1 /*
2 *   $Id: read.h 659 2008-04-20 23:27:48Z elliotth $
3 *
4 *   Copyright (c) 1998-2002, Darren Hiebert
5 *
6 *   This source code is released for free distribution under the terms of the
7 *   GNU General Public License.
8 *
9 *   External interface to read.c
10 */
11 #ifndef _READ_H
12 #define _READ_H
13 
14 #if defined(FILE_WRITE) || defined(VAXC)
15 # define CONST_FILE
16 #else
17 # define CONST_FILE const
18 #endif
19 
20 /*
21 *   INCLUDE FILES
22 */
23 #include "general.h"  /* must always come first */
24 
25 #include <stdio.h>
26 #include <ctype.h>
27 
28 #include "parse.h"
29 #include "vstring.h"
30 
31 /*
32 *   MACROS
33 */
34 #define getInputLineNumber()     File.lineNumber
35 #define getInputFileName()       vStringValue (File.source.name)
36 #define getInputFilePosition()   File.filePosition
37 #define getSourceFileName()      vStringValue (File.source.name)
38 #define getSourceFileTagPath()   File.source.tagPath
39 #define getSourceLanguage()      File.source.language
40 #define getSourceLanguageName()  getLanguageName (File.source.language)
41 #define getSourceLineNumber()    File.source.lineNumber
42 #define isLanguage(lang)         (boolean)((lang) == File.source.language)
43 #define isHeaderFile()           File.source.isHeader
44 
45 /*
46 *   DATA DECLARATIONS
47 */
48 
49 enum eCharacters {
50 	/* white space characters */
51 	SPACE         = ' ',
52 	NEWLINE       = '\n',
53 	CRETURN       = '\r',
54 	FORMFEED      = '\f',
55 	TAB           = '\t',
56 	VTAB          = '\v',
57 
58 	/* some hard to read characters */
59 	DOUBLE_QUOTE  = '"',
60 	SINGLE_QUOTE  = '\'',
61 	BACKSLASH     = '\\',
62 
63 	STRING_SYMBOL = ('S' + 0x80),
64 	CHAR_SYMBOL   = ('C' + 0x80)
65 };
66 
67 /*  Maintains the state of the current source file.
68  */
69 typedef struct sInputFile {
70 	vString    *name;          /* name of input file */
71 	vString    *path;          /* path of input file (if any) */
72 	vString    *line;          /* last line read from file */
73 	const unsigned char* currentLine;  /* current line being worked on */
74 	FILE       *fp;            /* stream used for reading the file */
75 	unsigned long lineNumber;  /* line number in the input file */
76 	fpos_t      filePosition;  /* file position of current line */
77 	int         ungetch;       /* a single character that was ungotten */
78 	boolean     eof;           /* have we reached the end of file? */
79 	boolean     newLine;       /* will the next character begin a new line? */
80 	langType    language;      /* language of input file */
81 
82 	/*  Contains data pertaining to the original source file in which the tag
83 	 *  was defined. This may be different from the input file when #line
84 	 *  directives are processed (i.e. the input file is preprocessor output).
85 	 */
86 	struct sSource {
87 		vString *name;           /* name to report for source file */
88 		char    *tagPath;        /* path of source file relative to tag file */
89 		unsigned long lineNumber;/* line number in the source file */
90 		boolean  isHeader;       /* is source file a header file? */
91 		langType language;       /* language of source file */
92 	} source;
93 } inputFile;
94 
95 /*
96 *   GLOBAL VARIABLES
97 */
98 extern CONST_FILE inputFile File;
99 
100 /*
101 *   FUNCTION PROTOTYPES
102 */
103 extern void freeSourceFileResources (void);
104 extern boolean fileOpen (const char *const fileName, const langType language);
105 extern boolean fileEOF (void);
106 extern void fileClose (void);
107 extern int fileGetc (void);
108 extern int fileSkipToCharacter (int c);
109 extern void fileUngetc (int c);
110 extern const unsigned char *fileReadLine (void);
111 extern char *readLine (vString *const vLine, FILE *const fp);
112 extern char *readSourceLine (vString *const vLine, fpos_t location, long *const pSeekValue);
113 
114 #endif  /* _READ_H */
115 
116 /* vi:set tabstop=4 shiftwidth=4: */
117