/* * Count arguments, stopping at the end of the argument list, or on any of our * "--" tokens. */ static int arg_rest(char *argv[]) { int i = 1; /* argv[0] points to a "--" token */ while (argv[i] != 0 && (strncmp(argv[i], "--", 2) || lookupOption(argv[i], 7) == o_unknown)) i++; return i; }
/* returns false if unknown option, missing parameter, ** or option doesn't use parameter */ Bool ParseConfigOption( TidyDocImpl* doc, ctmbstr optnam, ctmbstr optval ) { const TidyOptionImpl* option = lookupOption( optnam ); Bool status = ( option != NULL ); if ( !status ) { /* Not a standard tidy option. Check to see if the user application recognizes it */ if (NULL != doc->pOptCallback) status = (*doc->pOptCallback)( optnam, optval ); if (!status) ReportUnknownOption( doc, optnam ); } else status = ParseConfigValue( doc, option->id, optval ); return status; }
int main(int argc, char *argv[]) { FILE *output = stderr; char temp[80]; const char *separate_str = DEFAULT_SEPARATE_STR; bool esc_pressed = FALSE; int offset = 1; int offset_add; int retval = DLG_EXIT_OK; int done; int j; eOptions code; const Mode *modePtr; #ifndef HAVE_COLOR int use_shadow = FALSE; /* ignore corresponding option */ #endif #if defined(ENABLE_NLS) /* initialize locale support */ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #elif defined(HAVE_SETLOCALE) (void) setlocale(LC_ALL, ""); #endif program = argv[0]; dialog_vars.output = output; if (argc == 2) { /* if we don't want clear screen */ switch (lookupOption(argv[1], 7)) { case o_print_maxsize: (void) initscr(); fprintf(output, "MaxSize: %d, %d\n", SLINES, SCOLS); end_dialog(); break; case o_print_version: fprintf(output, "Version: %s\n", VERSION); break; default: case o_help: Help(); break; } return 0; } if (argc < 2) { Help(); } init_dialog(); #ifdef HAVE_RC_FILE if (!strcmp(argv[1], "--create-rc")) { if (argc != 3) { sprintf(temp, "Expected a filename for %s", argv[1]); Usage(temp); } end_dialog(); create_rc(argv[2]); return 0; } #endif while (offset < argc && !esc_pressed) { memset(&dialog_vars, 0, sizeof(dialog_vars)); dialog_vars.aspect_ratio = DEFAULT_ASPECT_RATIO; dialog_vars.tab_len = TAB_LEN; dialog_vars.output = output; done = FALSE; while (offset < argc && !done) { /* Common options */ switch (lookupOption(argv[offset], 1)) { case o_title: dialog_vars.title = optionString(argv, &offset); break; case o_backtitle: dialog_vars.backtitle = optionString(argv, &offset); break; case o_separate_widget: separate_str = optionString(argv, &offset); break; case o_separate_output: dialog_vars.separate_output = TRUE; break; case o_cr_wrap: dialog_vars.cr_wrap = TRUE; break; case o_no_kill: dialog_vars.cant_kill = TRUE; break; case o_nocancel: dialog_vars.nocancel = TRUE; break; case o_size_err: dialog_vars.size_err = TRUE; break; case o_beep: dialog_vars.beep_signal = TRUE; break; case o_beep_after: dialog_vars.beep_after_signal = TRUE; break; case o_shadow: use_shadow = TRUE; break; case o_defaultno: defaultno = TRUE; break; case o_default_item: dialog_vars.default_item = optionString(argv, &offset); break; case o_item_help: dialog_vars.item_help = TRUE; break; case o_no_shadow: use_shadow = FALSE; break; case o_print_size: dialog_vars.print_siz = TRUE; break; case o_print_maxsize: fprintf(output, "MaxSize: %d, %d\n", SLINES, SCOLS); break; case o_print_version: fprintf(output, "Version: %s\n", VERSION); break; case o_tab_correct: dialog_vars.tab_correct = TRUE; break; case o_sleep: dialog_vars.sleep_secs = optionValue(argv, &offset); break; case o_stderr: dialog_vars.output = output = stderr; break; case o_stdout: dialog_vars.output = output = stdout; break; case o_tab_len: dialog_vars.tab_len = optionValue(argv, &offset); break; case o_aspect: dialog_vars.aspect_ratio = optionValue(argv, &offset); break; case o_begin: dialog_vars.begin_set = TRUE; dialog_vars.begin_y = optionValue(argv, &offset); dialog_vars.begin_x = optionValue(argv, &offset); break; case o_clear: if (argc == 2) { /* we only want to clear the screen */ killall_bg(&retval); (void) refresh(); end_dialog(); return 0; } dialog_vars.dlg_clear_screen = TRUE; break; case o_noitem: case o_fullbutton: /* ignore */ break; default: /* no more common options */ done = TRUE; break; } if (!done) offset++; } for (j = 1; j < argc; j++) { if (strncmp(argv[j - 1], "--", 2) == 0 && strcmp(argv[j - 1], "--backtitle") != 0 && strcmp(argv[j - 1], "--title") != 0) { dlg_trim_string(argv[j]); } } if (argv[offset] == NULL) { Usage("Expected a box option"); } if (lookupOption(argv[offset], 2) != o_checklist && dialog_vars.separate_output) { sprintf(temp, "Expected --checklist, not %.20s", argv[offset]); Usage(temp); } if (dialog_vars.aspect_ratio == 0) dialog_vars.aspect_ratio = DEFAULT_ASPECT_RATIO; put_backtitle(); /* use a table to look for the requested mode, to avoid code duplication */ modePtr = 0; if ((code = lookupOption(argv[offset], 2)) != o_unknown) modePtr = lookupMode(code); if (modePtr == 0) { sprintf(temp, "Unknown option %.20s", argv[offset]); Usage(temp); } if (arg_rest(&argv[offset]) < modePtr->argmin) { sprintf(temp, "Expected at least %d tokens for %.20s, have %d", modePtr->argmin - 1, argv[offset], arg_rest(&argv[offset]) - 1); Usage(temp); } if (modePtr->argmax && arg_rest(&argv[offset]) > modePtr->argmax) { sprintf(temp, "Expected no more than %d tokens for %.20s, have %d", modePtr->argmax - 1, argv[offset], arg_rest(&argv[offset]) - 1); Usage(temp); } retval = (*(modePtr->jumper)) (dialog_vars.title, argv + offset, &offset_add); offset += offset_add; if (retval == DLG_EXIT_ESC) { esc_pressed = TRUE; } else { if (dialog_vars.beep_after_signal) (void) beep(); if (dialog_vars.sleep_secs) (void) napms(dialog_vars.sleep_secs * 1000); if (offset < argc) { switch (lookupOption(argv[offset], 7)) { case o_and_widget: (void) fputs(separate_str, output); offset++; break; case o_unknown: sprintf(temp, "Expected --and-widget, not %.20s", argv[offset]); Usage(temp); break; default: /* if we got a cancel, etc., stop chaining */ if (retval != DLG_EXIT_OK) esc_pressed = TRUE; else dialog_vars.dlg_clear_screen = TRUE; break; } } if (dialog_vars.dlg_clear_screen) dialog_clear(); } } killall_bg(&retval); (void) refresh(); end_dialog(); return retval; /* assume this is the same as exit(retval) */ }
/* open the file and parse its contents */ int ParseConfigFileEnc( TidyDocImpl* doc, ctmbstr file, ctmbstr charenc ) { uint opterrs = doc->optionErrors; tmbstr fname = (tmbstr) ExpandTilde( file ); TidyConfigImpl* cfg = &doc->config; FILE* fin = fopen( fname, "r" ); int enc = CharEncodingId( charenc ); if ( fin == NULL || enc < 0 ) { FileError( doc, fname, TidyConfig ); return -1; } else { tchar c; cfg->cfgIn = FileInput( doc, fin, enc ); c = FirstChar( cfg ); for ( c = SkipWhite(cfg); c != EndOfStream; c = NextProperty(cfg) ) { uint ix = 0; tmbchar name[ TIDY_MAX_NAME ] = {0}; /* // or # start a comment */ if ( c == '/' || c == '#' ) continue; while ( ix < sizeof(name)-1 && c != '\n' && c != EndOfStream && c != ':' ) { name[ ix++ ] = (tmbchar) c; /* Option names all ASCII */ c = AdvanceChar( cfg ); } if ( c == ':' ) { const TidyOptionImpl* option = lookupOption( name ); c = AdvanceChar( cfg ); if ( option ) option->parser( doc, option ); else { if (NULL != doc->pOptCallback) { TidyConfigImpl* cfg = &doc->config; tmbchar buf[8192]; uint i = 0; tchar delim = 0; Bool waswhite = yes; tchar c = SkipWhite( cfg ); if ( c == '"' || c == '\'' ) { delim = c; c = AdvanceChar( cfg ); } while ( i < sizeof(buf)-2 && c != EndOfStream && c != '\r' && c != '\n' ) { if ( delim && c == delim ) break; if ( IsWhite(c) ) { if ( waswhite ) { c = AdvanceChar( cfg ); continue; } c = ' '; } else waswhite = no; buf[i++] = (tmbchar) c; c = AdvanceChar( cfg ); } buf[i] = '\0'; if (no == (*doc->pOptCallback)( name, buf )) ReportUnknownOption( doc, name ); } else ReportUnknownOption( doc, name ); } } } fclose( fin ); MemFree( (void *)cfg->cfgIn->source.sourceData ); /* fix for bug #810259 */ freeStreamIn( cfg->cfgIn ); cfg->cfgIn = NULL; } if ( fname != (tmbstr) file ) MemFree( fname ); AdjustConfig( doc ); /* any new config errors? If so, return warning status. */ return (doc->optionErrors > opterrs ? 1 : 0); }