/*
     File:       LanguageAnalysis.h
 
     Contains:   Language Analysis Manager Interfaces
 
     Version:    Technology: Mac OS 8
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1996-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __LANGUAGEANALYSIS__
#define __LANGUAGEANALYSIS__

#ifndef __MACTYPES__
#include "MacTypes.h"
#endif

#ifndef __FILES__
#include "Files.h"
#endif

#ifndef __AEREGISTRY__
#include "AERegistry.h"
#endif

#ifndef __DICTIONARY__
#include "Dictionary.h"
#endif

#ifndef __TEXTCOMMON__
#include "TextCommon.h"
#endif

#ifndef __MACERRORS__
#include "MacErrors.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=power
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

typedef struct OpaqueLAEnvironmentRef*  LAEnvironmentRef;
typedef struct OpaqueLAContextRef*      LAContextRef;
typedef AEKeyword                       LAPropertyKey;
typedef DescType                        LAPropertyType;
/*
    Data structure for high level API
*/

struct LAMorphemeRec {
    ByteCount                       sourceTextLength;
    LogicalAddress                  sourceTextPtr;
    ByteCount                       morphemeTextLength;
    LogicalAddress                  morphemeTextPtr;
    UInt32                          partOfSpeech;
};
typedef struct LAMorphemeRec            LAMorphemeRec;

struct LAMorphemesArray {
    ItemCount                       morphemesCount;
    ByteCount                       processedTextLength;
    ByteCount                       morphemesTextLength;
    LAMorphemeRec                   morphemes[1];
};
typedef struct LAMorphemesArray         LAMorphemesArray;
typedef LAMorphemesArray *              LAMorphemesArrayPtr;
enum {
    kLAMorphemesArrayVersion    = 0
};

/*
    Definitions for result path/bundle structure
*/

typedef AERecord                        LAMorphemeBundle;
typedef AERecord                        LAMorphemePath;
typedef AERecord                        LAMorpheme;
typedef AERecord                        LAHomograph;
enum {
    keyAELAMorphemeBundle       = FOUR_CHAR_CODE('lmfb'),
    keyAELAMorphemePath         = FOUR_CHAR_CODE('lmfp'),
    keyAELAMorpheme             = FOUR_CHAR_CODE('lmfn'),
    keyAELAHomograph            = FOUR_CHAR_CODE('lmfh')
};

enum {
    typeLAMorphemeBundle        = typeAERecord,
    typeLAMorphemePath          = typeAERecord,
    typeLAMorpheme              = typeAEList,
    typeLAHomograph             = typeAEList
};

/*
    Definitions for morpheme/homograph information
*/
enum {
    keyAEMorphemePartOfSpeechCode = FOUR_CHAR_CODE('lamc'),
    keyAEMorphemeTextRange      = FOUR_CHAR_CODE('lamt')
};

enum {
    typeAEMorphemePartOfSpeechCode = FOUR_CHAR_CODE('lamc'),
    typeAEMorphemeTextRange     = FOUR_CHAR_CODE('lamt')
};

typedef UInt32                          MorphemePartOfSpeech;

struct MorphemeTextRange {
    UInt32                          sourceOffset;
    UInt32                          length;
};
typedef struct MorphemeTextRange        MorphemeTextRange;
/*
    Mask for High level API convert flags 
*/
enum {
    kLAEndOfSourceTextMask      = 0x00000001
};

/*
    Constants for leading/trailing path of analysis function
*/
enum {
    kLADefaultEdge              = 0,
    kLAFreeEdge                 = 1,
    kLAIncompleteEdge           = 2
};

/*
    Constants for confirm and shift function
*/
enum {
    kLAAllMorphemes             = 0
};


/*
    Library version
*/
EXTERN_API( UInt32 )
LALibraryVersion                (void);

/*
    High level API
*/
EXTERN_API( OSStatus )
LATextToMorphemes               (LAContextRef           context,
                                 TextEncoding           preferedEncoding,
                                 ByteCount              textLength,
                                 ConstLogicalAddress    sourceText,
                                 ByteCount              bufferSize,
                                 OptionBits             convertFlags,
                                 UInt32                 structureVersion,
                                 ByteCount *            acceptedLength,
                                 LAMorphemesArrayPtr    resultBuffer);

/*
    Handling Context
*/
EXTERN_API( OSStatus )
LAOpenAnalysisContext           (LAEnvironmentRef       environ,
                                 LAContextRef *         context);

EXTERN_API( OSStatus )
LACloseAnalysisContext          (LAContextRef           context);

/*
    Handling Environment
*/
EXTERN_API( OSStatus )
LAGetEnvironmentList            (UInt32                 maxCount,
                                 UInt32 *               actualCount,
                                 LAEnvironmentRef       environmentList[]);

EXTERN_API( OSStatus )
LAGetEnvironmentName            (LAEnvironmentRef       environment,
                                 Str63                  environmentName);

