/* * Pick out command-line options and set up appres. */ static void parse_options(int *argcp, const char **argv) { int i; unsigned j; int argc_out = 0; const char **argv_out = (const char **) Malloc((*argcp + 1) * sizeof(char *)); optlist_t *o; opt_t *opts; /* Parse the command-line options. */ argv_out[argc_out++] = argv[0]; for (i = 1; i < *argcp; i++) { bool found = false; for (o = optlist; o != NULL && !found; o = o->next) { opts = o->opts; for (j = 0; j < o->count; j++) { if (!strcmp(argv[i], opts[j].name)) { found = true; break; } } } if (!found) { argv_out[argc_out++] = argv[i]; continue; } switch (opts[j].type) { case OPT_BOOLEAN: *(bool *)opts[j].aoff = opts[j].flag; if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].name), opts[j].flag? "true": "false"); } break; case OPT_STRING: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(const char **)opts[j].aoff = argv[++i]; if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].res_name), NewString(argv[i])); } break; case OPT_XRM: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } parse_xrm(argv[++i], "-xrm"); break; case OPT_SKIP2: argv_out[argc_out++] = argv[i++]; if (i < *argcp) { argv_out[argc_out++] = argv[i]; } break; case OPT_NOP: break; case OPT_INT: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(int *)opts[j].aoff = atoi(argv[++i]); if (opts[j].res_name != NULL) { add_resource(NewString(opts[j].name), NewString(argv[i])); } break; case OPT_V: dump_version(); break; case OPT_DONE: while (i < *argcp) { argv_out[argc_out++] = argv[i++]; } break; } } *argcp = argc_out; argv_out[argc_out] = NULL; (void) memcpy((char *)argv, (char *)argv_out, (argc_out + 1) * sizeof(char *)); Free((char *)argv_out); }
/* * Pick out command-line options and set up appres. */ static void parse_options(int *argcp, const char **argv) { int i, j; int argc_out = 0; const char **argv_out = (const char **) Malloc((*argcp + 1) * sizeof(char *)); /* Parse the command-line options. */ argv_out[argc_out++] = argv[0]; for (i = 1; i < *argcp; i++) { for (j = 0; opts[j].name != CN; j++) { if (!strcmp(argv[i], opts[j].name)) break; } if (opts[j].name == CN) { argv_out[argc_out++] = argv[i]; continue; } switch (opts[j].type) { case OPT_BOOLEAN: *(Boolean *)opts[j].aoff = opts[j].flag; if (opts[j].res_name != CN) add_resource(NewString(opts[j].name), opts[j].flag? "True": "False"); break; case OPT_STRING: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(const char **)opts[j].aoff = argv[++i]; if (opts[j].res_name != CN) add_resource(NewString(opts[j].res_name), NewString(argv[i])); break; case OPT_XRM: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } parse_xrm(argv[++i], "-xrm"); break; case OPT_SKIP2: argv_out[argc_out++] = argv[i++]; if (i < *argcp) argv_out[argc_out++] = argv[i]; break; case OPT_NOP: break; case OPT_INT: if (i == *argcp - 1) { /* missing arg */ popup_an_error("Missing value for '%s'", argv[i]); continue; } *(int *)opts[j].aoff = atoi(argv[++i]); if (opts[j].res_name != CN) add_resource(NewString(opts[j].name), NewString(argv[i])); break; case OPT_V: dump_version(); break; case OPT_DONE: while (i < *argcp) argv_out[argc_out++] = argv[i++]; break; } } *argcp = argc_out; argv_out[argc_out] = CN; (void) memcpy((char *)argv, (char *)argv_out, (argc_out + 1) * sizeof(char *)); Free((char *)argv_out); }
/* Read resources from a file. */ int read_resource_file(const char *filename, Boolean fatal) { FILE *f; int ilen; char buf[4096]; char *where; int lno = 0; f = fopen(filename, "r"); if (f == NULL) { if (fatal) xs_warning("Cannot open '%s': %s", filename, strerror(errno)); return -1; } /* Merge in what's in the file into the resource database. */ where = Malloc(strlen(filename) + 64); ilen = 0; while (fgets(buf + ilen, sizeof(buf) - ilen, f) != CN || ilen) { char *s, *t; unsigned sl; Boolean bsl; lno++; /* Stip any trailing newline. */ sl = strlen(buf + ilen); if (sl && (buf + ilen)[sl-1] == '\n') (buf + ilen)[--sl] = '\0'; /* * Translate backslash-n to real newline characters, and * remember if the last character is a backslash. */ for (bsl = False, s = buf + ilen, t = s; *s; s++) { if (bsl) { if (*s == 'n') *t++ = '\n'; else *t++ = *s; bsl = False; } else if (*s == '\\') bsl = True; else { *t++ = *s; bsl = False; } } *t = '\0'; /* Skip leading whitespace. */ s = buf; while (isspace(*s)) s++; /* Skip comments _before_ checking for line continuation. */ if (*s == '!') { ilen = 0; continue; } if (*s == '#') { (void) sprintf(where, "%s:%d: Invalid profile " "syntax ('#' ignored)", filename, lno); Warning(where); ilen = 0; continue; } /* If this line is a continuation, try again. */ if (bsl) { ilen += strlen(buf + ilen); if (ilen >= sizeof(buf) - 1) { (void) sprintf(where, "%s:%d: Line too long\n", filename, lno); Warning(where); break; } continue; } /* Strip trailing whitespace and check for empty lines. */ sl = strlen(s); while (sl && isspace(s[sl-1])) s[--sl] = '\0'; if (!sl) { ilen = 0; continue; } /* Digest it. */ (void) sprintf(where, "%s:%d", filename, lno); parse_xrm(s, where); /* Get ready for the next iteration. */ ilen = 0; } Free(where); return 0; }