www.pudn.com > vim53src.zip > ctags.h


/***************************************************************************** 
*   $Id: ctags.h,v 6.13 1998/08/13 01:32:38 darren Exp $ 
* 
*   Copyright (c) 1996-1998, Darren Hiebert 
* 
*   This source code is released for free distribution under the terms of the 
*   GNU General Public License. 
* 
*   This module is a global include file. 
*****************************************************************************/ 
 
/*============================================================================ 
=   Include files 
============================================================================*/ 
#include  
#include  
#include 	/* to declare isalnum(), isalpha(), isspace() */ 
 
#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(AMIGA) 
# define HAVE_STDLIB_H 
#endif 
 
#if defined(__STDC__) || defined(MSDOS) || defined(WIN32) || defined(OS2) 
# define ENABLE_PROTOTYPES 
#endif 
 
#if defined(HAVE_STDLIB_H) 
# include 	/* to declare alloc funcs and getenv() */ 
#endif 
 
/*============================================================================ 
=   Portability defines 
============================================================================*/ 
#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(AMIGA) || defined(HAVE_OPENDIR) 
# define RECURSE_SUPPORTED 
#endif 
 
/*  Determine whether to use prototypes or simple declarations. 
 */ 
#ifndef __ARGS 
# ifdef ENABLE_PROTOTYPES 
#  define __ARGS(x) x 
# else 
#  define __ARGS(x) () 
# endif 
#endif 
 
/*  This is a helpful internal feature of later versions (> 2.7) of GCC 
 *  to prevent warnings about unused variables. 
 */ 
#if __GNUC__ > 2  ||  (__GNUC__ == 2  &&  __GNUC_MINOR__ >= 7) 
# define __unused__	__attribute__((unused)) 
#else 
# define __unused__ 
#endif 
 
/*  MS-DOS doesn't allow manipulation of standard error, so we send it to 
 *  stdout instead. 
 */ 
#if defined(MSDOS) || defined(WIN32) 
# define errout	stdout 
#else 
# define errout	stderr 
#endif 
 
/*============================================================================ 
=   General defines 
============================================================================*/ 
#ifndef PROGRAM_VERSION 
# define PROGRAM_VERSION	"2.3" 
#endif 
#define PROGRAM_NAME	"Exuberant Ctags" 
#define PROGRAM_URL	"http://darren.hiebert.com/ctags/index.html" 
#define AUTHOR_NAME	"Darren Hiebert" 
#define AUTHOR_EMAIL	"darren@hiebert.com" 
 
#define CTAGS_FILE	"tags" 
#define ETAGS_FILE	"TAGS" 
 
#define PSEUDO_TAG_PREFIX	"!_" 
 
/*============================================================================ 
=   Macros 
============================================================================*/ 
 
#ifdef DEBUG 
# define debug(level)	((Option.debugLevel & (int)(level)) != 0) 
# define DebugStatement(x)	x 
#else 
# define DebugStatement(x) 
# ifndef NDEBUG 
#  define NDEBUG 
# endif 
#endif 
 
/*  For convenience and safety. 
 */ 
#define stringMatch(s1,s2)	(strcmp(s1,s2) == 0) 
 
/*  Is the character valid as a character of a C identifier? 
 */ 
#define isident(c)	(isalnum(c) || (c) == '_') 
 
/*  Is the character valid as the first character of a C identifier? 
 */ 
#define isident1(c)	(isalpha(c) || (c) == '_' || (c) == '~') 
 
/*  Is that character a space or a tab? 
 */ 
#define isspacetab(c)	((c) == ' ' || (c) == '\t') 
 
/*============================================================================ 
=   Data declarations 
============================================================================*/ 
 
#undef FALSE 
#undef TRUE 
typedef enum { FALSE, TRUE } boolean; 
 
typedef int errorSelection; 
enum _errorTypes { FATAL = 1, WARNING = 2, PERROR = 4 }; 
 
enum _limits { 
    MaxNameLength	= 256,	/* maximum length of token with null */ 
    MaxHeaderExtensions	= 100,	/* maximum number of extensions in -h option */ 
    MaxCppNestingLevel	= 20, 
    MaxSupportedTagFormat = 2 
}; 
 
enum _characters { 
    /*  White space characters. 
     */ 
    SPACE	= ' ', 
    NEWLINE	= '\n', 
    CRETURN	= '\r', 
    FORMFEED	= '\f', 
    TAB		= '\t', 
    VTAB	= '\v', 
 
    /*  Some hard to read characters. 
     */ 
    DOUBLE_QUOTE  = '"', 
    SINGLE_QUOTE  = '\'', 
    BACKSLASH	  = '\\', 
 
