-
Notifications
You must be signed in to change notification settings - Fork 0
/
clexer.h
107 lines (88 loc) · 3.33 KB
/
clexer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/* clexer.h: Copyright (C) 2011 by Brian Raiter <breadbox@muppetlabs.com>
* License GPLv2+: GNU GPL version 2 or later.
* This is free software; you are free to change and redistribute it.
* There is NO WARRANTY, to the extent permitted by law.
*/
#ifndef _clexer_h_
#define _clexer_h_
/*
* The C lexer object does basic lexical analysis on the input stream.
* It knows enough C syntax to find the lines containing preprocessor
* statements. The C lexer works by feeding it input text, and
* advancing it through each character of input.
*/
struct clexer;
/* A list of identifiers for the preprocessor commands that the
* program cares about.
*/
enum ppcmd
{
cmdNone = 0,
cmdDefine, cmdElif, cmdElse, cmdEndif,
cmdIf, cmdIfdef, cmdIfndef, cmdUndef,
cmdOther
};
/* Returns the length of the C identifier located at input, or zero if
* input does not point to a valid C identifier.
*/
extern int getidentifierlength(char const *input);
/* Creates a new C lexer.
*/
extern struct clexer *initclexer(void);
/* Deallocates a lexer.
*/
extern void freeclexer(struct clexer *cl);
/* These functions all return true or false depending on what the
* lexer has last examined.
*/
extern int endoflinep(struct clexer const *cl);
extern int whitespacep(struct clexer const *cl);
extern int charquotep(struct clexer const *cl);
extern int ccommentp(struct clexer const *cl);
extern int preproclinep(struct clexer const *cl);
/* Returns the current number of nested parentheses.
*/
extern int getparenlevel(struct clexer const *cl);
/* Examines the next character in the given line of input, and updates
* state as necessary.
*/
extern char const *examinechar(struct clexer *cl, char const *input);
/* Examines the first character token in input, and returns a pointer
* to the byte immediately following.
*/
extern char const *nextchar(struct clexer *cl, char const *input);
/* Examines n character tokens in input, updating state along the way,
* and returns a pointer to the byte immediately following them.
*/
extern char const *nextchars(struct clexer *cl, char const *input, int skip);
/* Examines all character tokens in input until reaching the end of
* the line.
*/
extern char const *restofline(struct clexer *cl, char const *input);
/* Examines characters tokens until a whitespace character is found.
*/
extern char const *skiptowhite(struct clexer *cl, char const *input);
/* Examines characters tokens until a non-whitespace character is
* found.
*/
extern char const *skipwhite(struct clexer *cl, char const *input);
/* Mark the beginning of a new line. If input is not null, it will
* be used as the new line; otherwise, the lexer will take the next
* input as the beginning of the new line.
*/
extern char const *nextline(struct clexer *cl, char const *input);
/* Mark the end of the current input file.
*/
extern void endstream(struct clexer *cl);
/* Examines character tokens until the end of an identifier is
* found. The identifier itself is returned via buffer.
*/
extern char const *getidentifier(struct clexer *cl, char const *input,
char *buffer);
/* Examines character tokens until the end of the preprocessor
* statement is found. The value identifying the preprocessor statement
* is returned via cmdid.
*/
extern char const *getpreprocessorcmd(struct clexer *cl, char const *input,
enum ppcmd *cmdid);
#endif