Fix pg_dump bug in the database-level collation patch. "datcollate" and
[PostgreSQL.git] / contrib / seg / segscan.l
blob36da5fa3957901fa08b93b39e7219f6a8fad0ee6
1 %{
2 /* 
3 ** A scanner for EMP-style numeric ranges 
4 */
6 #include "postgres.h"
8 /* No reason to constrain amount of data slurped */
9 #define YY_READ_BUF_SIZE 16777216
11 /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
12 #undef fprintf
13 #define fprintf(file, fmt, msg)  ereport(ERROR, (errmsg_internal("%s", msg)))
15 /* Handles to the buffer that the lexer uses internally */
16 static YY_BUFFER_STATE scanbufhandle;
17 static char *scanbuf;
18 static int      scanbuflen;
20 /* flex 2.5.4 doesn't bother with a decl for this */
21 int seg_yylex(void);
23 void seg_scanner_init(const char *str);
24 void seg_scanner_finish(void);
27 %option 8bit
28 %option never-interactive
29 %option nodefault
30 %option noinput
31 %option nounput
32 %option noyywrap
33 %option prefix="seg_yy"
36 range        (\.\.)(\.)?
37 plumin       (\'\+\-\')|(\(\+\-)\)
38 integer      [+-]?[0-9]+
39 real         [+-]?[0-9]+\.[0-9]+
40 float        ({integer}|{real})([eE]{integer})?
44 {range}      yylval.text = yytext; return RANGE;
45 {plumin}     yylval.text = yytext; return PLUMIN;
46 {float}      yylval.text = yytext; return SEGFLOAT;
47 \<           yylval.text = "<"; return EXTENSION;
48 \>           yylval.text = ">"; return EXTENSION;
49 \~           yylval.text = "~"; return EXTENSION;
50 [ \t\n\r\f]+ /* discard spaces */
51 .            return yytext[0]; /* alert parser of the garbage */
55 void
56 yyerror(const char *message)
58         if (*yytext == YY_END_OF_BUFFER_CHAR)
59         {
60                 ereport(ERROR,
61                                 (errcode(ERRCODE_SYNTAX_ERROR),
62                                  errmsg("bad seg representation"),
63                                  /* translator: %s is typically "syntax error" */
64                                  errdetail("%s at end of input", message)));
65         }
66         else
67         {
68                 ereport(ERROR,
69                                 (errcode(ERRCODE_SYNTAX_ERROR),
70                                  errmsg("bad seg representation"),
71                                  /* translator: first %s is typically "syntax error" */
72                                  errdetail("%s at or near \"%s\"", message, yytext)));
73         }
78  * Called before any actual parsing is done
79  */
80 void
81 seg_scanner_init(const char *str)
83         Size    slen = strlen(str);
85         /*
86          * Might be left over after ereport()
87          */
88         if (YY_CURRENT_BUFFER)
89                 yy_delete_buffer(YY_CURRENT_BUFFER);
91         /*
92          * Make a scan buffer with special termination needed by flex.
93          */
94         scanbuflen = slen;
95         scanbuf = palloc(slen + 2);
96         memcpy(scanbuf, str, slen);
97         scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
98         scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);
100         BEGIN(INITIAL);
105  * Called after parsing is done to clean up after seg_scanner_init()
106  */
107 void
108 seg_scanner_finish(void)
110         yy_delete_buffer(scanbufhandle);
111         pfree(scanbuf);