mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	Trying to clean up the code a bit while we're working on these files for the reentrant scanner/pure parser patches. This cleanup only touches the code sections after the second '%%' in each file, via a manually-supervised and locally hacked up pgindent.
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| %top{
 | |
| /*
 | |
|  * A scanner for EMP-style numeric ranges
 | |
|  */
 | |
| #include "postgres.h"
 | |
| 
 | |
| #include "nodes/miscnodes.h"
 | |
| 
 | |
| #include "segdata.h"
 | |
| #include "segparse.h"	/* must be after segdata.h for SEG */
 | |
| }
 | |
| 
 | |
| %{
 | |
| /* LCOV_EXCL_START */
 | |
| 
 | |
| /* 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) */
 | |
| #undef fprintf
 | |
| #define fprintf(file, fmt, msg)  fprintf_to_ereport(fmt, msg)
 | |
| 
 | |
| static void
 | |
| fprintf_to_ereport(const char *fmt, const char *msg)
 | |
| {
 | |
| 	ereport(ERROR, (errmsg_internal("%s", msg)));
 | |
| }
 | |
| %}
 | |
| 
 | |
| %option reentrant
 | |
| %option bison-bridge
 | |
| %option 8bit
 | |
| %option never-interactive
 | |
| %option nodefault
 | |
| %option noinput
 | |
| %option nounput
 | |
| %option noyywrap
 | |
| %option noyyalloc
 | |
| %option noyyrealloc
 | |
| %option noyyfree
 | |
| %option warn
 | |
| %option prefix="seg_yy"
 | |
| 
 | |
| 
 | |
| range        (\.\.)(\.)?
 | |
| plumin       (\'\+\-\')|(\(\+\-)\)
 | |
| integer      [+-]?[0-9]+
 | |
| real         [+-]?[0-9]+\.[0-9]+
 | |
| float        ({integer}|{real})([eE]{integer})?
 | |
| 
 | |
| %%
 | |
| 
 | |
| {range}      yylval->text = yytext; return RANGE;
 | |
| {plumin}     yylval->text = yytext; return PLUMIN;
 | |
| {float}      yylval->text = yytext; return SEGFLOAT;
 | |
| \<           yylval->text = "<"; return EXTENSION;
 | |
| \>           yylval->text = ">"; return EXTENSION;
 | |
| \~           yylval->text = "~"; return EXTENSION;
 | |
| [ \t\n\r\f\v]+ /* discard spaces */
 | |
| .            return yytext[0]; /* alert parser of the garbage */
 | |
| 
 | |
| %%
 | |
| 
 | |
| /* LCOV_EXCL_STOP */
 | |
| 
 | |
| void
 | |
| seg_yyerror(SEG *result, struct Node *escontext, yyscan_t yyscanner, const char *message)
 | |
| {
 | |
| 	struct yyguts_t *yyg = (struct yyguts_t *) yyscanner;	/* needed for yytext
 | |
| 															 * macro */
 | |
| 
 | |
| 	/* if we already reported an error, don't overwrite it */
 | |
| 	if (SOFT_ERROR_OCCURRED(escontext))
 | |
| 		return;
 | |
| 
 | |
| 	if (*yytext == YY_END_OF_BUFFER_CHAR)
 | |
| 	{
 | |
| 		errsave(escontext,
 | |
| 				(errcode(ERRCODE_SYNTAX_ERROR),
 | |
| 				 errmsg("bad seg representation"),
 | |
| 		/* translator: %s is typically "syntax error" */
 | |
| 				 errdetail("%s at end of input", message)));
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		errsave(escontext,
 | |
| 				(errcode(ERRCODE_SYNTAX_ERROR),
 | |
| 				 errmsg("bad seg representation"),
 | |
| 		/* translator: first %s is typically "syntax error" */
 | |
| 				 errdetail("%s at or near \"%s\"", message, yytext)));
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Called before any actual parsing is done
 | |
|  */
 | |
| void
 | |
| seg_scanner_init(const char *str, yyscan_t *yyscannerp)
 | |
| {
 | |
| 	yyscan_t	yyscanner;
 | |
| 
 | |
| 	if (yylex_init(yyscannerp) != 0)
 | |
| 		elog(ERROR, "yylex_init() failed: %m");
 | |
| 
 | |
| 	yyscanner = *yyscannerp;
 | |
| 
 | |
| 	yy_scan_string(str, yyscanner);
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Called after parsing is done to clean up after seg_scanner_init()
 | |
|  */
 | |
| void
 | |
| seg_scanner_finish(yyscan_t yyscanner)
 | |
| {
 | |
| 	yylex_destroy(yyscanner);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Interface functions to make flex use palloc() instead of malloc().
 | |
|  * It'd be better to make these static, but flex insists otherwise.
 | |
|  */
 | |
| 
 | |
| void *
 | |
| yyalloc(yy_size_t size, yyscan_t yyscanner)
 | |
| {
 | |
| 	return palloc(size);
 | |
| }
 | |
| 
 | |
| void *
 | |
| yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner)
 | |
| {
 | |
| 	if (ptr)
 | |
| 		return repalloc(ptr, size);
 | |
| 	else
 | |
| 		return palloc(size);
 | |
| }
 | |
| 
 | |
| void
 | |
| yyfree(void *ptr, yyscan_t yyscanner)
 | |
| {
 | |
| 	if (ptr)
 | |
| 		pfree(ptr);
 | |
| }
 |