/**** * * Implementation of options.h. * */ #include "options.h" #include "options.hP" #include OptionsStatus ProcessCommandLineOptions(int argc, char** argv) { bool error = false; char* arg; int n; for (n = 1; n < argc; n++) { /* * If arg has '-' prefix, treat as option switch, else treat as file. */ if (*argv[n] == '-') { if (not (argv[n][1])) { printf("Empty option (ignored).\n"); continue; } arg = &(argv[n][1]); if (streq(arg, "i") or streq(arg, "interactive")) { interactive_flag = true; } else if (streq(arg, "v") or streq(arg, "verbose") or streq(arg, "print-progress")) { print_progress_flag = true; } else if (streq(arg, "dump-memory")) { dump_memory_flag = true; } else if (streq(arg, "dump-symtabs")) { dump_symtabs_flag = true; } else if (streq(arg, "dump-universe")) { dump_universe_flag = true; } else if (streq(arg, "universe-duplicates")) { universe_duplicates_flag = true; } else if (streq(arg, "h") or streq(arg, "help")) { PrintUsage(); return OPTIONS_FAILED; } else { printf("Unknown option '%s'.\n", argv[n]); PrintUsage(); return OPTIONS_FAILED; } } else { continue; } } return interactive_flag ? OPTIONS_START_INTERACTIVE : OPTIONS_OK; } void PrintUsage() { #ifndef BROWSER char* executable_name = "specl"; #else char* executable_name = "rbrowse"; #endif printf("Usage:\n%s [options ...] infile ...\n", executable_name); printf("See reference manual or man page for description of options.\n"); printf("The reference manual is at http://specl.org/documentation/ref-man\n"); } void InitOptions() { interactive_flag = false; grammar_flag = false; warn_on_obj_redef_flag = true; print_progress_flag = false; dump_memory_flag = false; dump_symtabs_flag = false; dump_universe_flag = false; universe_duplicates_flag = false; } bool WarnOnObjRedefOn() { return warn_on_obj_redef_flag; } bool PrintProgressOn() { return print_progress_flag; } bool DumpMemoryOn() { return dump_memory_flag; } bool DumpSymtabsOn() { return dump_symtabs_flag; } bool DumpUniverseOn() { return dump_universe_flag; } bool UniverseDuplicatesOn() { return universe_duplicates_flag;; } /*** * Set Functions */ void SetDumpUniverseOn(bool val) { dump_universe_flag = val; } void SetUniverseDuplicatesOn(bool val) { universe_duplicates_flag = val; } /*** * The grammar flag is not a command-line option, but is used as communication * between the lexer and parser. See its use in those places for details. */ void SetGrammarFlag(bool val) { grammar_flag = val; } bool GrammarFlagOn() { return grammar_flag; }