Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Mon, 20 Apr 2015 17:48:30 UTC Commit: 2d31d8f836e3a16ae86dfb3f3426e5a272ca6f8c https://github.com/geany/geany/commit/2d31d8f836e3a16ae86dfb3f3426e5a272ca6f...
Log Message: ----------- make: Support for combined targets
Modified Paths: -------------- tagmanager/ctags/make.c tests/ctags/Makefile.am tests/ctags/make-multi-target.mak tests/ctags/make-multi-target.mak.tags tests/ctags/simple.mak.tags
Modified: tagmanager/ctags/make.c 130 lines changed, 52 insertions(+), 78 deletions(-) =================================================================== @@ -105,42 +105,19 @@ static void newMacro (vString *const name) makeSimpleTag (name, MakeKinds, K_MACRO); }
-static void newMacroFromDefine (vString *const name) -{ - /* name is something like "define JAVAHPP_RULE", find the space and jump to the next char */ - char *name_val = strchr (vStringValue (name), ' '); - - if (name_val != NULL) { - vStringCopyS (name, name_val + 1); - makeSimpleTag (name, MakeKinds, K_MACRO); - } -} - static void readIdentifier (const int first, vString *const id) { int depth = 0; int c = first; - int c_prev = first; - int c_next = first; vStringClear (id); - while (isIdentifier (c) || c == ' ' || (depth > 0 && c != EOF && c != '\n')) + while (isIdentifier (c) || (depth > 0 && c != EOF && c != '\n')) { - c_next = nextChar (); if (c == '(' || c == '}') depth++; else if (depth > 0 && (c == ')' || c == '}')) depth--; - if (depth < 1 && c == ' ') { - /* add the space character only if the previous and - * next character are valid identifiers */ - if (isIdentifier (c_prev) && isIdentifier (c_next)) - vStringPut (id, c); - } - else { - vStringPut (id, c); - } - c_prev = c; - c = c_next; + vStringPut (id, c); + c = nextChar (); } fileUngetc (c); vStringTerminate (id); @@ -148,7 +125,7 @@ static void readIdentifier (const int first, vString *const id)
static void findMakeTags (void) { - vString *name = vStringNew (); + stringList *identifiers = stringListNew (); boolean newline = TRUE; boolean in_define = FALSE; boolean in_rule = FALSE; @@ -169,6 +146,7 @@ static void findMakeTags (void) else in_rule = FALSE; } + stringListClear (identifiers); variable_possible = (boolean)(!in_rule); newline = FALSE; } @@ -178,74 +156,70 @@ static void findMakeTags (void) continue; else if (c == '#') skipLine (); - else if (c == ':') + else if (variable_possible && c == '?') + { + c = nextChar (); + fileUngetc (c); + variable_possible = (c == '='); + } + else if (variable_possible && c == ':' && + stringListCount (identifiers) > 0) + { + c = nextChar (); + fileUngetc (c); + if (c != '=') + { + unsigned int i; + for (i = 0; i < stringListCount (identifiers); i++) + newTarget (stringListItem (identifiers, i)); + stringListClear (identifiers); + in_rule = TRUE; + } + } + else if (variable_possible && c == '=' && + stringListCount (identifiers) == 1) { - variable_possible = TRUE; - in_rule = TRUE; + newMacro (stringListItem (identifiers, 0)); + skipLine (); + in_rule = FALSE; } else if (variable_possible && isIdentifier (c)) { + vString *name = vStringNew (); readIdentifier (c, name); - if (strncmp (vStringValue (name), "endef", 5) == 0) - in_define = FALSE; - else if (in_define) - skipLine (); - else if (strncmp (vStringValue (name), "define", 6) == 0 && - isIdentifier (c)) + stringListAdd (identifiers, name); + + if (stringListCount (identifiers) == 1) { - in_define = TRUE; - c = skipToNonWhite (); - newMacroFromDefine (name); - skipLine (); - } - else { - c = skipToNonWhite (); - if (strchr (":?+", c) != NULL) + if (in_define && ! strcmp (vStringValue (name), "endef")) + in_define = FALSE; + else if (in_define) + skipLine (); + else if (! strcmp (vStringValue (name), "define")) { - boolean append = (boolean)(c == '+'); - boolean was_colon = (c == ':'); - c = nextChar (); - if (was_colon) - { - if (c == '=') - { - newMacro (name); - in_rule = FALSE; - skipLine (); - } - else - { - fileUngetc (c); - in_rule = TRUE; - newTarget (name); - } - } - else if (append) + in_define = TRUE; + c = skipToNonWhite (); + vStringClear (name); + /* all remaining characters on the line are the name -- even spaces */ + while (c != EOF && c != '\n') { - skipLine (); - continue; + vStringPut (name, c); + c = nextChar (); } - else - { + if (c == '\n') fileUngetc (c); - } - } - else if (c == '=') - { + vStringTerminate (name); + vStringStripTrailing (name); newMacro (name); - in_rule = FALSE; - skipLine (); - } - else - { - fileUngetc (c); } + else if (! strcmp (vStringValue (name), "export")) + stringListClear (identifiers); } } else variable_possible = FALSE; } - vStringDelete (name); + stringListDelete (identifiers); }
extern parserDefinition* MakefileParser (void)
Modified: tests/ctags/Makefile.am 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -200,6 +200,7 @@ test_sources = \ line_directives.c \ local.c \ macros.c \ + make-multi-target.mak \ make-target-with-parentheses.mak \ make-variable-on-cmdline.mak \ masm.asm \
Modified: tests/ctags/make-multi-target.mak 8 lines changed, 8 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,8 @@ + +all: foo bar + +foo bar: baz + echo $@ + +baz: + echo $@
Modified: tests/ctags/make-multi-target.mak.tags 5 lines changed, 5 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,5 @@ +# format=tagmanager +all�16�0 +bar�16�0 +baz�16�0 +foo�16�0
Modified: tests/ctags/simple.mak.tags 2 lines changed, 1 insertions(+), 1 deletions(-) =================================================================== @@ -8,7 +8,7 @@ E F�65536�0 G�65536�0 H�65536�0 +I�65536�0 a.o�16�0 b.o�16�0 default�16�0 -export I�65536�0
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).