Skip to content

Instantly share code, notes, and snippets.

@masatake
Created May 27, 2017 00:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save masatake/f1b447c5a7d199ef7e69f3bbb5aeb4fe to your computer and use it in GitHub Desktop.
Save masatake/f1b447c5a7d199ef7e69f3bbb5aeb4fe to your computer and use it in GitHub Desktop.
Unable to apply subparser #1409
diff --git a/main/parse.c b/main/parse.c
index 254c661..9a8c624 100644
--- a/main/parse.c
+++ b/main/parse.c
@@ -1677,25 +1677,43 @@ static void doNothing (void)
{
}
+static void optlibRunBaseParser (void)
+{
+ scheduleRunningBaseparser (0);
+}
+
static void lazyInitialize (langType language)
{
- parserDefinition* lang;
+ parserDefinition* def;
Assert (0 <= language && language < (int) LanguageCount);
- lang = LanguageTable [language].def;
+ def = LanguageTable [language].def;
- lang->parser = doNothing;
+ def->parser = doNothing;
- if (lang->method & METHOD_REGEX)
- lang->parser = findRegexTags;
+ if (def->method & METHOD_REGEX)
+ {
+ if (def->dependencies
+ && (def->dependencies->type == DEPTYPE_SUBPARSER)
+ && ((subparser *)def->dependencies->data)->direction & SUBPARSER_SUB_RUNS_BASE)
+ def->parser = optlibRunBaseParser;
+ else
+ def->parser = findRegexTags;
+ }
}
/*
* Option parsing
*/
+struct preLangDefFlagData
+{
+ char *base;
+ bool exclusive;
+};
+
static void pre_lang_def_flag_base_long (const char* const optflag, const char* const param, void* data)
{
- char **name = data;
+ struct preLangDefFlagData * flag_data = data;
langType base;
if (param[0] == '\0')
@@ -1713,11 +1731,19 @@ static void pre_lang_def_flag_base_long (const char* const optflag, const char*
}
- *name = eStrdup(param);
+ flag_data->base = eStrdup(param);
+}
+
+static void pre_lang_def_flag_exclusive_long (const char* const optflag, const char* const param, void* data)
+{
+ struct preLangDefFlagData * flag_data = data;
+
+ flag_data->exclusive = true;
}
static flagDefinition PreLangDefFlagDef [] = {
- { '\0', "base", NULL, pre_lang_def_flag_base_long },
+ { '\0', "base", NULL, pre_lang_def_flag_base_long },
+ { '\0', "exclusive", NULL, pre_lang_def_flag_exclusive_long },
};
static void lang_def_flag_file_kind_long (const char* const optflag, const char* const param, void* data)
@@ -1761,7 +1787,7 @@ static void optlibFreeDep (langType lang, bool initialized)
}
}
-static parserDefinition* OptlibParser(const char *name, const char *base)
+static parserDefinition* OptlibParser(const char *name, const char *base, bool exclusive)
{
parserDefinition *def;
@@ -1773,7 +1799,11 @@ static parserDefinition* OptlibParser(const char *name, const char *base)
subparser *sub = xCalloc (1, subparser);
parserDependency *dep = xCalloc (1, parserDependency);
- sub->direction = SUBPARSER_BASE_RUNS_SUB;
+ if (exclusive)
+ sub->direction = SUBPARSER_SUB_RUNS_BASE;
+ else
+ sub->direction = SUBPARSER_BASE_RUNS_SUB;
+
dep->type = DEPTYPE_SUBPARSER;
dep->upperParser = eStrdup (base);
dep->data = sub;
@@ -1807,12 +1837,15 @@ extern void processLanguageDefineOption (
LanguageTable = xRealloc (LanguageTable, LanguageCount + 1, parserObject);
memset (LanguageTable + LanguageCount, 0, sizeof(parserObject));
- char *base = NULL;
- flagsEval (flags, PreLangDefFlagDef, ARRAY_SIZE (PreLangDefFlagDef), &base);
+ struct preLangDefFlagData data = {
+ .base = NULL,
+ .exclusive = false,
+ };
+ flagsEval (flags, PreLangDefFlagDef, ARRAY_SIZE (PreLangDefFlagDef), &data);
- def = OptlibParser (name, base);
- if (base)
- eFree (base);
+ def = OptlibParser (name, data.base, data.exclusive);
+ if (data.base)
+ eFree (data.base);
initializeParsingCommon (def, false);
linkDependenciesAtInitializeParsing (def);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment