windows-nt/Source/XPSP1/NT/drivers/tpg/hwx/common/inc/udictp.h
2020-09-26 16:20:57 +08:00

71 lines
2.1 KiB
C

/******************************************************
*
* uDictP.h
*
* Private dclartaions involving the user dictionary
*
*****************************************************/
#ifndef H_UDICTP_H
#define H_UDICTP_H
#define NO_LINK (-1) // Offset value use when no valid link.
// User dictionary Flags.
#define UDF_VALID 0x0001 // End of valid word.
#define UDF_HAS_TAG 0x0002 // Tag information stored for this node.
#define UDF_IS_TAG 0x0004 // Tag information, is NOT normal node.
#ifdef __cplusplus
extern "C"
{
#endif
// Node in user dictionary.
typedef struct tagNODE {
wchar_t wchLabel; // Character label of node
WORD flags; // Node flags.
int iDown; // Index of down node.
union {
int iRight; // Index of right node.
const wchar_t *pTag; // Pointer to tag info.
} uu;
} NODE;
typedef enum tagUDICT_IDX {READER=1, WRITER} UDICT_IDX; // Identifer if I am a reader or writer of the XWL
// The header structure for the user dictionary.
// June 2001. Implement read/write locking to protect
// multiple thread access as in the following table:
// Read Access Write Access
// Reading Yes No
// Writing No No
//
typedef struct tagUDICT {
NODE *pNodeAlloc; // Allocated array of nodes.
int cNodes; // Count of allocated nodes in array.
int cNodesUsed; // Count of nodes used in array.
int iFreeList; // Offset of first item in free list.
int iRoot; // Offset of root of trie.
BOOL bIsChanged; // True if dictionary has changed since last save
int iLen; // Amount of space needed to save all the words in the dictionary
int cReadLock; // Number of read locks on to prevent write updates during a read
HANDLE hReadLockEvent; // Signal reading of the User dictiionary
HANDLE hWriteLockMutex; // Signals a writing thread has ownership
HANDLE hRWevent; // Signals either read or write has ownership
} UDICT;
// Synchronization functions
BOOL UDictInitLocks(UDICT *pDict);
void UDictDestroyLocks(UDICT *pDict);
void UDictGetLock(HWL hwl, UDICT_IDX idx );
void UDictReleaseLock(HWL hwl, UDICT_IDX idx);
#ifdef __cplusplus
};
#endif
#endif