mirror of
https://github.com/keymanapp/keyman.git
synced 2026-09-12 18:47:41 +00:00
Keyman Developer Compiler should warn on deprecated language tags for Keyman 10 keyboards
This commit is contained in:
parent
99144df7bf
commit
ac83ebb8a9
10 changed files with 125 additions and 29 deletions
|
|
@ -79,6 +79,9 @@
|
|||
#include <comperr.h>
|
||||
#include <vkeys.h>
|
||||
#include <versioning.h>
|
||||
#include <kmcmpdll.h>
|
||||
#include <DeprecationChecks.h>
|
||||
|
||||
#include "virtualcharkeys.h"
|
||||
|
||||
#include "crc32.h"
|
||||
|
|
@ -288,10 +291,6 @@ BOOL AddCompileMessage(DWORD msg)
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define SetError(err) { if(AddCompileMessage(err)) return FALSE; }
|
||||
#define AddWarning(warn) { if(AddCompileMessage(warn)) return FALSE; }
|
||||
|
||||
|
||||
extern "C" BOOL __declspec(dllexport) CompileKeyboardFile(PSTR pszInfile, PSTR pszOutfile, BOOL ASaveDebug, BOOL ACompilerWarningsAsErrors, BOOL AWarnDeprecatedCode, CompilerMessageProc pMsgProc) // I4865 // I4866
|
||||
{
|
||||
|
|
@ -560,7 +559,14 @@ BOOL CompileKeyboardHandle(HANDLE hInfile, PFILE_KEYBOARD fk)
|
|||
|
||||
delete str;
|
||||
|
||||
return CheckKeyboardFinalVersion(fk);
|
||||
if (!CheckKeyboardFinalVersion(fk)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Flag presence of deprecated features */
|
||||
CheckForDeprecatedFeatures(fk);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
DWORD ProcessBeginLine(PFILE_KEYBOARD fk, PWSTR p)
|
||||
|
|
@ -598,13 +604,6 @@ DWORD ProcessBeginLine(PFILE_KEYBOARD fk, PWSTR p)
|
|||
return CERR_None;
|
||||
}
|
||||
|
||||
DWORD WarnDeprecatedCode() { // I4866
|
||||
if(FWarnDeprecatedCode) {
|
||||
AddWarning(CWARN_HeaderStatementIsDeprecated);
|
||||
}
|
||||
return CERR_None;
|
||||
}
|
||||
|
||||
DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
||||
{
|
||||
PWSTR p, q, pp;
|
||||
|
|
@ -640,7 +639,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
break;
|
||||
|
||||
case T_NAME:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
q = GetDelimitedString(&p, L"\"\"", 0);
|
||||
if( !q ) return CERR_InvalidName;
|
||||
|
||||
|
|
@ -648,7 +647,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
break;
|
||||
|
||||
case T_COPYRIGHT:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
q = GetDelimitedString(&p, L"\"\"", 0);
|
||||
if(!q) return CERR_InvalidCopyright;
|
||||
|
||||
|
|
@ -656,7 +655,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
break;
|
||||
|
||||
case T_MESSAGE:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
q = GetDelimitedString(&p, L"\"\"", 0);
|
||||
if(!q) return CERR_InvalidMessage;
|
||||
|
||||
|
|
@ -664,7 +663,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
break;
|
||||
|
||||
case T_LANGUAGENAME:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
q = GetDelimitedString(&p, L"\"\"", 0);
|
||||
if(!q) return CERR_InvalidLanguageName;
|
||||
|
||||
|
|
@ -673,7 +672,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
|
||||
case T_LANGUAGE:
|
||||
{
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
wchar_t *tokcontext = NULL;
|
||||
q = wcstok_s(p, L"\n", &tokcontext); // I3481
|
||||
if((msg = AddStore(fk, TSS_LANGUAGE, q)) != CERR_None) return msg;
|
||||
|
|
@ -681,30 +680,30 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
}
|
||||
case T_LAYOUT:
|
||||
{
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
wchar_t *tokcontext = NULL;
|
||||
q = wcstok_s(p, L"\n", &tokcontext); // I3481
|
||||
if((msg = AddStore(fk, TSS_LAYOUT, q)) != CERR_None) return msg;
|
||||
break;
|
||||
}
|
||||
case T_CAPSOFF:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
if((msg = AddStore(fk, TSS_CAPSALWAYSOFF, L"1")) != CERR_None) return msg;
|
||||
break;
|
||||
|
||||
case T_CAPSON:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
if((msg = AddStore(fk, TSS_CAPSONONLY, L"1")) != CERR_None) return msg;
|
||||
break;
|
||||
|
||||
case T_SHIFT:
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
if((msg = AddStore(fk, TSS_SHIFTFREESCAPS, L"1")) != CERR_None) return msg;
|
||||
break;
|
||||
|
||||
case T_HOTKEY:
|
||||
{
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
wchar_t *tokcontext = NULL;
|
||||
if((q = wcstok_s(p, L"\n", &tokcontext)) == NULL) return CERR_CodeInvalidInThisSection; // I3481
|
||||
if((msg = AddStore(fk, TSS_HOTKEY, q)) != CERR_None) return msg;
|
||||
|
|
@ -712,7 +711,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
}
|
||||
case T_BITMAP:
|
||||
{
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
wchar_t *tokcontext = NULL;
|
||||
if((q = wcstok_s(p, L"\n", &tokcontext)) == NULL) return CERR_InvalidBitmapLine; // I3481
|
||||
|
||||
|
|
@ -724,7 +723,7 @@ DWORD ParseLine(PFILE_KEYBOARD fk, PWSTR str)
|
|||
}
|
||||
case T_BITMAPS:
|
||||
{
|
||||
WarnDeprecatedCode(); // I4866
|
||||
WarnDeprecatedHeader(); // I4866
|
||||
wchar_t *tokcontext = NULL;
|
||||
AddWarning(CWARN_BitmapNotUsed);
|
||||
|
||||
|
|
@ -1003,6 +1002,7 @@ DWORD ProcessStoreLine(PFILE_KEYBOARD fk, PWSTR p)
|
|||
fk->dpStoreArray = sp;
|
||||
sp = &fk->dpStoreArray[fk->cxStoreArray];
|
||||
|
||||
sp->line = currentLine;
|
||||
sp->fIsOption = FALSE;
|
||||
sp->fIsReserved = FALSE;
|
||||
sp->fIsStore = FALSE;
|
||||
|
|
@ -1066,6 +1066,7 @@ DWORD AddStore(PFILE_KEYBOARD fk, DWORD SystemID, PWSTR str, DWORD *dwStoreID)
|
|||
fk->dpStoreArray = sp;
|
||||
sp = &fk->dpStoreArray[fk->cxStoreArray];
|
||||
|
||||
sp->line = currentLine;
|
||||
sp->fIsOption = FALSE; // I3686
|
||||
sp->fIsReserved = (SystemID != TSS_NONE);
|
||||
sp->fIsStore = FALSE;
|
||||
|
|
@ -1109,7 +1110,7 @@ DWORD AddDebugStore(PFILE_KEYBOARD fk, PWSTR str)
|
|||
|
||||
sp->dpString = new WCHAR[wcslen(tstr)+1];
|
||||
wcscpy_s(sp->dpString, wcslen(tstr)+1, tstr); // I3481
|
||||
|
||||
sp->line = 0;
|
||||
sp->fIsOption = FALSE;
|
||||
sp->fIsReserved = TRUE;
|
||||
sp->fIsStore = FALSE;
|
||||
|
|
|
|||
|
|
@ -216,4 +216,9 @@ STRINGTABLE
|
|||
BEGIN
|
||||
CWARN_DontMixChiralAndNonChiralModifiers "Don't mix the use of left/right modifiers with non-left/right modifiers in the same platform"
|
||||
CWARN_MixingLeftAndRightModifiers "Left and right modifiers should not both be used in the same rule"
|
||||
END
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
CWARN_LanguageHeadersDeprecatedInKeyman10 "This language header has been deprecated in Keyman 10. Instead, add language metadata in the package file"
|
||||
END
|
||||
|
|
|
|||
60
windows/src/developer/kmcmpdll/DeprecationChecks.cpp
Normal file
60
windows/src/developer/kmcmpdll/DeprecationChecks.cpp
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <windows.h>
|
||||
|
||||
// Keyman includes
|
||||
|
||||
#include <keyman64.h>
|
||||
#include <compfile.h>
|
||||
#include <compiler.h>
|
||||
#include <comperr.h>
|
||||
#include <kmcmpdll.h>
|
||||
|
||||
BOOL WarnDeprecatedHeader() { // I4866
|
||||
if (FWarnDeprecatedCode) {
|
||||
AddWarning(CWARN_HeaderStatementIsDeprecated);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Flag presence of deprecated features */
|
||||
BOOL CheckForDeprecatedFeatures(PFILE_KEYBOARD fk) {
|
||||
/*
|
||||
For Keyman 10, we deprecated:
|
||||
// < Keyman 7
|
||||
#define TSS_LANGUAGE 4
|
||||
#define TSS_LAYOUT 5
|
||||
#define TSS_LANGUAGENAME 12
|
||||
#define TSS_ETHNOLOGUECODE 15
|
||||
|
||||
// Keyman 7
|
||||
#define TSS_WINDOWSLANGUAGES 29
|
||||
*/
|
||||
int currentLineBackup = currentLine;
|
||||
DWORD i;
|
||||
PFILE_STORE sp;
|
||||
|
||||
if (!FWarnDeprecatedCode) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (fk->version >= VERSION_100) {
|
||||
for (i = 0, sp = fk->dpStoreArray; i < fk->cxStoreArray; i++, sp++) {
|
||||
if (sp->dwSystemID == TSS_LANGUAGE ||
|
||||
sp->dwSystemID == TSS_LAYOUT ||
|
||||
sp->dwSystemID == TSS_LANGUAGENAME ||
|
||||
sp->dwSystemID == TSS_ETHNOLOGUECODE ||
|
||||
sp->dwSystemID == TSS_WINDOWSLANGUAGES) {
|
||||
currentLine = sp->line;
|
||||
AddWarning(CWARN_LanguageHeadersDeprecatedInKeyman10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
currentLine = currentLineBackup;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
7
windows/src/developer/kmcmpdll/DeprecationChecks.h
Normal file
7
windows/src/developer/kmcmpdll/DeprecationChecks.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#include <Compfile.h>
|
||||
|
||||
BOOL WarnDeprecatedHeader();
|
||||
BOOL CheckForDeprecatedFeatures(PFILE_KEYBOARD fk);
|
||||
12
windows/src/developer/kmcmpdll/kmcmpdll.h
Normal file
12
windows/src/developer/kmcmpdll/kmcmpdll.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
BOOL AddCompileString(LPSTR buf);
|
||||
BOOL AddCompileMessage(DWORD msg);
|
||||
|
||||
#define SetError(err) { if(AddCompileMessage(err)) return FALSE; }
|
||||
#define AddWarning(warn) { if(AddCompileMessage(warn)) return FALSE; }
|
||||
|
||||
extern BOOL FWarnDeprecatedCode;
|
||||
extern int currentLine;
|
||||
|
|
@ -172,8 +172,10 @@
|
|||
<ClInclude Include="..\..\global\inc\ConvertUTF.h" />
|
||||
<ClInclude Include="..\..\global\inc\crc32.h" />
|
||||
<ClInclude Include="..\..\global\inc\debugstore.h" />
|
||||
<ClInclude Include="DeprecationChecks.h" />
|
||||
<ClInclude Include="Edition.h" />
|
||||
<ClInclude Include="keyman64.h" />
|
||||
<ClInclude Include="kmcmpdll.h" />
|
||||
<ClInclude Include="NamedCodeConstants.h" />
|
||||
<ClInclude Include="resource.h" />
|
||||
<ClInclude Include="..\..\global\inc\unicode.h" />
|
||||
|
|
@ -199,6 +201,7 @@
|
|||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\global\vc\crc32.cpp" />
|
||||
<ClCompile Include="DeprecationChecks.cpp" />
|
||||
<ClCompile Include="Edition.cpp">
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
|
|
|
|||
|
|
@ -61,6 +61,12 @@
|
|||
<ClInclude Include="versioning.h">
|
||||
<Filter>Header files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="kmcmpdll.h">
|
||||
<Filter>Header files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="DeprecationChecks.h">
|
||||
<Filter>Header files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Compiler.cpp" />
|
||||
|
|
@ -78,6 +84,7 @@
|
|||
<ClCompile Include="..\..\ext\json-schema-validator\json-validator.cpp" />
|
||||
<ClCompile Include="json-validation.cpp" />
|
||||
<ClCompile Include="versioning.cpp" />
|
||||
<ClCompile Include="DeprecationChecks.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="Compiler.rc" />
|
||||
|
|
|
|||
|
|
@ -11,9 +11,7 @@
|
|||
#include <compfile.h>
|
||||
#include <compiler.h>
|
||||
#include <comperr.h>
|
||||
|
||||
BOOL AddCompileString(LPSTR buf);
|
||||
BOOL AddCompileMessage(DWORD msg);
|
||||
#include <kmcmpdll.h>
|
||||
|
||||
BOOL CheckKeyboardFinalVersion(PFILE_KEYBOARD fk) {
|
||||
char buf[128];
|
||||
|
|
|
|||
|
|
@ -182,6 +182,8 @@
|
|||
#define CWARN_DontMixChiralAndNonChiralModifiers 0x000020A3
|
||||
#define CWARN_MixingLeftAndRightModifiers 0x000020A4
|
||||
|
||||
#define CWARN_LanguageHeadersDeprecatedInKeyman10 0x00020A5
|
||||
|
||||
#define CERR_BufferOverflow 0x000080C0
|
||||
#define CERR_Break 0x000080C1
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ struct FILE_STORE {
|
|||
BOOL fIsOption;
|
||||
BOOL fIsDebug;
|
||||
BOOL fIsCall;
|
||||
int line;
|
||||
};
|
||||
|
||||
typedef FILE_STORE *PFILE_STORE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue