📄 options.c
字号:
{
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-2003 %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 (
const char *const option, const char *const parameter)
{
if (parameter [0] == '\0')
error (WARNING, "no option file supplied for \"%s\"", option);
else if (! parseFileOptions (parameter))
error (FATAL | PERROR, "cannot open option file \"%s\"", parameter);
}
static void processSortOption (
const char *const option, const char *const parameter)
{
if (isFalse (parameter))
Option.sorted = SO_UNSORTED;
else if (isTrue (parameter))
Option.sorted = SO_SORTED;
else if (strcasecmp (parameter, "f") == 0 ||
strcasecmp (parameter, "fold") == 0 ||
strcasecmp (parameter, "foldcase") == 0)
Option.sorted = SO_FOLDSORTED;
else
error (FATAL, "Invalid value for \"%s\" option", option);
}
static void installHeaderListDefaults (void)
{
Option.headerExt = stringListNewFromArgv (HeaderExtensions);
if (Option.verbose)
{
printf (" Setting default header extensions: ");
stringListPrint (Option.headerExt);
putchar ('\n');
}
}
static void processHeaderListOption (const int option, const char *parameter)
{
/* Check to make sure that the user did not enter "ctags -h *.c"
* by testing to see if the list is a filename that exists.
*/
if (doesFileExist (parameter))
error (FATAL, "-%c: Invalid list", option);
if (strcmp (parameter, "default") == 0)
installHeaderListDefaults ();
else
{
boolean clear = TRUE;
if (parameter [0] == '+')
{
++parameter;
clear = FALSE;
}
if (Option.headerExt == NULL)
Option.headerExt = stringListNew ();
verbose (" Header Extensions:\n");
addExtensionList (Option.headerExt, parameter, clear);
}
}
/*
* Token ignore processing
*/
/* Determines whether or not "name" should be ignored, per the ignore list.
*/
extern boolean isIgnoreToken (
const char *const name, boolean *const pIgnoreParens,
const char **const replacement)
{
boolean result = FALSE;
if (Option.ignore != NULL)
{
const size_t nameLen = strlen (name);
unsigned int i;
if (pIgnoreParens != NULL)
*pIgnoreParens = FALSE;
for (i = 0 ; i < stringListCount (Option.ignore) ; ++i)
{
vString *token = stringListItem (Option.ignore, i);
if (strncmp (vStringValue (token), name, nameLen) == 0)
{
const size_t tokenLen = vStringLength (token);
if (nameLen == tokenLen)
{
result = TRUE;
break;
}
else if (tokenLen == nameLen + 1 &&
vStringChar (token, tokenLen - 1) == '+')
{
result = TRUE;
if (pIgnoreParens != NULL)
*pIgnoreParens = TRUE;
break;
}
else if (vStringChar (token, nameLen) == '=')
{
if (replacement != NULL)
*replacement = vStringValue (token) + nameLen + 1;
break;
}
}
}
}
return result;
}
static void saveIgnoreToken (vString *const ignoreToken)
{
if (Option.ignore == NULL)
Option.ignore = stringListNew ();
stringListAdd (Option.ignore, ignoreToken);
verbose (" ignore token: %s\n", vStringValue (ignoreToken));
}
static void readIgnoreList (const char *const list)
{
char* newList = stringCopy (list);
const char *token = strtok (newList, IGNORE_SEPARATORS);
while (token != NULL)
{
vString *const entry = vStringNewInit (token);
saveIgnoreToken (entry);
token = strtok (NULL, IGNORE_SEPARATORS);
}
eFree (newList);
}
static void addIgnoreListFromFile (const char *const fileName)
{
stringList* tokens = stringListNewFromFile (fileName);
if (tokens == NULL)
error (FATAL | PERROR, "cannot open \"%s\"", fileName);
if (Option.ignore == NULL)
Option.ignore = tokens;
else
stringListCombine (Option.ignore, tokens);
}
static void processIgnoreOption (const char *const list)
{
if (strchr ("@./\\", list [0]) != NULL)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -