Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Jiří Techet techet@gmail.com Date: Sun, 09 Oct 2016 09:04:51 UTC Commit: e685d956d66651139d6deaf779bcec3b7f4aa0d2 https://github.com/geany/geany/commit/e685d956d66651139d6deaf779bcec3b7f4aa0...
Log Message: ----------- Some sync of lcpp.c/h
Sync things which are possible to sync from lcpp.c/h. This file is heavily dependent on c.c and since our c.c differs quite significantly, it's not possible to use the universal-ctags implementation right now.
Modified Paths: -------------- ctags/main/entry.h ctags/main/lcpp.c ctags/main/lcpp.h ctags/parsers/c.c
Modified: ctags/main/entry.h 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -26,6 +26,7 @@ #define WHOLE_FILE -1L
#define NO_PARSER_FIELD -1 +#define CORK_NIL 0
/* * DATA DECLARATIONS
Modified: ctags/main/lcpp.c 74 lines changed, 45 insertions(+), 29 deletions(-) =================================================================== @@ -22,7 +22,7 @@ #include "options.h" #include "read.h" #include "vstring.h" -#include "routines.h" +#include "parse.h" #include "xtag.h"
/* @@ -135,10 +135,7 @@ extern void cppInit (const bool state, const bool hasAtLiteralStrings, Cpp.directive.ifdef [0].branchChosen = false; Cpp.directive.ifdef [0].ignoring = false;
- if (Cpp.directive.name == NULL) - Cpp.directive.name = vStringNew (); - else - vStringClear (Cpp.directive.name); + Cpp.directive.name = vStringNewOrClear (Cpp.directive.name); }
extern void cppTerminate (void) @@ -305,35 +302,40 @@ static bool popConditional (void) return isIgnore (); }
-static void makeDefineTag (const char *const name, bool parameterized) +static int makeDefineTag (const char *const name, bool parameterized, bool undef) { const bool isFileScope = (bool) (! isInputHeaderFile ());
- if (includingDefineTags () && - (! isFileScope || isXtagEnabled(XTAG_FILE_SCOPE))) + if (!Cpp.defineMacroKind) + return CORK_NIL; + if (isFileScope && !isXtagEnabled(XTAG_FILE_SCOPE)) + return CORK_NIL; + + if ( /* condition for definition tag */ + ((!undef) && Cpp.defineMacroKind->enabled) + || /* condition for reference tag */ + (undef && isXtagEnabled(XTAG_REFERENCE_TAGS))) { tagEntryInfo e;
initTagEntry (&e, name, Cpp.defineMacroKind); - - e.lineNumberEntry = (bool) (Option.locate != EX_PATTERN); + e.lineNumberEntry = (bool) (Option.locate == EX_LINENUM); e.isFileScope = isFileScope; e.truncateLine = true; if (parameterized) - { - e.extensionFields.signature = cppGetArglistFromFilePos(getInputFilePosition() - , e.name); - } + e.extensionFields.signature = cppGetArglistFromFilePos(getInputFilePosition(), e.name); makeTagEntry (&e); if (parameterized) eFree((char *) e.extensionFields.signature); } + return CORK_NIL; }
-static void directiveDefine (const int c) +static int directiveDefine (const int c, bool undef) { bool parameterized; int nc; + int r = CORK_NIL;
if (cppIsident1 (c)) { @@ -342,9 +344,22 @@ static void directiveDefine (const int c) ungetcToInputFile (nc); parameterized = (bool) (nc == '('); if (! isIgnore ()) - makeDefineTag (vStringValue (Cpp.directive.name), parameterized); + makeDefineTag (vStringValue (Cpp.directive.name), parameterized, undef); } Cpp.directive.state = DRCTV_NONE; + return r; +} + +static void directiveUndef (const int c) +{ + if (isXtagEnabled (XTAG_REFERENCE_TAGS)) + { + directiveDefine (c, true); + } + else + { + Cpp.directive.state = DRCTV_NONE; + } }
static void directivePragma (int c) @@ -362,7 +377,7 @@ static void directivePragma (int c) if (cppIsident1 (c)) { readIdentifier (c, Cpp.directive.name); - makeDefineTag (vStringValue (Cpp.directive.name), false); + makeDefineTag (vStringValue (Cpp.directive.name), NULL, false); } } } @@ -417,18 +432,20 @@ static bool directiveHash (const int c)
/* Handles a pre-processor directive whose first character is given by "c". */ -static bool handleDirective (const int c) +static bool handleDirective (const int c, int *macroCorkIndex) { bool ignore = isIgnore ();
switch (Cpp.directive.state) { case DRCTV_NONE: ignore = isIgnore (); break; - case DRCTV_DEFINE: directiveDefine (c); break; + case DRCTV_DEFINE: + *macroCorkIndex = directiveDefine (c, false); + break; case DRCTV_HASH: ignore = directiveHash (c); break; case DRCTV_IF: ignore = directiveIf (c); break; case DRCTV_PRAGMA: directivePragma (c); break; - case DRCTV_UNDEF: directiveDefine (c); break; + case DRCTV_UNDEF: directiveUndef (c); break; } return ignore; } @@ -612,13 +629,6 @@ static int skipToEndOfChar (void) ungetcToInputFile (c); break; } - else if (count == 1 && strchr ("DHOB", toupper (c)) != NULL) - veraBase = c; - else if (veraBase != '\0' && ! isalnum (c)) - { - ungetcToInputFile (c); - break; - } } return CHAR_SYMBOL; /* symbolic representation of character */ } @@ -633,6 +643,7 @@ extern int cppGetc (void) bool directive = false; bool ignore = false; int c; + int macroCorkIndex = CORK_NIL;
if (Cpp.ungetch != '\0') { @@ -643,13 +654,15 @@ extern int cppGetc (void) } else do { +start_loop: c = getcFromInputFile (); process: switch (c) { case EOF: ignore = false; directive = false; + macroCorkIndex = CORK_NIL; break;
case TAB: @@ -658,7 +671,10 @@ extern int cppGetc (void)
case NEWLINE: if (directive && ! ignore) + { + macroCorkIndex = CORK_NIL; directive = false; + } Cpp.directive.accept = true; break;
@@ -705,7 +721,7 @@ extern int cppGetc (void) int next = getcFromInputFile ();
if (next == NEWLINE) - continue; + goto start_loop; else ungetcToInputFile (next); break; @@ -828,7 +844,7 @@ extern int cppGetc (void) enter: Cpp.directive.accept = false; if (directive) - ignore = handleDirective (c); + ignore = handleDirective (c, ¯oCorkIndex); break; } } while (directive || ignore);
Modified: ctags/main/lcpp.h 34 lines changed, 30 insertions(+), 4 deletions(-) =================================================================== @@ -28,17 +28,43 @@ * VMS allows '$' in identifiers. * Vala allows '@' in identifiers. */ -#define cppIsident1(c) (isalpha(c) || (c) == '_' || (c) == '~' || (c) == '$' || (c) == '@') +#define cppIsident1(c) ( ((c >= 0) && (c < 0x80) && isalpha(c)) \ + || (c) == '_' || (c) == '~' || (c) == '$' || (c) == '@') +/* NOTE about isident1 profitability + + Doing the same as isascii before passing value to isalpha + ---------------------------------------------------------- + cppGetc() can return the value out of range of char. + cppGetc calls skipToEndOfString and skipToEndOfString can + return STRING_SYMBOL(== 338). + + Depending on the platform, isalpha(338) returns different value . + As far as Fedora22, it returns 0. On Windows 2010, it returns 1. + + man page on Fedora 22 says: + + These functions check whether c, which must have the value of an + unsigned char or EOF, falls into a certain character class + according to the specified locale. + + isascii is for suitable to verify the range of input. However, it + is not portable enough. */ + +#define RoleTemplateUndef { true, "undef", "undefined" } + +#define RoleTemplateSystem { true, "system", "system header" } +#define RoleTemplateLocal { true, "local", "local header" }
/* * FUNCTION PROTOTYPES */ extern bool cppIsBraceFormat (void); extern unsigned int cppGetDirectiveNestLevel (void);
-extern void cppInit (const bool state, const bool hasAtLiteralStrings, - const bool hasCxxRawLiteralStrings, - const kindOption *defineMacroKind); +extern void cppInit (const bool state, + const bool hasAtLiteralStrings, + const bool hasCxxRawLiteralStrings, + const kindOption *defineMacroKind); extern void cppTerminate (void); extern void cppBeginStatement (void); extern void cppEndStatement (void);
Modified: ctags/parsers/c.c 7 lines changed, 6 insertions(+), 1 deletions(-) =================================================================== @@ -3138,11 +3138,16 @@ static bool findCTags (const unsigned int passCount) { exception_t exception; bool retry; + kindOption *kind_for_define = NULL;
contextual_fake_count = 0;
Assert (passCount < 3); - cppInit ((bool) (passCount > 1), isInputLanguage (Lang_csharp), isInputLanguage (Lang_cpp), &(CKinds [CK_DEFINE])); + + kind_for_define = CKinds+CK_DEFINE; + + cppInit ((bool) (passCount > 1), isInputLanguage (Lang_csharp), isInputLanguage(Lang_cpp), + kind_for_define);
exception = (exception_t) setjmp (Exception); retry = false;
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).