[geany/geany] e685d9: Some sync of lcpp.c/h
Jiří Techet
git-noreply at xxxxx
Mon Dec 17 21:05:41 UTC 2018
Branch: refs/heads/master
Author: Jiří Techet <techet at gmail.com>
Committer: Jiří Techet <techet at gmail.com>
Date: Sun, 09 Oct 2016 09:04:51 UTC
Commit: e685d956d66651139d6deaf779bcec3b7f4aa0d2
https://github.com/geany/geany/commit/e685d956d66651139d6deaf779bcec3b7f4aa0d2
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).
More information about the Commits
mailing list