Blame view

scripts/kconfig/zconf.l 6.55 KB
674eed8a6   Arnaud Lacombe   kconfig/zconf.l: ...
1
2
  %option nostdinit noyywrap never-interactive full ecs
  %option 8bit nodefault perf-report perf-report
be2be1d59   Adrian Bunk   kconfig: scripts/...
3
  %option noinput
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
13
14
15
  %x COMMAND HELP STRING PARAM
  %{
  /*
   * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
   * Released under the terms of the GNU GPL v2.0.
   */
  
  #include <limits.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
  #include "lkc.h"
  
  #define START_STRSIZE	16
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
19
20
21
22
  static struct {
  	struct file *file;
  	int lineno;
  } current_pos;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
23
  static char *text;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
35
  static int text_size, text_asize;
  
  struct buffer {
          struct buffer *parent;
          YY_BUFFER_STATE state;
  };
  
  struct buffer *current_buf;
  
  static int last_ts, first_ts;
  
  static void zconf_endhelp(void);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
36
  static void zconf_endfile(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

651665718   Josh Triplett   kconfig: Mark var...
38
  static void new_string(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
  {
  	text = malloc(START_STRSIZE);
  	text_asize = START_STRSIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  	text_size = 0;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
43
  	*text = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  }
651665718   Josh Triplett   kconfig: Mark var...
45
  static void append_string(const char *str, int size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
  {
  	int new_size = text_size + size + 1;
  	if (new_size > text_asize) {
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
49
50
  		new_size += START_STRSIZE - 1;
  		new_size &= -START_STRSIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
  		text = realloc(text, new_size);
  		text_asize = new_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  	}
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
54
  	memcpy(text + text_size, str, size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  	text_size += size;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
56
  	text[text_size] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  }
651665718   Josh Triplett   kconfig: Mark var...
58
  static void alloc_string(const char *str, int size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  {
  	text = malloc(size + 1);
  	memcpy(text, str, size);
  	text[size] = 0;
  }
  %}
  
  ws	[ 
  \t]
  n	[A-Za-z0-9_]
  
  %%
  	int str = 0;
  	int ts, i;
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
73
74
75
76
77
78
79
  [ \t]*#.*
  	|
  [ \t]*
  	{
  	current_file->lineno++;
  	return T_EOL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  [ \t]*#.*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
88
89
90
91
92
  
  [ \t]+	{
  	BEGIN(COMMAND);
  }
  
  .	{
  	unput(yytext[0]);
  	BEGIN(COMMAND);
  }
  
  
  <COMMAND>{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
  	{n}+	{
61f956f57   Arnaud Lacombe   kconfig: constify...
94
  		const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
95
96
97
  		BEGIN(PARAM);
  		current_pos.file = current_file;
  		current_pos.lineno = current_file->lineno;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
98
  		if (id && id->flags & TF_COMMAND) {
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
99
  			zconflval.id = id;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
100
101
  			return id->token;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
104
105
106
  		alloc_string(yytext, yyleng);
  		zconflval.string = text;
  		return T_WORD;
  	}
  	.
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
107
108
109
110
111
112
  	
  	{
  		BEGIN(INITIAL);
  		current_file->lineno++;
  		return T_EOL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
117
118
119
120
121
122
  }
  
  <PARAM>{
  	"&&"	return T_AND;
  	"||"	return T_OR;
  	"("	return T_OPEN_PAREN;
  	")"	return T_CLOSE_PAREN;
  	"!"	return T_NOT;
  	"="	return T_EQUAL;
  	"!="	return T_UNEQUAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
131
  	\"|\'	{
  		str = yytext[0];
  		new_string();
  		BEGIN(STRING);
  	}
  	
  	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
  	---	/* ignore */
  	({n}|[-/.])+	{
61f956f57   Arnaud Lacombe   kconfig: constify...
132
  		const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
133
134
  		if (id && id->flags & TF_PARAM) {
  			zconflval.id = id;
7a88488bb   Roman Zippel   [PATCH] kconfig: ...
135
  			return id->token;
3370f9f0d   Roman Zippel   [PATCH] kconfig: ...
136
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
  		alloc_string(yytext, yyleng);
  		zconflval.string = text;
  		return T_WORD;
  	}
  	#.*	/* comment */
  	\\
  	current_file->lineno++;
  	.
  	<<EOF>> {
  		BEGIN(INITIAL);
  	}
  }
  
  <STRING>{
  	[^'"\\
  ]+/
  	{
  		append_string(yytext, yyleng);
  		zconflval.string = text;
  		return T_WORD_QUOTE;
  	}
  	[^'"\\
  ]+	{
  		append_string(yytext, yyleng);
  	}
  	\\.?/
  	{
  		append_string(yytext + 1, yyleng - 1);
  		zconflval.string = text;
  		return T_WORD_QUOTE;
  	}
  	\\.?	{
  		append_string(yytext + 1, yyleng - 1);
  	}
  	\'|\"	{
  		if (str == yytext[0]) {
  			BEGIN(PARAM);
  			zconflval.string = text;
  			return T_WORD_QUOTE;
  		} else
  			append_string(yytext, 1);
  	}
  	
  	{
  		printf("%s:%d:warning: multi-line strings not supported
  ", zconf_curname(), zconf_lineno());
  		current_file->lineno++;
  		BEGIN(INITIAL);
  		return T_EOL;
  	}
  	<<EOF>>	{
  		BEGIN(INITIAL);
  	}
  }
  
  <HELP>{
  	[ \t]+	{
  		ts = 0;
  		for (i = 0; i < yyleng; i++) {
  			if (yytext[i] == '\t')
  				ts = (ts & ~7) + 8;
  			else
  				ts++;
  		}
  		last_ts = ts;
  		if (first_ts) {
  			if (ts < first_ts) {
  				zconf_endhelp();
  				return T_HELPTEXT;
  			}
  			ts -= first_ts;
  			while (ts > 8) {
  				append_string("        ", 8);
  				ts -= 8;
  			}
  			append_string("        ", ts);
  		}
  	}
  	[ \t]*
  /[^ \t
  ] {
  		current_file->lineno++;
  		zconf_endhelp();
  		return T_HELPTEXT;
  	}
  	[ \t]*
  	{
  		current_file->lineno++;
  		append_string("
  ", 1);
  	}
  	[^ \t
  ].* {
f7a4b4cdc   EGRY Gabor   kconfig: whitespa...
230
231
232
233
234
  		while (yyleng) {
  			if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
  				break;
  			yyleng--;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
238
239
240
241
242
243
244
245
  		append_string(yytext, yyleng);
  		if (!first_ts)
  			first_ts = last_ts;
  	}
  	<<EOF>>	{
  		zconf_endhelp();
  		return T_HELPTEXT;
  	}
  }
  
  <<EOF>>	{
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
246
  	if (current_file) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  		zconf_endfile();
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
248
  		return T_EOL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  	}
  	fclose(yyin);
  	yyterminate();
  }
  
  %%
  void zconf_starthelp(void)
  {
  	new_string();
  	last_ts = first_ts = 0;
  	BEGIN(HELP);
  }
  
  static void zconf_endhelp(void)
  {
  	zconflval.string = text;
  	BEGIN(INITIAL);
  }
  
  
  /*
   * Try to open specified file with following names:
   * ./name
   * $(srctree)/name
   * The latter is used when srctree is separate from objtree
   * when compiling the kernel.
   * Return NULL if file is not found.
   */
  FILE *zconf_fopen(const char *name)
  {
  	char *env, fullname[PATH_MAX+1];
  	FILE *f;
  
  	f = fopen(name, "r");
11de39e2f   Marcin Garski   kconfig: fix mcon...
283
  	if (!f && name != NULL && name[0] != '/') {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  		env = getenv(SRCTREE);
  		if (env) {
  			sprintf(fullname, "%s/%s", env, name);
  			f = fopen(fullname, "r");
  		}
  	}
  	return f;
  }
  
  void zconf_initscan(const char *name)
  {
  	yyin = zconf_fopen(name);
  	if (!yyin) {
  		printf("can't find file %s
  ", name);
  		exit(1);
  	}
  
  	current_buf = malloc(sizeof(*current_buf));
  	memset(current_buf, 0, sizeof(*current_buf));
  
  	current_file = file_lookup(name);
  	current_file->lineno = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
308
309
310
  }
  
  void zconf_nextfile(const char *name)
  {
f094f8a1b   Yann E. MORIN   kconfig: allow mu...
311
  	struct file *iter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
313
314
315
316
  	struct file *file = file_lookup(name);
  	struct buffer *buf = malloc(sizeof(*buf));
  	memset(buf, 0, sizeof(*buf));
  
  	current_buf->state = YY_CURRENT_BUFFER;
e82dae908   Arnaud Lacombe   kconfig: use the ...
317
  	yyin = zconf_fopen(file->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
  	if (!yyin) {
e82dae908   Arnaud Lacombe   kconfig: use the ...
319
320
321
  		printf("%s:%d: can't open file \"%s\"
  ",
  		    zconf_curname(), zconf_lineno(), file->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
324
325
326
  		exit(1);
  	}
  	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
  	buf->parent = current_buf;
  	current_buf = buf;
f094f8a1b   Yann E. MORIN   kconfig: allow mu...
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
  	for (iter = current_file->parent; iter; iter = iter->parent ) {
  		if (!strcmp(current_file->name,iter->name) ) {
  			printf("%s:%d: recursive inclusion detected. "
  			       "Inclusion path:
    current file : '%s'
  ",
  			       zconf_curname(), zconf_lineno(),
  			       zconf_curname());
  			iter = current_file->parent;
  			while (iter && \
  			       strcmp(iter->name,current_file->name)) {
  				printf("  included from: '%s:%d'
  ",
  				       iter->name, iter->lineno-1);
  				iter = iter->parent;
  			}
  			if (iter)
  				printf("  included from: '%s:%d'
  ",
  				       iter->name, iter->lineno+1);
  			exit(1);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
352
353
  	file->lineno = 1;
  	file->parent = current_file;
  	current_file = file;
  }
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
354
  static void zconf_endfile(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
  {
  	struct buffer *parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
357
358
359
360
361
362
363
364
365
366
  	current_file = current_file->parent;
  
  	parent = current_buf->parent;
  	if (parent) {
  		fclose(yyin);
  		yy_delete_buffer(YY_CURRENT_BUFFER);
  		yy_switch_to_buffer(parent->state);
  	}
  	free(current_buf);
  	current_buf = parent;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
367
368
369
370
  }
  
  int zconf_lineno(void)
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
371
  	return current_pos.lineno;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
  }
2e7a09183   Arnaud Lacombe   kconfig: constify...
373
  const char *zconf_curname(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  {
a02f0570a   Roman Zippel   [PATCH] kconfig: ...
375
  	return current_pos.file ? current_pos.file->name : "<none>";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
  }