1d4c6f1e6SMasatake YAMATO /*
2d4c6f1e6SMasatake YAMATO * Copyright (c) 1996-2002, Darren Hiebert
3d4c6f1e6SMasatake YAMATO *
4d4c6f1e6SMasatake YAMATO * This source code is released for free distribution under the terms of the
50ce38835Sviccuad * GNU General Public License version 2 or (at your option) any later version.
6d4c6f1e6SMasatake YAMATO *
7d4c6f1e6SMasatake YAMATO * This module contains debugging functions.
8d4c6f1e6SMasatake YAMATO */
9d4c6f1e6SMasatake YAMATO
10d4c6f1e6SMasatake YAMATO /*
11d4c6f1e6SMasatake YAMATO * INCLUDE FILES
12d4c6f1e6SMasatake YAMATO */
13d4c6f1e6SMasatake YAMATO #include "general.h" /* must always come first */
14d4c6f1e6SMasatake YAMATO
15d4c6f1e6SMasatake YAMATO #include <ctype.h>
16e3e7e44dSColomban Wendling #include <stdlib.h>
17e3e7e44dSColomban Wendling #include <stdio.h>
18d4c6f1e6SMasatake YAMATO #include <stdarg.h>
1964f5cf22SMasatake YAMATO #include <string.h>
20d4c6f1e6SMasatake YAMATO
21d4c6f1e6SMasatake YAMATO #include "debug.h"
228791bb4bSMasatake YAMATO #include "entry_p.h"
23d4c6f1e6SMasatake YAMATO #include "options.h"
240d502ef0SMasatake YAMATO #include "parse_p.h"
25d4c6f1e6SMasatake YAMATO #include "read.h"
26*b5df137eSMasatake YAMATO #include "read_p.h"
27d4c6f1e6SMasatake YAMATO
28d4c6f1e6SMasatake YAMATO /*
29d4c6f1e6SMasatake YAMATO * FUNCTION DEFINITIONS
30d4c6f1e6SMasatake YAMATO */
31d4c6f1e6SMasatake YAMATO
32d4c6f1e6SMasatake YAMATO #ifdef DEBUG
33a8e6f945SMasatake YAMATO #include "htable.h"
34a8e6f945SMasatake YAMATO
35d4c6f1e6SMasatake YAMATO
lineBreak(void)36d4c6f1e6SMasatake YAMATO extern void lineBreak (void) {} /* provides a line-specified break point */
37d4c6f1e6SMasatake YAMATO
debugPrintf(const enum eDebugLevels level,const char * const format,...)38d4c6f1e6SMasatake YAMATO extern void debugPrintf (
39d4c6f1e6SMasatake YAMATO const enum eDebugLevels level, const char *const format, ... )
40d4c6f1e6SMasatake YAMATO {
41d4c6f1e6SMasatake YAMATO va_list ap;
42d4c6f1e6SMasatake YAMATO
43d4c6f1e6SMasatake YAMATO va_start (ap, format);
44d4c6f1e6SMasatake YAMATO if (debug (level))
45d4c6f1e6SMasatake YAMATO vprintf (format, ap);
46d4c6f1e6SMasatake YAMATO fflush (stdout);
47d4c6f1e6SMasatake YAMATO va_end (ap);
48d4c6f1e6SMasatake YAMATO }
49d4c6f1e6SMasatake YAMATO
debugPutc(const int level,const int c)50d4c6f1e6SMasatake YAMATO extern void debugPutc (const int level, const int c)
51d4c6f1e6SMasatake YAMATO {
52d4c6f1e6SMasatake YAMATO if (debug (level) && c != EOF)
53d4c6f1e6SMasatake YAMATO {
54d4c6f1e6SMasatake YAMATO if (c == STRING_SYMBOL) printf ("\"string\"");
55d4c6f1e6SMasatake YAMATO else if (c == CHAR_SYMBOL) printf ("'c'");
56d4c6f1e6SMasatake YAMATO else putchar (c);
57d4c6f1e6SMasatake YAMATO
58d4c6f1e6SMasatake YAMATO fflush (stdout);
59d4c6f1e6SMasatake YAMATO }
60d4c6f1e6SMasatake YAMATO }
61d4c6f1e6SMasatake YAMATO
debugParseNest(const bool increase,const unsigned int level)62ce990805SThomas Braun extern void debugParseNest (const bool increase, const unsigned int level)
63d4c6f1e6SMasatake YAMATO {
64d4c6f1e6SMasatake YAMATO debugPrintf (DEBUG_PARSE, "<*%snesting:%d*>", increase ? "++" : "--", level);
65d4c6f1e6SMasatake YAMATO }
66d4c6f1e6SMasatake YAMATO
debugCppNest(const bool begin,const unsigned int level)67ce990805SThomas Braun extern void debugCppNest (const bool begin, const unsigned int level)
68d4c6f1e6SMasatake YAMATO {
69d4c6f1e6SMasatake YAMATO debugPrintf (DEBUG_CPP, "<*cpp:%s level %d*>", begin ? "begin":"end", level);
70d4c6f1e6SMasatake YAMATO }
71d4c6f1e6SMasatake YAMATO
debugCppIgnore(const bool ignore)72ce990805SThomas Braun extern void debugCppIgnore (const bool ignore)
73d4c6f1e6SMasatake YAMATO {
74d4c6f1e6SMasatake YAMATO debugPrintf (DEBUG_CPP, "<*cpp:%s ignore*>", ignore ? "begin":"end");
75d4c6f1e6SMasatake YAMATO }
76d4c6f1e6SMasatake YAMATO
debugEntry(const tagEntryInfo * const tag)77d4c6f1e6SMasatake YAMATO extern void debugEntry (const tagEntryInfo *const tag)
78d4c6f1e6SMasatake YAMATO {
79d4c6f1e6SMasatake YAMATO const char *const scope = tag->isFileScope ? "{fs}" : "";
80d4c6f1e6SMasatake YAMATO
81d4c6f1e6SMasatake YAMATO if (debug (DEBUG_PARSE))
82d4c6f1e6SMasatake YAMATO {
837dd44807SMasatake YAMATO langType lang = (tag->extensionFields.scopeLangType == LANG_AUTO)
843dbbc8deSMasatake YAMATO ? tag->langType
853dbbc8deSMasatake YAMATO : tag->extensionFields.scopeLangType;
863dbbc8deSMasatake YAMATO kindDefinition *scopeKindDef = getLanguageKind(lang,
87f92e6bf2SMasatake YAMATO tag->extensionFields.scopeKindIndex);
88f92e6bf2SMasatake YAMATO printf ("<#%s%s:%s", scope, getTagKindName(tag), tag->name);
89d4c6f1e6SMasatake YAMATO
90f92e6bf2SMasatake YAMATO if (tag->extensionFields.scopeKindIndex != KIND_GHOST_INDEX &&
91015ab54cSMasatake YAMATO tag->extensionFields.scopeName != NULL)
92f92e6bf2SMasatake YAMATO printf (" [%s:%s]", scopeKindDef->name,
93015ab54cSMasatake YAMATO tag->extensionFields.scopeName);
94d4c6f1e6SMasatake YAMATO
9528ce6666SMasatake YAMATO if (isFieldEnabled (FIELD_INHERITANCE) &&
96d4c6f1e6SMasatake YAMATO tag->extensionFields.inheritance != NULL)
97d4c6f1e6SMasatake YAMATO printf (" [inherits:%s]", tag->extensionFields.inheritance);
98d4c6f1e6SMasatake YAMATO
9928ce6666SMasatake YAMATO if (isFieldEnabled (FIELD_FILE_SCOPE) &&
1007c8a4d6fSMasatake YAMATO tag->isFileScope && ! isInputHeaderFile ())
101d4c6f1e6SMasatake YAMATO printf (" [file:]");
102d4c6f1e6SMasatake YAMATO
10328ce6666SMasatake YAMATO if (isFieldEnabled (FIELD_ACCESS) &&
104d4c6f1e6SMasatake YAMATO tag->extensionFields.access != NULL)
105d4c6f1e6SMasatake YAMATO printf (" [access:%s]", tag->extensionFields.access);
106d4c6f1e6SMasatake YAMATO
10728ce6666SMasatake YAMATO if (isFieldEnabled (FIELD_IMPLEMENTATION) &&
108d4c6f1e6SMasatake YAMATO tag->extensionFields.implementation != NULL)
109d4c6f1e6SMasatake YAMATO printf (" [imp:%s]", tag->extensionFields.implementation);
110d4c6f1e6SMasatake YAMATO
11128ce6666SMasatake YAMATO if (isFieldEnabled (FIELD_TYPE_REF) &&
112d4c6f1e6SMasatake YAMATO tag->extensionFields.typeRef [0] != NULL &&
113d4c6f1e6SMasatake YAMATO tag->extensionFields.typeRef [1] != NULL)
114d4c6f1e6SMasatake YAMATO printf (" [%s:%s]", tag->extensionFields.typeRef [0],
115d4c6f1e6SMasatake YAMATO tag->extensionFields.typeRef [1]);
116d4c6f1e6SMasatake YAMATO
117d4c6f1e6SMasatake YAMATO printf ("#>");
118d4c6f1e6SMasatake YAMATO fflush (stdout);
119d4c6f1e6SMasatake YAMATO }
120d4c6f1e6SMasatake YAMATO }
121d4c6f1e6SMasatake YAMATO
debugAssert(const char * assertion,const char * file,unsigned int line,const char * function)122e3e7e44dSColomban Wendling extern void debugAssert (const char *assertion, const char *file, unsigned int line, const char *function)
123e3e7e44dSColomban Wendling {
124e3e7e44dSColomban Wendling fprintf(stderr, "ctags: %s:%u: %s%sAssertion `%s' failed.\n",
125e3e7e44dSColomban Wendling file, line,
126e3e7e44dSColomban Wendling function ? function : "", function ? ": " : "",
127e3e7e44dSColomban Wendling assertion);
128d41a27faSMasatake YAMATO if (getInputFileName())
129e3e7e44dSColomban Wendling {
130e3e7e44dSColomban Wendling fprintf(stderr, "ctags: %s:%u: parsing %s:%lu as %s\n",
131e3e7e44dSColomban Wendling file, line,
132a31b37dcSMasatake YAMATO getInputFileName(), getInputLineNumber(),
133a31b37dcSMasatake YAMATO getInputLanguageName());
134e3e7e44dSColomban Wendling }
135e3e7e44dSColomban Wendling fflush(stderr);
136e3e7e44dSColomban Wendling abort();
137e3e7e44dSColomban Wendling }
138e3e7e44dSColomban Wendling
13964f5cf22SMasatake YAMATO static int debugScopeDepth;
14064f5cf22SMasatake YAMATO #define DEBUG_INDENT_UNIT 4
14164f5cf22SMasatake YAMATO
14264f5cf22SMasatake YAMATO static char debugPrefix[DEBUG_INDENT_UNIT + 1];
14364f5cf22SMasatake YAMATO
debugInit(void)14464f5cf22SMasatake YAMATO extern void debugInit (void)
14564f5cf22SMasatake YAMATO {
14664f5cf22SMasatake YAMATO memset(debugPrefix, ' ', DEBUG_INDENT_UNIT);
14764f5cf22SMasatake YAMATO debugPrefix[DEBUG_INDENT_UNIT] = '\0';
14864f5cf22SMasatake YAMATO }
14964f5cf22SMasatake YAMATO
debugIndent(void)15064f5cf22SMasatake YAMATO extern void debugIndent(void)
15164f5cf22SMasatake YAMATO {
15264f5cf22SMasatake YAMATO for(int i=0;i< debugScopeDepth;i++)
15364f5cf22SMasatake YAMATO fputs(debugPrefix, stderr);
15464f5cf22SMasatake YAMATO }
15564f5cf22SMasatake YAMATO
debugInc(void)15664f5cf22SMasatake YAMATO extern void debugInc(void)
15764f5cf22SMasatake YAMATO {
15864f5cf22SMasatake YAMATO debugScopeDepth++;
15964f5cf22SMasatake YAMATO }
16064f5cf22SMasatake YAMATO
debugDec(void)16164f5cf22SMasatake YAMATO extern void debugDec(void)
16264f5cf22SMasatake YAMATO {
16364f5cf22SMasatake YAMATO debugScopeDepth--;
16464f5cf22SMasatake YAMATO if(debugScopeDepth < 0)
16564f5cf22SMasatake YAMATO debugScopeDepth = 0;
16664f5cf22SMasatake YAMATO }
16764f5cf22SMasatake YAMATO
168a8e6f945SMasatake YAMATO
169a8e6f945SMasatake YAMATO
170a8e6f945SMasatake YAMATO struct circularRefChecker {
171a8e6f945SMasatake YAMATO hashTable *visitTable;
172a8e6f945SMasatake YAMATO int counter;
173a8e6f945SMasatake YAMATO };
174a8e6f945SMasatake YAMATO
circularRefCheckerDestroy(struct circularRefChecker * checker)175a8e6f945SMasatake YAMATO extern void circularRefCheckerDestroy (struct circularRefChecker * checker)
176a8e6f945SMasatake YAMATO {
177a8e6f945SMasatake YAMATO hashTableDelete (checker->visitTable);
178a8e6f945SMasatake YAMATO checker->visitTable = NULL;
179a8e6f945SMasatake YAMATO eFree (checker);
180a8e6f945SMasatake YAMATO }
181a8e6f945SMasatake YAMATO
circularRefCheckerNew(void)182a8e6f945SMasatake YAMATO extern struct circularRefChecker * circularRefCheckerNew (void)
183a8e6f945SMasatake YAMATO {
184a8e6f945SMasatake YAMATO Assert (sizeof(void *) >= sizeof(int));
185a8e6f945SMasatake YAMATO
186a8e6f945SMasatake YAMATO struct circularRefChecker *c = xMalloc (1, struct circularRefChecker);
187a8e6f945SMasatake YAMATO
188a8e6f945SMasatake YAMATO c->visitTable = hashTableNew (17, hashPtrhash, hashPtreq, NULL, NULL);
189a8e6f945SMasatake YAMATO c->counter = 0;
190a8e6f945SMasatake YAMATO
191a8e6f945SMasatake YAMATO return c;
192a8e6f945SMasatake YAMATO }
193a8e6f945SMasatake YAMATO
circularRefCheckerCheck(struct circularRefChecker * c,void * ptr)194a8e6f945SMasatake YAMATO extern int circularRefCheckerCheck (struct circularRefChecker *c, void *ptr)
195a8e6f945SMasatake YAMATO {
196a8e6f945SMasatake YAMATO union conv {
197a8e6f945SMasatake YAMATO int i;
198a8e6f945SMasatake YAMATO void *ptr;
199a8e6f945SMasatake YAMATO } v;
200a8e6f945SMasatake YAMATO
201a8e6f945SMasatake YAMATO v.ptr = hashTableGetItem(c->visitTable, ptr);
202a8e6f945SMasatake YAMATO if (v.ptr)
203a8e6f945SMasatake YAMATO return v.i;
204a8e6f945SMasatake YAMATO else
205a8e6f945SMasatake YAMATO {
206a8e6f945SMasatake YAMATO v.i = ++c->counter;
207a8e6f945SMasatake YAMATO hashTablePutItem (c->visitTable, ptr, v.ptr);
208a8e6f945SMasatake YAMATO return 0;
209a8e6f945SMasatake YAMATO }
210a8e6f945SMasatake YAMATO }
211a8e6f945SMasatake YAMATO
circularRefCheckerGetCurrent(struct circularRefChecker * c)212a8e6f945SMasatake YAMATO extern int circularRefCheckerGetCurrent (struct circularRefChecker *c)
213a8e6f945SMasatake YAMATO {
214a8e6f945SMasatake YAMATO return c->counter;
215a8e6f945SMasatake YAMATO }
216a8e6f945SMasatake YAMATO
circularRefCheckClear(struct circularRefChecker * c)217a8e6f945SMasatake YAMATO extern void circularRefCheckClear (struct circularRefChecker *c)
218a8e6f945SMasatake YAMATO {
219a8e6f945SMasatake YAMATO hashTableClear (c->visitTable);
220a8e6f945SMasatake YAMATO c->counter = 0;
221a8e6f945SMasatake YAMATO }
222a8e6f945SMasatake YAMATO
223d4c6f1e6SMasatake YAMATO #endif
224