    STRING_SYMBOL = ('S' + 0x80), 
    CHAR_SYMBOL	  = ('C' + 0x80) 
}; 
 
typedef struct _lineBuf { 
    int size;		/* size of buffer; 'int' because passed to fgets() */ 
    char *buffer;	/* buffer for placing line into */ 
} lineBuf; 
 
/*  Maintains the state of the tag file. 
 */ 
typedef struct _tagFile { 
    const char *name; 
    FILE *fp; 
    struct _numTags { unsigned long added, prev; } numTags; 
    struct _max { size_t line, tag, file; } max; 
    struct _etags { 
	char name[L_tmpnam]; 
	FILE *fp; 
	size_t byteCount; 
    } etags; 
    lineBuf line; 
} tagFile; 
 
typedef enum _langType { 
    LANG_AUTO = -2,		/* automatically determine language */ 
    LANG_IGNORE = -1,		/* ignore file (uunknown/nsupported language) */ 
    LANG_C,			/* ANSI C */ 
    LANG_CPP,			/* C++ */ 
    LANG_JAVA,			/* Java */ 
    LANG_COUNT			/* count of languages */ 
} langType; 
 
/*  Maintains the state of the current source file. 
 */ 
typedef struct _sourceFile { 
    const char	*name;		/* name of the current file */ 
    FILE	*fp;		/* stream used for reading the file */ 
    unsigned long lineNumber;	/* line number in the current file */ 
    long	seek;		/* fseek() offset to start of current line */ 
    int		ungetch;	/* a single character that was ungotten */ 
    boolean	afterNL;	/* was previous character a newline? */ 
    boolean	isHeader;	/* is current file a header file? */ 
    langType	language;	/* language of current file */ 
} sourceFile; 
 
/*  This stores the command line options. 
 */ 
typedef struct _optionValues { 
    struct _include {		/* include tags for: */ 
	boolean	classNames;	/* -ic  class names */ 
	boolean	defines;	/* -id  defines */ 
	boolean	enumerators;	/* -ie  enumeration value */ 
	boolean	functions;	/* -if  functions */ 
	boolean	enumNames;	/* -ig  enum names */ 
	boolean	interfaceNames;	/* -ii  interface names */ 
	boolean	members;	/* -im  data members */ 
	boolean	namespaceNames;	/* -in  namespace names */ 
	boolean	prototypes;	/* -ip  function prototypes */ 
	boolean	structNames;	/* -is  struct names */ 
	boolean	typedefs;	/* -it  typedefs */ 
	boolean	unionNames;	/* -iu  unions */ 
	boolean	variables;	/* -iv  variables */ 
	boolean	externVars;	/* -ix  extern variables */ 
 
	boolean classPrefix;	/* -iC  include tag entries of class::member */ 
	boolean sourceFiles;	/* -iF  include tags for source files */ 
	boolean	statics;	/* -iS  include static tags */ 
    } include; 
    struct _ignore { 
	char **list; 
	unsigned int count, max; 
    } ignore;		    /* -I  name of file containing tokens to ignore */ 
    boolean append;	    /* -a  append to "tags" files */ 
    boolean backward;	    /* -B  regexp patterns search backwards */ 
    boolean etags;	    /* -e  output Emacs style tags file */ 
    enum _locate { 
	EX_MIX,		    /* line numbers for defines, patterns otherwise */ 
	EX_LINENUM,	    /* -n  only line numbers in tag file */ 
	EX_PATTERN	    /* -N  only patterns in tag file */ 
    } locate;		    /* --excmd  EX command used to locate tag */ 
    const char *path;	    /* -p  default path for source files */ 
    boolean recurse;	    /* -R  recurse into directories */ 
    boolean sorted;	    /* -u,--sort  sort tags */ 
    boolean xref;	    /* -x  generate xref output instead */ 
    const char *fileList;   /* -L  name of file containing names of files */ 
    const char *tagFileName;/* -o  name of tags file */ 
    const char *const *headerExt; /* -h  header extensions */ 
#ifdef DEBUG 
    int debugLevel;	    /* -D  debugging output */ 
    unsigned long breakLine;/* -b  source line at which to call lineBreak() */ 
#endif 
    boolean startedAsEtags; 
    boolean braceFormat;    /* use brace formatting to detect end of block */ 
    unsigned int tagFileFormat; /* --format  tag file format (level) */ 
    boolean if0;	    /* --if0  examine code within "#if 0" branch */ 
    langType language;	    /* --lang specified language override */ 
    const char *const *langMap[(int)LANG_COUNT]; 
			    /* --langmap  language-extension map */ 
    boolean printTotals;    /* --totals  print cumulative statistics */ 
} optionValues; 
 
