[Haiku-commits] r31195 - haiku/trunk/src/bin/keymap
axeld at BerliOS
axeld at mail.berlios.de
Tue Jun 23 11:44:32 CEST 2009
Author: axeld
Date: 2009-06-23 11:44:31 +0200 (Tue, 23 Jun 2009)
New Revision: 31195
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=31195&view=rev
Modified:
haiku/trunk/src/bin/keymap/Keymap.cpp
haiku/trunk/src/bin/keymap/Keymap.h
haiku/trunk/src/bin/keymap/main.cpp
Log:
* More or less rewrote main.cpp to use getopt_long() instead of the self-made
argument evaluation. Also separated the evaluation from performing the
options, solving a TODO, and added long versions for the options.
* Changed Keymap methods to work on a path instead of entry_refs - this
simplifies the code a bit over the place.
* Added new option to load a source keymap directly (-s, --load-source).
* Renamed some methods to make clearer what they do.
* Added a way to directly write a source keymap to a file (by specifying the
-o option together with -d).
* Coding style cleanup, ordered Keymap methods in the order they are declared.
Modified: haiku/trunk/src/bin/keymap/Keymap.cpp
===================================================================
--- haiku/trunk/src/bin/keymap/Keymap.cpp 2009-06-23 01:39:51 UTC (rev 31194)
+++ haiku/trunk/src/bin/keymap/Keymap.cpp 2009-06-23 09:44:31 UTC (rev 31195)
@@ -1,28 +1,164 @@
/*
- * Copyright (c) 2004-2006, Haiku, Inc.
+ * Copyright 2004-2009, Haiku, Inc. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
*
- * This software is part of the Haiku distribution and is covered
- * by the Haiku license.
- *
- * Author: Jérôme Duval
+ * Authors:
+ * Jérôme Duval
+ * Axel Dörfler, axeld at pinc-software.de.
*/
#include "Keymap.h"
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
#include <ByteOrder.h>
#include <File.h>
#include <FindDirectory.h>
#include <Path.h>
#include <String.h>
-#include <stdlib.h>
-#include <string.h>
-
#define CHARS_TABLE_MAXSIZE 10000
+extern status_t _restore_key_map_();
+
+
+// i couldn't put patterns and pattern bufs on the stack without segfaulting
+// regexp patterns
+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:]]+";
+
+
+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:]]+";
+const char acutetabPattern[] = "AcuteTab[[:space:]]+="
+ "[[:space:]]+\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
+const char gravetabPattern[] = "GraveTab[[:space:]]+="
+ "[[:space:]]+\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
+const char circumflextabPattern[] = "CircumflexTab[[:space:]]+="
+ "[[:space:]]+\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
+const char diaeresistabPattern[] = "DiaeresisTab[[:space:]]+="
+ "[[:space:]]+\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
+const char tildetabPattern[] = "TildeTab[[:space:]]+="
+ "[[:space:]]+\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)"
+ "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
+
+
+// re_pattern_buffer buffers
+struct re_pattern_buffer versionBuf;
+struct re_pattern_buffer capslockBuf;
+struct re_pattern_buffer scrolllockBuf;
+struct re_pattern_buffer numlockBuf;
+struct re_pattern_buffer lshiftBuf;
+struct re_pattern_buffer rshiftBuf;
+struct re_pattern_buffer lcommandBuf;
+struct re_pattern_buffer rcommandBuf;
+struct re_pattern_buffer lcontrolBuf;
+struct re_pattern_buffer rcontrolBuf;
+struct re_pattern_buffer loptionBuf;
+struct re_pattern_buffer roptionBuf;
+struct re_pattern_buffer menuBuf;
+struct re_pattern_buffer locksettingsBuf;
+struct re_pattern_buffer keyBuf;
+struct re_pattern_buffer acuteBuf;
+struct re_pattern_buffer graveBuf;
+struct re_pattern_buffer circumflexBuf;
+struct re_pattern_buffer diaeresisBuf;
+struct re_pattern_buffer tildeBuf;
+struct re_pattern_buffer acutetabBuf;
+struct re_pattern_buffer gravetabBuf;
+struct re_pattern_buffer circumflextabBuf;
+struct re_pattern_buffer diaeresistabBuf;
+struct re_pattern_buffer tildetabBuf;
+
+
void
dump_map(FILE* file, const char* name, int32* map)
{
@@ -73,205 +209,11 @@
}
-void
-Keymap::GetKey(char *chars, int32 offset, char* string)
-{
- int size = chars[offset++];
- char str[32];
- memset(str, 0, 32);
- memset(string, 0, 32);
-
- switch (size) {
- case 0:
- // Not mapped
- sprintf(str, "''");
- break;
-
- case 1:
- // 1-byte UTF-8/ASCII character
- if ((uint8)chars[offset] < 0x20
- || (uint8)chars[offset] > 0x7e)
- sprintf(str, "0x%02x", (uint8)chars[offset]);
- else
- sprintf(str, "'%s%c'",
- (chars[offset] == '\\' || chars[offset] == '\'') ? "\\" : "", chars[offset]);
- break;
-
- default:
- // n-byte UTF-8/ASCII character
- sprintf(str, "0x");
- for (int i = 0; i < size; i++) {
- sprintf(str + 2*(i+1), "%02x", (uint8)chars[offset+i]);
- }
- break;
- }
-
- strncpy(string, str, strlen(str) < 12 ? strlen(str) : 12);
- // TODO: Huh?
-}
-
-
-void
-Keymap::Dump()
-{
- printf("#!/bin/keymap -l\n"
- "#\n"
- "#\tRaw key numbering for 101 keyboard...\n"
- "# [sys] [brk]\n"
- "# 0x7e 0x7f\n"
- "# [esc] [ f1] [ f2] [ f3] [ f4] [ f5] [ f6] [ f7] [ f8] [ f9] [f10] [f11] [f12] [prn] [scr] [pau]\n"
- "# 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 K E Y P A D K E Y S\n"
- "#\n"
- "# [ ` ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 0 ] [ - ] [ = ] [bck] [ins] [hme] [pup] [num] [ / ] [ * ] [ - ]\n"
- "# 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25\n"
- "#\n"
- "# [tab] [ q ] [ w ] [ e ] [ r ] [ t ] [ y ] [ u ] [ i ] [ o ] [ p ] [ [ ] [ ] ] [ \\ ] [del] [end] [pdn] [ 7 ] [ 8 ] [ 9 ] [ + ]\n"
- "# 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a\n"
- "#\n"
- "# [cap] [ a ] [ s ] [ d ] [ f ] [ g ] [ h ] [ j ] [ k ] [ l ] [ ; ] [ ' ] [ enter ] [ 4 ] [ 5 ] [ 6 ]\n"
- "# 0x3b 0x3c 0x3d 0x3e 0x3f 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4a\n"
- "#\n"
- "# [shift] [ z ] [ x ] [ c ] [ v ] [ b ] [ n ] [ m ] [ , ] [ . ] [ / ] [shift] [ up] [ 1 ] [ 2 ] [ 3 ] [ent]\n"
- "# 0x4b 0x4c 0x4d 0x4e 0x4f 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 0x5a 0x5b\n"
- "#\n"
- "# [ctr] [cmd] [ space ] [cmd] [ctr] [lft] [dwn] [rgt] [ 0 ] [ . ]\n"
- "# 0x5c 0x5d 0x5e 0x5f 0x60 0x61 0x62 0x63 0x64 0x65\n"
- "#\n"
- "#\tNOTE: On a Microsoft Natural Keyboard:\n"
- "#\t\t\tleft option = 0x66\n"
- "#\t\t\tright option = 0x67\n"
- "#\t\t\tmenu key = 0x68\n"
- "#\tNOTE: On an Apple Extended Keyboard:\n"
- "#\t\t\tleft option = 0x66\n"
- "#\t\t\tright option = 0x67\n"
- "#\t\t\tkeypad '=' = 0x6a\n"
- "#\t\t\tpower key = 0x6b\n");
-
- printf("Version = %ld\n", fKeys.version);
- printf("CapsLock = 0x%02lx\n", fKeys.caps_key);
- printf("ScrollLock = 0x%02lx\n", fKeys.scroll_key);
- printf("NumLock = 0x%02lx\n", fKeys.num_key);
- printf("LShift = 0x%02lx\n", fKeys.left_shift_key);
- printf("RShift = 0x%02lx\n", fKeys.right_shift_key);
- printf("LCommand = 0x%02lx\n", fKeys.left_command_key);
- printf("RCommand = 0x%02lx\n", fKeys.right_command_key);
- printf("LControl = 0x%02lx\n", fKeys.left_control_key);
- printf("RControl = 0x%02lx\n", fKeys.right_control_key);
- printf("LOption = 0x%02lx\n", fKeys.left_option_key);
- printf("ROption = 0x%02lx\n", fKeys.right_option_key);
- printf("Menu = 0x%02lx\n", fKeys.menu_key);
- printf("#\n"
- "# Lock settings\n"
- "# To set NumLock, do the following:\n"
- "# LockSettings = NumLock\n"
- "#\n"
- "# To set everything, do the following:\n"
- "# LockSettings = CapsLock NumLock ScrollLock\n"
- "#\n");
- printf("LockSettings = ");
- if (fKeys.lock_settings & B_CAPS_LOCK)
- printf("CapsLock ");
- if (fKeys.lock_settings & B_NUM_LOCK)
- printf("NumLock ");
- if (fKeys.lock_settings & B_SCROLL_LOCK)
- printf("ScrollLock ");
- printf("\n");
- printf("# Legend:\n"
- "# n = Normal\n"
- "# s = Shift\n"
- "# c = Control\n"
- "# C = CapsLock\n"
- "# o = Option\n"
- "# Key n s c o os C Cs Co Cos \n");
-
- for (int idx = 0; idx < 128; idx++) {
- char normalKey[32];
- char shiftKey[32];
- char controlKey[32];
- char optionKey[32];
- char optionShiftKey[32];
- char capsKey[32];
- char capsShiftKey[32];
- char optionCapsKey[32];
- char optionCapsShiftKey[32];
-
- GetKey(fChars, fKeys.normal_map[idx], normalKey);
- GetKey(fChars, fKeys.shift_map[idx], shiftKey);
- GetKey(fChars, fKeys.control_map[idx], controlKey);
- GetKey(fChars, fKeys.option_map[idx], optionKey);
- GetKey(fChars, fKeys.option_shift_map[idx], optionShiftKey);
- GetKey(fChars, fKeys.caps_map[idx], capsKey);
- GetKey(fChars, fKeys.caps_shift_map[idx], capsShiftKey);
- GetKey(fChars, fKeys.option_caps_map[idx], optionCapsKey);
- GetKey(fChars, fKeys.option_caps_shift_map[idx], optionCapsShiftKey);
-
- printf("Key 0x%02x = %-9s%-9s%-9s%-9s%-9s%-9s%-9s%-9s%-9s\n", idx, normalKey, shiftKey, controlKey,
- optionKey, optionShiftKey, capsKey, capsShiftKey, optionCapsKey, optionCapsShiftKey);
- }
-
- int32* deadOffsets[] = {
- fKeys.acute_dead_key,
- fKeys.grave_dead_key,
- fKeys.circumflex_dead_key,
- fKeys.dieresis_dead_key,
- fKeys.tilde_dead_key
- };
-
- char labels[][12] = {
- "Acute",
- "Grave",
- "Circumflex",
- "Diaeresis",
- "Tilde"
- };
-
- uint32 deadTables[] = {
- fKeys.acute_tables,
- fKeys.grave_tables,
- fKeys.circumflex_tables,
- fKeys.dieresis_tables,
- fKeys.tilde_tables
- };
-
- for (int i = 0; i<5; i++) {
- for (int idx = 0; idx < 32; idx++ ) {
- char deadKey[32];
- char secondKey[32];
- GetKey(fChars, deadOffsets[i][idx++], deadKey);
- GetKey(fChars, deadOffsets[i][idx], secondKey);
- printf("%s %-9s = %-9s\n", labels[i], deadKey, secondKey);
- }
-
- printf("%sTab = ", labels[i]);
-
- if (deadTables[i] & B_NORMAL_TABLE)
- printf("Normal ");
- if (deadTables[i] & B_SHIFT_TABLE)
- printf("Shift ");
- if (deadTables[i] & B_CONTROL_TABLE)
- printf("Control ");
- if (deadTables[i] & B_OPTION_TABLE)
- printf("Option ");
- if (deadTables[i] & B_OPTION_SHIFT_TABLE)
- printf("Option-Shift ");
- if (deadTables[i] & B_CAPS_TABLE)
- printf("CapsLock ");
- if (deadTables[i] & B_CAPS_SHIFT_TABLE)
- printf("CapsLock-Shift ");
- if (deadTables[i] & B_OPTION_CAPS_TABLE)
- printf("CapsLock-Option ");
- if (deadTables[i] & B_OPTION_CAPS_SHIFT_TABLE)
- printf("CapsLock-Option-Shift ");
- printf("\n");
- }
-}
-
-
status_t
Keymap::LoadCurrent()
{
#if (defined(__BEOS__) || defined(__HAIKU__))
- key_map *keys = NULL;
+ key_map* keys = NULL;
get_key_map(&keys, &fChars);
if (!keys)
return B_ERROR;
@@ -279,7 +221,6 @@
memcpy(&fKeys, keys, sizeof(fKeys));
free(keys);
return B_OK;
-
#else // ! __BEOS__
fprintf(stderr, "Unsupported operation on this platform!\n");
exit(1);
@@ -287,26 +228,32 @@
}
-/*!
- Load a map from a file.
+/*! Load a map from a file.
file format in big endian:
struct key_map
uint32 size of following charset
- charset (offsets go into this with size of character followed by character)
+ charset (offsets go into this with size of character followed by
+ character)
*/
-status_t
-Keymap::Load(entry_ref &ref)
+status_t
+Keymap::Load(const char* name)
{
- status_t err;
+ FILE* file = fopen(name, "r");
+ if (file == NULL)
+ return errno;
- BFile file(&ref, B_READ_ONLY);
- if ((err = file.InitCheck()) != B_OK)
- return err;
+ return Load(file);
+}
- if (file.Read(&fKeys, sizeof(fKeys)) < (ssize_t)sizeof(fKeys))
+
+status_t
+Keymap::Load(FILE* file)
+{
+ if (fread(&fKeys, sizeof(fKeys), 1, file) < 1)
return B_BAD_VALUE;
+ // convert from big-endian
for (uint32 i = 0; i < sizeof(fKeys) / 4; i++) {
((uint32*)&fKeys)[i] = B_BENDIAN_TO_HOST_INT32(((uint32*)&fKeys)[i]);
}
@@ -314,225 +261,59 @@
if (fKeys.version != 3)
return KEYMAP_ERROR_UNKNOWN_VERSION;
- if (file.Read(&fCharsSize, sizeof(uint32)) < (ssize_t)sizeof(uint32))
+ if (fread(&fCharsSize, sizeof(uint32), 1, file) < 1)
return B_BAD_VALUE;
fCharsSize = B_BENDIAN_TO_HOST_INT32(fCharsSize);
- if (!fChars)
- delete[] fChars;
+ if (fCharsSize > 16 * 1024)
+ return B_BAD_DATA;
+
+ delete[] fChars;
fChars = new char[fCharsSize];
- if ((unsigned)file.Read(fChars, fCharsSize) != fCharsSize)
+
+ if (fread(fChars, 1, fCharsSize, file) != fCharsSize)
return B_BAD_VALUE;
return B_OK;
}
-void
-Keymap::ComputeChars(const char *buffer, struct re_registers ®s, int i, int &offset)
+status_t
+Keymap::LoadSource(const char* name)
{
- 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 < length; j++)
- sscanf(hexChars + 2*j, "%02hhx", current + j);
- }
- fChars[offset] = length;
- offset += length + 1;
-}
+ FILE* file = fopen(name, "r");
+ if (file == NULL)
+ return errno;
+ status_t status = LoadSource(file);
+ fclose(file);
-void
-Keymap::ComputeTables(const char *buffer, struct re_registers ®s, uint32 &table)
-{
- for (int32 i=1; i<=9; i++) {
- if (regs.end[i] - regs.start[i] <= 0)
- break;
- if (strncmp(buffer + regs.start[i], "Normal", regs.end[i] - regs.start[i]) == 0)
- table |= B_NORMAL_TABLE;
- else if (strncmp(buffer + regs.start[i], "Shift", regs.end[i] - regs.start[i]) == 0)
- table |= B_SHIFT_TABLE;
- else if (strncmp(buffer + regs.start[i], "Control", regs.end[i] - regs.start[i]) == 0)
- table |= B_CONTROL_TABLE;
- else if (strncmp(buffer + regs.start[i], "Option", regs.end[i] - regs.start[i]) == 0)
- table |= B_OPTION_TABLE;
- else if (strncmp(buffer + regs.start[i], "Option-Shift", regs.end[i] - regs.start[i]) == 0)
- table |= B_OPTION_SHIFT_TABLE;
- else if (strncmp(buffer + regs.start[i], "CapsLock", regs.end[i] - regs.start[i]) == 0)
- table |= B_CAPS_TABLE;
- else if (strncmp(buffer + regs.start[i], "CapsLock-Shift", regs.end[i] - regs.start[i]) == 0)
- table |= B_CAPS_SHIFT_TABLE;
- else if (strncmp(buffer + regs.start[i], "CapsLock-Option", regs.end[i] - regs.start[i]) == 0)
- table |= B_OPTION_CAPS_TABLE;
- else if (strncmp(buffer + regs.start[i], "CapsLock-Option-Shift", regs.end[i] - regs.start[i]) == 0)
- table |= B_OPTION_CAPS_SHIFT_TABLE;
- }
+ return status;
}
-status_t
-Keymap::LoadSourceFromRef(entry_ref &ref)
+status_t
+Keymap::LoadSource(FILE* file)
{
- status_t err;
-
- BFile file(&ref, B_READ_ONLY);
- if ((err = file.InitCheck()) != B_OK)
- return err;
-
- int fd = file.Dup();
- FILE* f = fdopen(fd, "r");
- if (f != NULL) {
- err = LoadSource(f);
- fclose(f);
- } else
- err = B_FILE_ERROR;
+ // Setup regexp parser
- return err;
-}
-
-
-// i couldn't put patterns and pattern bufs on the stack without segfaulting
-// regexp patterns
-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:]]+";
-
-
-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:]]+";
-const char acutetabPattern[] = "AcuteTab[[:space:]]+="
- "[[:space:]]+\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
-const char gravetabPattern[] = "GraveTab[[:space:]]+="
- "[[:space:]]+\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
-const char circumflextabPattern[] = "CircumflexTab[[:space:]]+="
- "[[:space:]]+\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
-const char diaeresistabPattern[] = "DiaeresisTab[[:space:]]+="
- "[[:space:]]+\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
-const char tildetabPattern[] = "TildeTab[[:space:]]+="
- "[[:space:]]+\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)"
- "[[:space:]]*\\([[:alnum:]-]*\\)[[:space:]]*" ;
-
-
-// re_pattern_buffer buffers
-struct re_pattern_buffer versionBuf;
-struct re_pattern_buffer capslockBuf;
-struct re_pattern_buffer scrolllockBuf;
-struct re_pattern_buffer numlockBuf;
-struct re_pattern_buffer lshiftBuf;
-struct re_pattern_buffer rshiftBuf;
-struct re_pattern_buffer lcommandBuf;
-struct re_pattern_buffer rcommandBuf;
-struct re_pattern_buffer lcontrolBuf;
-struct re_pattern_buffer rcontrolBuf;
-struct re_pattern_buffer loptionBuf;
-struct re_pattern_buffer roptionBuf;
-struct re_pattern_buffer menuBuf;
-struct re_pattern_buffer locksettingsBuf;
-struct re_pattern_buffer keyBuf;
-struct re_pattern_buffer acuteBuf;
-struct re_pattern_buffer graveBuf;
-struct re_pattern_buffer circumflexBuf;
-struct re_pattern_buffer diaeresisBuf;
-struct re_pattern_buffer tildeBuf;
-struct re_pattern_buffer acutetabBuf;
-struct re_pattern_buffer gravetabBuf;
-struct re_pattern_buffer circumflextabBuf;
-struct re_pattern_buffer diaeresistabBuf;
-struct re_pattern_buffer tildetabBuf;
-
-status_t
-Keymap::LoadSource(FILE * f)
-{
reg_syntax_t syntax = RE_CHAR_CLASSES;
re_set_syntax(syntax);
-
- const char* error;
- error = re_compile_pattern(versionPattern, strlen(versionPattern), &versionBuf);
+
+ const char* error = re_compile_pattern(versionPattern,
+ strlen(versionPattern), &versionBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(capslockPattern, strlen(capslockPattern), &capslockBuf);
+ error = re_compile_pattern(capslockPattern, strlen(capslockPattern),
+ &capslockBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(scrolllockPattern, strlen(scrolllockPattern), &scrolllockBuf);
+ error = re_compile_pattern(scrolllockPattern, strlen(scrolllockPattern),
+ &scrolllockBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(numlockPattern, strlen(numlockPattern), &numlockBuf);
+ error = re_compile_pattern(numlockPattern, strlen(numlockPattern),
+ &numlockBuf);
if (error)
fprintf(stderr, error);
error = re_compile_pattern(lshiftPattern, strlen(lshiftPattern), &lshiftBuf);
@@ -541,28 +322,35 @@
error = re_compile_pattern(rshiftPattern, strlen(rshiftPattern), &rshiftBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(lcommandPattern, strlen(lcommandPattern), &lcommandBuf);
+ error = re_compile_pattern(lcommandPattern, strlen(lcommandPattern),
+ &lcommandBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(rcommandPattern, strlen(rcommandPattern), &rcommandBuf);
+ error = re_compile_pattern(rcommandPattern, strlen(rcommandPattern),
+ &rcommandBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(lcontrolPattern, strlen(lcontrolPattern), &lcontrolBuf);
+ error = re_compile_pattern(lcontrolPattern, strlen(lcontrolPattern),
+ &lcontrolBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(rcontrolPattern, strlen(rcontrolPattern), &rcontrolBuf);
+ error = re_compile_pattern(rcontrolPattern, strlen(rcontrolPattern),
+ &rcontrolBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(loptionPattern, strlen(loptionPattern), &loptionBuf);
+ error = re_compile_pattern(loptionPattern, strlen(loptionPattern),
+ &loptionBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(roptionPattern, strlen(roptionPattern), &roptionBuf);
+ error = re_compile_pattern(roptionPattern, strlen(roptionPattern),
+ &roptionBuf);
if (error)
fprintf(stderr, error);
error = re_compile_pattern(menuPattern, strlen(menuPattern), &menuBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(locksettingsPattern, strlen(locksettingsPattern), &locksettingsBuf);
+ error = re_compile_pattern(locksettingsPattern, strlen(locksettingsPattern),
+ &locksettingsBuf);
if (error)
fprintf(stderr, error);
error = re_compile_pattern(keyPattern, strlen(keyPattern), &keyBuf);
@@ -574,32 +362,39 @@
error = re_compile_pattern(gravePattern, strlen(gravePattern), &graveBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(circumflexPattern, strlen(circumflexPattern), &circumflexBuf);
+ error = re_compile_pattern(circumflexPattern, strlen(circumflexPattern),
+ &circumflexBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(diaeresisPattern, strlen(diaeresisPattern), &diaeresisBuf);
+ error = re_compile_pattern(diaeresisPattern, strlen(diaeresisPattern),
+ &diaeresisBuf);
if (error)
fprintf(stderr, error);
error = re_compile_pattern(tildePattern, strlen(tildePattern), &tildeBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(acutetabPattern, strlen(acutetabPattern), ´tabBuf);
+ error = re_compile_pattern(acutetabPattern, strlen(acutetabPattern),
+ ´tabBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(gravetabPattern, strlen(gravetabPattern), &gravetabBuf);
+ error = re_compile_pattern(gravetabPattern, strlen(gravetabPattern),
+ &gravetabBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(circumflextabPattern, strlen(circumflextabPattern), &circumflextabBuf);
+ error = re_compile_pattern(circumflextabPattern,
+ strlen(circumflextabPattern), &circumflextabBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(diaeresistabPattern, strlen(diaeresistabPattern), &diaeresistabBuf);
+ error = re_compile_pattern(diaeresistabPattern, strlen(diaeresistabPattern),
+ &diaeresistabBuf);
if (error)
fprintf(stderr, error);
- error = re_compile_pattern(tildetabPattern, strlen(tildetabPattern), &tildetabBuf);
+ error = re_compile_pattern(tildetabPattern, strlen(tildetabPattern),
+ &tildetabBuf);
if (error)
fprintf(stderr, error);
- char buffer[1024];
+ // Read file
delete[] fChars;
fChars = new char[CHARS_TABLE_MAXSIZE];
@@ -611,7 +406,7 @@
int diaeresisOffset = 0;
int tildeOffset = 0;
- int32 *maps[] = {
+ int32* maps[] = {
fKeys.normal_map,
fKeys.shift_map,
fKeys.control_map,
@@ -623,93 +418,118 @@
fKeys.option_caps_shift_map
};
- while (fgets(buffer, 1024-1, f) != NULL) {
+ char buffer[1024];
+
+ while (fgets(buffer, sizeof(buffer) - 1, file) != NULL) {
if (buffer[0] == '#' || buffer[0] == '\n')
continue;
+ size_t length = strlen(buffer);
+
struct re_registers regs;
- if (re_search(&versionBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ if (re_search(&versionBuf, buffer, length, 0, length, ®s) >= 0) {
sscanf(buffer + regs.start[1], "%ld", &fKeys.version);
- } else if (re_search(&capslockBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(&capslockBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&scrolllockBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&numlockBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&lshiftBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&rshiftBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&lcommandBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&rcommandBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&lcontrolBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&rcontrolBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&loptionBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&roptionBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&menuBuf, buffer, length, 0, length, ®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) {
+ } else if (re_search(&locksettingsBuf, buffer, length, 0, length, ®s)
+ >= 0) {
fKeys.lock_settings = 0;
for (int32 i = 1; i <= 3; i++) {
- if (regs.end[i] - regs.start[i] <= 0)
+ const char* start = buffer + regs.start[i];
+ length = regs.end[i] - regs.start[i];
+ if (length == 0)
break;
- if (strncmp(buffer + regs.start[i], "CapsLock", regs.end[i] - regs.start[i]) == 0)
+ if (!strncmp(start, "CapsLock", length))
fKeys.lock_settings |= B_CAPS_LOCK;
- else if (strncmp(buffer + regs.start[i], "NumLock", regs.end[i] - regs.start[i]) == 0)
+ else if (!strncmp(start, "NumLock", length))
fKeys.lock_settings |= B_NUM_LOCK;
- else if (strncmp(buffer + regs.start[i], "ScrollLock", regs.end[i] - regs.start[i]) == 0)
+ else if (!strncmp(start, "ScrollLock", length))
fKeys.lock_settings |= B_SCROLL_LOCK;
}
- } else if (re_search(&keyBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- uint32 keyCode;
+ } else if (re_search(&keyBuf, buffer, length, 0, length, ®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);
+ _ComputeChars(buffer, regs, i, offset);
}
}
- } else if (re_search(´Buf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(´Buf, buffer, length, 0, length, ®s) >= 0) {
for (int i = 1; i <= 2; i++) {
- fKeys.acute_dead_key[acuteOffset++] = offset;
- ComputeChars(buffer, regs, i, offset);
+ fKeys.acute_dead_key[acuteOffset++] = offset;
+ _ComputeChars(buffer, regs, i, offset);
}
- } else if (re_search(&graveBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(&graveBuf, buffer, length, 0, length, ®s) >= 0) {
for (int i = 1; i <= 2; i++) {
- fKeys.grave_dead_key[graveOffset++] = offset;
- ComputeChars(buffer, regs, i, offset);
+ fKeys.grave_dead_key[graveOffset++] = offset;
+ _ComputeChars(buffer, regs, i, offset);
}
- } else if (re_search(&circumflexBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(&circumflexBuf, buffer, length, 0, length, ®s)
+ >= 0) {
for (int i = 1; i <= 2; i++) {
- fKeys.circumflex_dead_key[circumflexOffset++] = offset;
- ComputeChars(buffer, regs, i, offset);
+ fKeys.circumflex_dead_key[circumflexOffset++] = offset;
+ _ComputeChars(buffer, regs, i, offset);
}
- } else if (re_search(&diaeresisBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(&diaeresisBuf, buffer, length, 0, length, ®s)
+ >= 0) {
for (int i = 1; i <= 2; i++) {
- fKeys.dieresis_dead_key[diaeresisOffset++] = offset;
- ComputeChars(buffer, regs, i, offset);
+ fKeys.dieresis_dead_key[diaeresisOffset++] = offset;
+ _ComputeChars(buffer, regs, i, offset);
}
- } else if (re_search(&tildeBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
+ } else if (re_search(&tildeBuf, buffer, length, 0, length, ®s) >= 0) {
for (int i = 1; i <= 2; i++) {
- fKeys.tilde_dead_key[tildeOffset++] = offset;
- ComputeChars(buffer, regs, i, offset);
+ fKeys.tilde_dead_key[tildeOffset++] = offset;
+ _ComputeChars(buffer, regs, i, offset);
}
- } else if (re_search(´tabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- ComputeTables(buffer, regs, fKeys.acute_tables);
- } else if (re_search(&gravetabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- ComputeTables(buffer, regs, fKeys.grave_tables);
- } else if (re_search(&circumflextabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- ComputeTables(buffer, regs, fKeys.circumflex_tables);
- } else if (re_search(&diaeresistabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- ComputeTables(buffer, regs, fKeys.dieresis_tables);
- } else if (re_search(&tildetabBuf, buffer, strlen(buffer), 0, strlen(buffer), ®s) >= 0) {
- ComputeTables(buffer, regs, fKeys.tilde_tables);
+ } else if (re_search(´tabBuf, buffer, length, 0, length, ®s)
+ >= 0) {
+ _ComputeTables(buffer, regs, fKeys.acute_tables);
+ } else if (re_search(&gravetabBuf, buffer, length, 0, length, ®s)
+ >= 0) {
+ _ComputeTables(buffer, regs, fKeys.grave_tables);
+ } else if (re_search(&circumflextabBuf, buffer, length, 0, length, ®s)
+ >= 0) {
+ _ComputeTables(buffer, regs, fKeys.circumflex_tables);
+ } else if (re_search(&diaeresistabBuf, buffer, length, 0, length, ®s)
+ >= 0) {
+ _ComputeTables(buffer, regs, fKeys.dieresis_tables);
+ } else if (re_search(&tildetabBuf, buffer, length, 0, length, ®s)
+ >= 0) {
+ _ComputeTables(buffer, regs, fKeys.tilde_tables);
}
}
@@ -720,18 +540,42 @@
return B_OK;
}
-
-//! we save a map to a file
-status_t
-Keymap::Save(entry_ref &ref)
+
+status_t
+Keymap::SaveAsCurrent()
{
- status_t err;
+#if (defined(__BEOS__) || defined(__HAIKU__))
+ BPath path;
+ status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path, true);
+ if (status != B_OK)
+ return status;
- BFile file(&ref, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE );
- if ((err = file.InitCheck()) != B_OK)
- return err;
+ path.Append("Key_map");
+ status = Save(path.Path());
+ if (status != B_OK)
+ return status;
+
+ Use();
+ return B_OK;
+#else // ! __BEOS__
+ fprintf(stderr, "Unsupported operation on this platform!\n");
+ exit(1);
+#endif // ! __BEOS__
+}
+
+
+//! Save a binary keymap to a file.
+status_t
+Keymap::Save(const char* name)
+{
+ BFile file;
+ status_t status = file.SetTo(name,
+ B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
+ if (status != B_OK)
[... truncated: 1088 lines follow ...]
More information about the Haiku-commits
mailing list