diff --git a/mac/mcompile/bu_phonetic.kmx b/mac/mcompile/bu_phonetic.kmx deleted file mode 100755 index bf5f8b54a2..0000000000 Binary files a/mac/mcompile/bu_phonetic.kmx and /dev/null differ diff --git a/mac/mcompile/keymap.h b/mac/mcompile/keymap.h index ff0bcf1f85..d0cf0c10ab 100644 --- a/mac/mcompile/keymap.h +++ b/mac/mcompile/keymap.h @@ -6,7 +6,8 @@ #include #include #include -#include "u16.h" + +#include "../../common/include/km_u16.h" enum ShiftState { Base = 0, // 0 diff --git a/mac/mcompile/kmx_file.h b/mac/mcompile/kmx_file.h deleted file mode 100644 index b254eb99af..0000000000 --- a/mac/mcompile/kmx_file.h +++ /dev/null @@ -1,388 +0,0 @@ - -#pragma once -#ifndef KMX_FILE_H -#define KMX_FILE_H - -/* - Copyright: Copyright (C) 2003-2018 SIL International. - Authors: mcdurdin -*/ - -#define UNREFERENCED_PARAMETER(P) (P) -#define TRUNCATE ((size_t) - 1) -#ifdef KMN_KBP -// TODO: move this to a common namespace keyman::common::kmx_file or similar in the future -namespace km { -namespace kbp { -namespace kmx { -#endif - -#define KMX_MAX_ALLOWED_FILE_SIZE (128 * 1024 * 1024) // 128MB // - -#define KEYMAN_LAYOUT_DEFAULT 0x000005FE - -#define KEYMANID_NONKEYMAN 0xFFFFFFFF -#define KEYMANID_IGNORE 0xFFFFFFFE -#define KEYMANID_INVALID 0xFFFFFFFD - -// Shift flags for hotkeys (version 1.0) // -#define SHIFTFLAG 0x2000 -#define CTRLFLAG 0x4000 -#define ALTFLAG 0x8000 - -// Miscellaneous flags and defines // - -#define MAXGROUPS 128 - -// File version identifiers // - -#define VERSION_30 0x00000300 -#define VERSION_31 0x00000301 -#define VERSION_32 0x00000302 -#define VERSION_40 0x00000400 -#define VERSION_50 0x00000500 -#define VERSION_501 0x00000501 -#define VERSION_60 0x00000600 -#define VERSION_70 0x00000700 -#define VERSION_80 0x00000800 -#define VERSION_90 0x00000900 -#define VERSION_100 0x00000A00 -#define VERSION_140 0x00000E00 -#define VERSION_150 0x00000F00 - -#define VERSION_160 0x00001000 - -#define VERSION_MIN VERSION_50 -#define VERSION_MAX VERSION_160 - -// -// Backspace types -// - -#define BK_DEFAULT 0 -#define BK_DEADKEY 1 - -// Different begin types -#define BEGIN_ANSI 0 -#define BEGIN_UNICODE 1 -#define BEGIN_NEWCONTEXT 2 -#define BEGIN_POSTKEYSTROKE 3 - -#define TSS_NONE 0 -#define TSS_BITMAP 1 -#define TSS_COPYRIGHT 2 -#define TSS_HOTKEY 3 -#define TSS_LANGUAGE 4 -#define TSS_LAYOUT 5 -#define TSS_MESSAGE 6 -#define TSS_NAME 7 -#define TSS_VERSION 8 -#define TSS_CAPSONONLY 9 -#define TSS_CAPSALWAYSOFF 10 -#define TSS_SHIFTFREESCAPS 11 -#define TSS_LANGUAGENAME 12 - -#define TSS_CALLDEFINITION 13 -#define TSS_CALLDEFINITION_LOADFAILED 14 - -#define TSS_ETHNOLOGUECODE 15 - -#define TSS_DEBUG_LINE 16 - -#define TSS_MNEMONIC 17 - -#define TSS_INCLUDECODES 18 - -#define TSS_OLDCHARPOSMATCHING 19 - -#define TSS_COMPILEDVERSION 20 -#define TSS_KEYMANCOPYRIGHT 21 - -#define TSS_CUSTOMKEYMANEDITION 22 -#define TSS_CUSTOMKEYMANEDITIONNAME 23 - -// Keyman 7.0 system stores // - -#define TSS__KEYMAN_60_MAX 23 - -#define TSS_VISUALKEYBOARD 24 -#define TSS_KMW_RTL 25 -#define TSS_KMW_HELPFILE 26 -#define TSS_KMW_HELPTEXT 27 -#define TSS_KMW_EMBEDJS 28 - -#define TSS_WINDOWSLANGUAGES 29 - -#define TSS__KEYMAN_70_MAX 29 - -// Keyman 8.0 system stores // - -#define TSS_COMPARISON 30 - -#define TSS__KEYMAN_80_MAX 30 - -// Keyman 9.0 system stores // - -#define TSS_PLATFORM 31 -#define TSS_BASELAYOUT 32 -#define TSS_LAYER 33 - -#define TSS_PLATFORM_NOMATCH 0x8001 // Reserved for internal use - after platform statement is run, set to either TSS_PLATFORM_NOMATCH or TSS_PLATFORM_MATCH -#define TSS_PLATFORM_MATCH 0x8002 // Reserved for internal use - as the result will never change for the lifetime of the process. - -#define TSS_VKDICTIONARY 34 // Dictionary of virtual key names for v9 dynamic layouts -#define TSS_LAYOUTFILE 35 // Keyman 9 layer-based JSON OSK -#define TSS_KEYBOARDVERSION 36 // &keyboardversion system store // I4140 -#define TSS_KMW_EMBEDCSS 37 - -#define TSS_TARGETS 38 - -#define TSS__KEYMAN_90_MAX 38 - -// Keyman 14.0 system stores // - -#define TSS_CASEDKEYS 39 - -#define TSS__KEYMAN_140_MAX 39 - -// Keyman 15.0 system stores // - -#define TSS_BEGIN_NEWCONTEXT 40 -#define TSS_BEGIN_POSTKEYSTROKE 41 -#define TSS_NEWLAYER 42 -#define TSS_OLDLAYER 43 - -#define TSS__KEYMAN_150_MAX 43 - -#define TSS__MAX 43 - -// wm_keyman_control_internal message control codes // - -#define KMCI_SELECTKEYBOARD 3 // I3933 -#define KMCI_SELECTKEYBOARD_TSF 4 // I3933 -#define KMCI_GETACTIVEKEYBOARD 5 // I3933 -#define KMCI_SETFOREGROUND 6 // I3933 -#define KMCI_SELECTKEYBOARD_BACKGROUND 7 // I4271 -#define KMCI_SELECTKEYBOARD_BACKGROUND_TSF 8 // I4271 - -#define FILEID_COMPILED 0x5354584B - -#define SZMAX_LANGUAGENAME 80 -#define SZMAX_KEYBOARDNAME 80 -#define SZMAX_COPYRIGHT 256 -#define SZMAX_MESSAGE 1024 - -#define UC_SENTINEL 0xFFFF -#define UC_SENTINEL_EXTENDEDEND 0x10 // was ((CODE_LASTCODE)+1)... what was I thinking? - -#define U_UC_SENTINEL u"\uFFFF" - -/* - VK__MAX defines the highest virtual key code defined in the system = 0xFF. Custom VK codes start at 256 -*/ -#define VK__MAX 255 - -#define CODE_ANY 0x01 -#define CODE_INDEX 0x02 -#define CODE_CONTEXT 0x03 -#define CODE_NUL 0x04 -#define CODE_USE 0x05 -#define CODE_RETURN 0x06 -#define CODE_BEEP 0x07 -#define CODE_DEADKEY 0x08 -// 0x09 = bkspace.-- we don't need to keep this separate though with UC_SENTINEL -#define CODE_EXTENDED 0x0A -//#define CODE_EXTENDEDEND 0x0B deprecated -#define CODE_SWITCH 0x0C -#define CODE_KEY 0x0D -#define CODE_CLEARCONTEXT 0x0E -#define CODE_CALL 0x0F -// UC_SENTINEL_EXTENDEDEND 0x10 -#define CODE_CONTEXTEX 0x11 - -#define CODE_NOTANY 0x12 - -#define CODE_KEYMAN70_LASTCODE 0x12 - -#define CODE_SETOPT 0x13 -#define CODE_IFOPT 0x14 -#define CODE_SAVEOPT 0x15 -#define CODE_RESETOPT 0x16 - -#define CODE_KEYMAN80_LASTCODE 0x16 - -// Keyman 9.0 codes // - -#define CODE_IFSYSTEMSTORE 0x17 -#define CODE_SETSYSTEMSTORE 0x18 - -#define CODE_LASTCODE 0x18 - -#define U_CODE_ANY u"\u0001" -#define U_CODE_INDEX u"\u0002" -#define U_CODE_CONTEXT u"\u0003" -#define U_CODE_NUL u"\u0004" -#define U_CODE_USE u"\u0005" -#define U_CODE_RETURN u"\u0006" -#define U_CODE_BEEP u"\u0007" -#define U_CODE_DEADKEY u"\u0008" -#define U_CODE_EXTENDED u"\u000A" -#define U_CODE_SWITCH u"\u000C" -#define U_CODE_CLEARCONTEXT u"\u000E" -#define U_CODE_CALL u"\u000F" -#define U_CODE_EXTENDEDEND u"\u0010" -#define U_CODE_CONTEXTEX u"\u0011" -#define U_CODE_NOTANY u"\u0012" -#define U_CODE_SETOPT u"\u0013" -#define U_CODE_IFOPT u"\u0014" -#define U_CODE_SAVEOPT u"\u0015" -#define U_CODE_RESETOPT u"\u0016" -#define U_CODE_IFSYSTEMSTORE u"\u0017" -#define U_CODE_SETSYSTEMSTORE u"\u0018" - -#define C_CODE_ANY(store) U_UC_SENTINEL U_CODE_ANY store -#define C_CODE_INDEX(val1, val2) U_UC_SENTINEL U_CODE_INDEX val1 val2 -#define C_CODE_CONTEXT() U_UC_SENTINEL U_CODE_CONTEXT -#define C_CODE_NUL() U_UC_SENTINEL U_CODE_NUL -#define C_CODE_USE(val) U_UC_SENTINEL U_CODE_USE val -#define C_CODE_RETURN() U_UC_SENTINEL U_CODE_RETURN -#define C_CODE_BEEP() U_UC_SENTINEL U_CODE_BEEP -#define C_CODE_DEADKEY(deadkey) U_UC_SENTINEL U_CODE_DEADKEY deadkey -#define C_CODE_EXTENDED(varargs) U_UC_SENTINEL U_CODE_EXTENDED varargs -#define C_CODE_SWITCH(val) U_UC_SENTINEL U_CODE_SWITCH val -#define C_CODE_CLEARCONTEXT() U_UC_SENTINEL U_CODE_CLEARCONTEXT -#define C_CODE_CALL(val) U_UC_SENTINEL U_CODE_CALL val -#define C_CODE_CONTEXTEX(val) U_UC_SENTINEL U_CODE_CONTEXTEX val -#define C_CODE_NOTANY(val) U_UC_SENTINEL U_CODE_NOTANY val -#define C_CODE_SETOPT(val1, val2) U_UC_SENTINEL U_CODE_SETOPT val1 val2 -#define C_CODE_IFOPT(opt, val1, val2) U_UC_SENTINEL U_CODE_IFOPT opt val1 val2 -#define C_CODE_SAVEOPT(opt) U_UC_SENTINEL U_CODE_SAVEOPT opt -#define C_CODE_RESETOPT(opt) U_UC_SENTINEL U_CODE_RESETOPT opt -#define C_CODE_IFSYSTEMSTORE(store, val1, val2) U_UC_SENTINEL U_CODE_IFSYSTEMSTORE store val1 val2 -#define C_CODE_SETSYSTEMSTORE(store, val) U_UC_SENTINEL U_CODE_SETSYSTEMSTORE store val - -#define KF_SHIFTFREESCAPS 0x0001 -#define KF_CAPSONONLY 0x0002 -#define KF_CAPSALWAYSOFF 0x0004 -#define KF_LOGICALLAYOUT 0x0008 -#define KF_AUTOMATICVERSION 0x0010 - -// 16.0: Support for LDML Keyboards in KMXPlus file format -#define KF_KMXPLUS 0x0020 - -#define HK_ALT 0x00010000 -#define HK_CTRL 0x00020000 -#define HK_SHIFT 0x00040000 - -#define LCTRLFLAG 0x0001 // Left Control flag -#define RCTRLFLAG 0x0002 // Right Control flag -#define LALTFLAG 0x0004 // Left Alt flag -#define RALTFLAG 0x0008 // Right Alt flag -#define K_SHIFTFLAG 0x0010 // Either shift flag -#define K_CTRLFLAG 0x0020 // Either ctrl flag -#define K_ALTFLAG 0x0040 // Either alt flag -//#define K_METAFLAG 0x0080 // Either Meta-key flag (tentative). Not usable in keyboard rules; - // Used internally (currently, only by KMW) to ensure Meta-key - // shortcuts safely bypass rules - // Meta key = Command key on macOS, Windows key on Windows -#define CAPITALFLAG 0x0100 // Caps lock on -#define NOTCAPITALFLAG 0x0200 // Caps lock NOT on -#define NUMLOCKFLAG 0x0400 // Num lock on -#define NOTNUMLOCKFLAG 0x0800 // Num lock NOT on -#define SCROLLFLAG 0x1000 // Scroll lock on -#define NOTSCROLLFLAG 0x2000 // Scroll lock NOT on -#define ISVIRTUALKEY 0x4000 // It is a Virtual Key Sequence -#define VIRTUALCHARKEY 0x8000 // Keyman 6.0: Virtual Key Cap Sequence NOT YET - -#define K_MODIFIERFLAG 0x007F -#define K_NOTMODIFIERFLAG 0xFF00 // I4548 - -struct KMX_COMP_STORE { - KMX_DWORD dwSystemID; - KMX_DWORD dpName; - KMX_DWORD dpString; - }; - -struct KMX_COMP_KEY { - KMX_WORD Key; - KMX_WORD _reserved; - KMX_DWORD Line; - KMX_DWORD ShiftFlags; - KMX_DWORD dpOutput; - KMX_DWORD dpContext; - }; - -struct KMX_COMP_GROUP { - KMX_DWORD dpName; - KMX_DWORD dpKeyArray; // [LPKEY] address of first item in key array - KMX_DWORD dpMatch; - KMX_DWORD dpNoMatch; - KMX_DWORD cxKeyArray; // in array entries - KMX_BOOL fUsingKeys; // group(xx) [using keys] <-- specified or not - }; - -struct KMX_COMP_KEYBOARD { - KMX_DWORD dwIdentifier; // 0000 Keyman compiled keyboard id - - KMX_DWORD dwFileVersion; // 0004 Version of the file - Keyman 4.0 is 0x0400 - - KMX_DWORD dwCheckSum; // 0008 As stored in keyboard. DEPRECATED as of 16.0 - KMX_DWORD KeyboardID; // 000C as stored in HKEY_LOCAL_MACHINE//system//currentcontrolset//control//keyboard layouts - KMX_DWORD IsRegistered; // 0010 - KMX_DWORD version; // 0014 keyboard version - - KMX_DWORD cxStoreArray; // 0018 in array entries - KMX_DWORD cxGroupArray; // 001C in array entries - - KMX_DWORD dpStoreArray; // 0020 [LPSTORE] address of first item in store array - KMX_DWORD dpGroupArray; // 0024 [LPGROUP] address of first item in group array - - KMX_DWORD StartGroup[2]; // 0028 index of starting groups [2 of them] - - KMX_DWORD dwFlags; // 0030 Flags for the keyboard file - - KMX_DWORD dwHotKey; // 0034 standard windows hotkey (hiword=shift/ctrl/alt stuff, loword=vkey) - - KMX_DWORD dpBitmapOffset; // 0038 offset of the bitmaps in the file - KMX_DWORD dwBitmapSize; // 003C size in bytes of the bitmaps -}; - -struct KMX_COMP_KEYBOARD_KMXPLUSINFO { - KMX_DWORD dpKMXPlus; // 0040 offset of KMXPlus data, header is first - KMX_DWORD dwKMXPlusSize; // 0044 size in bytes of entire KMXPlus data -}; - -// - //* Only valid if comp_keyboard.dwFlags&KF_KMXPLUS - // -struct KMX_COMP_KEYBOARD_EX { - KMX_COMP_KEYBOARD header; // 0000 see COMP_KEYBOARD - KMX_COMP_KEYBOARD_KMXPLUSINFO kmxplus; // 0040 see COMP_KEYBOARD_EXTRA -}; - -typedef KMX_COMP_KEYBOARD *PKMX_COMP_KEYBOARD; -typedef KMX_COMP_STORE *PKMX_COMP_STORE; -typedef KMX_COMP_KEY *PKMX_COMP_KEY; -typedef KMX_COMP_GROUP *PKMX_COMP_GROUP; - - -extern const int CODE__SIZE[]; -#define CODE__SIZE_MAX 5 - -#define KEYBOARDFILEHEADER_SIZE 64 -#define KEYBOARDFILESTORE_SIZE 12 -#define KEYBOARDFILEGROUP_SIZE 24 -#define KEYBOARDFILEKEY_SIZE 20 - -static_assert(sizeof(KMX_COMP_STORE) == KEYBOARDFILESTORE_SIZE, "COMP_STORE must be KEYBOARDFILESTORE_SIZE bytes"); -static_assert(sizeof(KMX_COMP_KEY) == KEYBOARDFILEKEY_SIZE, "COMP_KEY must be KEYBOARDFILEKEY_SIZE bytes"); -static_assert(sizeof(KMX_COMP_GROUP) == KEYBOARDFILEGROUP_SIZE, "COMP_GROUP must be KEYBOARDFILEGROUP_SIZE bytes"); -static_assert(sizeof(KMX_COMP_KEYBOARD) == KEYBOARDFILEHEADER_SIZE, "COMP_KEYBOARD must be KEYBOARDFILEHEADER_SIZE bytes"); - -#ifdef KMN_KBP -} // namespace kmx -} // namespace kbp -} // namespace km -#endif -#endif //KMX_FILE_H - diff --git a/mac/mcompile/mc_kmxfile.cpp b/mac/mcompile/mc_kmxfile.cpp index 86845f8165..d75f3076de 100644 --- a/mac/mcompile/mc_kmxfile.cpp +++ b/mac/mcompile/mc_kmxfile.cpp @@ -58,18 +58,18 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX LPKMX_STORE fsp; LPKMX_KEY fkp; - PKMX_COMP_KEYBOARD ck; - PKMX_COMP_GROUP gp; - PKMX_COMP_STORE sp; - PKMX_COMP_KEY kp; + PCOMP_KEYBOARD ck; + PCOMP_GROUP gp; + PCOMP_STORE sp; + PCOMP_KEY kp; PKMX_BYTE buf; KMX_DWORD size, offset; KMX_DWORD i, j; // Calculate how much memory to allocate - size = sizeof(KMX_COMP_KEYBOARD) + - fk->cxGroupArray * sizeof(KMX_COMP_GROUP) + - fk->cxStoreArray * sizeof(KMX_COMP_STORE) + + size = sizeof(COMP_KEYBOARD) + + fk->cxGroupArray * sizeof(COMP_GROUP) + + fk->cxStoreArray * sizeof(COMP_STORE) + //wcslen(fk->szName)*2 + 2 + //wcslen(fk->szCopyright)*2 + 2 + //wcslen(fk->szLanguageName)*2 + 2 + @@ -79,7 +79,7 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX for (i = 0, fgp = fk->dpGroupArray; i < fk->cxGroupArray; i++, fgp++) { if (fgp->dpName) size += (u16len(fgp->dpName) + 1) * sizeof(KMX_WCHAR); - size += fgp->cxKeyArray * sizeof(KMX_COMP_KEY); + size += fgp->cxKeyArray * sizeof(COMP_KEY); for (j = 0, fkp = fgp->dpKeyArray; j < fgp->cxKeyArray; j++, fkp++) { size += (u16len(fkp->dpOutput) + 1) * sizeof(KMX_WCHAR); size += (u16len(fkp->dpContext) + 1) * sizeof(KMX_WCHAR); @@ -100,7 +100,7 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX return CERR_CannotAllocateMemory; memset(buf, 0, size); - ck = (PKMX_COMP_KEYBOARD)buf; + ck = (PCOMP_KEYBOARD)buf; ck->dwIdentifier = FILEID_COMPILED; @@ -116,12 +116,12 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX ck->dwFlags = fk->dwFlags; - offset = sizeof(KMX_COMP_KEYBOARD); + offset = sizeof(COMP_KEYBOARD); ck->dpStoreArray = offset; - sp = (PKMX_COMP_STORE)(buf + offset); + sp = (PCOMP_STORE)(buf + offset); fsp = fk->dpStoreArray; - offset += sizeof(KMX_COMP_STORE) * ck->cxStoreArray; + offset += sizeof(COMP_STORE) * ck->cxStoreArray; for (i = 0; i < ck->cxStoreArray; i++, sp++, fsp++) { sp->dwSystemID = fsp->dwSystemID; sp->dpString = offset; @@ -138,9 +138,9 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX } ck->dpGroupArray = offset; - gp = (PKMX_COMP_GROUP)(buf + offset); + gp = (PCOMP_GROUP)(buf + offset); - offset += sizeof(KMX_COMP_GROUP) * ck->cxGroupArray; + offset += sizeof(COMP_GROUP) * ck->cxGroupArray; for (i = 0, fgp = fk->dpGroupArray; i < ck->cxGroupArray; i++, gp++, fgp++) { gp->cxKeyArray = fgp->cxKeyArray; @@ -168,8 +168,8 @@ KMX_DWORD KMX_WriteCompiledKeyboardToFile(LPKMX_KEYBOARD fk, FILE* hOutfile, KMX } gp->dpKeyArray = offset; - kp = (PKMX_COMP_KEY)(buf + offset); - offset += gp->cxKeyArray * sizeof(KMX_COMP_KEY); + kp = (PCOMP_KEY)(buf + offset); + offset += gp->cxKeyArray * sizeof(COMP_KEY); for (j = 0, fkp = fgp->dpKeyArray; j < gp->cxKeyArray; j++, kp++, fkp++) { kp->Key = fkp->Key; @@ -265,7 +265,7 @@ PKMX_WCHAR KMX_StringOffset(PKMX_BYTE base, KMX_DWORD offset) { * @return pointer to the keyboard */ LPKMX_KEYBOARD KMX_CopyKeyboard(PKMX_BYTE bufp, PKMX_BYTE base) { - PKMX_COMP_KEYBOARD ckbp = (PKMX_COMP_KEYBOARD)base; + PCOMP_KEYBOARD ckbp = (PCOMP_KEYBOARD)base; // Copy keyboard structure // @@ -291,20 +291,20 @@ LPKMX_KEYBOARD KMX_CopyKeyboard(PKMX_BYTE bufp, PKMX_BYTE base) { kbp->dpGroupArray = (LPKMX_GROUP)bufp; bufp += sizeof(KMX_GROUP) * kbp->cxGroupArray; - PKMX_COMP_STORE csp; + PCOMP_STORE csp; LPKMX_STORE sp; KMX_DWORD i; - for (csp = (PKMX_COMP_STORE)(base + ckbp->dpStoreArray), sp = kbp->dpStoreArray, i = 0; i < kbp->cxStoreArray; i++, sp++, csp++) { + for (csp = (PCOMP_STORE)(base + ckbp->dpStoreArray), sp = kbp->dpStoreArray, i = 0; i < kbp->cxStoreArray; i++, sp++, csp++) { sp->dwSystemID = csp->dwSystemID; sp->dpName = KMX_StringOffset(base, csp->dpName); sp->dpString = KMX_StringOffset(base, csp->dpString); } - PKMX_COMP_GROUP cgp; + PCOMP_GROUP cgp; LPKMX_GROUP gp; - for (cgp = (PKMX_COMP_GROUP)(base + ckbp->dpGroupArray), gp = kbp->dpGroupArray, i = 0; i < kbp->cxGroupArray; i++, gp++, cgp++) { + for (cgp = (PCOMP_GROUP)(base + ckbp->dpGroupArray), gp = kbp->dpGroupArray, i = 0; i < kbp->cxGroupArray; i++, gp++, cgp++) { gp->dpName = KMX_StringOffset(base, cgp->dpName); gp->dpKeyArray = cgp->cxKeyArray > 0 ? (LPKMX_KEY)bufp : NULL; gp->cxKeyArray = cgp->cxKeyArray; @@ -313,11 +313,11 @@ LPKMX_KEYBOARD KMX_CopyKeyboard(PKMX_BYTE bufp, PKMX_BYTE base) { gp->dpNoMatch = KMX_StringOffset(base, cgp->dpNoMatch); gp->fUsingKeys = cgp->fUsingKeys; - PKMX_COMP_KEY ckp; + PCOMP_KEY ckp; LPKMX_KEY kp; KMX_DWORD j; - for (ckp = (PKMX_COMP_KEY)(base + cgp->dpKeyArray), kp = gp->dpKeyArray, j = 0; j < gp->cxKeyArray; j++, kp++, ckp++) { + for (ckp = (PCOMP_KEY)(base + cgp->dpKeyArray), kp = gp->dpKeyArray, j = 0; j < gp->cxKeyArray; j++, kp++, ckp++) { kp->Key = ckp->Key; kp->Line = ckp->Line; kp->ShiftFlags = ckp->ShiftFlags; @@ -343,10 +343,10 @@ LPKMX_KEYBOARD KMX_FixupKeyboard(PKMX_BYTE bufp, PKMX_BYTE base, KMX_DWORD dwFil UNREFERENCED_PARAMETER(dwFileSize); KMX_DWORD i, j; - PKMX_COMP_KEYBOARD ckbp = (PKMX_COMP_KEYBOARD)base; - PKMX_COMP_GROUP cgp; - PKMX_COMP_STORE csp; - PKMX_COMP_KEY ckp; + PCOMP_KEYBOARD ckbp = (PCOMP_KEYBOARD)base; + PCOMP_GROUP cgp; + PCOMP_STORE csp; + PCOMP_KEY ckp; LPKMX_KEYBOARD kbp = (LPKMX_KEYBOARD)bufp; LPKMX_STORE sp; LPKMX_GROUP gp; @@ -355,18 +355,18 @@ LPKMX_KEYBOARD KMX_FixupKeyboard(PKMX_BYTE bufp, PKMX_BYTE base, KMX_DWORD dwFil kbp->dpStoreArray = (LPKMX_STORE)(base + ckbp->dpStoreArray); kbp->dpGroupArray = (LPKMX_GROUP)(base + ckbp->dpGroupArray); - for (sp = kbp->dpStoreArray, csp = (PKMX_COMP_STORE)sp, i = 0; i < kbp->cxStoreArray; i++, sp++, csp++) { + for (sp = kbp->dpStoreArray, csp = (PCOMP_STORE)sp, i = 0; i < kbp->cxStoreArray; i++, sp++, csp++) { sp->dpName = KMX_StringOffset(base, csp->dpName); sp->dpString = KMX_StringOffset(base, csp->dpString); } - for (gp = kbp->dpGroupArray, cgp = (PKMX_COMP_GROUP)gp, i = 0; i < kbp->cxGroupArray; i++, gp++, cgp++) { + for (gp = kbp->dpGroupArray, cgp = (PCOMP_GROUP)gp, i = 0; i < kbp->cxGroupArray; i++, gp++, cgp++) { gp->dpName = KMX_StringOffset(base, cgp->dpName); gp->dpKeyArray = (LPKMX_KEY)(base + cgp->dpKeyArray); if (cgp->dpMatch != NULL)gp->dpMatch = (PKMX_WCHAR)(base + cgp->dpMatch); if (cgp->dpNoMatch != NULL)gp->dpNoMatch = (PKMX_WCHAR)(base + cgp->dpNoMatch); - for (kp = gp->dpKeyArray, ckp = (PKMX_COMP_KEY)kp, j = 0; j < gp->cxKeyArray; j++, kp++, ckp++) { + for (kp = gp->dpKeyArray, ckp = (PCOMP_KEY)kp, j = 0; j < gp->cxKeyArray; j++, kp++, ckp++) { kp->dpOutput = (PKMX_WCHAR)(base + ckp->dpOutput); kp->dpContext = (PKMX_WCHAR)(base + ckp->dpContext); } @@ -497,14 +497,14 @@ KMX_BOOL KMX_LoadKeyboard(KMX_CHAR* fileName, LPKMX_KEYBOARD* lpKeyboard) { */ KMX_BOOL KMX_VerifyKeyboard(PKMX_BYTE filebase, KMX_DWORD file_size) { KMX_DWORD i; - PKMX_COMP_KEYBOARD ckbp = (PKMX_COMP_KEYBOARD)filebase; - PKMX_COMP_STORE csp; + PCOMP_KEYBOARD ckbp = (PCOMP_KEYBOARD)filebase; + PCOMP_STORE csp; // Check file version // if (ckbp->dwFileVersion < VERSION_MIN || ckbp->dwFileVersion > VERSION_MAX) { // Old or new version -- identify the desired program version // - for (csp = (PKMX_COMP_STORE)(filebase + ckbp->dpStoreArray), i = 0; i < ckbp->cxStoreArray; i++, csp++) { + for (csp = (PCOMP_STORE)(filebase + ckbp->dpStoreArray), i = 0; i < ckbp->cxStoreArray; i++, csp++) { if (csp->dwSystemID == TSS_COMPILEDVERSION) { if (csp->dpString == 0) { mac_KMX_LogError(L"errWrongFileVersion:NULL"); diff --git a/mac/mcompile/mc_kmxfile.h b/mac/mcompile/mc_kmxfile.h index 12d9ba4a8c..014a8146bf 100644 --- a/mac/mcompile/mc_kmxfile.h +++ b/mac/mcompile/mc_kmxfile.h @@ -3,7 +3,7 @@ #define MC_KMXFILE_H #include "../../common/include/km_types.h" -#include "kmx_file.h" +#include "../../common/include/kmx_file.h" #include "mcompile.h" #ifndef _KMXFILE_H diff --git a/mac/mcompile/mcompile.cpp b/mac/mcompile/mcompile.cpp index a13d04d7fa..e3ccd0353e 100644 --- a/mac/mcompile/mcompile.cpp +++ b/mac/mcompile/mcompile.cpp @@ -13,7 +13,7 @@ #include #include #include "mcompile.h" -#include "u16.h" +#include "../../common/include/km_u16.h" /** @brief convert mnemonic keyboard layout to positional keyboard layout and translate keyboard */ KMX_BOOL mac_KMX_DoConvert(LPKMX_KEYBOARD kbd, KMX_BOOL bDeadkeyConversion, int argc); diff --git a/mac/mcompile/meson.build b/mac/mcompile/meson.build new file mode 100644 index 0000000000..30e9d2e375 --- /dev/null +++ b/mac/mcompile/meson.build @@ -0,0 +1,29 @@ +project('mcompile', 'c', 'cpp', + license: 'MIT', + meson_version: '>=1.0') + +carbon = dependency('Carbon') + +deps = [carbon] + +# subdir('resources') + +cpp_files = files( + 'keymap.cpp', + 'mcompile.cpp', + 'mc_kmxfile.cpp', + 'mc_import_rules.cpp', + '../../common/cpp/km_u16.cpp', + ) + +comon_include_dir = [ + include_directories('../../common/include') +] + +mcompile = executable( + 'mcompile', + cpp_args: ['-std=c++17'], # this should be defined from resources/standard.meson.build + sources: [cpp_files], + dependencies: deps, + include_directories : comon_include_dir + ) \ No newline at end of file diff --git a/mac/mcompile/sil_sahu.kmx b/mac/mcompile/sil_sahu.kmx deleted file mode 100755 index e5548549a7..0000000000 Binary files a/mac/mcompile/sil_sahu.kmx and /dev/null differ diff --git a/mac/mcompile/u16.cpp b/mac/mcompile/u16.cpp deleted file mode 100644 index 2ee561e5a6..0000000000 --- a/mac/mcompile/u16.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Keyman is copyright (C) 2004 - 2024 SIL International. MIT License. - * - * Functions for u16string - */ - -#include "u16.h" -#include -#include -#include -#include "../../core/src/utfcodec.hpp" - -/** string <- wstring -* @brief Obtain a std::string from a std::wstring -* @param wstr the std::wstring to be converted -* @return a std::string -*/ -std::string string_from_wstring(std::wstring const wstr) { - return convert((const std::wstring)wstr); -} - -/** wstring <- string -* @brief Obtain a std::wstring from a std::string -* @param str the std::string to be converted -* @return a std::wstring -*/ -std::wstring wstring_from_string(std::string const str) { - return convert((const std::string)str); -} - -/** u16String <- string -* @brief Obtain a std::u16tring from a std::string -* @param str the std::string to be converted -* @return a std::u16string -*/ -std::u16string u16string_from_string(std::string const str) { - return convert((const std::string)str); -} - -/** string <- u16string -* @brief Obtain a std::string from a std::u16string -* @param str16 the std::u16string to be converted -* @return a std::string -*/ -std::string string_from_u16string(std::u16string const str16) { - return convert((const std::u16string)str16); -} - -/** wstring <- u16string -* @brief Obtain a std::wstring from a std::u16string -* @param str16 the std::u16string to be converted -* @return a std::wstring -*/ -std::wstring wstring_from_u16string(std::u16string const str16) { - return convert((const std::u16string)str16); -} - -/** u16string <- wstring -* @brief Obtain a std::u16string from a std::wstring -* @param wstr the std::wstring to be converted -* @return a std::u16string -*/ -std::u16string u16string_from_wstring(std::wstring const wstr) { - return convert((const std::wstring)wstr);; -} - -/** UTF16 (=const wchar_t*) -> std::string -> std::u16string -> UTF16 ( = char16_t*) -* @brief Convert pointer to wchar_t to pointer to char16_t and copy sz elements into dst -* @param dst destination -* @param sz nr of characters to be copied -* @param fmt source to convert and copy -* @return void -*/ -void u16sprintf(KMX_WCHAR* dst, const size_t sz, const wchar_t* fmt, ...) { - wchar_t* wbuf = new wchar_t[sz]; - va_list args; - va_start(args, fmt); - vswprintf(wbuf, sz, fmt, args); - va_end(args); - - std::u16string u16str = u16string_from_wstring(wbuf); - u16ncpy(dst, u16str.c_str(), sz); - delete[] wbuf; -} - -/** -* @brief Convert u16string to long integer -* @param str u16string beginning with the representation of an integral number. -* @param endptr Reference to the next character in str -* @param base Numerical base (radix) that determines the valid characters and their interpretation -* @return a long -*/ -long int u16tol(const KMX_WCHAR* str, KMX_WCHAR** endptr, int base) { - auto s = string_from_u16string(str); - char* t; - long int result = strtol(s.c_str(), &t, base); - if (endptr != nullptr) - *endptr = (KMX_WCHAR*)str + (t - s.c_str()); - return result; -} - -/** - * @brief Append n characters from u16string - * @param dst Pointer to the destination array - * @param src u16string to be appended - * @param max Maximum number of characters to be appended. - * @return Pointer to the destination array - */ -const KMX_WCHAR* u16ncat(KMX_WCHAR* dst, const KMX_WCHAR* src, size_t max) { - KMX_WCHAR* o = dst; - dst = (KMX_WCHAR*)u16chr(dst, 0); - // max -= (dst-o); - while (*src && max > 0) { - *dst++ = *src++; - max--; - } - if (max > 0) - *dst = 0; - return o; -} - -/** - * @brief Find last '/' or '\\' in an array of char16_t - * @param name Pointer to the source - * @return Pointer to the last slash/backslash - */ -const KMX_WCHAR* u16rchr_slash(KMX_WCHAR const* name) { - const KMX_WCHAR* cp = NULL; - cp = u16rchr(name, '\\'); - if (cp == NULL) - cp = u16rchr(name, '/'); - return cp; -} - -/** - * @brief Find last '/' or '\\' in an array of char - * @param name Pointer to the source - * @return Pointer to the last slash/backslash - */ -KMX_CHAR* strrchr_slash(KMX_CHAR* name) { - KMX_CHAR* cp = NULL; - cp = strrchr(name, '\\'); - if (cp == NULL) - cp = strrchr(name, '/'); - return cp; -} - -/** - * @brief Locate last occurrence of character in u16string - * @param p Pointer to the source - * @param ch The character to be found - * @return A pointer to the last occurrence of character in u16str - */ -const KMX_WCHAR* u16rchr(const KMX_WCHAR* p, KMX_WCHAR ch) { - const KMX_WCHAR* p_end = p + u16len(p); - - while (p_end > p) { - if (*p_end == ch) - return p_end; - p_end--; - } - return NULL; -} - -/** - * @brief Locate first occurrence of character in u16string - * @param p Pointer to the source - * @param ch The character to be found - * @return A pointer to the first occurrence of character in u16str - */ -const KMX_WCHAR* u16chr(const KMX_WCHAR* p, KMX_WCHAR ch) { - while (*p) { - if (*p == ch) - return p; - p++; - } - return ch == 0 ? p : NULL; -} - -/** -* @brief Copy the u16string pointed by src into the array pointed by dst -* @param dst Pointer to the destination -* @param src Pointer to the source to be copied -* @return Pointer to dst -*/ -const KMX_WCHAR* u16cpy(KMX_WCHAR* dst, const KMX_WCHAR* src) { - KMX_WCHAR* o = dst; - while (*src) { - *dst++ = *src++; - } - *dst = 0; - return o; -} - -/** -* @brief Copy max characters of the u16string pointed by src into the array pointed by dst -* @param dst Pointer to the destination -* @param src Pointer to the source to be copied -* @param max Maximum number of characters to be copied -* @return Pointer to dst -*/ -const KMX_WCHAR* u16ncpy(KMX_WCHAR* dst, const KMX_WCHAR* src, size_t max) { - KMX_WCHAR* o = dst; - while (*src && max > 0) { - *dst++ = *src++; - max--; - } - if (max > 0) { - *dst = 0; - } - return o; -} - -/** -* @brief Return the length of the u16string str -* @param p Pointer to the source -* @return The length of u16string -*/ -size_t u16len(const KMX_WCHAR* p) { - int i = 0; - while (*p) { - p++; - i++; - } - return i; -} - -/** -* @brief Compare two u16strings -* @param p Pointer one u16string -* @param q Pointer another u16string -* @return 0 if strings are eqaual -* ! = 0 if unequal -*/ -int u16cmp(const KMX_WCHAR* p, const KMX_WCHAR* q) { - while (*p && *q) { - if (*p != *q) - return *p - *q; - p++; - q++; - } - return *p - *q; -} - -/** -* @brief Case insensitive comparison of up to count characters in two strings -* @param p Pointer one u16string -* @param q Pointer another u16string -* @param count Maximum number of characters to compare -* @return 0 if strings are equal -* ! = 0 if unequal -*/ -int u16nicmp(const KMX_WCHAR* p, const KMX_WCHAR* q, size_t count) { - while (*p && *q && count) { - if (toupper(*p) != toupper(*q)) - return *p - *q; - p++; - q++; - count--; - } - if (count) - return *p - *q; - return 0; -} - -/** -* @brief Case insensitive comparison of two strings -* @param p Pointer one u16string -* @param q Pointer another u16string -* @return 0 if strings are equal -* ! = 0 if unequal -*/ -int u16icmp(const KMX_WCHAR* p, const KMX_WCHAR* q) { - while (*p && *q) { - if (toupper(*p) != toupper(*q)) - return *p - *q; - p++; - q++; - } - return *p - *q; -} - -/** -* @brief Comparison of up to count characters in two strings -* @param p Pointer one u16string -* @param q Pointer another u16string -* @param count Maximum number of characters to compare -* @return 0 if strings are equal -* ! = 0 if unequal -*/ -int u16ncmp(const KMX_WCHAR* p, const KMX_WCHAR* q, size_t count) { - while (*p && *q && count) { - if (*p != *q) - return *p - *q; - p++; - q++; - count--; - } - if (count) - return *p - *q; - return 0; -} - -/** -* @brief Split u16string into tokens -* @param p Pointer to u16string to parse -* @param ch the delimiter character -* @param ctx the remaining string after the first delimiter -* @return Pointer to the first token in p -*/ -KMX_WCHAR* u16tok(KMX_WCHAR* p, const KMX_WCHAR ch, KMX_WCHAR** ctx) { - if (!p) { - p = *ctx; - if (!p) - return NULL; - } - KMX_WCHAR* q = p; - while (*q && *q != ch) { - q++; - } - if (*q) { - *q = 0; - q++; - while (*q == ch) - q++; - *ctx = q; - } else { - *ctx = NULL; - } - return *p ? p : NULL; -} - -/** -* @brief Split u16string into tokens -* @param p Pointer to u16string to parse -* @param delimiters an array of delimiter characters -* @param ctx the remaining string after the first delimiter -* @return Pointer to the first token in p -*/ -KMX_WCHAR* u16tok(KMX_WCHAR* p, const KMX_WCHAR* delimiters, KMX_WCHAR** ctx) { - if (!p) { - p = *ctx; - if (!p) - return NULL; - } - - KMX_WCHAR* q = p; - while (*q && !u16chr(delimiters, *q)) { - q++; - } - if (*q) { - *q = 0; - q++; - while (*q && u16chr(delimiters, *q)) - q++; - *ctx = q; - } else { - *ctx = NULL; - } - return *p ? p : NULL; -} - -/** -* @brief Convert a u16string to a double -* @param str Pointer to u16string -* @return double value equivalent to the string -*/ -double u16tof(KMX_WCHAR* str) { - double val = 0; - int offsetdot = 0; - char digit; - - PKMX_WCHAR q = (PKMX_WCHAR)u16chr(str, '.'); - size_t pos_dot = (q - str < 0) ? u16len(str) : q - str; - - for (size_t i = 0; i < u16len(str); i++) { - digit = static_cast(towupper(*str)); - - if (i > pos_dot - 1) - offsetdot = 1; - - if (digit != '.') - val = val + ((int(digit)) - 48) * pow(10, (pos_dot - 1 - i + offsetdot)); - - str++; - } - return val; -} diff --git a/mac/mcompile/u16.h b/mac/mcompile/u16.h deleted file mode 100644 index aeafde33c0..0000000000 --- a/mac/mcompile/u16.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef U16_H -#define U16_H -#pragma once - -#include "../../common/include/km_types.h" -#include -#include -#include -#include -#include -#include - - -/** @brief Obtain a std::string from a std::wstring */ -std::string string_from_wstring(std::wstring const wstr); - -/** @brief Obtain a std::wstring from a std::string */ -std::wstring wstring_from_string(std::string const str); - -/** @brief Obtain a std::u16tring from a std::string*/ -std::u16string u16string_from_string(std::string const str); - -/** @brief Obtain a std::string from a std::u16string */ -std::string string_from_u16string(std::u16string const str16); - -/** @brief Obtain a std::wstring from a std::u16string */ -std::wstring wstring_from_u16string(std::u16string const str16); - -/** @brief Obtain a std::u16string from a std::wstring */ -std::u16string u16string_from_wstring(std::wstring const wstr); - -/** @brief Convert pointer to wchar_t to pointer to char16_t and copy sz elements into dst */ -void u16sprintf(KMX_WCHAR* dst, const size_t sz, const wchar_t* fmt, ...); - -/** @brief Convert u16string to long integer */ -long int u16tol(const KMX_WCHAR* str, KMX_WCHAR** endptr, int base); - -/** @brief Append max characters from u16string */ -const KMX_WCHAR* u16ncat(KMX_WCHAR* dst, const KMX_WCHAR* src, size_t max); - -/** @brief find last '/' or '\\' in an array of char16_t */ -const KMX_WCHAR* u16rchr_slash(KMX_WCHAR const* Name); - -/** @brief find last '/' or '\\' in an array of char */ -KMX_CHAR* strrchr_slash(KMX_CHAR* Name); - -/** @brief Locate last occurrence of character in u16string */ -const KMX_WCHAR* u16rchr(const KMX_WCHAR* p, KMX_WCHAR ch); - -/** @brief Locate first occurrence of character in u16string */ -const KMX_WCHAR* u16chr(const KMX_WCHAR* p, KMX_WCHAR ch); - -/** @brief Copy the u16string pointed to by src into the array pointed to by dst */ -const KMX_WCHAR* u16cpy(KMX_WCHAR* dst, const KMX_WCHAR* src); - -/** @brief Copy max characters of the u16string pointed to by src into the array pointed to by dst */ -const KMX_WCHAR* u16ncpy(KMX_WCHAR* dst, const KMX_WCHAR* src, size_t max); - -/** @brief Return the length of the u16string str */ -size_t u16len(const KMX_WCHAR* p); - -/** @brief Compare two u16strings */ -int u16cmp(const KMX_WCHAR* p, const KMX_WCHAR* q); - -/** @brief Case insensitive comparison of up to count characters in two strings */ -int u16nicmp(const KMX_WCHAR* p, const KMX_WCHAR* q, size_t count); - -/** @brief Case insensitive comparison of two strings */ -int u16icmp(const KMX_WCHAR* p, const KMX_WCHAR* q); - -/** @brief Comparison of up to count characters in two strings */ -int u16ncmp(const KMX_WCHAR* p, const KMX_WCHAR* q, size_t count); - -/** @brief Split u16string into tokens */ -KMX_WCHAR* u16tok(KMX_WCHAR* p, const KMX_WCHAR ch, KMX_WCHAR** ctx); - -/** @brief Split u16string into tokens */ -KMX_WCHAR* u16tok(KMX_WCHAR* p, const KMX_WCHAR* delimiters, KMX_WCHAR** ctx); - -/** @brief Convert a u16string to a double */ -double u16tof(KMX_WCHAR* str); - -#endif /* U16_H */