/*  Describes the type of tag being generated. This is used for debugging 
 *  purposes only. 
 */ 
typedef enum _tagType { 
    TAG_CLASS,			/* class name */ 
    TAG_DEFINE_OBJ,		/* pre-processor define (object-like) */ 
    TAG_DEFINE_FUNC,		/* pre-processor define (function-like) */ 
    TAG_ENUM,			/* enumeration name */ 
    TAG_ENUMERATOR,		/* enumerator (enumeration value) */ 
    TAG_FUNCDECL,		/* function declaration */ 
    TAG_FUNCTION,		/* function (or method) definition */ 
    TAG_INTERFACE,		/* interface declaration */ 
    TAG_MEMBER,			/* structure, class or interface member */ 
    TAG_NAMESPACE,		/* namespace name */ 
    TAG_SOURCE_FILE,		/* source file */ 
    TAG_STRUCT,			/* structure name */ 
    TAG_TYPEDEF,		/* typedef name */ 
    TAG_UNION,			/* union name */ 
    TAG_VARIABLE,		/* variable definition */ 
    TAG_EXTERN_VAR,		/* external variable declaration */ 
    TAG_NUMTYPES		/* must be last */ 
} tagType; 
 
#ifdef DEBUG 
 
/*  Defines the debugging levels. 
 */ 
enum _debugLevels { 
    DEBUG_CPP	 = 1,		/* echo characters out of pre-processor */ 
    DEBUG_PARSE	 = 2,		/* echo parsing results */ 
    DEBUG_STATUS = 4,		/* echo file status information */ 
    DEBUG_OPTION = 8,		/* echo option parsing */ 
    DEBUG_RAW	 = 16		/* echo raw (filtered) characters */ 
}; 
 
#endif 
 
/*---------------------------------------------------------------------------- 
 *  Used for describing a statement 
 *--------------------------------------------------------------------------*/ 
 
/*  This describes the scoping of the current statement. 
 */ 
typedef enum _tagScope { 
    SCOPE_GLOBAL,		/* no storage class specified */ 
    SCOPE_STATIC,		/* static storage class */ 
    SCOPE_EXTERN,		/* external storage class */ 
    SCOPE_FRIEND,		/* declares visibility only */ 
    SCOPE_TYPEDEF		/* scoping depends upon context */ 
} tagScope; 
 
/*  Information about the current tag candidate. 
 */ 
typedef struct _tagInfo { 
    long    location;		/* file position of line containing name */ 
    unsigned long lineNumber;	/* line number of tag */ 
    char    name[MaxNameLength];/* the name of the token */ 
} tagInfo; 
 
typedef enum _memberType { 
    MEMBER_NONE, 
    MEMBER_ENUM, MEMBER_CLASS, MEMBER_INTERFACE, MEMBER_NAMESPACE, 
    MEMBER_STRUCT, MEMBER_UNION 
} memberType; 
 
typedef enum _visibilityType { 
    VIS_UNDEFINED, VIS_PUBLIC, VIS_PROTECTED, VIS_PRIVATE 
} visibilityType; 
 
/*  Information about the parent class of a member (if any). 
 */ 
typedef struct _memberInfo { 
    memberType type; 
    visibilityType visibility;	/* current visibility section, if known */ 
    boolean persistent;		/* persistent across multiple statements? */ 
    char parent[MaxNameLength];	/* name of the parent data type */ 
} memberInfo; 
 
/*  Defines the one nesting level of a preprocessor conditional. 
 */ 
typedef struct _conditionalInfo { 
    boolean ignoreAllBranches;	/* ignoring parent conditional branch */ 
    boolean singleBranch;	/* choose only one branch */ 
    boolean branchChosen;	/* branch already selected */ 
    boolean ignoring;		/* current ignore state */ 
} conditionalInfo; 
 
/*  Defines the current state of the pre-processor. 
 */ 
typedef struct _cppState { 
    int	    ungetch;		/* an ungotten character, if any */ 
    boolean resolveRequired;	/* must resolve if/else/elif/endif branch */ 
    struct _directive { 
	enum _state { 
	    DRCTV_NONE, 
	    DRCTV_HASH, 
	    DRCTV_IF, 
	    DRCTV_DEFINE 
	} state; 
	boolean	accept;		/* is a directive syntatically permitted? */ 
	tagInfo tag;		/* the name associated with the directive */ 
	unsigned int nestLevel;	/* level 0 is not used */ 
	conditionalInfo ifdef[MaxCppNestingLevel]; 
    } directive; 
} cppState; 
 