EXTERN_API( OSStatus )
LAGetEnvironmentRef             (ConstStr63Param        targetEnvironmentName,
                                 LAEnvironmentRef *     environment);

EXTERN_API( OSStatus )
LACreateCustomEnvironment       (LAEnvironmentRef       baseEnvironment,
                                 ConstStr63Param        newEnvironmentName,
                                 Boolean                persistent,
                                 LAEnvironmentRef *     newEnvironment);

EXTERN_API( OSStatus )
LADeleteCustomEnvironment       (LAEnvironmentRef       environment);

/*
    Handling dictionries
*/
EXTERN_API( OSStatus )
LAOpenDictionary                (LAEnvironmentRef       environ,
                                 const FSSpec *         dictionary);

EXTERN_API( OSStatus )
LACloseDictionary               (LAEnvironmentRef       environ,
                                 const FSSpec *         dictionary);

EXTERN_API( OSStatus )
LAListAvailableDictionaries     (LAEnvironmentRef       environ,
                                 ItemCount              maxCount,
                                 ItemCount *            actualCount,
                                 FSSpec                 dictionaryList[],
                                 Boolean                opened[]);

EXTERN_API( OSStatus )
LAAddNewWord                    (LAEnvironmentRef       environ,
                                 const FSSpec *         dictionary,
                                 const AEDesc *         dataList);

/*
    Analyzing text
*/
EXTERN_API( OSStatus )
LAMorphemeAnalysis              (LAContextRef           context,
                                 ConstUniCharArrayPtr   text,
                                 UniCharCount           textLength,
                                 LAMorphemePath *       leadingPath,
                                 LAMorphemePath *       trailingPath,
                                 ItemCount              pathCount,
                                 LAMorphemeBundle *     result);

EXTERN_API( OSStatus )
LAContinuousMorphemeAnalysis    (LAContextRef           context,
                                 ConstUniCharArrayPtr   text,
                                 UniCharCount           textLength,
                                 Boolean                incrementalText,
                                 LAMorphemePath *       leadingPath,
                                 LAMorphemePath *       trailingPath,
                                 Boolean *              modified);

EXTERN_API( OSStatus )
LAGetMorphemes                  (LAContextRef           context,
                                 LAMorphemePath *       result);

EXTERN_API( OSStatus )
LAShiftMorphemes                (LAContextRef           context,
                                 ItemCount              morphemeCount,
                                 LAMorphemePath *       path,
                                 UniCharCount *         shiftedLength);

EXTERN_API( OSStatus )
LAResetAnalysis                 (LAContextRef           context);

/*
    Check Language Analysis Manager availability
*/
#if TARGET_RT_MAC_CFM
#ifdef __cplusplus
    inline pascal Boolean LALanguageAnalysisAvailable() { return (LALibraryVersion != (void*)kUnresolvedCFragSymbolAddress); }
#else
    #define LALanguageAnalysisAvailable()   ((LALibraryVersion != (void*)kUnresolvedCFragSymbolAddress)
#endif
#elif TARGET_RT_MAC_MACHO
/* Language Analysis Manager is always available on OS X */
#ifdef __cplusplus
    inline pascal Boolean LALanguageAnalysisAvailable() { return true; }
#else
    #define LALanguageAnalysisAvailable()   (true)
#endif
#endif  /*  */

/*
=============================================================================================
    Definitions for Japanese Analysis Module
=============================================================================================
*/
/*
    Names for default environments for Japanese analysis
*/
#define kLAJapaneseKanaKanjiEnvironment             "\pKanaKanjiConversion"
#define kLAJapaneseMorphemeAnalysisEnvironment      "\pJapaneseMorphemeAnalysis"
#define kLAJapaneseTTSEnvironment                   "\pJapaneseTextToSpeech"
/*
    File cretor for dictionary of Apple Japanese access method
*/
enum {
    kAppleJapaneseDictionarySignature = FOUR_CHAR_CODE('jlan')
};

/*
    Engine limitations
*/
enum {
    kMaxInputLengthOfAppleJapaneseEngine = 200
};

/*
    Definitions of information in the path/bundle
*/

typedef MorphemePartOfSpeech            JapanesePartOfSpeech;
typedef UInt16                          HomographWeight;
typedef UInt8                           HomographAccent;
/*
    AE keywords and type definitions for morpheme/homograph information
*/
enum {
    keyAEHomographDicInfo       = FOUR_CHAR_CODE('lahd'),
    keyAEHomographWeight        = FOUR_CHAR_CODE('lahw'),
    keyAEHomographAccent        = FOUR_CHAR_CODE('laha')
};

enum {
    typeAEHomographDicInfo      = FOUR_CHAR_CODE('lahd'),
    typeAEHomographWeight       = typeShortInteger,
    typeAEHomographAccent       = FOUR_CHAR_CODE('laha')
};

