Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1997, Microsoft Corporation. All Rights Reserved.
//
/////////////////////////////////////////////////////////////////////////////
//#include "stdafx.h"
#include "pch.cxx"
#include "FSADict.h"
//#include "TransTable.h"
#include "ReadHeosaDict.h"
CFSADict::CFSADict(HANDLE fHandle, UINT sparseMatSize, UINT actSize) { DWORD NumOfBytesRead;
lpBuffer = (LPSTR)GlobalAlloc(GPTR, sparseMatSize); Assert(lpBuffer != NULL ); ReadFile(fHandle, lpBuffer, sparseMatSize, &NumOfBytesRead, 0); // _ASSERT(sparseMatSize == NumOfBytesRead);
if (actSize) { lpActBuffer = (LPSTR)GlobalAlloc(GPTR, actSize); Assert(lpActBuffer != NULL); ReadFile(fHandle, lpActBuffer, actSize, &NumOfBytesRead, 0); // _ASSERT(actSize == NumOfBytesRead);
} else lpActBuffer = 0; }
CFSADict::~CFSADict() { GlobalFree(lpBuffer); if (lpActBuffer) GlobalFree(lpActBuffer); }
WORD CFSADict::Find(LPCSTR lpWord, BYTE *actCode) { WORD base, delta; WORD hashVal=0; WORD ret; //BYTE c;
base = delta = 0; //delta = ((WORD)(*lpWord) -'A') * 3;
//base = *(WORD *)(lpBuffer + base + delta+1);
//lpWord++;
while(*lpWord) { if ((BYTE)*(lpBuffer + base + MAX_CHARS*5) == FINAL) return NOT_FOUND;
// if not start state.(input token 0 not used)
//if (base)
delta = ((WORD)(*lpWord)) * 5; if ( (*(lpBuffer + base + delta)) != (int) (*lpWord) ) return NOT_FOUND; hashVal += *(WORD*)(lpBuffer + base + delta + 3); base = *(WORD *)(lpBuffer + base + delta + 1);
if (base==0) return NOT_FOUND; lpWord++; }
//c = (BYTE)*(lpBuffer + base + MAX_CHARS*3);
ret = *(WORD*)(lpBuffer + base + MAX_CHARS*5); if (ret & FINAL) *actCode = *(lpActBuffer + hashVal); return ret; }
WORD CFSAIrrDict::Find(LPCSTR lpWord) { WORD base, delta; //WORD ret;
//BYTE c;
base = delta = 0; //delta = ((WORD)(*lpWord) -'A') * 3;
//base = *(WORD *)(lpBuffer + base + delta+1);
//lpWord++;
while(*lpWord) { if ((BYTE)*(lpBuffer + base + MAX_CHARS*3)==FINAL) return NOT_FOUND;
// if not start state.(input token 0 not used)
delta = ((WORD)(*lpWord)) * 3; if ( (*(lpBuffer + base + delta)) != (int) (*lpWord) ) return NOT_FOUND; base = *(WORD *)(lpBuffer + base + delta + 1);
if (base==0) return NOT_FOUND; lpWord++; }
//c = (BYTE)*(lpBuffer + base + MAX_CHARS*3);
return *(WORD *)(lpBuffer + base + MAX_CHARS*3); }
|