windows-nt/Source/XPSP1/NT/windows/feime/tools/chajei/genctbl/genctbl.c
2020-09-26 16:20:57 +08:00

225 lines
7.4 KiB
C

/*************************************************
* genctbl.c *
* *
* Copyright (C) 1995-1999 Microsoft Inc. *
* *
*************************************************/
// ---------------------------------------------------------------------------
//
// This program is used to generate Chajei IME tables from its text Code table
//
// History: 02-06-1998, Weibz, Created
//
// Usage: genctbl <Unicode Text File> <A15.tbl> <A234.tbl> <Acode.tbl>
//
//
// --------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
void _cdecl main( int argc, TCHAR **argv) {
HANDLE hInFile, hA15, hA234, hAcode;
HANDLE hInMap;
LPWORD lpInFile, lpStart, lpA1, lpA5, lpAcode;
DWORD dwInFileSize, BytesWritten;
DWORD iLine, LineLen, NumLine;
int i;
WORD wOutData, wOffset, wLastOffset;
WORD wA1, wA5;
WORD wPattern234, uCode;
if ( argc != 5 ) {
printf("usage: genctbl <U Text File> <A15.tbl> <A234.tbl> <Acode.tbl>\n");
return;
}
hInFile = CreateFile( argv[1], // pointer to name of the file
GENERIC_READ, // access (read-write) mode
FILE_SHARE_READ, // share mode
NULL, // pointer to security attributes
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL);
if ( hInFile == INVALID_HANDLE_VALUE ) return;
hA15 = CreateFile( argv[2], // pointer to name of the file
GENERIC_WRITE, // access (read-write) mode
FILE_SHARE_WRITE, // share mode
NULL, // pointer to security attributes
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL);
if ( hA15 == INVALID_HANDLE_VALUE ) {
printf("hA15 is INVALID_HANDLE_VALUE\n");
return;
}
hA234 = CreateFile(argv[3], // pointer to name of the file
GENERIC_WRITE, // access (read-write) mode
FILE_SHARE_WRITE, // share mode
NULL, // pointer to security attributes
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL);
if ( hA234 == INVALID_HANDLE_VALUE ) {
printf("hA234 is INVALID_HANDLE_VALUE\n");
return;
}
hAcode = CreateFile(argv[4], // pointer to name of the file
GENERIC_WRITE, // access (read-write) mode
FILE_SHARE_WRITE, // share mode
NULL, // pointer to security attributes
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL);
if ( hAcode == INVALID_HANDLE_VALUE ) {
printf("hAcode is INVALID_HANDLE_VALUE\n");
return;
}
hInMap = CreateFileMapping(hInFile, // handle to file to map
NULL, // optional security attributes
PAGE_READONLY, // protection for mapping object
0, // high-order 32 bits of object size
0, // low-order 32 bits of object size
NULL); // name of file-mapping object);
if ( !hInMap ) {
printf("hInMap is NULL\n");
return;
}
lpInFile = (LPWORD)MapViewOfFile(hInMap, FILE_MAP_READ, 0, 0, 0);
lpStart = lpInFile + 1; // skip Unicode header signature 0xFEFF
dwInFileSize = GetFileSize(hInFile, NULL) - 2; // sub head two bytes
LineLen = 9 * sizeof(WORD);
NumLine = dwInFileSize / LineLen;
// ------------------------------
// For the first 27 words, we need to write 00 to A15.tbl
wOutData = 0x0000;
for (i=0; i<27; i++) {
WriteFile(hA15, // handle to file to write to
&wOutData, // pointer to data to write to file
2, // number of bytes to write
&BytesWritten, // pointer to number of bytes written
NULL); // pointer to structure needed for
// overlapped I/O
}
wLastOffset = 26;
for (iLine=0; iLine < NumLine; iLine++) {
lpA1 = lpStart;
lpA5 = lpStart + 4;
lpAcode = lpStart + 6;
wA1 = *lpA1; wA5 = *lpA5; uCode = *lpAcode;
if (wA1 == 0x0020)
wA1 = 0;
else
wA1 = wA1 - L'A' + 1;
if (wA5 == 0x0020)
wA5 = 0;
else
wA5 = wA5 - L'A' + 1;
//Generate the pattern
wPattern234 = 0;
for (i=1; i<4; i++) {
wPattern234 = wPattern234 << 5;
if ( *(lpA1+i) != 0x0020 )
wPattern234 += *(lpA1+i) - L'A' + 1;
}
// write this Pattern to A234.tbl
WriteFile(hA234, // handle to file to write to
&wPattern234, // pointer to data to write to file
2, // number of bytes to write
&BytesWritten, // pointer to number of bytes written
NULL); // pointer to structure needed for
// overlapped I/O
// write uCode to Acode.tbl
WriteFile(hAcode, // handle to file to write to
&uCode, // pointer to data to write to file
2, // number of bytes to write
&BytesWritten, // pointer to number of bytes written
NULL); // pointer to structure needed for
// overlapped I/O
wOffset = wA1 * 27 + wA5;
if ( wOffset > wLastOffset ) {
for (i=wLastOffset; i<wOffset; i++) {
WriteFile(hA15, // handle to file to write to
&iLine, // pointer to data to write to file
2, // number of bytes to write
&BytesWritten, // pointer to number of bytes written
NULL); // pointer to structure needed for
// overlapped I/O
}
wLastOffset = wOffset;
}
lpStart += 9;
}
for (i=wLastOffset; i< (27*27 ); i++)
WriteFile(hA15, // handle to file to write to
&iLine, // pointer to data to write to file
2, // number of bytes to write
&BytesWritten, // pointer to number of bytes written
NULL); // pointer to structure needed for
// overlapped I/O
// ------------------------------------------------------------
UnmapViewOfFile(lpInFile);
CloseHandle(hInMap);
CloseHandle(hInFile);
CloseHandle(hA15);
CloseHandle(hA234);
CloseHandle(hAcode);
return;
}