mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-08 01:45:32 +00:00
392 lines
12 KiB
C
392 lines
12 KiB
C
/*
|
|
Name: Compfile
|
|
Copyright: Copyright (C) SIL International.
|
|
Documentation:
|
|
Description:
|
|
Create Date: 25 Jan 2007
|
|
|
|
Modified Date: 25 May 2010
|
|
Authors: mcdurdin
|
|
Related Files:
|
|
Dependencies:
|
|
|
|
Bugs:
|
|
Todo:
|
|
Notes:
|
|
History: 25 Jan 2007 - mcdurdin - Add GLOBAL_BUFSIZE, enlarge LINESIZE
|
|
25 May 2010 - mcdurdin - I1632 - Keyboard Options
|
|
|
|
- Sabine: 25.Nov.21:
|
|
- doubled all structs and consts; renamed them: struct FILE_STORE ---> struct KMX_FILE_STORE
|
|
- New structs are needed for gradually exchanging variables in Compiler.cpp etc
|
|
- after all variables in compiler.cpp etc are replaced these structs will be renamed again:
|
|
- struct FILE_STORE <--- struct KMX_FILE_STORE
|
|
|
|
*/
|
|
#pragma once // _S2
|
|
#ifndef _COMPFILE_H
|
|
#define _COMPFILE_H
|
|
|
|
#include "compiler.h"
|
|
|
|
#define LINESIZE 8192
|
|
#define GLOBAL_BUFSIZE 4096
|
|
|
|
#define SZMAX_STORENAME 80
|
|
#define SZMAX_GROUPNAME 80
|
|
#define SZMAX_DEADKEYNAME 80
|
|
#define SZMAX_ERRORTEXT 512
|
|
#define SZMAX_VKDICTIONARYNAME 80
|
|
|
|
#define MAX_WARNINGS 100
|
|
|
|
#define T_COMMENT 1 // A comment line
|
|
#define T_KEYTOKEY 2 // A rule line
|
|
#define T_BLANK 3 // A blank line
|
|
|
|
#define T_W_START 4 // Start of easily matched line types
|
|
#define T_STORE 4 // A store line
|
|
#define T_VERSION 5 // A 'VERSION 3.2/3.1/3.0' line
|
|
#define T_NAME 6 // A 'NAME "xxxx"' line
|
|
#define T_BITMAP 7 // A 'BITMAP bmpfile' line
|
|
#define T_HOTKEY 8 // A 'HOTKEY "^%+C"' line
|
|
#define T_BEGIN 9 // A 'begin > use(xxxx)' line
|
|
#define T_GROUP 10 // A 'group(xxxx)' line
|
|
#define T_MATCH 11 // A 'match > "XXXX"' line
|
|
#define T_NOMATCH 12 // A 'nomatch > "XXXX"' line
|
|
#define T_SHIFT 13 // A 'SHIFT FREES CAPS' line
|
|
#define T_CAPSON 14 // A 'CAPS ON ONLY' line
|
|
#define T_CAPSOFF 15 // A 'CAPS ALWAYS OFF' line
|
|
#define T_LANGUAGE 16 // A 'LANGUAGE xxxh, xxh' line
|
|
#define T_LAYOUT 17 // A 'LAYOUT xxxxh' line
|
|
#define T_COPYRIGHT 18 // A 'COPYRIGHT "so and so"' line
|
|
#define T_MESSAGE 19 // A 'MESSAGE "so and so"' line
|
|
#define T_LANGUAGENAME 20 // A 'LANGUAGENAME "xxxx"' line
|
|
#define T_BITMAPS 21 // An unused 'BITMAPS' line (version 3.x)
|
|
#define T_W_END 21 // End of easily matched rule types
|
|
|
|
#define T_UNKNOWN 99 // Unrecognized line type (illegal line)
|
|
|
|
#define GDS_CUTLEAD 0x01 // GetDelimitedString: cut leading spaces
|
|
#define GDS_CUTFOLL 0x02 // GetDelimitedString: cut following spaces
|
|
|
|
#define GXS_LINE 0x00 // GetExtendedString error: in a "line"
|
|
#define GXS_RULE 0x01 // GetExtendedString error: in a "rule"
|
|
#define GXS_STORE 0x02 // GetExtendedString error: in a "store"
|
|
|
|
enum FileStoreType { FST_STORE, FST_OPTION, FST_RESERVED };
|
|
|
|
struct FILE_STORE {
|
|
KMX_DWORD dwSystemID;
|
|
KMX_WCHAR szName[SZMAX_STORENAME]; // the name of the store
|
|
PKMX_WCHAR dpString; // from start of store structure
|
|
//FileStoreType fstType;
|
|
KMX_BOOL fIsStore;
|
|
KMX_BOOL fIsReserved;
|
|
KMX_BOOL fIsOption;
|
|
KMX_BOOL fIsDebug;
|
|
KMX_BOOL fIsCall;
|
|
int line;
|
|
};
|
|
typedef FILE_STORE * PFILE_STORE;
|
|
|
|
|
|
struct FILE_KEY {
|
|
KMX_WCHAR Key; // WCHAR for consistency; only a byte used however
|
|
KMX_DWORD Line;
|
|
KMX_DWORD ShiftFlags;
|
|
PKMX_WCHAR dpOutput; // from start of key structure
|
|
PKMX_WCHAR dpContext; // from start of key structure
|
|
};
|
|
typedef FILE_KEY *PFILE_KEY;
|
|
|
|
|
|
struct FILE_GROUP {
|
|
KMX_WCHAR szName[SZMAX_GROUPNAME];
|
|
PFILE_KEY dpKeyArray; // address of first item in key array, from start of group structure
|
|
PKMX_WCHAR dpMatch; // from start of group structure
|
|
PKMX_WCHAR dpNoMatch; // from start of group structure
|
|
KMX_DWORD cxKeyArray; // in array items
|
|
KMX_BOOL fUsingKeys; // group(xx) [using keys] <-- specified or not
|
|
KMX_BOOL fReadOnly; // group(xx) [readonly] <-- specified or not
|
|
KMX_DWORD Line;
|
|
};
|
|
typedef FILE_GROUP *PFILE_GROUP;
|
|
|
|
|
|
struct FILE_DEADKEY
|
|
{
|
|
KMX_WCHAR szName[SZMAX_DEADKEYNAME];
|
|
};
|
|
typedef FILE_DEADKEY *PFILE_DEADKEY;
|
|
|
|
|
|
struct FILE_VKDICTIONARY
|
|
{
|
|
KMX_WCHAR szName[SZMAX_VKDICTIONARYNAME];
|
|
};
|
|
typedef FILE_VKDICTIONARY *PFILE_VKDICTIONARY;
|
|
|
|
|
|
struct FILE_KEYBOARD {
|
|
KMX_DWORD KeyboardID; // as stored in HKEY_LOCAL_MACHINE//system//currentcontrolset//control//keyboard layouts
|
|
|
|
KMX_DWORD version; // keyboard file version with VERSION keyword
|
|
|
|
PFILE_STORE dpStoreArray; // address of first item in store array, from start of store structure
|
|
PFILE_GROUP dpGroupArray; // address of first item in group array, from start of group structure
|
|
|
|
KMX_DWORD cxStoreArray; // in number of items
|
|
KMX_DWORD cxGroupArray; // in number of items
|
|
KMX_DWORD StartGroup[2]; // index of starting groups [ANSI=0, Unicode=1]
|
|
|
|
KMX_DWORD dwHotKey; // standard windows hotkey (hiword=shift/ctrl/alt stuff, loword=vkey)
|
|
|
|
KMX_WCHAR szName[SZMAX_KEYBOARDNAME]; // Keyboard layout name
|
|
KMX_WCHAR szLanguageName[SZMAX_LANGUAGENAME]; // Language name
|
|
KMX_WCHAR szCopyright[SZMAX_COPYRIGHT]; // Copyright information
|
|
KMX_WCHAR szMessage[SZMAX_MESSAGE]; // General information about the keyboard
|
|
PKMX_BYTE lpBitmap;
|
|
KMX_DWORD dwBitmapSize;
|
|
KMX_DWORD dwFlags; // Flags for the keyboard file
|
|
|
|
KMX_DWORD currentGroup; // temp - current processing group
|
|
KMX_DWORD currentStore; // temp - current processing store
|
|
KMX_DWORD cxDeadKeyArray;
|
|
PFILE_DEADKEY dpDeadKeyArray; // temp - dead key array
|
|
KMX_DWORD cxVKDictionary;
|
|
PFILE_VKDICTIONARY dpVKDictionary; // temp - virtual key dictionary
|
|
};
|
|
typedef FILE_KEYBOARD *PFILE_KEYBOARD;
|
|
|
|
/*
|
|
These size values are used in unit tests to ensure
|
|
that the structure sizes correspond precisely across
|
|
compilers (pas and c++).
|
|
*/
|
|
|
|
const KMX_DWORD sz_FILE_STORE = sizeof(FILE_STORE);
|
|
const KMX_DWORD sz_FILE_KEY = sizeof(FILE_KEY);
|
|
const KMX_DWORD sz_FILE_GROUP = sizeof(FILE_GROUP);
|
|
const KMX_DWORD sz_FILE_DEADKEY = sizeof(FILE_DEADKEY);
|
|
const KMX_DWORD sz_FILE_VKDICTIONARY = sizeof(FILE_VKDICTIONARY);
|
|
const KMX_DWORD sz_FILE_KEYBOARD = sizeof(FILE_KEYBOARD);
|
|
|
|
|
|
struct COMPMSG {
|
|
KMX_CHAR szText[SZMAX_ERRORTEXT];
|
|
KMX_DWORD Line;
|
|
KMX_DWORD dwMsgCode;
|
|
};
|
|
typedef COMPMSG *PCOMPMSG;
|
|
|
|
|
|
struct COMPILEMESSAGES {
|
|
int nMessages;
|
|
int nErrors;
|
|
|
|
PCOMPMSG cm;
|
|
|
|
KMX_DWORD fatalCode;
|
|
KMX_CHAR szFatalText[SZMAX_ERRORTEXT];
|
|
|
|
KMX_DWORD currentLine;
|
|
};
|
|
typedef COMPILEMESSAGES *PCOMPILEMESSAGES;
|
|
|
|
/*
|
|
struct TVersion
|
|
{
|
|
//int MinVersion; // 0x0500 usually
|
|
//int CompilerVersion[4];
|
|
//int MinCompilerVersion[4];
|
|
int KeyboardVersion; // 0x0500 usually
|
|
};
|
|
|
|
extern TVersion FVersionInfo;
|
|
*/
|
|
|
|
/*
|
|
#define bstrcpy(c,d) (LPBYTE)strcpy((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrlen(c) strlen((LPSTR)(c))
|
|
#define bstrcmp(c,d) strcmp((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrncmp(c,d,n) strncmp((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrnicmp(c,d,n) strnicmp((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstricmp(c,d) stricmp((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrchr(c,ch) (LPBYTE)strchr((LPSTR)(c),(char)ch)
|
|
#define bstrncpy(c,d,n) (LPBYTE)strncpy((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrtok(c,d) (LPBYTE)strtok((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrcat(c,d) (LPBYTE)strcat((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrncat(c,d,n) (LPBYTE)strncat((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrrev(c) (LPBYTE)strrev((LPSTR)(c))
|
|
#define batoi(c) atoi((LPSTR)(c))
|
|
#define bstrtol(c,d,n) strtol((LPSTR)(c),(LPSTR *)(d),(n))
|
|
*/
|
|
|
|
#endif // _COMPFILE_H
|
|
|
|
|
|
//------------------- old -----------------------------
|
|
/*
|
|
enum FileStoreType { FST_STORE, FST_OPTION, FST_RESERVED };
|
|
|
|
struct FILE_STORE {
|
|
DWORD dwSystemID;
|
|
WCHAR szName[SZMAX_STORENAME]; // the name of the store
|
|
PWSTR dpString; // from start of store structure
|
|
//FileStoreType fstType;
|
|
BOOL fIsStore;
|
|
BOOL fIsReserved;
|
|
BOOL fIsOption;
|
|
BOOL fIsDebug;
|
|
BOOL fIsCall;
|
|
int line;
|
|
};
|
|
|
|
typedef FILE_STORE *PFILE_STORE;
|
|
|
|
|
|
struct FILE_KEY {
|
|
WCHAR Key; // WCHAR for consistency; only a byte used however
|
|
DWORD Line;
|
|
DWORD ShiftFlags;
|
|
PWSTR dpOutput; // from start of key structure
|
|
PWSTR dpContext; // from start of key structure
|
|
};
|
|
|
|
typedef FILE_KEY *PFILE_KEY;
|
|
|
|
|
|
|
|
|
|
|
|
struct FILE_GROUP {
|
|
WCHAR szName[SZMAX_GROUPNAME];
|
|
PFILE_KEY dpKeyArray; // address of first item in key array, from start of group structure
|
|
PWSTR dpMatch; // from start of group structure
|
|
PWSTR dpNoMatch; // from start of group structure
|
|
DWORD cxKeyArray; // in array items
|
|
BOOL fUsingKeys; // group(xx) [using keys] <-- specified or not
|
|
};
|
|
|
|
typedef FILE_GROUP *PFILE_GROUP;
|
|
|
|
|
|
struct FILE_DEADKEY
|
|
{
|
|
WCHAR szName[SZMAX_DEADKEYNAME];
|
|
};
|
|
|
|
typedef FILE_DEADKEY *PFILE_DEADKEY;
|
|
|
|
|
|
|
|
struct FILE_VKDICTIONARY
|
|
{
|
|
WCHAR szName[SZMAX_VKDICTIONARYNAME];
|
|
};
|
|
typedef FILE_VKDICTIONARY *PFILE_VKDICTIONARY;
|
|
|
|
|
|
|
|
struct FILE_KEYBOARD {
|
|
DWORD KeyboardID; // as stored in HKEY_LOCAL_MACHINE//system//currentcontrolset//control//keyboard layouts
|
|
|
|
DWORD version; // keyboard file version with VERSION keyword
|
|
|
|
PFILE_STORE dpStoreArray; // address of first item in store array, from start of store structure
|
|
PFILE_GROUP dpGroupArray; // address of first item in group array, from start of group structure
|
|
|
|
DWORD cxStoreArray; // in number of items
|
|
DWORD cxGroupArray; // in number of items
|
|
DWORD StartGroup[2]; // index of starting groups [ANSI=0, Unicode=1]
|
|
|
|
DWORD dwHotKey; // standard windows hotkey (hiword=shift/ctrl/alt stuff, loword=vkey)
|
|
|
|
WCHAR szName[SZMAX_KEYBOARDNAME]; // Keyboard layout name
|
|
WCHAR szLanguageName[SZMAX_LANGUAGENAME]; // Language name
|
|
WCHAR szCopyright[SZMAX_COPYRIGHT]; // Copyright information
|
|
WCHAR szMessage[SZMAX_MESSAGE]; // General information about the keyboard
|
|
PBYTE lpBitmap;
|
|
DWORD dwBitmapSize;
|
|
DWORD dwFlags; // Flags for the keyboard file
|
|
|
|
DWORD currentGroup; // temp - current processing group
|
|
DWORD currentStore; // temp - current processing store
|
|
DWORD cxDeadKeyArray;
|
|
PFILE_DEADKEY dpDeadKeyArray; // temp - dead key array
|
|
DWORD cxVKDictionary;
|
|
PFILE_VKDICTIONARY dpVKDictionary; // temp - virtual key dictionary
|
|
};
|
|
|
|
typedef FILE_KEYBOARD *PFILE_KEYBOARD;
|
|
|
|
|
|
//
|
|
//These size values are used in unit tests to ensure
|
|
//that the structure sizes correspond precisely across
|
|
//compilers (pas and c++).
|
|
//
|
|
|
|
const DWORD sz_FILE_STORE = sizeof(FILE_STORE);
|
|
const DWORD sz_FILE_KEY = sizeof(FILE_KEY);
|
|
const DWORD sz_FILE_GROUP = sizeof(FILE_GROUP);
|
|
const DWORD sz_FILE_DEADKEY = sizeof(FILE_DEADKEY);
|
|
const DWORD sz_FILE_VKDICTIONARY = sizeof(FILE_VKDICTIONARY);
|
|
const DWORD sz_FILE_KEYBOARD = sizeof(FILE_KEYBOARD);
|
|
|
|
|
|
struct COMPMSG {
|
|
char szText[SZMAX_ERRORTEXT];
|
|
DWORD Line;
|
|
DWORD dwMsgCode;
|
|
};
|
|
|
|
typedef COMPMSG *PCOMPMSG;
|
|
|
|
|
|
|
|
struct COMPILEMESSAGES {
|
|
int nMessages;
|
|
int nErrors;
|
|
|
|
PCOMPMSG cm;
|
|
|
|
DWORD fatalCode;
|
|
char szFatalText[SZMAX_ERRORTEXT];
|
|
|
|
DWORD currentLine;
|
|
};
|
|
|
|
typedef COMPILEMESSAGES *PCOMPILEMESSAGES;
|
|
|
|
//
|
|
//struct TVersion
|
|
//{
|
|
// //int MinVersion; // 0x0500 usually
|
|
// //int CompilerVersion[4];
|
|
// //int MinCompilerVersion[4];
|
|
// int KeyboardVersion; // 0x0500 usually
|
|
//};
|
|
//
|
|
//extern TVersion FVersionInfo;
|
|
*/
|
|
|
|
/*
|
|
#define bstrcpy(c,d) (LPBYTE)strcpy((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrlen(c) strlen((LPSTR)(c))
|
|
#define bstrcmp(c,d) strcmp((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrncmp(c,d,n) strncmp((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrnicmp(c,d,n) strnicmp((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstricmp(c,d) stricmp((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrchr(c,ch) (LPBYTE)strchr((LPSTR)(c),(char)ch)
|
|
#define bstrncpy(c,d,n) (LPBYTE)strncpy((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrtok(c,d) (LPBYTE)strtok((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrcat(c,d) (LPBYTE)strcat((LPSTR)(c),(LPSTR)(d))
|
|
#define bstrncat(c,d,n) (LPBYTE)strncat((LPSTR)(c),(LPSTR)(d),(n))
|
|
#define bstrrev(c) (LPBYTE)strrev((LPSTR)(c))
|
|
#define batoi(c) atoi((LPSTR)(c))
|
|
#define bstrtol(c,d,n) strtol((LPSTR)(c),(LPSTR *)(d),(n))
|
|
*/
|
|
|
|
/*#endif // _COMPFILE_H*/
|