summaryrefslogtreecommitdiff
path: root/contrib/cube/cubescan.l
diff options
context:
space:
mode:
authorTom Lane2003-09-14 01:52:25 +0000
committerTom Lane2003-09-14 01:52:25 +0000
commit03e47392e0c383ea75a1aac9294c4e0f4eb4d20f (patch)
tree0723a85e046a0c1d43df1b8b433a5ffea905fd4e /contrib/cube/cubescan.l
parentb38c04335a3d09265ef1ccc26cc924b4edc5c9ca (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.l86
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);
}