|
|
// FILE: udict.h
// Internal API for User dictionary.
#ifdef __cplusplus
extern "C" { #endif
// Status values returned from User Dictionary procedures.
enum { udError, // Externally caused error, E.g. out of memory.
udFail, // Operation failed because requested action not possable.
udSuccess, // Operation completed successfully.
udWordFound, // Word was in dictionary.
udWordNotFound, // Word was NOT in dictionary.
udWordAdded, // Word was added to dictinary.
udWordDeleted, // Word was deleted from dictionary.
udWordChanged, // Word tag information was changed in dictionary.
udNoTag, // Word has no tags.
udStopEarly, // Stop processing early (not an error).
udNumStatus };
// Flags for UD_NODE_INFO flags field.
#define UDNIF_VALID 0x0001 // End of valid word.
#define UDNIF_HAS_RIGHT 0x0002 // There is a node to the right of this one.
#define UDNIF_HAS_DOWN 0x0004 // There is a node down from of this one.
#define UDNIF_HAS_TAG 0x0008 // Tag information stored for this node.
// Information that can be fetched from a node.
// Note: tags only occur on nodes that are valid.
// Note: if fValid is true and fHasTag is false, then then there is no tag.
// If fHasTag is valid, then you have to
// check out the tags to find out what versions exist (e.g. don't assume that
// an untagged version exists).
typedef struct tagUD_NODE_INFO { wchar_t wchLabel; WORD flags; // Node flags.
HANDLE hRight; // Handle on right node, only valid if fHasRight.
HANDLE hDown; // Handle on down node, only valid if fHasDown.
HANDLE hTag; // Handle on tag, only valid if hsHasTag.
} UD_NODE_INFO;
// Longest word allowed in user dictionary.
#define UDICT_MAX_WORD 128
//
// User dictionary APIs.
//
// Create a new User Dictionary
// Return:
// NULL Could not allocate memory for Dictionary
// !NULL Handle on dictionary.
HANDLE UDictCreate();
// Destroy a User Dictionary, free all allocated memory.
// Return:
// udError Error freeing memory
// udSuccess All memory successfully freed.
int UDictDestroy(HANDLE hUDict);
// Get Handle on root node.
// Return:
// udFail User dictionary is empty, no root node available.
// udSuccess Root node successfully filled in.
int UDictRootNode(HANDLE hUDict, HANDLE *phRoot);
// Move one node to the right (e.g. alternate character to current one).
// Fill in phNode with your current node. On success, it will be replaced
// with the new node.
// Return:
// udFail No right node available.
// udSuccess Right node successfully filled in.
int UDictRightNode(HANDLE hUDict, HANDLE *phNode);
// Move one node to the down (e.g. character following current one).
// Fill in *phNode with your current node. On success, it will be replaced
// with the new node.
// Return:
// udFail No down node available.
// udSuccess Right node successfully filled in.
int UDictDownNode(HANDLE hUDict, HANDLE *phNode);
// Fetch the character label on the node.
// Return:
// The character label on the node.
wchar_t UDictNodeLabel(HANDLE hUDict, HANDLE hNode);
// Fetch information about node. Passed in node info structure will be filled
// in with contents of hNode.
// Return:
// udSuccess Node values successfully filled in.
int UDictGetNode(HANDLE hUDict, HANDLE hNode, UD_NODE_INFO *pNodeInfo);
// Fetch tag. You must pass in a valid tag handle.
// Note that the returned pointer is to memory allocated by user dictionary.
// If you want to keep the value around, copy it into memory you control, because
// the returned copy may go away the next time the udict is modified.
// Return:
// !NULL Pointer to tag.
const wchar_t *UDictFetchTag(HANDLE hUDict, HANDLE hTag);
// Add a word to the user dictionary. Optional tag allowed.
// Return:
// udError Could not grow dictinary to hold new word.
// udFail Zero length word can not be added.
// udWordFound Word (and tag) already in dictinary, no update needed.
// udWordAdded Word added to dictionary.
// udWordChanged New word tag was set for existing word in dictionary.
// Note: word and tag are copied into User dictionary, so that callers memory
// may be reused or freed after call returns.
int UDictAddWord(HANDLE hUDict, const wchar_t *pwchWord, const wchar_t *pTag);
// Delete a word from the user dictionary.
// Return:
// udError Error adjusting size of dictionary (?possable?).
// udWordNotFound Word was not in dictionary. no update needed.
// udWordDeleted Word was deleted from dictionary.
int UDictDeleteWord(HANDLE hUDict, const wchar_t *pwchWord);
// Find a word, also gets its tag if it has one.
// Return:
// udWordNotFound Word was not in dictionary, no tag returned.
// udWordFound Word found, tag pointer for node filled in.
// Note that the returned tag pointer is to memory allocated by user dictionary.
// If you want to keep the value around, copy it into memory you control, because
// the returned copy may go away the next time the udict is modified.
int UDictFindWord( HANDLE hUDict, const wchar_t *pwchWord, const wchar_t **ppTag // Out: pointer tag.
);
// Enumerate the tree. Call a callback function for each word in selected range.
// Return:
// udFail Invalid range of words or call back failed.
// udSuccess Right node successfully filled in.
// The enumeration function must return one of the following three values:
// udFail Error in processing, abort traversal and return error.
// udStopEarly Successfully prcessed word, but we don't need to see any more.
// udSuccess Successfully prcessed word, continue to next..
#define UDICT_ENUM_TO_END -1 // Value for lastWord to go to end of dictionary.
typedef int (*P_UD_ENUM_CALL_BACK)( void *pCallBackData, int wordNumber, const wchar_t *pWord, const wchar_t *pTag );
int UDictEnumerate( HANDLE hUDict, P_UD_ENUM_CALL_BACK pCallBack, // Function to call on each selected word.
void *pCallBackData // Data to pass to callback function
);
// Merge one word list into another
// Supply both the Source and Destination word Lists
// The merge directly merges the tries rather than expanding
// adding
//
// CAVEATES:
// 1) Before merging we allocate enough memory to guarantee
// the merge completes, but this may leave memory unused
// Code changes at the expense of speed will be required to modify this
// 2) If a word in both the source and destination both contain
// tags, we retain only the original (destination) tag.
// (The code does not support multiple tags)
//
// Returns TRUE if the merge completed successfully, FALSE
// otherwise
//
int UDictMerge(HANDLE hUSrc, HANDLE hUDest);
#ifdef __cplusplus
}; #endif
|