Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 76 additions & 31 deletions main/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@
/* The following separators are permitted for list options.
*/
#define EXTENSION_SEPARATOR '.'
#define REXPR_START '%'
#define REXPR_STOP '%'
#define REXPR_ICASE 'i'
#define PATTERN_START '('
#define PATTERN_STOP ')'
#define IGNORE_SEPARATORS ", \t\n"
Expand Down Expand Up @@ -303,10 +306,10 @@ static optionDescription LongOptionDescription [] = {
{1,0," --langmap=<map>[,<map>[...]]"},
{1,0," Override default mapping of language to input file extension."},
{1,0," e.g. --langmap=c:.c.x,java:+.j,make:([Mm]akefile).mak"},
{1,0," --map-<LANG>=[+|-]<extension>|<pattern>"},
{1,0," --map-<LANG>=[+|-]<extension>|<pattern>|<regex>"},
{1,0," Set, add(+) or remove(-) the map for <LANG>."},
{1,0," Unlike --langmap, this doesn't take a list; only one file name <pattern>"},
{1,0," or one file <extension> can be specified at once."},
{1,0," Unlike --langmap, this doesn't take a list; only one file name <pattern>,"},
{1,0," one file name <regex>, or one file <extension> can be specified at once."},
{1,0," Unlike --langmap the change with this option affects mapping of <LANG> only."},
{1,0,""},
{1,0,"Tags File Contents Options"},
Expand Down Expand Up @@ -436,6 +439,8 @@ static optionDescription LongOptionDescription [] = {
{1,0," Output list of language extensions in mapping."},
{1,0," --list-map-patterns[=(<language>|all)]"},
{1,0," Output list of language patterns in mapping."},
{1,0," --list-map-regex[=(<language>|all)]"},
{1,0," Output list of language regular expressions in mapping."},
{1,0," --list-maps[=(<language>|all)]"},
{1,0," Output list of language mappings (both extensions and patterns)."},
{1,0," --list-mline-regex-flags"},
Expand Down Expand Up @@ -1751,7 +1756,7 @@ static char* skipPastMap (char* p)
static char* extractMapFromParameter (const langType language,
char* parameter,
char** tail,
bool* pattern_p,
langmapType *mapType,
char* (* skip) (char *))
{
char* p = NULL;
Expand All @@ -1761,7 +1766,7 @@ static char* extractMapFromParameter (const langType language,

if (first == EXTENSION_SEPARATOR) /* extension map */
{
*pattern_p = false;
*mapType = LMAP_EXTENSION;

++parameter;
p = (* skip) (parameter);
Expand All @@ -1771,38 +1776,56 @@ static char* extractMapFromParameter (const langType language,
*tail = parameter + strlen (parameter);
return result;
}
else
{
tmp = *p;
*p = '\0';
result = eStrdup (parameter);
*p = tmp;
*tail = p;
return result;
}

tmp = *p;
*p = '\0';
result = eStrdup (parameter);
*p = tmp;
*tail = p;
return result;
}
else if (first == PATTERN_START) /* pattern map */

if (first == PATTERN_START) /* pattern map */
{
*pattern_p = true;
*mapType = LMAP_PATTERN;

++parameter;
for (p = parameter ; *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

tmp = *p;
*p = '\0';
result = eStrdup (parameter);
*p = tmp;
*tail = p + 1;
return result;
}

if (first == REXPR_START)
{
*mapType = LMAP_REXPR;

++parameter;
vString *rexpr = vStringNew ();
for (p = parameter ; *p != REXPR_STOP && *p != '\0' ; ++p)
{
tmp = *p;
*p = '\0';
result = eStrdup (parameter);
*p = tmp;
*tail = p + 1;
return result;
if (*p == '\\' && *(p + 1) == REXPR_STOP)
continue;
vStringPut (rexpr, *p);
}
if (*p == '\0')
error (FATAL, "Unterminated file name regex for %s language",
getLanguageName (language));

*tail = p + 1;
return vStringDeleteUnwrap (rexpr);
}

return NULL;
Expand All @@ -1812,14 +1835,21 @@ static char* addLanguageMap (const langType language, char* map_parameter,
bool exclusiveInAllLanguages)
{
char* p = NULL;
bool pattern_p;
langmapType map_type;
char* map;

map = extractMapFromParameter (language, map_parameter, &p, &pattern_p, skipPastMap);
if (map && pattern_p == false)
map = extractMapFromParameter (language, map_parameter, &p, &map_type, skipPastMap);
if (map && map_type == LMAP_EXTENSION)
addLanguageExtensionMap (language, map, exclusiveInAllLanguages);
else if (map && pattern_p == true)
else if (map && map_type == LMAP_PATTERN)
addLanguagePatternMap (language, map, exclusiveInAllLanguages);
else if (map && map_type == LMAP_REXPR)
{
bool icase = (*p == REXPR_ICASE);
addLanguageRexprMap (language, map, icase, exclusiveInAllLanguages);
if (icase)
p++;
}
else
error (FATAL, "Badly formed language map for %s language",
getLanguageName (language));
Expand All @@ -1832,14 +1862,21 @@ static char* addLanguageMap (const langType language, char* map_parameter,
static char* removeLanguageMap (const langType language, char* map_parameter)
{
char* p = NULL;
bool pattern_p;
langmapType map_type;
char* map;

map = extractMapFromParameter (language, map_parameter, &p, &pattern_p, skipPastMap);
if (map && pattern_p == false)
map = extractMapFromParameter (language, map_parameter, &p, &map_type, skipPastMap);
if (map && map_type == LMAP_EXTENSION)
removeLanguageExtensionMap (language, map);
else if (map && pattern_p == true)
else if (map && map_type == LMAP_PATTERN)
removeLanguagePatternMap (language, map);
else if (map && map_type == LMAP_REXPR)
{
bool icase = (*p == REXPR_ICASE);
removeLanguageRexprMap (language, map, icase);
if (icase)
p++;
}
else
error (FATAL, "Badly formed language map for %s language",
getLanguageName (language));
Expand Down Expand Up @@ -2161,6 +2198,13 @@ static void processListMapPatternsOption (const char *const option,
processListMapsOptionForType (option, parameter, LMAP_PATTERN|LMAP_TABLE_OUTPUT);
}

static void processListMapRegularExpressionsOption (const char *const option,
const char *const parameter)
{
processListMapsOptionForType (option, parameter, LMAP_REXPR|LMAP_TABLE_OUTPUT);
}


static void processListMapsOption (
const char *const option CTAGS_ATTR_UNUSED,
const char *const parameter CTAGS_ATTR_UNUSED)
Expand Down Expand Up @@ -2892,6 +2936,7 @@ static parametricOption ParametricOptions [] = {
{ "list-maps", processListMapsOption, true, STAGE_ANY },
{ "list-map-extensions", processListMapExtensionsOption, true, STAGE_ANY },
{ "list-map-patterns", processListMapPatternsOption, true, STAGE_ANY },
{ "list-map-regex", processListMapRegularExpressionsOption, true, STAGE_ANY },
{ "list-mline-regex-flags", processListMultilineRegexFlagsOption, true, STAGE_ANY },
{ "list-output-formats", processListOutputFormatsOption, true, STAGE_ANY },
{ "list-params", processListParametersOption, true, STAGE_ANY },
Expand Down
Loading
Loading