/*
    Structure for dictionary information of homograph
*/

struct HomographDicInfoRec {
    DCMDictionaryID                 dictionaryID;
    DCMUniqueID                     uniqueID;
};
typedef struct HomographDicInfoRec      HomographDicInfoRec;
/*
=============================================================================================
    Definitions for Japanese part of speeches
=============================================================================================
*/
/*
    Masks for part of speeches
*/
enum {
    kLASpeechRoughClassMask     = 0x0000F000,
    kLASpeechMediumClassMask    = 0x0000FF00,
    kLASpeechStrictClassMask    = 0x0000FFF0,
    kLASpeechKatsuyouMask       = 0x0000000F
};


/*
    Part of speeches
*/
enum {
    kLASpeechMeishi             = 0x00000000,                   /* noun */
    kLASpeechFutsuuMeishi       = 0x00000000,                   /* general noun */
    kLASpeechJinmei             = 0x00000100,                   /* person name */
    kLASpeechJinmeiSei          = 0x00000110,                   /* family name */
    kLASpeechJinmeiMei          = 0x00000120,                   /* first name */
    kLASpeechChimei             = 0x00000200,                   /* place name */
    kLASpeechSetsubiChimei      = 0x00000210,                   /* place name with suffix */
    kLASpeechSoshikimei         = 0x00000300,                   /* organization name */
    kLASpeechKoyuuMeishi        = 0x00000400,                   /* proper noun */
    kLASpeechSahenMeishi        = 0x00000500,                   /* special noun */
    kLASpeechKeidouMeishi       = 0x00000600,                   /* special noun */
    kLASpeechRentaishi          = 0x00001000,
    kLASpeechFukushi            = 0x00002000,                   /* adverb */
    kLASpeechSetsuzokushi       = 0x00003000,                   /* conjunction */
    kLASpeechKandoushi          = 0x00004000,
    kLASpeechDoushi             = 0x00005000,                   /* verb */
    kLASpeechGodanDoushi        = 0x00005000,
    kLASpeechKagyouGodan        = 0x00005000,
    kLASpeechSagyouGodan        = 0x00005010,
    kLASpeechTagyouGodan        = 0x00005020,
    kLASpeechNagyouGodan        = 0x00005030,
    kLASpeechMagyouGodan        = 0x00005040,
    kLASpeechRagyouGodan        = 0x00005050,
    kLASpeechWagyouGodan        = 0x00005060,
    kLASpeechGagyouGodan        = 0x00005070,
    kLASpeechBagyouGodan        = 0x00005080,
    kLASpeechIchidanDoushi      = 0x00005100,
    kLASpeechKahenDoushi        = 0x00005200,
    kLASpeechSahenDoushi        = 0x00005300,
    kLASpeechZahenDoushi        = 0x00005400,
    kLASpeechKeiyoushi          = 0x00006000,                   /* adjective */
    kLASpeechKeiyoudoushi       = 0x00007000,
    kLASpeechSettougo           = 0x00008000,                   /* prefix*/
    kLASpeechSuujiSettougo      = 0x00008100,                   /* prefix for numbers */
    kLASpeechSetsubigo          = 0x00009000,                   /* suffix */
    kLASpeechJinmeiSetsubigo    = 0x00009100,                   /* suffix for person name */
    kLASpeechChimeiSetsubigo    = 0x00009200,                   /* suffix for place name */
    kLASpeechSoshikimeiSetsubigo = 0x00009300,                  /* suffix for organization name */
    kLASpeechSuujiSetsubigo     = 0x00009400,                   /* suffix for numbers */
    kLASpeechMuhinshi           = 0x0000A000,                   /* no category */
    kLASpeechTankanji           = 0x0000A000,                   /* character */
    kLASpeechKigou              = 0x0000A100,                   /* symbol */
    kLASpeechKuten              = 0x0000A110,
    kLASpeechTouten             = 0x0000A120,
    kLASpeechSuushi             = 0x0000A200,                   /* numbers */
    kLASpeechDokuritsugo        = 0x0000A300,
    kLASpeechSeiku              = 0x0000A400,
    kLASpeechJodoushi           = 0x0000B000,                   /* auxiliary verb */
    kLASpeechJoshi              = 0x0000C000                    /* postpositional particle */
};


/*
    Conjugations
 */
enum {
    kLASpeechKatsuyouGokan      = 0x00000001,                   /* stem */
    kLASpeechKatsuyouMizen      = 0x00000002,
    kLASpeechKatsuyouRenyou     = 0x00000003,
    kLASpeechKatsuyouSyuushi    = 0x00000004,
    kLASpeechKatsuyouRentai     = 0x00000005,
    kLASpeechKatsuyouKatei      = 0x00000006,
    kLASpeechKatsuyouMeirei     = 0x00000007
};



#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __LANGUAGEANALYSIS__ */

