diff options
| author | Tom Lane | 2003-09-14 01:52:25 +0000 |
|---|---|---|
| committer | Tom Lane | 2003-09-14 01:52:25 +0000 |
| commit | 03e47392e0c383ea75a1aac9294c4e0f4eb4d20f (patch) | |
| tree | 0723a85e046a0c1d43df1b8b433a5ffea905fd4e /contrib/cube/cubescan.l | |
| parent | b38c04335a3d09265ef1ccc26cc924b4edc5c9ca (diff) | |
Make contrib/cube work with flex 2.5.31. Fix it up to have a real
btree operator class, too, since in PG 7.4 you can't GROUP without one.
Diffstat (limited to 'contrib/cube/cubescan.l')
| -rw-r--r-- | contrib/cube/cubescan.l | 86 |
1 files changed, 68 insertions, 18 deletions
diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index 1b44397f460..c5e1a20f6b1 100644 --- a/contrib/cube/cubescan.l +++ b/contrib/cube/cubescan.l @@ -5,33 +5,30 @@ #include "postgres.h" -#include "buffer.h" +/* No reason to constrain amount of data slurped */ +#define YY_READ_BUF_SIZE 16777216 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */ #define fprintf(file, fmt, msg) ereport(ERROR, (errmsg_internal("%s", msg))) +/* Handles to the buffer that the lexer uses internally */ +static YY_BUFFER_STATE scanbufhandle; +/* this is now declared in cubeparse.y: */ +/* static char *scanbuf; */ +/* static int scanbuflen; */ -/* flex screws a couple symbols when used with the -P option; fix those */ -#define YY_DECL int cube_yylex YY_PROTO(( void )); \ -int cube_yylex YY_PROTO(( void )) -#define yylval cube_yylval +/* flex 2.5.4 doesn't bother with a decl for this */ +int cube_yylex(void); - -/* redefined YY_INPUT reads byte-wise from the memory area defined in buffer.c */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ -{ \ - int c = read_parse_buffer(); \ - result = (c == '\0') ? YY_NULL : (buf[0] = c, 1); \ -} - -void cube_flush_scanner_buffer(void); +void cube_scanner_init(const char *str); +void cube_scanner_finish(void); %} %option 8bit %option never-interactive %option nounput %option noyywrap +%option prefix="cube_yy" n [0-9]+ @@ -52,8 +49,61 @@ float ({integer}|{real})([eE]{integer})? %% -int cube_yylex(); +void +yyerror(const char *message) +{ + if (*yytext == YY_END_OF_BUFFER_CHAR) + { + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("bad cube representation"), + /* translator: %s is typically "syntax error" */ + errdetail("%s at end of input", message))); + } + else + { + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("bad cube representation"), + /* translator: first %s is typically "syntax error" */ + errdetail("%s at or near \"%s\"", message, yytext))); + } +} + + +/* + * Called before any actual parsing is done + */ +void +cube_scanner_init(const char *str) +{ + Size slen = strlen(str); + + /* + * Might be left over after ereport() + */ + if (YY_CURRENT_BUFFER) + yy_delete_buffer(YY_CURRENT_BUFFER); + + /* + * Make a scan buffer with special termination needed by flex. + */ + scanbuflen = slen; + scanbuf = palloc(slen + 2); + memcpy(scanbuf, str, slen); + scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR; + scanbufhandle = yy_scan_buffer(scanbuf, slen + 2); + + BEGIN(INITIAL); +} + -void cube_flush_scanner_buffer(void) { - YY_FLUSH_BUFFER; +/* + * Called after parsing is done to clean up after cube_scanner_init() + */ +void +cube_scanner_finish(void) +{ + yy_delete_buffer(scanbufhandle); + pfree(scanbuf); } |
