static int yyGetIdent(int first) { int ch,i,found; int rtrn = IDENT; buf[0] = first; nInBuf = 1; while ( ((ch=getc(yyin))!=EOF) && (isalnum(ch)||(ch=='_')) ) { if ( nInBuf < BUFSIZE - 1 ) buf[nInBuf++] = ch; } buf[nInBuf++] = '\0'; found= 0; for (i=0;(!found)&&(i<numKeywords);i++) { if (uStrCaseCmp(buf,keywords[i].keyword)==0) { rtrn= keywords[i].token; found= 1; } } if (!found) { if ( scanStr ) uFree( scanStr ); scanStr = (char *)uStringDup(buf); scanStrLine = lineNum; rtrn = IDENT; } if ( (ch!=EOF) && (!isspace(ch)) ) ungetc( ch, yyin ); else if ( ch=='\n' ) lineNum++; return rtrn; }
static int yyGetKeyName(void) { int ch; nInBuf = 0; while (((ch = getc(yyin)) != EOF) && (ch != '>')) { if (ch == '\\') { if ((ch = getc(yyin)) != EOF) { if (ch == 'n') ch = '\n'; else if (ch == 't') ch = '\t'; else if (ch == 'v') ch = '\v'; else if (ch == 'b') ch = '\b'; else if (ch == 'r') ch = '\r'; else if (ch == 'f') ch = '\f'; else if (ch == 'e') ch = '\033'; else if (ch == '0') { int tmp, stop; ch = stop = 0; if (((tmp = getc(yyin)) != EOF) && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) { ch = (ch * 8) + (tmp - '0'); } else { stop = 1; ungetc(tmp, yyin); } if ((!stop) && ((tmp = getc(yyin)) != EOF) && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) { ch = (ch * 8) + (tmp - '0'); } else { stop = 1; ungetc(tmp, yyin); } if ((!stop) && ((tmp = getc(yyin)) != EOF) && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) { ch = (ch * 8) + (tmp - '0'); } else { stop = 1; ungetc(tmp, yyin); } } } else return ERROR_TOK; } if (nInBuf < BUFSIZE - 1) buf[nInBuf++] = ch; } if ((ch == '>') && (nInBuf < 5)) { buf[nInBuf++] = '\0'; if (scanStr) uFree(scanStr); scanStr = (char *) uStringDup(buf); scanStrLine = lineNum; return KEYNAME; } return ERROR_TOK; }
static Bool parseArgs(int argc, char *argv[]) { register int i, tmp; i = strlen(argv[0]); tmp = strlen("xkblist"); if ((i >= tmp) && (strcmp(&argv[0][i - tmp], "xkblist") == 0)) { xkblist = True; } for (i = 1; i < argc; i++) { int itmp; if ((argv[i][0] != '-') || (uStringEqual(argv[i], "-"))) { if (!xkblist) { if (inputFile == NULL) inputFile = argv[i]; else if (outputFile == NULL) outputFile = argv[i]; else if (warningLevel > 0) { WARN("Too many file names on command line\n"); ACTION3 ("Compiling %s, writing to %s, ignoring %s\n", inputFile, outputFile, argv[i]); } } else if (!AddMatchingFiles(argv[i])) return False; } else if ((strcmp(argv[i], "-?") == 0) || (strcmp(argv[i], "-help") == 0)) { Usage(argc, argv); exit(0); } else if ((strcmp(argv[i], "-a") == 0) && (!xkblist)) { showImplicit = True; } else if ((strcmp(argv[i], "-C") == 0) && (!xkblist)) { if ((outputFormat != WANT_DEFAULT) && (outputFormat != WANT_C_HDR)) { if (warningLevel > 0) { WARN("Multiple output file formats specified\n"); ACTION1("\"%s\" flag ignored\n", argv[i]); } } else outputFormat = WANT_C_HDR; } #ifdef DEBUG else if (strcmp(argv[i], "-d") == 0) { if ((i >= (argc - 1)) || (!isdigit(argv[i + 1][0]))) { debugFlags = 1; } else { if (sscanf(argv[++i], "%i", &itmp) == 1) debugFlags = itmp; } INFO1("Setting debug flags to %d\n", debugFlags); } #endif else if ((strcmp(argv[i], "-dflts") == 0) && (!xkblist)) { computeDflts = True; } else if (strcmp(argv[i], "-em1") == 0) { if (++i >= argc) { if (warningLevel > 0) { WARN("No pre-error message specified\n"); ACTION("Trailing \"-em1\" option ignored\n"); } } else if (preErrorMsg != NULL) { if (warningLevel > 0) { WARN("Multiple pre-error messsages specified\n"); ACTION2("Compiling %s, ignoring %s\n", preErrorMsg, argv[i]); } } else preErrorMsg = argv[i]; } else if (strcmp(argv[i], "-emp") == 0) { if (++i >= argc) { if (warningLevel > 0) { WARN("No error prefix specified\n"); ACTION("Trailing \"-emp\" option ignored\n"); } } else if (errorPrefix != NULL) { if (warningLevel > 0) { WARN("Multiple error prefixes specified\n"); ACTION2("Compiling %s, ignoring %s\n", errorPrefix, argv[i]); } } else errorPrefix = argv[i]; } else if (strcmp(argv[i], "-eml") == 0) { if (++i >= argc) { if (warningLevel > 0) { WARN("No post-error message specified\n"); ACTION("Trailing \"-eml\" option ignored\n"); } } else if (postErrorMsg != NULL) { if (warningLevel > 0) { WARN("Multiple post-error messages specified\n"); ACTION2("Compiling %s, ignoring %s\n", postErrorMsg, argv[i]); } } else postErrorMsg = argv[i]; } else if ((strncmp(argv[i], "-I", 2) == 0) && (!xkblist)) { if (!XkbAddDirectoryToPath(&argv[i][2])) { ACTION("Exiting\n"); exit(1); } } else if ((strncmp(argv[i], "-i", 2) == 0) && (!xkblist)) { if (++i >= argc) { if (warningLevel > 0) WARN("No device ID specified\n"); } device_id = atoi(argv[i]); } else if ((strncmp(argv[i], "-l", 2) == 0) && (!xkblist)) { if (outputFormat != WANT_DEFAULT) { if (warningLevel > 0) { WARN("Multiple output file formats specified\n"); ACTION1("\"%s\" flag ignored\n", argv[i]); } } else { if (argv[i][2] != '\0') setVerboseFlags(&argv[i][2]); xkblist = True; if ((inputFile) && (!AddMatchingFiles(inputFile))) return False; else inputFile = NULL; if ((outputFile) && (!AddMatchingFiles(outputFile))) return False; else outputFile = NULL; } } else if ((strcmp(argv[i], "-m") == 0) || (strcmp(argv[i], "-map") == 0)) { if (++i >= argc) { if (warningLevel > 0) { WARN("No map name specified\n"); ACTION1("Trailing \"%s\" option ignored\n", argv[i - 1]); } } else if (xkblist) { if (!AddMapOnly(argv[i])) return False; } else if (inputMap != NULL) { if (warningLevel > 0) { WARN("Multiple map names specified\n"); ACTION2("Compiling %s, ignoring %s\n", inputMap, argv[i]); } } else inputMap = argv[i]; } else if ((strcmp(argv[i], "-merge") == 0) && (!xkblist)) { /* Ignored */ } else if (strcmp(argv[i], "-o") == 0) { if (++i >= argc) { if (warningLevel > 0) { WARN("No output file specified\n"); ACTION("Trailing \"-o\" option ignored\n"); } } else if (outputFile != NULL) { if (warningLevel > 0) { WARN("Multiple output files specified\n"); ACTION2("Compiling %s, ignoring %s\n", outputFile, argv[i]); } } else outputFile = argv[i]; } else if (((strcmp(argv[i], "-opt") == 0) || (strcmp(argv[i], "optional") == 0)) && (!xkblist)) { if (++i >= argc) { if (warningLevel > 0) { WARN("No optional components specified\n"); ACTION1("Trailing \"%s\" option ignored\n", argv[i - 1]); } } else { char *tmp2; for (tmp2 = argv[i]; (*tmp2 != '\0'); tmp2++) { switch (*tmp2) { case 'c': case 'C': optionalParts |= XkmCompatMapMask; break; case 'g': case 'G': optionalParts |= XkmGeometryMask; break; case 'k': case 'K': optionalParts |= XkmKeyNamesMask; break; case 's': case 'S': optionalParts |= XkmSymbolsMask; break; case 't': case 'T': optionalParts |= XkmTypesMask; break; default: if (warningLevel > 0) { WARN1 ("Illegal component for %s option\n", argv[i - 1]); ACTION1 ("Ignoring unknown specifier \"%c\"\n", (unsigned int) *tmp2); } break; } } } } else if (strncmp(argv[i], "-p", 2) == 0) { if (isdigit(argv[i][2])) { if (sscanf(&argv[i][2], "%i", &itmp) == 1) dirsToStrip = itmp; } else if ((i < (argc - 1)) && (isdigit(argv[i + 1][0]))) { if (sscanf(argv[++i], "%i", &itmp) == 1) dirsToStrip = itmp; } else { dirsToStrip = 0; } if (warningLevel > 5) INFO1("Setting path count to %d\n", dirsToStrip); } else if (strncmp(argv[i], "-R", 2) == 0) { if (argv[i][2] == '\0') { if (warningLevel > 0) { WARN("No root directory specified\n"); ACTION("Ignoring -R option\n"); } } else if (rootDir != NULL) { if (warningLevel > 0) { WARN("Multiple root directories specified\n"); ACTION2("Using %s, ignoring %s\n", rootDir, argv[i]); } } else { rootDir = &argv[i][2]; if (warningLevel > 8) { WARN1("Changing root directory to \"%s\"\n", rootDir); } if ((chdir(rootDir) < 0) && (warningLevel > 0)) { WARN1("Couldn't change directory to \"%s\"\n", rootDir); ACTION("Root directory (-R) option ignored\n"); rootDir = NULL; } } } else if ((strcmp(argv[i], "-synch") == 0) || (strcmp(argv[i], "-s") == 0)) { synch = True; } else if (strncmp(argv[i], "-v", 2) == 0) { char *str; if (argv[i][2] != '\0') str = &argv[i][2]; else if ((i < (argc - 1)) && (argv[i + 1][0] != '-')) str = argv[++i]; else str = NULL; if (str) setVerboseFlags(str); } else if (strncmp(argv[i], "-w", 2) == 0) { if ((i >= (argc - 1)) || (!isdigit(argv[i + 1][0]))) { warningLevel = 0; if (isdigit(argv[i][1])) if (sscanf(&argv[i][1], "%i", &itmp) == 1) warningLevel = itmp; } else { if (sscanf(argv[++i], "%i", &itmp) == 1) warningLevel = itmp; } } else if ((strcmp(argv[i], "-xkb") == 0) && (!xkblist)) { if ((outputFormat != WANT_DEFAULT) && (outputFormat != WANT_XKB_FILE)) { if (warningLevel > 0) { WARN("Multiple output file formats specified\n"); ACTION1("\"%s\" flag ignored\n", argv[i]); } } else outputFormat = WANT_XKB_FILE; } else if ((strcmp(argv[i], "-xkm") == 0) && (!xkblist)) { if ((outputFormat != WANT_DEFAULT) && (outputFormat != WANT_XKM_FILE)) { if (warningLevel > 0) { WARN("Multiple output file formats specified\n"); ACTION1("\"%s\" flag ignored\n", argv[i]); } } else outputFormat = WANT_XKM_FILE; } else { ERROR1("Unknown flag \"%s\" on command line\n", argv[i]); Usage(argc, argv); return False; } } if (xkblist) inputFormat = INPUT_XKB; else if (inputFile == NULL) { ERROR("No input file specified\n"); return False; } else if (uStringEqual(inputFile, "-")) { inputFormat = INPUT_XKB; } #ifndef WIN32 else if (strchr(inputFile, ':') == NULL) { #else else if ((strchr(inputFile, ':') == NULL) || (strlen(inputFile) > 2 && isalpha(inputFile[0]) && inputFile[1] == ':' && strchr(inputFile + 2, ':') == NULL)) { #endif int len; len = strlen(inputFile); if (inputFile[len - 1] == ')') { char *tmp; if ((tmp = strchr(inputFile, '(')) != NULL) { *tmp = '\0'; inputFile[len - 1] = '\0'; tmp++; if (*tmp == '\0') { WARN("Empty map in filename\n"); ACTION("Ignored\n"); } else if (inputMap == NULL) { inputMap = uStringDup(tmp); } else { WARN("Map specified in filename and with -m flag\n"); ACTION1("map from name (\"%s\") ignored\n", tmp); } } else { ERROR1("Illegal name \"%s\" for input file\n", inputFile); return False; } } if ((len > 4) && (strcmp(&inputFile[len - 4], ".xkm") == 0)) { inputFormat = INPUT_XKM; } else { FILE *file; file = fopen(inputFile, "r"); if (file) { if (XkmProbe(file)) inputFormat = INPUT_XKM; else inputFormat = INPUT_XKB; fclose(file); } else { fprintf(stderr, "Cannot open \"%s\" for reading\n", inputFile); return False; } } } else { inDpyName = inputFile; inputFile = NULL; inputFormat = INPUT_XKM; } if (outputFormat == WANT_DEFAULT) { if (xkblist) outputFormat = WANT_LISTING; else if (inputFormat == INPUT_XKB) outputFormat = WANT_XKM_FILE; else outputFormat = WANT_XKB_FILE; } if ((outputFormat == WANT_LISTING) && (inputFormat != INPUT_XKB)) { if (inputFile) ERROR("Cannot generate a listing from a .xkm file (yet)\n"); else ERROR("Cannot generate a listing from an X connection (yet)\n"); return False; } if (xkblist) { if (outputFile == NULL) outputFile = uStringDup("-"); else if (strchr(outputFile, ':') != NULL) { ERROR("Cannot write a listing to an X connection\n"); return False; } } else if ((!outputFile) && (inputFile) && uStringEqual(inputFile, "-")) { int len = strlen("stdin") + strlen(fileTypeExt[outputFormat]) + 2; outputFile = uTypedCalloc(len, char); if (outputFile == NULL) { WSGO("Cannot allocate space for output file name\n"); ACTION("Exiting\n"); exit(1); } sprintf(outputFile, "stdin.%s", fileTypeExt[outputFormat]); } else if ((outputFile == NULL) && (inputFile != NULL))