ctags.h
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:16k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /*****************************************************************************
  2. *   $Id: ctags.h,v 6.13 1998/08/13 01:32:38 darren Exp $
  3. *
  4. *   Copyright (c) 1996-1998, Darren Hiebert
  5. *
  6. *   This source code is released for free distribution under the terms of the
  7. *   GNU General Public License.
  8. *
  9. *   This module is a global include file.
  10. *****************************************************************************/
  11. /*============================================================================
  12. =   Include files
  13. ============================================================================*/
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <ctype.h> /* to declare isalnum(), isalpha(), isspace() */
  17. #if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(AMIGA)
  18. # define HAVE_STDLIB_H
  19. #endif
  20. #if defined(__STDC__) || defined(MSDOS) || defined(WIN32) || defined(OS2)
  21. # define ENABLE_PROTOTYPES
  22. #endif
  23. #if defined(HAVE_STDLIB_H)
  24. # include <stdlib.h> /* to declare alloc funcs and getenv() */
  25. #endif
  26. /*============================================================================
  27. =   Portability defines
  28. ============================================================================*/
  29. #if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(AMIGA) || defined(HAVE_OPENDIR)
  30. # define RECURSE_SUPPORTED
  31. #endif
  32. /*  Determine whether to use prototypes or simple declarations.
  33.  */
  34. #ifndef __ARGS
  35. # ifdef ENABLE_PROTOTYPES
  36. #  define __ARGS(x) x
  37. # else
  38. #  define __ARGS(x) ()
  39. # endif
  40. #endif
  41. /*  This is a helpful internal feature of later versions (> 2.7) of GCC
  42.  *  to prevent warnings about unused variables.
  43.  */
  44. #if __GNUC__ > 2  ||  (__GNUC__ == 2  &&  __GNUC_MINOR__ >= 7)
  45. # define __unused__ __attribute__((unused))
  46. #else
  47. # define __unused__
  48. #endif
  49. /*  MS-DOS doesn't allow manipulation of standard error, so we send it to
  50.  *  stdout instead.
  51.  */
  52. #if defined(MSDOS) || defined(WIN32)
  53. # define errout stdout
  54. #else
  55. # define errout stderr
  56. #endif
  57. /*============================================================================
  58. =   General defines
  59. ============================================================================*/
  60. #ifndef PROGRAM_VERSION
  61. # define PROGRAM_VERSION "2.3"
  62. #endif
  63. #define PROGRAM_NAME "Exuberant Ctags"
  64. #define PROGRAM_URL "http://darren.hiebert.com/ctags/index.html"
  65. #define AUTHOR_NAME "Darren Hiebert"
  66. #define AUTHOR_EMAIL "darren@hiebert.com"
  67. #define CTAGS_FILE "tags"
  68. #define ETAGS_FILE "TAGS"
  69. #define PSEUDO_TAG_PREFIX "!_"
  70. /*============================================================================
  71. =   Macros
  72. ============================================================================*/
  73. #ifdef DEBUG
  74. # define debug(level) ((Option.debugLevel & (int)(level)) != 0)
  75. # define DebugStatement(x) x
  76. #else
  77. # define DebugStatement(x)
  78. # ifndef NDEBUG
  79. #  define NDEBUG
  80. # endif
  81. #endif
  82. /*  For convenience and safety.
  83.  */
  84. #define stringMatch(s1,s2) (strcmp(s1,s2) == 0)
  85. /*  Is the character valid as a character of a C identifier?
  86.  */
  87. #define isident(c) (isalnum(c) || (c) == '_')
  88. /*  Is the character valid as the first character of a C identifier?
  89.  */
  90. #define isident1(c) (isalpha(c) || (c) == '_' || (c) == '~')
  91. /*  Is that character a space or a tab?
  92.  */
  93. #define isspacetab(c) ((c) == ' ' || (c) == 't')
  94. /*============================================================================
  95. =   Data declarations
  96. ============================================================================*/
  97. #undef FALSE
  98. #undef TRUE
  99. typedef enum { FALSE, TRUE } boolean;
  100. typedef int errorSelection;
  101. enum _errorTypes { FATAL = 1, WARNING = 2, PERROR = 4 };
  102. enum _limits {
  103.     MaxNameLength = 256, /* maximum length of token with null */
  104.     MaxHeaderExtensions = 100, /* maximum number of extensions in -h option */
  105.     MaxCppNestingLevel = 20,
  106.     MaxSupportedTagFormat = 2
  107. };
  108. enum _characters {
  109.     /*  White space characters.
  110.      */
  111.     SPACE = ' ',
  112.     NEWLINE = 'n',
  113.     CRETURN = 'r',
  114.     FORMFEED = 'f',
  115.     TAB = 't',
  116.     VTAB = 'v',
  117.     /*  Some hard to read characters.
  118.      */
  119.     DOUBLE_QUOTE  = '"',
  120.     SINGLE_QUOTE  = ''',
  121.     BACKSLASH   = '\',
  122.     STRING_SYMBOL = ('S' + 0x80),
  123.     CHAR_SYMBOL   = ('C' + 0x80)
  124. };
  125. typedef struct _lineBuf {
  126.     int size; /* size of buffer; 'int' because passed to fgets() */
  127.     char *buffer; /* buffer for placing line into */
  128. } lineBuf;
  129. /*  Maintains the state of the tag file.
  130.  */
  131. typedef struct _tagFile {
  132.     const char *name;
  133.     FILE *fp;
  134.     struct _numTags { unsigned long added, prev; } numTags;
  135.     struct _max { size_t line, tag, file; } max;
  136.     struct _etags {
  137. char name[L_tmpnam];
  138. FILE *fp;
  139. size_t byteCount;
  140.     } etags;
  141.     lineBuf line;
  142. } tagFile;
  143. typedef enum _langType {
  144.     LANG_AUTO = -2, /* automatically determine language */
  145.     LANG_IGNORE = -1, /* ignore file (uunknown/nsupported language) */
  146.     LANG_C, /* ANSI C */
  147.     LANG_CPP, /* C++ */
  148.     LANG_JAVA, /* Java */
  149.     LANG_COUNT /* count of languages */
  150. } langType;
  151. /*  Maintains the state of the current source file.
  152.  */
  153. typedef struct _sourceFile {
  154.     const char *name; /* name of the current file */
  155.     FILE *fp; /* stream used for reading the file */
  156.     unsigned long lineNumber; /* line number in the current file */
  157.     long seek; /* fseek() offset to start of current line */
  158.     int ungetch; /* a single character that was ungotten */
  159.     boolean afterNL; /* was previous character a newline? */
  160.     boolean isHeader; /* is current file a header file? */
  161.     langType language; /* language of current file */
  162. } sourceFile;
  163. /*  This stores the command line options.
  164.  */
  165. typedef struct _optionValues {
  166.     struct _include { /* include tags for: */
  167. boolean classNames; /* -ic  class names */
  168. boolean defines; /* -id  defines */
  169. boolean enumerators; /* -ie  enumeration value */
  170. boolean functions; /* -if  functions */
  171. boolean enumNames; /* -ig  enum names */
  172. boolean interfaceNames; /* -ii  interface names */
  173. boolean members; /* -im  data members */
  174. boolean namespaceNames; /* -in  namespace names */
  175. boolean prototypes; /* -ip  function prototypes */
  176. boolean structNames; /* -is  struct names */
  177. boolean typedefs; /* -it  typedefs */
  178. boolean unionNames; /* -iu  unions */
  179. boolean variables; /* -iv  variables */
  180. boolean externVars; /* -ix  extern variables */
  181. boolean classPrefix; /* -iC  include tag entries of class::member */
  182. boolean sourceFiles; /* -iF  include tags for source files */
  183. boolean statics; /* -iS  include static tags */
  184.     } include;
  185.     struct _ignore {
  186. char **list;
  187. unsigned int count, max;
  188.     } ignore;     /* -I  name of file containing tokens to ignore */
  189.     boolean append;     /* -a  append to "tags" files */
  190.     boolean backward;     /* -B  regexp patterns search backwards */
  191.     boolean etags;     /* -e  output Emacs style tags file */
  192.     enum _locate {
  193. EX_MIX,     /* line numbers for defines, patterns otherwise */
  194. EX_LINENUM,     /* -n  only line numbers in tag file */
  195. EX_PATTERN     /* -N  only patterns in tag file */
  196.     } locate;     /* --excmd  EX command used to locate tag */
  197.     const char *path;     /* -p  default path for source files */
  198.     boolean recurse;     /* -R  recurse into directories */
  199.     boolean sorted;     /* -u,--sort  sort tags */
  200.     boolean xref;     /* -x  generate xref output instead */
  201.     const char *fileList;   /* -L  name of file containing names of files */
  202.     const char *tagFileName;/* -o  name of tags file */
  203.     const char *const *headerExt; /* -h  header extensions */
  204. #ifdef DEBUG
  205.     int debugLevel;     /* -D  debugging output */
  206.     unsigned long breakLine;/* -b  source line at which to call lineBreak() */
  207. #endif
  208.     boolean startedAsEtags;
  209.     boolean braceFormat;    /* use brace formatting to detect end of block */
  210.     unsigned int tagFileFormat; /* --format  tag file format (level) */
  211.     boolean if0;     /* --if0  examine code within "#if 0" branch */
  212.     langType language;     /* --lang specified language override */
  213.     const char *const *langMap[(int)LANG_COUNT];
  214.     /* --langmap  language-extension map */
  215.     boolean printTotals;    /* --totals  print cumulative statistics */
  216. } optionValues;
  217. /*  Describes the type of tag being generated. This is used for debugging
  218.  *  purposes only.
  219.  */
  220. typedef enum _tagType {
  221.     TAG_CLASS, /* class name */
  222.     TAG_DEFINE_OBJ, /* pre-processor define (object-like) */
  223.     TAG_DEFINE_FUNC, /* pre-processor define (function-like) */
  224.     TAG_ENUM, /* enumeration name */
  225.     TAG_ENUMERATOR, /* enumerator (enumeration value) */
  226.     TAG_FUNCDECL, /* function declaration */
  227.     TAG_FUNCTION, /* function (or method) definition */
  228.     TAG_INTERFACE, /* interface declaration */
  229.     TAG_MEMBER, /* structure, class or interface member */
  230.     TAG_NAMESPACE, /* namespace name */
  231.     TAG_SOURCE_FILE, /* source file */
  232.     TAG_STRUCT, /* structure name */
  233.     TAG_TYPEDEF, /* typedef name */
  234.     TAG_UNION, /* union name */
  235.     TAG_VARIABLE, /* variable definition */
  236.     TAG_EXTERN_VAR, /* external variable declaration */
  237.     TAG_NUMTYPES /* must be last */
  238. } tagType;
  239. #ifdef DEBUG
  240. /*  Defines the debugging levels.
  241.  */
  242. enum _debugLevels {
  243.     DEBUG_CPP  = 1, /* echo characters out of pre-processor */
  244.     DEBUG_PARSE  = 2, /* echo parsing results */
  245.     DEBUG_STATUS = 4, /* echo file status information */
  246.     DEBUG_OPTION = 8, /* echo option parsing */
  247.     DEBUG_RAW  = 16 /* echo raw (filtered) characters */
  248. };
  249. #endif
  250. /*----------------------------------------------------------------------------
  251.  *  Used for describing a statement
  252.  *--------------------------------------------------------------------------*/
  253. /*  This describes the scoping of the current statement.
  254.  */
  255. typedef enum _tagScope {
  256.     SCOPE_GLOBAL, /* no storage class specified */
  257.     SCOPE_STATIC, /* static storage class */
  258.     SCOPE_EXTERN, /* external storage class */
  259.     SCOPE_FRIEND, /* declares visibility only */
  260.     SCOPE_TYPEDEF /* scoping depends upon context */
  261. } tagScope;
  262. /*  Information about the current tag candidate.
  263.  */
  264. typedef struct _tagInfo {
  265.     long    location; /* file position of line containing name */
  266.     unsigned long lineNumber; /* line number of tag */
  267.     char    name[MaxNameLength];/* the name of the token */
  268. } tagInfo;
  269. typedef enum _memberType {
  270.     MEMBER_NONE,
  271.     MEMBER_ENUM, MEMBER_CLASS, MEMBER_INTERFACE, MEMBER_NAMESPACE,
  272.     MEMBER_STRUCT, MEMBER_UNION
  273. } memberType;
  274. typedef enum _visibilityType {
  275.     VIS_UNDEFINED, VIS_PUBLIC, VIS_PROTECTED, VIS_PRIVATE
  276. } visibilityType;
  277. /*  Information about the parent class of a member (if any).
  278.  */
  279. typedef struct _memberInfo {
  280.     memberType type;
  281.     visibilityType visibility; /* current visibility section, if known */
  282.     boolean persistent; /* persistent across multiple statements? */
  283.     char parent[MaxNameLength]; /* name of the parent data type */
  284. } memberInfo;
  285. /*  Defines the one nesting level of a preprocessor conditional.
  286.  */
  287. typedef struct _conditionalInfo {
  288.     boolean ignoreAllBranches; /* ignoring parent conditional branch */
  289.     boolean singleBranch; /* choose only one branch */
  290.     boolean branchChosen; /* branch already selected */
  291.     boolean ignoring; /* current ignore state */
  292. } conditionalInfo;
  293. /*  Defines the current state of the pre-processor.
  294.  */
  295. typedef struct _cppState {
  296.     int     ungetch; /* an ungotten character, if any */
  297.     boolean resolveRequired; /* must resolve if/else/elif/endif branch */
  298.     struct _directive {
  299. enum _state {
  300.     DRCTV_NONE,
  301.     DRCTV_HASH,
  302.     DRCTV_IF,
  303.     DRCTV_DEFINE
  304. } state;
  305. boolean accept; /* is a directive syntatically permitted? */
  306. tagInfo tag; /* the name associated with the directive */
  307. unsigned int nestLevel; /* level 0 is not used */
  308. conditionalInfo ifdef[MaxCppNestingLevel];
  309.     } directive;
  310. } cppState;
  311. /*============================================================================
  312. =   Global variables
  313. ============================================================================*/
  314. extern tagFile TagFile;
  315. extern sourceFile File;
  316. extern optionValues Option;
  317. extern cppState Cpp;
  318. extern memberInfo NoClass;
  319. /*============================================================================
  320. =   Function prototypes
  321. ============================================================================*/
  322. extern void error __ARGS(( const errorSelection selection,
  323.    const char *const format, ... ));
  324. extern unsigned long getFileSize __ARGS((const char *const name));
  325. extern boolean isNormalFile __ARGS((const char *const name));
  326. extern boolean isDirectory __ARGS((const char *const name));
  327. extern boolean doesFileExist __ARGS((const char *const fileName));
  328. extern void addTotals __ARGS(( const unsigned int files, const unsigned long lines, const unsigned long bytes));
  329. extern char *readLine __ARGS((lineBuf *const pLineBuf, FILE *const fp));
  330. extern const char *getExecutableName __ARGS((void));
  331. extern const char *getTypeString __ARGS((const memberType mType));
  332. extern const char *getVisibilityString __ARGS((const visibilityType visibility));
  333. extern void makeTag __ARGS((const tagInfo *const tag,
  334.     const memberInfo *const pMember,
  335.     const tagScope scope, const tagType type));
  336. extern void makeDefineTag __ARGS((const tagInfo *const tag,
  337.   const tagScope scope,
  338.   const boolean parameterized));
  339. extern const char *tagTypeName __ARGS((const tagType type));
  340. extern void addPseudoTags __ARGS((void));
  341. extern unsigned long updatePseudoTags __ARGS((void));
  342. extern boolean cppOpen __ARGS((const char *const name, const langType language, const boolean isHeader));
  343. extern void cppClose __ARGS((void));
  344. extern void cppUngetc __ARGS((const int c));
  345. extern int cppGetc __ARGS((void));
  346. extern boolean createTags __ARGS((const unsigned int nesting, const void *const parent));
  347. extern void buildKeywordHash __ARGS((void));
  348. extern boolean fileOpen __ARGS((const char *const name, const langType language, const boolean isHeader));
  349. extern void fileClose __ARGS((void));
  350. extern int fileGetc __ARGS((void));
  351. extern void fileUngetc __ARGS((int c));
  352. extern void freeLineBuffer __ARGS((lineBuf *const pLine));
  353. extern char *getSourceLine __ARGS((lineBuf *const pLineBuffer, const long int location));
  354. extern boolean isIgnoreToken __ARGS((const char *const name));
  355. extern void freeIgnoreList __ARGS((void));
  356. extern const char *getLanguageName __ARGS((const langType language));
  357. extern boolean strequiv __ARGS((const char *s1, const char *s2));
  358. extern char *const *parseOptions __ARGS((char *const *const argList));
  359. extern void *parseEnvironmentOptions __ARGS((void));
  360. extern void catFile __ARGS((const char *const name));
  361. #ifdef EXTERNAL_SORT
  362. extern void externalSortTags __ARGS((const boolean toStdout));
  363. #else
  364. extern void internalSortTags __ARGS((const boolean toStdout));
  365. #endif
  366. #ifdef DEBUG
  367. extern void lineBreak __ARGS((void));
  368. extern void debugPrintf __ARGS((const enum _debugLevels level, const char *const format, ... ));
  369. extern void debugOpen __ARGS((const char *const fileName, const boolean isHeader, const langType language));
  370. extern void debugPutc __ARGS((const int c, const int level));
  371. extern void debugEntry __ARGS((const tagScope scope, const tagType type, const char *const tagName, const memberInfo *const pMember));
  372. extern void debugParseNest __ARGS((const boolean increase, const unsigned int level));
  373. extern void debugCppNest __ARGS((const boolean begin, const unsigned int ignore));
  374. extern void debugCppIgnore __ARGS((const boolean ignore));
  375. extern void clearString __ARGS((char *const string, const int length));
  376. #endif
  377. /*  Possibly missing system prototypes.
  378.  */
  379. #if defined(NEED_PROTO_REMOVE) && defined(HAVE_REMOVE)
  380. extern int remove __ARGS((const char *));
  381. #endif
  382. #if defined(NEED_PROTO_UNLINK) && !defined(HAVE_REMOVE)
  383. extern void *unlink __ARGS((const char *));
  384. #endif
  385. #ifdef NEED_PROTO_MALLOC
  386. extern void *malloc __ARGS((size_t));
  387. #endif
  388. #ifdef NEED_PROTO_GETENV
  389. extern char *getenv __ARGS((const char *));
  390. #endif
  391. #ifdef NEED_PROTO_STRSTR
  392. extern char *strstr __ARGS((const char *str, const char *substr));
  393. #endif
  394. /* vi:set tabstop=8 shiftwidth=4: */