diff --git a/src/apps/bin/keymap/Keymap.cpp b/src/apps/bin/keymap/Keymap.cpp index 70a4184de4..1c456ec392 100644 --- a/src/apps/bin/keymap/Keymap.cpp +++ b/src/apps/bin/keymap/Keymap.cpp @@ -15,11 +15,14 @@ #include "Keymap.h" #include +#include #include +#include #include #include #include #include +#include void Keymap::GetKey( char *chars, int32 offset, char* string) @@ -263,8 +266,274 @@ Keymap::Load(entry_ref &ref) return B_OK; } +const char versionPattern[] = "Version[[:space:]]+=[[:space:]]+\\([[:digit:]]+\\)"; +const char capslockPattern[] = "CapsLock[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char scrolllockPattern[] = "ScrollLock[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char numlockPattern[] = "NumLock[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char lshiftPattern[] = "LShift[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char rshiftPattern[] = "RShift[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char lcommandPattern[] = "LCommand[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char rcommandPattern[] = "RCommand[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char lcontrolPattern[] = "LControl[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char rcontrolPattern[] = "RControl[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char loptionPattern[] = "LOption[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char roptionPattern[] = "ROption[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char menuPattern[] = "Menu[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\)"; +const char locksettingsPattern[] = "LockSettings[[:space:]]+=[[:space:]]+\\([[:alnum:]]*\\)" + "[[:space:]]*\\([[:alnum:]]*\\)" + "[[:space:]]*\\([[:alnum:]]*\\)[[:space:]]*"; +const char keyPattern[] = "Key[[:space:]]+\\([[:alnum:]]+\\)[[:space:]]+=" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)" + "[[:space:]]+"; -// we save a map from a file + +const char acutePattern[] = "Acute[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+"; +const char gravePattern[] = "Grave[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+"; +const char circumflexPattern[] = "Circumflex[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+"; +const char diaeresisPattern[] = "Diaeresis[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+"; +const char tildePattern[] = "Tilde[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+=[[:space:]]+\\([[:alnum:]]+\\|'.*'\\)[[:space:]]+"; + +void +Keymap::ComputeChars(const char *buffer, struct re_registers ®s, int i, int &offset) +{ + char *current = &fChars[offset+1]; + char hexChars[12]; + uint32 length = 0; + if (strncmp(buffer + regs.start[i], "''", regs.end[i] - regs.start[i]) == 0) + length = 0; + else if (sscanf(buffer + regs.start[i], "'%s'", current) > 0) { + if (current[0] == '\\') + current[0] = current[1]; + else if (current[0] == '\'') + current[0] = ' '; + length = 1; + } else if (sscanf(buffer + regs.start[i], "0x%s", hexChars) > 0) { + length = strlen(hexChars) / 2; + for (uint32 j=0; j= 0) { + sscanf(buffer + regs.start[1], "%ld", &fKeys.version); + } else if (re_search(&capslockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.caps_key); + } else if (re_search(&scrolllockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.scroll_key); + } else if (re_search(&numlockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.num_key); + } else if (re_search(&lshiftBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_shift_key); + } else if (re_search(&rshiftBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_shift_key); + } else if (re_search(&lcommandBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_command_key); + } else if (re_search(&rcommandBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_command_key); + } else if (re_search(&lcontrolBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_control_key); + } else if (re_search(&rcontrolBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_control_key); + } else if (re_search(&loptionBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.left_option_key); + } else if (re_search(&roptionBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.right_option_key); + } else if (re_search(&menuBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + sscanf(buffer + regs.start[1], "0x%lx", &fKeys.menu_key); + } else if (re_search(&locksettingsBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int32 i=1; i<=3; i++) { + if (strncmp(buffer + regs.start[i], "CapsLock", regs.end[i] - regs.start[i]) == 0) + fKeys.lock_settings |= B_CAPS_LOCK; + else if (strncmp(buffer + regs.start[i], "NumLock", regs.end[i] - regs.start[i]) == 0) + fKeys.lock_settings |= B_NUM_LOCK; + else if (strncmp(buffer + regs.start[i], "ScrollLock", regs.end[i] - regs.start[i]) == 0) + fKeys.lock_settings |= B_SCROLL_LOCK; + } + } else if (re_search(&keyBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + uint32 keyCode; + if (sscanf(buffer + regs.start[1], "0x%lx", &keyCode) > 0) { + + for (int i=2; i<=10; i++) { + maps[i-2][keyCode] = offset; + ComputeChars(buffer, regs, i, offset); + } + } + } else if (re_search(´Buf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int i=1; i<=2; i++) { + fKeys.acute_dead_key[acuteOffset++] = offset; + ComputeChars(buffer, regs, i, offset); + } + } else if (re_search(&graveBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int i=1; i<=2; i++) { + fKeys.grave_dead_key[graveOffset++] = offset; + ComputeChars(buffer, regs, i, offset); + } + } else if (re_search(&circumflexBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int i=1; i<=2; i++) { + fKeys.circumflex_dead_key[circumflexOffset++] = offset; + ComputeChars(buffer, regs, i, offset); + } + } else if (re_search(&diaeresisBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int i=1; i<=2; i++) { + fKeys.dieresis_dead_key[diaeresisOffset++] = offset; + ComputeChars(buffer, regs, i, offset); + } + } else if (re_search(&tildeBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) { + for (int i=1; i<=2; i++) { + fKeys.tilde_dead_key[tildeOffset++] = offset; + ComputeChars(buffer, regs, i, offset); + } + } + } + /* + for (uint32 i=1; i < 3; i++) { + printf("%.*s\n", regs.end[i] - regs.start[i], buffer + regs.start[i]); + } + */ + + return B_OK; +} + + +// we save a map to a file status_t Keymap::Save(entry_ref &ref) { diff --git a/src/apps/bin/keymap/Keymap.h b/src/apps/bin/keymap/Keymap.h index 13db980ab5..e838e931e6 100644 --- a/src/apps/bin/keymap/Keymap.h +++ b/src/apps/bin/keymap/Keymap.h @@ -25,7 +25,7 @@ public: void LoadCurrent(); status_t Load(entry_ref &ref); status_t Save(entry_ref &ref); - //status_t LoadSource(entry_ref &ref); + status_t LoadSource(entry_ref &ref); void Dump(); bool IsModifierKey(uint32 keyCode); uint8 IsDeadKey(uint32 keyCode, uint32 modifiers); @@ -34,6 +34,8 @@ public: void RestoreSystemDefault(); static void GetKey( char *chars, int32 offset, char* string); private: + void ComputeChars(const char *buffer, struct re_registers ®s, int i, int &offset); + char *fChars; key_map fKeys; uint32 fCharsSize; diff --git a/src/apps/bin/keymap/key_map.cpp b/src/apps/bin/keymap/key_map.cpp index 4b53fe0d04..619186fea5 100644 --- a/src/apps/bin/keymap/key_map.cpp +++ b/src/apps/bin/keymap/key_map.cpp @@ -48,9 +48,17 @@ int main(int argc, char **argv) keymap.RestoreSystemDefault(); return 0; } + } else { if (operation == 'o') { return 0; + } if (operation == 'l') { + entry_ref ref; + get_ref_for_path(argv[i], &ref); + Keymap keymap; + keymap.LoadSource(ref); + keymap.Dump(); + return 0; } else break; }