/* Copyright (c) 2006-2012 Red Hat, Inc. This file is part of GlusterFS. This file is licensed to you under your choice of the GNU Lesser General Public License, version 3 or any later version (LGPLv3 or later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ %x STRING %option yylineno %option noinput %{ #define YYSTYPE char * #include "xlator.h" #include "y.tab.h" #include #define START_STRSIZE 32 static char *text; static int text_asize; static int text_size; void append_string(const char *str, int size) { int new_size = text_size + size + 1; if (new_size > text_asize) { new_size += START_STRSIZE - 1; new_size &= -START_STRSIZE; if (!text) { text = GF_CALLOC (1, new_size, gf_common_mt_char); } else { text = GF_REALLOC (text, new_size); } if (!text) { gf_log ("parser", GF_LOG_ERROR, "out of memory"); return; } text_asize = new_size; } memcpy(text + text_size, str, size); text_size += size; text[text_size] = 0; } %} VOLUME [v][o][l][u][m][e] END [e][n][d] SUB [s][u][b] OPTION [o][p][t][i][o][n] TYPE [t][y][p][e] %% \#.* ; {VOLUME} return VOLUME_BEGIN; {TYPE} return TYPE; {END}[-]{VOLUME} return VOLUME_END; {SUB}{VOLUME}[Ss] return SUBVOLUME; {OPTION} return OPTION; \" BEGIN(STRING); { [^\n\"\\]* { append_string (yytext, yyleng); } \\. { append_string (yytext + 1, yyleng - 1); } \" { if (0) { yyunput (0, NULL); } BEGIN (INITIAL); graphyylval = text; return STRING_TOK; } } [^ \t\r\n\"\\]+ { graphyylval = gf_strdup (yytext) ; return ID; } [ \t\r\n]+ ; %%