Fix variable initialisation problem in objc parser, causing erroneous

parsing of second file.

Patch sent by Lars C. Hassing

git-svn-id: svn://svn.code.sf.net/p/ctags/code/trunk@788 c5d04d22-be80-434c-894e-aa346cc9e8e8
This commit is contained in:
vberthoux 2012-09-17 13:48:26 +00:00
parent 8c3b2e6ab9
commit 98a8c332ef
1 changed files with 36 additions and 29 deletions

65
objc.c
View File

@ -508,22 +508,22 @@ static void tillTokenOrFallBack (vString * const UNUSED (ident), objcToken what)
} }
} }
static int ignoreBalanced_count = 0;
static void ignoreBalanced (vString * const UNUSED (ident), objcToken what) static void ignoreBalanced (vString * const UNUSED (ident), objcToken what)
{ {
static int count = 0;
switch (what) switch (what)
{ {
case Tok_PARL: case Tok_PARL:
case Tok_CurlL: case Tok_CurlL:
case Tok_SQUAREL: case Tok_SQUAREL:
count++; ignoreBalanced_count++;
break; break;
case Tok_PARR: case Tok_PARR:
case Tok_CurlR: case Tok_CurlR:
case Tok_SQUARER: case Tok_SQUARER:
count--; ignoreBalanced_count--;
break; break;
default: default:
@ -531,7 +531,7 @@ static void ignoreBalanced (vString * const UNUSED (ident), objcToken what)
break; break;
} }
if (count == 0) if (ignoreBalanced_count == 0)
toDoNext = comeAfter; toDoNext = comeAfter;
} }
@ -818,22 +818,21 @@ static void parseStructMembers (vString * const ident, objcToken what)
} }
/* Called just after the struct keyword */ /* Called just after the struct keyword */
static boolean parseStruct_gotName = FALSE;
static void parseStruct (vString * const ident, objcToken what) static void parseStruct (vString * const ident, objcToken what)
{ {
static boolean gotName = FALSE;
switch (what) switch (what)
{ {
case ObjcIDENTIFIER: case ObjcIDENTIFIER:
if (!gotName) if (!parseStruct_gotName)
{ {
addTag (ident, K_STRUCT); addTag (ident, K_STRUCT);
pushEnclosingContext (ident, K_STRUCT); pushEnclosingContext (ident, K_STRUCT);
gotName = TRUE; parseStruct_gotName = TRUE;
} }
else else
{ {
gotName = FALSE; parseStruct_gotName = FALSE;
popEnclosingContext (); popEnclosingContext ();
toDoNext = comeAfter; toDoNext = comeAfter;
comeAfter (ident, what); comeAfter (ident, what);
@ -847,7 +846,7 @@ static void parseStruct (vString * const ident, objcToken what)
/* maybe it was just a forward declaration /* maybe it was just a forward declaration
* in which case, we pop the context */ * in which case, we pop the context */
case Tok_semi: case Tok_semi:
if (gotName) if (parseStruct_gotName)
popEnclosingContext (); popEnclosingContext ();
toDoNext = comeAfter; toDoNext = comeAfter;
@ -861,21 +860,20 @@ static void parseStruct (vString * const ident, objcToken what)
} }
/* Parse enumeration members, ignoring potential initialization */ /* Parse enumeration members, ignoring potential initialization */
static parseNext parseEnumFields_prev = NULL;
static void parseEnumFields (vString * const ident, objcToken what) static void parseEnumFields (vString * const ident, objcToken what)
{ {
static parseNext prev = NULL; if (parseEnumFields_prev != NULL)
if (prev != NULL)
{ {
comeAfter = prev; comeAfter = parseEnumFields_prev;
prev = NULL; parseEnumFields_prev = NULL;
} }
switch (what) switch (what)
{ {
case ObjcIDENTIFIER: case ObjcIDENTIFIER:
addTag (ident, K_ENUM); addTag (ident, K_ENUM);
prev = comeAfter; parseEnumFields_prev = comeAfter;
waitedToken = Tok_COMA; waitedToken = Tok_COMA;
/* last item might not have a coma */ /* last item might not have a coma */
fallBackToken = Tok_CurlR; fallBackToken = Tok_CurlR;
@ -896,22 +894,21 @@ static void parseEnumFields (vString * const ident, objcToken what)
} }
/* parse enum ... { ... */ /* parse enum ... { ... */
static boolean parseEnum_named = FALSE;
static void parseEnum (vString * const ident, objcToken what) static void parseEnum (vString * const ident, objcToken what)
{ {
static boolean named = FALSE;
switch (what) switch (what)
{ {
case ObjcIDENTIFIER: case ObjcIDENTIFIER:
if (!named) if (!parseEnum_named)
{ {
addTag (ident, K_ENUM); addTag (ident, K_ENUM);
pushEnclosingContext (ident, K_ENUM); pushEnclosingContext (ident, K_ENUM);
named = TRUE; parseEnum_named = TRUE;
} }
else else
{ {
named = FALSE; parseEnum_named = FALSE;
popEnclosingContext (); popEnclosingContext ();
toDoNext = comeAfter; toDoNext = comeAfter;
comeAfter (ident, what); comeAfter (ident, what);
@ -920,11 +917,11 @@ static void parseEnum (vString * const ident, objcToken what)
case Tok_CurlL: /* '{' */ case Tok_CurlL: /* '{' */
toDoNext = &parseEnumFields; toDoNext = &parseEnumFields;
named = FALSE; parseEnum_named = FALSE;
break; break;
case Tok_semi: /* ';' */ case Tok_semi: /* ';' */
if (named) if (parseEnum_named)
popEnclosingContext (); popEnclosingContext ();
toDoNext = comeAfter; toDoNext = comeAfter;
comeAfter (ident, what); comeAfter (ident, what);
@ -971,20 +968,19 @@ static void parseTypedef (vString * const ident, objcToken what)
} }
} }
static boolean ignorePreprocStuff_escaped = FALSE;
static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what) static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what)
{ {
static boolean escaped = FALSE;
switch (what) switch (what)
{ {
case Tok_Backslash: case Tok_Backslash:
escaped = TRUE; ignorePreprocStuff_escaped = TRUE;
break; break;
case Tok_EOL: case Tok_EOL:
if (escaped) if (ignorePreprocStuff_escaped)
{ {
escaped = FALSE; ignorePreprocStuff_escaped = FALSE;
} }
else else
{ {
@ -993,7 +989,7 @@ static void ignorePreprocStuff (vString * const UNUSED (ident), objcToken what)
break; break;
default: default:
escaped = FALSE; ignorePreprocStuff_escaped = FALSE;
break; break;
} }
} }
@ -1102,6 +1098,17 @@ static void findObjcTags (void)
fullMethodName = vStringNew (); fullMethodName = vStringNew ();
prevIdent = vStringNew (); prevIdent = vStringNew ();
/* (Re-)initialize state variables, this might be a second file */
comeAfter = NULL;
fallback = NULL;
parentType = K_INTERFACE;
ignoreBalanced_count = 0;
methodKind = 0;
parseStruct_gotName = FALSE;
parseEnumFields_prev = NULL;
parseEnum_named = FALSE;
ignorePreprocStuff_escaped = FALSE;
st.name = vStringNew (); st.name = vStringNew ();
st.cp = fileReadLine (); st.cp = fileReadLine ();
toDoNext = &globalScope; toDoNext = &globalScope;