From b8b4a4efec26daaae2dd59122a8e1d039fbbffb1 Mon Sep 17 00:00:00 2001 From: Arch Blackmann Date: Wed, 4 Nov 2009 04:49:00 +0000 Subject: [PATCH] Started adding support for reading the different character states and the cap data (including detecting SGCAP). Now the tool has to determine the type of each character defined at every stage (dead, valid, invalid, ligature, etc...) and save the character in the appropriate slot. Dead and other keys are currently handled, as are undefined keys. Major work remains to be done... svn path=/trunk/; revision=43947 --- reactos/tools/kbdtool/parser.c | 83 +++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/reactos/tools/kbdtool/parser.c b/reactos/tools/kbdtool/parser.c index c292f45bc8c..a205ff6c4f0 100644 --- a/reactos/tools/kbdtool/parser.c +++ b/reactos/tools/kbdtool/parser.c @@ -40,9 +40,9 @@ typedef struct tagLAYOUTENTRY USHORT ScanCode; UCHAR VirtualKey; UCHAR OriginalVirtualKey; - UCHAR Cap; + ULONG Cap; ULONG StateCount; - ULONG CharData[8]; + ULONGLONG CharData[8]; ULONG DeadCharData[8]; ULONG OtherCharData[8]; struct LAYOUTENTRY* CapData; @@ -250,6 +250,11 @@ VKNAME VKName[] = {0xe6, "RGROUPSHIFT"} }; +#define CHAR_NORMAL_KEY 0 +#define CHAR_DEAD_KEY 1 +#define CHAR_OTHER_KEY 2 +#define CHAR_INVALID_KEY 3 +#define CHAR_LIGATURE_KEY 4 /* FUNCTIONS ******************************************************************/ @@ -311,6 +316,16 @@ getVKNum(IN PCHAR p) return -1; } +UCHAR +getCharacterInfo(IN PCHAR State, + IN PLAYOUTENTRY Entry, + OUT PCHAR LigatureChar) +{ + /* FIXME: NOT YET IMPLEMENTED */ + ASSERT(FALSE); + return 0; +} + BOOLEAN NextLine(PCHAR LineBuffer, ULONG BufferSize, @@ -806,9 +821,12 @@ DoLAYOUT(IN PLAYOUT LayoutData, ULONG TokenCount; ULONG VirtualKey; ULONG i; + ULONG Count; BOOLEAN FullEntry; + CHAR State[8][8]; ULONG ScanCodeCount = -1; PLAYOUTENTRY Entry; + UCHAR CharacterType, LigatureChar; /* Only attempt this is Verbose is enabled (FOR DEBUGGING ONLY) */ if (!Verbose) return SkipLines(); @@ -916,6 +934,67 @@ FillEntry: if (Verbose) printf("An invalid Virtual Key '%s' was defined.\n", Token); continue; } + + /* Is this a full entry */ + if (FullEntry) + { + /* Do we have SGCAP data? Set cap mode to 2 */ + if (!strcmp(Cap, "SGCAP")) *Cap = '2'; + + /* Read the cap mode */ + if (sscanf(Cap, "%1d[012]", &Entry->Cap) != 1) + { + /* Invalid cap mode */ + printf("invalid Cap specified (%s). Must be 0, 1, or 2.\n", Cap); + exit(1); + } + } + + /* Read the states */ + Count = sscanf(gBuf, + " %*s %*s %*s %s %s %s %s %s %s %s %s", + State[0], + State[1], + State[2], + State[3], + State[4], + State[5], + State[6], + State[7]); + Entry->StateCount = Count; + + /* Check if there are less than 2 states */ + if ((Count < 2) && (FullEntry)) + { + /* Fail */ + printf("You must have at least 2 characters.\n"); + exit(1); + } + + /* Loop all states */ + for (i = 0; i < Count; i++) + { + /* Check if this is an undefined state */ + if (!strcmp(State[i], "-1")) + { + /* No data for this state */ + Entry->CharData[i] = -1; + continue; + } + + /* Otherwise, check what kind of character this is */ + CharacterType = getCharacterInfo(State[i], Entry, &LigatureChar); + if (CharacterType == CHAR_DEAD_KEY) + { + /* Save it as such */ + Entry->DeadCharData[i] = 1; + } + else if (CharacterType == CHAR_OTHER_KEY) + { + /* Save it as such */ + Entry->OtherCharData[i] = 1; + } + } } /* Skip what's left */