100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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);
|
|
}
|