Author: ablackmann Date: Sun Nov 1 18:43:51 2009 New Revision: 43899
URL: http://svn.reactos.org/svn/reactos?rev=43899&view=rev Log: Add support for DESCRIPTIONS section (tested on test.klc). Add KEYNAME structure. Fixup some of the code in the SHIFTSTATES implementation.
Modified: trunk/reactos/tools/kbdtool/parser.c
Modified: trunk/reactos/tools/kbdtool/parser.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/kbdtool/parser.c?rev=... ============================================================================== --- trunk/reactos/tools/kbdtool/parser.c [iso-8859-1] (original) +++ trunk/reactos/tools/kbdtool/parser.c [iso-8859-1] Sun Nov 1 18:43:51 2009 @@ -13,6 +13,13 @@ #include <stdio.h> #include <stdlib.h> #include <host/typedefs.h> + +typedef struct tagKEYNAME +{ + ULONG LanguageCode; + PCHAR Description; + struct tagKEYNAME* Next; +} KEYNAME, *PKEYNAME;
/* GLOBALS ********************************************************************/
@@ -232,9 +239,78 @@ }
ULONG -DoDESCRIPTIONS(PVOID DescriptionData) -{ - return SkipLines(); +DoDESCRIPTIONS(IN PKEYNAME* DescriptionData) +{ + ULONG KeyWord = 0; + CHAR Token[32]; + ULONG LanguageCode; + PCHAR p, pp; + PKEYNAME Description; + + /* Assume nothing */ + *DescriptionData = 0; + + /* Start scanning */ + while (NextLine(gBuf, 256, gfpInput)) + { + /* Search for token */ + if (sscanf(gBuf, "%s", Token) != 1) continue; + + /* Make sure it's not just a comment */ + if (*Token == ';') continue; + + /* Make sure it's not a keyword */ + KeyWord = isKeyWord(Token); + if (KeyWord < KEYWORD_COUNT) break; + + /* Now scan for the language code */ + if (sscanf(Token, " %4x", &LanguageCode) != 1) + { + /* Skip */ + printf("An invalid LANGID was specified.\n"); + continue; + } + + /* Now get the actual description */ + if (sscanf(gBuf, " %*4x %s[^\n]", Token) != 1) + { + /* Skip */ + printf("A language description is missing.\n"); + continue; + } + + /* Get the description string and find the ending */ + p = strstr(gBuf, Token); + pp = strchr(p, '\n'); + if (!pp) pp = strchr(p, '\r'); + + /* Terminate the description string here */ + if (pp) *pp = 0; + + /* Now allocate the description */ + Description = malloc(sizeof(KEYNAME)); + if (!Description) + { + /* Fail */ + printf("Unable to allocate the KEYNAME struct (out of memory?).\n"); + exit(1); + } + + /* Fill out the structure */ + Description->LanguageCode = LanguageCode; + Description->Description = strdup(p); + Description->Next = NULL; + + /* Debug only */ + DPRINT1("LANGID: [%4x] Description: [%s]\n", Description->LanguageCode, Description->Description); + + /* Point to it and advance the pointer */ + *DescriptionData = Description; + DescriptionData = &Description->Next; + } + + /* We are done */ + return KeyWord; }
ULONG @@ -293,15 +369,16 @@ if (KeyWord < KEYWORD_COUNT) break;
/* Now scan for the shift state */ - if (sscanf(gBuf, " %1s[01234567]", Token) != 1) + if (sscanf(gBuf, " %1s[012367]", Token) != 1) { /* We failed -- should we warn? */ - if (Verbose) printf("Invalid shift state\n"); + if (Verbose) printf("An invalid shift state '%s' was found (use 0, 1, 2, 3, 6, or 7.)\n", Token); continue; }
/* Now read the state */ ShiftState = atoi(Token); + /* Scan existing states */ for (i = 0; i < *StateCount; i++) { @@ -309,7 +386,7 @@ if ((ShiftStates[i] == ShiftState) && (Verbose)) { /* Warn user */ - printf("Duplicate shift state\n"); + printf("The state '%d' was duplicated for this Virtual Key.\n", ShiftStates[i]); break; } } @@ -323,14 +400,14 @@ else { /* Too many states -- should we warn? */ - if (Verbose) printf("Too many shift states: %d\n", *StateCount); + if (Verbose) printf("There were too many states (you defined %d).\n", *StateCount); } }
/* Debug only */ - printf("Found %d Shift States: [", *StateCount); - for (i = 0; i < *StateCount; i++) printf("%d ", ShiftStates[i]); - printf("]\n"); + DPRINT1("Found %d Shift States: [", *StateCount); + for (i = 0; i < *StateCount; i++) DPRINT1("%d ", ShiftStates[i]); + DPRINT1("]\n");
/* We are done */ return KeyWord; @@ -352,7 +429,8 @@ ULONG KeyWord; ULONG StateCount; ULONG ShiftStates[8]; - PVOID AttributeData, LigatureData, DeadKeyData, DescriptionData; + PKEYNAME DescriptionData; + PVOID AttributeData, LigatureData, DeadKeyData; PVOID KeyNameData, KeyNameExtData, KeyNameDeadData, LanguageData;
/* Parse keywords */