📄 options.c
字号:
return (boolean) (argOff (current->args) && ! cArgOptionPending (current));}extern boolean cArgIsOption (cookedArgs* const current){ Assert (current != NULL); return current->isOption;}extern const char* cArgItem (cookedArgs* const current){ Assert (current != NULL); return current->item;}extern void cArgForth (cookedArgs* const current){ Assert (current != NULL); Assert (! cArgOff (current)); if (cArgOptionPending (current)) parseShortOption (current); else { Assert (! argOff (current->args)); argForth (current->args); if (! argOff (current->args)) cArgRead (current); else { current->isOption = FALSE; current->longOption = FALSE; current->shortOptions = NULL; current->item = NULL; current->parameter = NULL; } }}/* * File extension and language mapping */static void addExtensionList ( stringList *const slist, const char *const elist, const boolean clear){ char *const extensionList = eStrdup (elist); const char *extension = NULL; boolean first = TRUE; if (clear) { verbose (" clearing\n"); stringListClear (slist); } verbose (" adding: "); if (elist != NULL && *elist != '\0') { extension = extensionList; if (elist [0] == EXTENSION_SEPARATOR) ++extension; } while (extension != NULL) { char *separator = strchr (extension, EXTENSION_SEPARATOR); if (separator != NULL) *separator = '\0'; verbose ("%s%s", first ? "" : ", ", *extension == '\0' ? "(NONE)" : extension); stringListAdd (slist, vStringNewInit (extension)); first = FALSE; if (separator == NULL) extension = NULL; else extension = separator + 1; } if (Option.verbose) { printf ("\n now: "); stringListPrint (slist); putchar ('\n'); } eFree (extensionList);}static boolean isFalse (const char *parameter){ return (boolean) ( strcasecmp (parameter, "0" ) == 0 || strcasecmp (parameter, "n" ) == 0 || strcasecmp (parameter, "no" ) == 0 || strcasecmp (parameter, "off") == 0);}static boolean isTrue (const char *parameter){ return (boolean) ( strcasecmp (parameter, "1" ) == 0 || strcasecmp (parameter, "y" ) == 0 || strcasecmp (parameter, "yes") == 0 || strcasecmp (parameter, "on" ) == 0);}/* Determines whether the specified file name is considered to be a header * file for the purposes of determining whether enclosed tags are global or * static. */extern boolean isIncludeFile (const char *const fileName){ boolean result = FALSE; const char *const extension = fileExtension (fileName); if (Option.headerExt != NULL) result = stringListExtensionMatched (Option.headerExt, extension); return result;}/* * Specific option processing */static void processEtagsInclude ( const char *const option, const char *const parameter){ if (! Option.etags) error (FATAL, "Etags must be enabled to use \"%s\" option", option); else { vString *const file = vStringNewInit (parameter); if (Option.etagsInclude == NULL) Option.etagsInclude = stringListNew (); stringListAdd (Option.etagsInclude, file); FilesRequired = FALSE; }}static void processExcludeOption ( const char *const option __unused__, const char *const parameter){ const char *const fileName = parameter + 1; if (parameter [0] == '\0') freeList (&Excluded); else if (parameter [0] == '@') { stringList* const sl = stringListNewFromFile (fileName); if (sl == NULL) error (FATAL | PERROR, "cannot open \"%s\"", fileName); if (Excluded == NULL) Excluded = sl; else stringListCombine (Excluded, sl); verbose (" adding exclude patterns from %s\n", fileName); } else { vString *const item = vStringNewInit (parameter); if (Excluded == NULL) Excluded = stringListNew (); stringListAdd (Excluded, item); verbose (" adding exclude pattern: %s\n", parameter); }}extern boolean isExcludedFile (const char* const name){ const char* base = baseFilename (name); boolean result = FALSE; if (Excluded != NULL) { result = stringListFileMatched (Excluded, base); if (! result && name != base) result = stringListFileMatched (Excluded, name); }#ifdef AMIGA /* not a good solution, but the only one which works often */ if (! result) result = (boolean) (strcmp (name, TagFile.name) == 0);#endif return result;}static void processExcmdOption ( const char *const option, const char *const parameter){ switch (*parameter) { case 'm': Option.locate = EX_MIX; break; case 'n': Option.locate = EX_LINENUM; break; case 'p': Option.locate = EX_PATTERN; break; default: error (FATAL, "Invalid value for \"%s\" option", option); break; }}static void processExtraTagsOption ( const char *const option, const char *const parameter){ struct sInclude *const inc = &Option.include; const char *p = parameter; boolean mode = TRUE; int c; if (*p != '+' && *p != '-') { inc->fileNames = FALSE; inc->qualifiedTags = FALSE;#if 0 inc->fileScope = FALSE;#endif } while ((c = *p++) != '\0') switch (c) { case '+': mode = TRUE; break; case '-': mode = FALSE; break; case 'f': inc->fileNames = mode; break; case 'q': inc->qualifiedTags = mode; break;#if 0 case 'F': inc->fileScope = mode; break;#endif default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option", c, option); break; }}static void processFieldsOption ( const char *const option, const char *const parameter){ struct sExtFields *field = &Option.extensionFields; const char *p = parameter; boolean mode = TRUE; int c; if (*p != '+' && *p != '-') { field->access = FALSE; field->fileScope = FALSE; field->implementation = FALSE; field->inheritance = FALSE; field->kind = FALSE; field->kindKey = FALSE; field->kindLong = FALSE; field->language = FALSE; field->scope = FALSE; field->typeRef = FALSE; } while ((c = *p++) != '\0') switch (c) { case '+': mode = TRUE; break; case '-': mode = FALSE; break; case 'a': field->access = mode; break; case 'f': field->fileScope = mode; break; case 'm': field->implementation = mode; break; case 'i': field->inheritance = mode; break; case 'k': field->kind = mode; break; case 'K': field->kindLong = mode; break; case 'l': field->language = mode; break; case 'n': field->lineNumber = mode; break; case 's': field->scope = mode; break; case 'S': field->signature = mode; break; case 'z': field->kindKey = mode; break; case 't': field->typeRef = mode; break; default: error(WARNING, "Unsupported parameter '%c' for \"%s\" option", c, option); break; }}static void processFilterTerminatorOption ( const char *const option __unused__, const char *const parameter){ freeString (&Option.filterTerminator); Option.filterTerminator = stringCopy (parameter);}static void processFormatOption ( const char *const option, const char *const parameter){ unsigned int format; if (sscanf (parameter, "%u", &format) < 1) error (FATAL, "Invalid value for \"%s\" option",option); else if (format <= (unsigned int) MaxSupportedTagFormat) Option.tagFileFormat = format; else error (FATAL, "Unsupported value for \"%s\" option", option);}static void printInvocationDescription (void){ printf (INVOCATION, getExecutableName ());}static void printOptionDescriptions (const optionDescription *const optDesc){ int i; for (i = 0 ; optDesc [i].description != NULL ; ++i) { if (! Option.etags || optDesc [i].usedByEtags) puts (optDesc [i].description); }}static void printFeatureList (void){ int i; for (i = 0 ; Features [i] != NULL ; ++i) { if (i == 0) printf (" Optional compiled features: "); printf ("%s+%s", (i>0 ? ", " : ""), Features [i]);#ifdef CUSTOM_CONFIGURATION_FILE if (strcmp (Features [i], "custom-conf") == 0) printf ("=%s", CUSTOM_CONFIGURATION_FILE);#endif } if (i > 0) putchar ('\n');}static void printProgramIdentification (void){ printf ("%s %s, Copyright (C) 1996-2004 %s\n", PROGRAM_NAME, PROGRAM_VERSION, AUTHOR_NAME); printf (" Compiled: %s, %s\n", __DATE__, __TIME__); printf (" Addresses: <%s>, %s\n", AUTHOR_EMAIL, PROGRAM_URL); printFeatureList ();}static void processHelpOption ( const char *const option __unused__, const char *const parameter __unused__){ printProgramIdentification (); putchar ('\n'); printInvocationDescription (); putchar ('\n'); printOptionDescriptions (LongOptionDescription); exit (0);}static void processLanguageForceOption ( const char *const option, const char *const parameter){ langType language; if (strcasecmp (parameter, "auto") == 0) language = LANG_AUTO; else language = getNamedLanguage (parameter); if (strcmp (option, "lang") == 0 || strcmp (option, "language") == 0) error (WARNING, "\"--%s\" option is obsolete; use \"--language-force\" instead", option); if (language == LANG_IGNORE) error (FATAL, "Unknown language specified in \"%s\" option", option); else Option.language = language;}static char* skipPastMap (char* p){ while (*p != EXTENSION_SEPARATOR && *p != PATTERN_START && *p != ',' && *p != '\0') ++p; return p;}/* Parses the mapping beginning at `map', adds it to the language map, and * returns first character past the map. */static char* addLanguageMap (const langType language, char* map){ char* p = NULL; const char first = *map; if (first == EXTENSION_SEPARATOR) /* extension map */ { ++map; p = skipPastMap (map); if (*p == '\0') { verbose (" .%s", map); addLanguageExtensionMap (language, map); p = map + strlen (map); } else { const char separator = *p; *p = '\0'; verbose (" .%s", map); addLanguageExtensionMap (language, map); *p = separator; } } else if (first == PATTERN_START) /* pattern map */ { ++map; for (p = map ; *p != PATTERN_STOP && *p != '\0' ; ++p) { if (*p == '\\' && *(p + 1) == PATTERN_STOP) ++p; } if (*p == '\0') error (FATAL, "Unterminated file name pattern for %s language", getLanguageName (language)); else { *p++ = '\0'; verbose (" (%s)", map); addLanguagePatternMap (language, map); } } else error (FATAL, "Badly formed language map for %s language", getLanguageName (language)); return p;}static char* processLanguageMap (char* map){ char* const separator = strchr (map, ':'); char* result = NULL; if (separator != NULL) { langType language; char *list = separator + 1; boolean clear = FALSE; *separator = '\0'; language = getNamedLanguage (map); if (language != LANG_IGNORE) { const char *const deflt = "default"; char* p; if (*list == '+') ++list; else clear = TRUE; for (p = list ; *p != ',' && *p != '\0' ; ++p) /*no-op*/ ; if ((size_t) (p - list) == strlen (deflt) && strncasecmp (list, deflt, p - list) == 0) { verbose (" Restoring default %s language map: ", getLanguageName (language)); installLanguageMapDefault (language); list = p; } else { if (clear) { verbose (" Setting %s language map:", getLanguageName (language)); clearLanguageMap (language); } else verbose (" Adding to %s language map:", getLanguageName (language)); while (list != NULL && *list != '\0' && *list != ',') list = addLanguageMap (language, list); verbose ("\n"); } if (list != NULL && *list == ',') ++list; result = list; } } return result;}static void processLanguageMapOption ( const char *const option, const char *const parameter){ char *const maps = eStrdup (parameter); char *map = maps; if (strcmp (parameter, "default") == 0) { verbose (" Restoring default language maps:\n"); installLanguageMapDefaults (); } else while (map != NULL && *map != '\0') { char* const next = processLanguageMap (map); if (next == NULL) error (WARNING, "Unknown language specified in \"%s\" option", option); map = next; } eFree (maps);}static void processLanguagesOption ( const char *const option, const char *const parameter){ char *const langs = eStrdup (parameter); enum { Add, Remove, Replace } mode = Replace; boolean first = TRUE; char *lang = langs; const char* prefix = ""; verbose (" Enabled languages: "); while (lang != NULL) { char *const end = strchr (lang, ','); if (lang [0] == '+') { ++lang; mode = Add; prefix = "+ "; } else if (lang [0] == '-') { ++lang; mode = Remove; prefix = "- "; } if (mode == Replace) enableLanguages (FALSE); if (end != NULL) *end = '\0'; if (lang [0] != '\0') { if (strcmp (lang, "all") == 0) enableLanguages ((boolean) (mode != Remove)); else { const langType language = getNamedLanguage (lang); if (language == LANG_IGNORE) error (WARNING, "Unknown language specified in \"%s\" option", option); else enableLanguage (language, (boolean) (mode != Remove)); } verbose ("%s%s%s", (first ? "" : ", "), prefix, lang); prefix = ""; first = FALSE; if (mode == Replace) mode = Add; } lang = (end != NULL ? end + 1 : NULL); } verbose ("\n"); eFree (langs);}static void processLicenseOption ( const char *const option __unused__, const char *const parameter __unused__){ printProgramIdentification (); puts (""); puts (License1); puts (License2); exit (0);}static void processListKindsOption ( const char *const option, const char *const parameter){ if (parameter [0] == '\0' || strcasecmp (parameter, "all") == 0) printLanguageKinds (LANG_AUTO); else { langType language = getNamedLanguage (parameter); if (language == LANG_IGNORE) error (FATAL, "Unknown language specified in \"%s\" option",option); else printLanguageKinds (language); } exit (0);}static void processListMapsOption ( const char *const __unused__ option, const char *const __unused__ parameter){ if (parameter [0] == '\0' || strcasecmp (parameter, "all") == 0) printLanguageMaps (LANG_AUTO); else { langType language = getNamedLanguage (parameter); if (language == LANG_IGNORE) error (FATAL, "Unknown language specified in \"%s\" option",option); else printLanguageMaps (language); } exit (0);}static void processListLanguagesOption ( const char *const option __unused__, const char *const parameter __unused__){ printLanguageList (); exit (0);}static void processOptionFile (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -