-
Notifications
You must be signed in to change notification settings - Fork 0
/
pp.c
80 lines (60 loc) · 1.07 KB
/
pp.c
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
#include "cc.h"
struct stack * defines=NULL;
struct define
{
char *key, *value;
};
char * pp = "Preprocesor";
char * trow( fd_t fd )
{
unsigned int i=0;
static char buff[255];
while( (buff[i]=read_chr(fd))!='\n' )
++i;
buff[i]=0x00;
return buff;
}
void parse_pp( fd_t fd )
{
char *str, c;
str = tokenize( fd );
if( !strcmp( str, "warning" ) )
return err( pp, trow(fd), 0 );
if( !strcmp( str, "error" ) )
return err( pp, trow(fd), 1 );
if( !strcmp( str, "define" ) )
{
struct define d;
while( (str=tokenize(fd)) )
{
if( token(str,0) != FG_BLK )
goto end;
}
end:
d.key=malloc( strlen(str) );
strcpy( d.key, str );
str=trow(fd);
d.value=malloc( strlen(str) );
strcpy( d.value, str );
push( &defines, &d, sizeof(struct define) );
return;
}
while( read_chr(fd)!='\n' )
;
err( "No preprocessor directive", str, 0 );
return;
}
char * definition( char * str )
{
struct stack * s;
struct define * d;
s=defines;
while( s )
{
d=s->value;
if ( !strcmp( str, d->key ) )
return d->value;
s=s->prev;
}
return str;
}