2 /*============================================================================
3 CMake - Cross Platform Makefile Generator
4 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
6 Distributed under the OSI-approved BSD License (the "License");
7 see accompanying file Copyright.txt for details.
9 This software is distributed WITHOUT ANY WARRANTY; without even the
10 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 See the License for more information.
12 ============================================================================*/
15 This file must be translated to C and modified to build everywhere.
19 flex --prefix=cmListFileLexer_yy -ocmListFileLexer.c cmListFileLexer.in.l
21 Modify cmListFileLexer.c:
23 - remove use of the 'register' storage class specifier
24 - remove the yyunput function
25 - add a statement "(void)yyscanner;" to the top of these methods:
26 yy_fatal_error, cmListFileLexer_yyalloc, cmListFileLexer_yyrealloc, cmListFileLexer_yyfree
27 - remove statement "yyscanner = NULL;" from cmListFileLexer_yylex_destroy
28 - remove all YY_BREAK lines occurring right after return statements
29 - remove the isatty forward declaration
33 #include "cmStandardLexer.h"
35 /* Setup the proper cmListFileLexer_yylex declaration. */
36 #define YY_EXTRA_TYPE cmListFileLexer*
37 #define YY_DECL int cmListFileLexer_yylex (yyscan_t yyscanner, cmListFileLexer* lexer)
39 #include "cmListFileLexer.h"
41 /*--------------------------------------------------------------------------*/
42 struct cmListFileLexer_s
44 cmListFileLexer_Token token;
50 char* string_position;
55 static void cmListFileLexerSetToken(cmListFileLexer* lexer, const char* text,
57 static void cmListFileLexerAppend(cmListFileLexer* lexer, const char* text,
59 static int cmListFileLexerInput(cmListFileLexer* lexer, char* buffer,
61 static void cmListFileLexerInit(cmListFileLexer* lexer);
62 static void cmListFileLexerDestroy(cmListFileLexer* lexer);
64 /* Replace the lexer input function. */
66 #define YY_INPUT(buf, result, max_size) \
67 { result = cmListFileLexerInput(cmListFileLexer_yyget_extra(yyscanner), buf, max_size); }
69 /*--------------------------------------------------------------------------*/
78 MAKEVAR \$\([A-Za-z0-9_]*\)
79 UNQUOTED ([^ \t\r\n\(\)#\\\"]|\\.)
80 LEGACY {MAKEVAR}|{UNQUOTED}|\"({MAKEVAR}|{UNQUOTED}|[ \t])*\"
85 lexer->token.type = cmListFileLexer_Token_Newline;
86 cmListFileLexerSetToken(lexer, yytext, yyleng);
93 lexer->column += yyleng;
97 lexer->token.type = cmListFileLexer_Token_ParenLeft;
98 cmListFileLexerSetToken(lexer, yytext, yyleng);
99 lexer->column += yyleng;
104 lexer->token.type = cmListFileLexer_Token_ParenRight;
105 cmListFileLexerSetToken(lexer, yytext, yyleng);
106 lexer->column += yyleng;
110 [A-Za-z_][A-Za-z0-9_]+ {
111 lexer->token.type = cmListFileLexer_Token_Identifier;
112 cmListFileLexerSetToken(lexer, yytext, yyleng);
113 lexer->column += yyleng;
117 ({UNQUOTED})({UNQUOTED})* {
118 lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
119 cmListFileLexerSetToken(lexer, yytext, yyleng);
120 lexer->column += yyleng;
124 ({MAKEVAR}|{UNQUOTED})({LEGACY})* {
125 lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
126 cmListFileLexerSetToken(lexer, yytext, yyleng);
127 lexer->column += yyleng;
132 lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
133 cmListFileLexerSetToken(lexer, "", 0);
134 lexer->column += yyleng;
138 <STRING>([^\\\n\"]|\\.)+ {
139 cmListFileLexerAppend(lexer, yytext, yyleng);
140 lexer->column += yyleng;
144 cmListFileLexerAppend(lexer, yytext, yyleng);
150 cmListFileLexerAppend(lexer, yytext, yyleng);
156 lexer->column += yyleng;
162 cmListFileLexerAppend(lexer, yytext, yyleng);
163 lexer->column += yyleng;
167 lexer->token.type = cmListFileLexer_Token_BadString;
173 lexer->token.type = cmListFileLexer_Token_Space;
174 cmListFileLexerSetToken(lexer, yytext, yyleng);
175 lexer->column += yyleng;
180 lexer->token.type = cmListFileLexer_Token_BadCharacter;
181 cmListFileLexerSetToken(lexer, yytext, yyleng);
182 lexer->column += yyleng;
187 lexer->token.type = cmListFileLexer_Token_None;
188 cmListFileLexerSetToken(lexer, 0, 0);
194 /*--------------------------------------------------------------------------*/
195 static void cmListFileLexerSetToken(cmListFileLexer* lexer, const char* text,
198 /* Set the token line and column number. */
199 lexer->token.line = lexer->line;
200 lexer->token.column = lexer->column;
202 /* Use the same buffer if possible. */
203 if(lexer->token.text)
205 if(text && length < lexer->size)
207 strcpy(lexer->token.text, text);
208 lexer->token.length = length;
211 free(lexer->token.text);
212 lexer->token.text = 0;
216 /* Need to extend the buffer. */
219 lexer->token.text = strdup(text);
220 lexer->token.length = length;
221 lexer->size = length+1;
225 lexer->token.length = 0;
229 /*--------------------------------------------------------------------------*/
230 static void cmListFileLexerAppend(cmListFileLexer* lexer, const char* text,
236 /* If the appended text will fit in the buffer, do not reallocate. */
237 newSize = lexer->token.length + length + 1;
238 if(lexer->token.text && newSize <= lexer->size)
240 strcpy(lexer->token.text+lexer->token.length, text);
241 lexer->token.length += length;
245 /* We need to extend the buffer. */
246 temp = malloc(newSize);
247 if(lexer->token.text)
249 memcpy(temp, lexer->token.text, lexer->token.length);
250 free(lexer->token.text);
252 memcpy(temp+lexer->token.length, text, length);
253 temp[lexer->token.length+length] = 0;
254 lexer->token.text = temp;
255 lexer->token.length += length;
256 lexer->size = newSize;
259 /*--------------------------------------------------------------------------*/
260 static int cmListFileLexerInput(cmListFileLexer* lexer, char* buffer,
267 return (int)fread(buffer, 1, bufferSize, lexer->file);
269 else if(lexer->string_left)
271 int length = lexer->string_left;
272 if((int)bufferSize < length) { length = (int)bufferSize; }
273 memcpy(buffer, lexer->string_position, length);
274 lexer->string_position += length;
275 lexer->string_left -= length;
282 /*--------------------------------------------------------------------------*/
283 static void cmListFileLexerInit(cmListFileLexer* lexer)
285 if(lexer->file || lexer->string_buffer)
287 cmListFileLexer_yylex_init(&lexer->scanner);
288 cmListFileLexer_yyset_extra(lexer, lexer->scanner);
292 /*--------------------------------------------------------------------------*/
293 static void cmListFileLexerDestroy(cmListFileLexer* lexer)
295 if(lexer->file || lexer->string_buffer)
297 cmListFileLexer_yylex_destroy(lexer->scanner);
303 if(lexer->string_buffer)
305 free(lexer->string_buffer);
306 lexer->string_buffer = 0;
307 lexer->string_left = 0;
308 lexer->string_position = 0;
313 /*--------------------------------------------------------------------------*/
314 cmListFileLexer* cmListFileLexer_New()
316 cmListFileLexer* lexer = (cmListFileLexer*)malloc(sizeof(cmListFileLexer));
321 memset(lexer, 0, sizeof(*lexer));
327 /*--------------------------------------------------------------------------*/
328 void cmListFileLexer_Delete(cmListFileLexer* lexer)
330 cmListFileLexer_SetFileName(lexer, 0);
334 /*--------------------------------------------------------------------------*/
335 int cmListFileLexer_SetFileName(cmListFileLexer* lexer, const char* name)
338 cmListFileLexerDestroy(lexer);
341 lexer->file = fopen(name, "r");
347 cmListFileLexerInit(lexer);
351 /*--------------------------------------------------------------------------*/
352 int cmListFileLexer_SetString(cmListFileLexer* lexer, const char* text)
355 cmListFileLexerDestroy(lexer);
358 int length = (int)strlen(text);
359 lexer->string_buffer = (char*)malloc(length+1);
360 if(lexer->string_buffer)
362 strcpy(lexer->string_buffer, text);
363 lexer->string_position = lexer->string_buffer;
364 lexer->string_left = length;
371 cmListFileLexerInit(lexer);
375 /*--------------------------------------------------------------------------*/
376 cmListFileLexer_Token* cmListFileLexer_Scan(cmListFileLexer* lexer)
382 if(cmListFileLexer_yylex(lexer->scanner, lexer))
384 return &lexer->token;
388 cmListFileLexer_SetFileName(lexer, 0);
393 /*--------------------------------------------------------------------------*/
394 long cmListFileLexer_GetCurrentLine(cmListFileLexer* lexer)
406 /*--------------------------------------------------------------------------*/
407 long cmListFileLexer_GetCurrentColumn(cmListFileLexer* lexer)
411 return lexer->column;
419 /*--------------------------------------------------------------------------*/
420 const char* cmListFileLexer_GetTypeAsString(cmListFileLexer* lexer,
421 cmListFileLexer_Type type)
426 case cmListFileLexer_Token_None: return "nothing";
427 case cmListFileLexer_Token_Space: return "space";
428 case cmListFileLexer_Token_Newline: return "newline";
429 case cmListFileLexer_Token_Identifier: return "identifier";
430 case cmListFileLexer_Token_ParenLeft: return "left paren";
431 case cmListFileLexer_Token_ParenRight: return "right paren";
432 case cmListFileLexer_Token_ArgumentUnquoted: return "unquoted argument";
433 case cmListFileLexer_Token_ArgumentQuoted: return "quoted argument";
434 case cmListFileLexer_Token_BadCharacter: return "bad character";
435 case cmListFileLexer_Token_BadString: return "unterminated string";
437 return "unknown token";