/*============================================================================ 
=   Global variables 
============================================================================*/ 
extern tagFile		TagFile; 
extern sourceFile	File; 
extern optionValues	Option; 
extern cppState		Cpp; 
extern memberInfo	NoClass; 
 
/*============================================================================ 
=   Function prototypes 
============================================================================*/ 
 
extern void error __ARGS(( const errorSelection selection, 
			   const char *const format, ... )); 
extern unsigned long getFileSize __ARGS((const char *const name)); 
extern boolean isNormalFile __ARGS((const char *const name)); 
extern boolean isDirectory __ARGS((const char *const name)); 
extern boolean doesFileExist __ARGS((const char *const fileName)); 
extern void addTotals __ARGS(( const unsigned int files, const unsigned long lines, const unsigned long bytes)); 
extern char *readLine __ARGS((lineBuf *const pLineBuf, FILE *const fp)); 
extern const char *getExecutableName __ARGS((void)); 
 
extern const char *getTypeString __ARGS((const memberType mType)); 
extern const char *getVisibilityString __ARGS((const visibilityType visibility)); 
extern void makeTag __ARGS((const tagInfo *const tag, 
			    const memberInfo *const pMember, 
			    const tagScope scope, const tagType type)); 
extern void makeDefineTag __ARGS((const tagInfo *const tag, 
				  const tagScope scope, 
				  const boolean parameterized)); 
extern const char *tagTypeName __ARGS((const tagType type)); 
extern void addPseudoTags __ARGS((void)); 
extern unsigned long updatePseudoTags __ARGS((void)); 
 
extern boolean cppOpen __ARGS((const char *const name, const langType language, const boolean isHeader)); 
extern void cppClose __ARGS((void)); 
extern void cppUngetc __ARGS((const int c)); 
extern int cppGetc __ARGS((void)); 
 
extern boolean createTags __ARGS((const unsigned int nesting, const void *const parent)); 
extern void buildKeywordHash __ARGS((void)); 
 
extern boolean fileOpen __ARGS((const char *const name, const langType language, const boolean isHeader)); 
extern void fileClose __ARGS((void)); 
extern int fileGetc __ARGS((void)); 
extern void fileUngetc __ARGS((int c)); 
extern void freeLineBuffer __ARGS((lineBuf *const pLine)); 
extern char *getSourceLine __ARGS((lineBuf *const pLineBuffer, const long int location)); 
extern boolean isIgnoreToken __ARGS((const char *const name)); 
extern void freeIgnoreList __ARGS((void)); 
extern const char *getLanguageName __ARGS((const langType language)); 
extern boolean strequiv __ARGS((const char *s1, const char *s2)); 
extern char *const *parseOptions __ARGS((char *const *const argList)); 
extern void *parseEnvironmentOptions __ARGS((void)); 
 
extern void catFile __ARGS((const char *const name)); 
#ifdef EXTERNAL_SORT 
extern void externalSortTags __ARGS((const boolean toStdout)); 
#else 
extern void internalSortTags __ARGS((const boolean toStdout)); 
#endif 
 
#ifdef DEBUG 
extern void lineBreak __ARGS((void)); 
extern void debugPrintf __ARGS((const enum _debugLevels level, const char *const format, ... )); 
extern void debugOpen __ARGS((const char *const fileName, const boolean isHeader, const langType language)); 
extern void debugPutc __ARGS((const int c, const int level)); 
extern void debugEntry __ARGS((const tagScope scope, const tagType type, const char *const tagName, const memberInfo *const pMember)); 
extern void debugParseNest __ARGS((const boolean increase, const unsigned int level)); 
extern void debugCppNest __ARGS((const boolean begin, const unsigned int ignore)); 
extern void debugCppIgnore __ARGS((const boolean ignore)); 
extern void clearString __ARGS((char *const string, const int length)); 
#endif 
 
/*  Possibly missing system prototypes. 
 */ 
#if defined(NEED_PROTO_REMOVE) && defined(HAVE_REMOVE) 
extern int remove __ARGS((const char *)); 
#endif 
 
#if defined(NEED_PROTO_UNLINK) && !defined(HAVE_REMOVE) 
extern void *unlink __ARGS((const char *)); 
#endif 
 
#ifdef NEED_PROTO_MALLOC 
extern void *malloc __ARGS((size_t)); 
#endif 
 
#ifdef NEED_PROTO_GETENV 
extern char *getenv __ARGS((const char *)); 
#endif 
 
#ifdef NEED_PROTO_STRSTR 
extern char *strstr __ARGS((const char *str, const char *substr)); 
#endif 
 
/* vi:set tabstop=8 shiftwidth=4: */