diff options
-rw-r--r-- | keycodes.c | 6 | ||||
-rw-r--r-- | misc.c | 3 | ||||
-rw-r--r-- | symbols.c | 14 | ||||
-rw-r--r-- | xkbcomp.c | 9 | ||||
-rw-r--r-- | xkbpath.c | 83 |
5 files changed, 103 insertions, 12 deletions
@@ -739,11 +739,11 @@ HandleKeycodesFile(XkbFile * file, HandleKeycodesFile)) info->errorCount++; break; - case StmtKeycodeDef: + case StmtKeycodeDef: /* e.g. <ESC> = 9; */ if (!HandleKeycodeDef((KeycodeDef *) stmt, merge, info)) info->errorCount++; break; - case StmtKeyAliasDef: + case StmtKeyAliasDef: /* e.g. alias <MENU> = <COMP>; */ if (!HandleAliasDef((KeyAliasDef *) stmt, merge, info->fileID, &info->aliases)) info->errorCount++; @@ -752,7 +752,7 @@ HandleKeycodesFile(XkbFile * file, if (!HandleKeyNameVar((VarDef *) stmt, merge, info)) info->errorCount++; break; - case StmtIndicatorNameDef: + case StmtIndicatorNameDef: /* e.g. indicator 1 = "Caps Lock"; */ if (!HandleIndicatorNameDef((IndicatorNameDef *) stmt, merge, info)) { @@ -49,6 +49,8 @@ ProcessIncludeFile(IncludeStmt * stmt, rtrn = XkbFindFileInCache(stmt->file, file_type, &stmt->path); if (rtrn == NULL) { + /* file not in cache, open it, parse it and store it in cache for next + time. */ file = XkbFindFileInPath(stmt->file, file_type, &stmt->path); if (file == NULL) { @@ -62,6 +64,7 @@ ProcessIncludeFile(IncludeStmt * stmt, setScanState(stmt->file, 1); if (debugFlags & 2) INFO1("About to parse include file %s\n", stmt->file); + /* parse the file */ if ((XKBParseFile(file, &rtrn) == 0) || (rtrn == NULL)) { setScanState(oldFile, oldLine); @@ -61,7 +61,7 @@ extern Atom tok_KEYPAD; typedef struct _KeyInfo { CommonInfo defs; - unsigned long name; + unsigned long name; /* the 4 chars of the key name, as long */ unsigned char groupInfo; unsigned char typesDefined; unsigned char symsDefined; @@ -78,6 +78,9 @@ typedef struct _KeyInfo Atom dfltType; } KeyInfo; +/** + * Init the given key info to sane values. + */ static void InitKeyInfo(KeyInfo * info) { @@ -108,6 +111,9 @@ InitKeyInfo(KeyInfo * info) return; } +/** + * Free memory associated with this key info and reset to sane values. + */ static void FreeKeyInfo(KeyInfo * info) { @@ -136,9 +142,15 @@ FreeKeyInfo(KeyInfo * info) info->vmodmap = 0; info->nameForOverlayKey = 0; info->repeat = RepeatUndefined; + info->allowNone = 0; return; } +/** + * Copy old into new, optionally reset old to 0. + * If old is reset, new simply re-uses old's memory. Otherwise, the memory is + * newly allocated and new points to the new memory areas. + */ static Bool CopyKeyInfo(KeyInfo * old, KeyInfo * new, Bool clearOld) { @@ -868,7 +868,7 @@ extern int yydebug; int main(int argc, char *argv[]) { - FILE *file; + FILE *file; /* input file (or stdin) */ XkbFile *rtrn; XkbFile *mapToUse; int ok; @@ -953,12 +953,12 @@ main(int argc, char *argv[]) { ok = True; setScanState(inputFile, 1); - if ((inputFormat == INPUT_XKB) + if ((inputFormat == INPUT_XKB) /* parse .xkb file */ && (XKBParseFile(file, &rtrn) && (rtrn != NULL))) { fclose(file); mapToUse = rtrn; - if (inputMap != NULL) + if (inputMap != NULL) /* map specified on cmdline? */ { while ((mapToUse) && (!uStringEqual(mapToUse->name, inputMap))) @@ -974,6 +974,7 @@ main(int argc, char *argv[]) } else if (rtrn->common.next != NULL) { + /* look for map with XkbLC_Default flag. */ mapToUse = rtrn; for (; mapToUse; mapToUse = (XkbFile *) mapToUse->common.next) { @@ -1034,7 +1035,7 @@ main(int argc, char *argv[]) break; } } - else if (inputFormat == INPUT_XKM) + else if (inputFormat == INPUT_XKM) /* parse xkm file */ { unsigned tmp; bzero((char *) &result, sizeof(result)); @@ -42,14 +42,40 @@ #define PATH_MAX 1024 #endif -#define PATH_CHUNK 8 +#define PATH_CHUNK 8 /* initial szPath */ static Bool noDefaultPath = False; static int longestPath; -static int szPath; -static int nPathEntries; -static char **includePath; +static int szPath; /* number of entries allocated for includePath */ +static int nPathEntries; /* number of actual entries in includePath */ +static char **includePath; /* Holds all directories we might be including data from */ +/** + * Extract the first token from an include statement. + * @param str_inout Input statement, modified in-place. Can be passed in + * repeatedly. If str_inout is NULL, the parsing has completed. + * @param file_rtrn Set to the include file to be used. + * @param map_rtrn Set to whatever comes after ), if any. + * @param nextop_rtrn Set to the next operation in the complete statement. + * @param extra_data Set to the string between ( and ), if any. + * + * @return True if parsing was succcessful, False for an illegal string. + * + * Example: "evdev+aliases(qwerty)" + * str_inout = aliases(qwerty) + * nextop_retrn = + + * extra_data = NULL + * file_rtrn = evdev + * map_rtrn = NULL + * + * 2nd run with "aliases(qwerty)" + * str_inout = NULL + * file_rtrn = aliases + * map_rtrn = qwerty + * extra_data = NULL + * nextop_retrn = "" + * + */ Bool XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, char *nextop_rtrn, char **extra_data) @@ -71,9 +97,11 @@ XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, } else { + /* search for tokens inside the string */ next = strpbrk(str, "|+"); if (next) { + /* set nextop_rtrn to \0, next to next character */ *nextop_rtrn = *next; *next++ = '\0'; } @@ -82,6 +110,7 @@ XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, *nextop_rtrn = '\0'; next = NULL; } + /* search for :, store result in extra_data */ tmp = strchr(str, ':'); if (tmp != NULL) { @@ -128,6 +157,9 @@ XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, return True; } +/** + * Init memory for include paths. + */ Bool XkbInitIncludePath(void) { @@ -146,6 +178,9 @@ XkbAddDefaultDirectoriesToPath(void) XkbAddDirectoryToPath(DFLT_XKB_CONFIG_ROOT); } +/** + * Remove all entries from the global includePath. + */ void XkbClearIncludePath(void) { @@ -168,6 +203,10 @@ XkbClearIncludePath(void) return; } +/** + * Add the given path to the global includePath variable. + * If dir is NULL, the includePath is emptied. + */ Bool XkbAddDirectoryToPath(const char *dir) { @@ -212,6 +251,10 @@ XkbAddDirectoryToPath(const char *dir) /***====================================================================***/ +/** + * Return the xkb directory based on the type. + * Do not free the memory returned by this function. + */ char * XkbDirectoryForInclude(unsigned type) { @@ -263,6 +306,19 @@ typedef struct _FileCacheEntry } FileCacheEntry; static FileCacheEntry *fileCache; +/** + * Add the file with the given name to the internal cache to avoid opening and + * parsing the file multiple times. If a cache entry for the same name + type + * is already present, the entry is overwritten and the data belonging to the + * previous entry is returned. + * + * @parameter name The name of the file (e.g. evdev). + * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) + * @parameter path The full path to the file. + * @parameter data Already parsed data. + * + * @return The data from the overwritten file or NULL. + */ void * XkbAddFileToCache(char *name, unsigned type, char *path, void *data) { @@ -292,6 +348,15 @@ XkbAddFileToCache(char *name, unsigned type, char *path, void *data) return NULL; } +/** + * Search for the given name + type in the cache. + * + * @parameter name The name of the file (e.g. evdev). + * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) + * @parameter pathRtrn Set to the full path of the given entry. + * + * @return the data from the cache entry or NULL if no matching entry was found. + */ void * XkbFindFileInCache(char *name, unsigned type, char **pathRtrn) { @@ -310,6 +375,16 @@ XkbFindFileInCache(char *name, unsigned type, char **pathRtrn) /***====================================================================***/ +/** + * Search for the given file name in the include directories. + * + * @param type one of XkbTypesIndex, XkbCompatMapIndex, ..., or + * XkbSemanticsFile, XkmKeymapFile, ... + * @param pathReturn is set to the full path of the file if found. + * + * @return an FD to the file or NULL. If NULL is returned, the value of + * pathRtrn is undefined. + */ FILE * XkbFindFileInPath(char *name, unsigned type, char **pathRtrn) { |