blob: c9bedf297003f5d34f1bb3680a2433e17e989f82 (
plain) (
blame)
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
108
109
110
111
|
%{
#include <ctype.h>
/*
* GENERIC -- This filter takes a file containing a generic operator as input
* and generates as output either a set of files, one for each of the data
* types in the generic family, or a single file wherein the generic section
* has been duplicated for each case.
*/
#undef output
extern char *type_string;
extern char xtype_string[];
extern char type_char;
extern void copy_line (void);
extern void copy_string (void);
extern void copy_comment (void);
extern void make_float (char type_ch);
extern void pass_through (void);
extern void do_for (void);
extern void do_endfor (void);
extern void do_if (void);
extern void do_else (void);
extern void do_endif (void);
extern void output_indef (char ch);
extern void output_upper (char *s);
extern void output (char ch);
extern void outstr (char *s);
extern int getc (FILE *cx_i); /* NOTE: lex.sed changes this to k_getc() */
%}
W [ \t]
%%
PIXEL outstr (type_string);
XPIXEL outstr (xtype_string);
INDEF output_indef (type_char);
INDEF(S|I|L|R|D|X) ECHO;
SZ_PIXEL output_upper ("SZ_");
TY_PIXEL output_upper ("TY_");
$PIXEL outstr ("PIXEL");
$INDEF outstr ("INDEF");
[A-Z][A-Z_]*PIXEL {
yytext[strlen(yytext)-5] = '\0';
output_upper (yytext);
}
"$t" { if (isupper (type_char))
output (tolower (type_char));
else
output (type_char);
}
"$T" { if (islower (type_char))
output (toupper (type_char));
else
output (type_char);
}
"$/" pass_through();
[0-9]+("$f"|"$F") make_float (type_char);
{W}*"$if" do_if();
{W}*"$else" do_else();
{W}*"$endif" do_endif();
{W}*"$for" do_for();
{W}*"$endfor" do_endfor();
{W}*"$IF" do_if();
{W}*"$ELSE" do_else();
{W}*"$ENDIF" do_endif();
{W}*"$FOR" do_for();
{W}*"$ENDFOR" do_endfor();
"$$" output ('$');
"/*" copy_comment();
\" copy_string();
^\#if ECHO;
^\#else ECHO;
^\#endif ECHO;
^\#include ECHO;
\# copy_line();
^\% copy_line();
%%
/* LEX_INPUT -- Make input() callable as a function from the .c code.
*/
int
lex_input (void)
{
return (input());
}
/* LEX_UNPUT -- Make unput() callable as a function from the .c code.
*/
void
lex_unput (int ch)
{
unput (ch);
}
|