Created
May 27, 2017 00:05
-
-
Save masatake/f1b447c5a7d199ef7e69f3bbb5aeb4fe to your computer and use it in GitHub Desktop.
Unable to apply subparser #1409
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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