mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Build all Flex files standalone
The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and C files generated by Flex which are #include'd into .y files make
this more difficult. In similar vein to 72b1e3a21
, arrange for all Flex
C files to compile to their own .o targets.
Reviewed by Andres Freund
Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
Discussion: https://www.postgresql.org/message-id/CAFBsxsF8Gc2StS3haXofshHCzqNMRXiSxvQEYGwnFsTmsdwNeg@mail.gmail.com
This commit is contained in:
1
contrib/cube/.gitignore
vendored
1
contrib/cube/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/cubeparse.h
|
||||
/cubeparse.c
|
||||
/cubescan.c
|
||||
# Generated subdirectories
|
||||
|
@ -4,7 +4,8 @@ MODULE_big = cube
|
||||
OBJS = \
|
||||
$(WIN32RES) \
|
||||
cube.o \
|
||||
cubeparse.o
|
||||
cubeparse.o \
|
||||
cubescan.o
|
||||
|
||||
EXTENSION = cube
|
||||
DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \
|
||||
@ -15,8 +16,6 @@ HEADERS = cubedata.h
|
||||
|
||||
REGRESS = cube cube_sci
|
||||
|
||||
EXTRA_CLEAN = y.tab.c y.tab.h
|
||||
|
||||
SHLIB_LINK += $(filter -lm, $(LIBS))
|
||||
|
||||
ifdef USE_PGXS
|
||||
@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global
|
||||
include $(top_srcdir)/contrib/contrib-global.mk
|
||||
endif
|
||||
|
||||
# See notes in src/backend/parser/Makefile about the following two rules
|
||||
cubeparse.h: cubeparse.c
|
||||
touch $@
|
||||
|
||||
# cubescan is compiled as part of cubeparse
|
||||
cubeparse.o: cubescan.c
|
||||
cubeparse.c: BISONFLAGS += -d
|
||||
|
||||
# Force these dependencies to be known even without dependency info built:
|
||||
cubeparse.o cubescan.o: cubeparse.h
|
||||
|
||||
distprep: cubeparse.c cubescan.c
|
||||
|
||||
maintainer-clean:
|
||||
rm -f cubeparse.c cubescan.c
|
||||
rm -f cubeparse.h cubeparse.c cubescan.c
|
||||
|
@ -119,11 +119,11 @@ cube_in(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *str = PG_GETARG_CSTRING(0);
|
||||
NDBOX *result;
|
||||
Size scanbuflen;
|
||||
|
||||
cube_scanner_init(str);
|
||||
cube_scanner_init(str, &scanbuflen);
|
||||
|
||||
if (cube_yyparse(&result) != 0)
|
||||
cube_yyerror(&result, "cube parser failed");
|
||||
cube_yyparse(&result, scanbuflen);
|
||||
|
||||
cube_scanner_finish();
|
||||
|
||||
|
@ -61,9 +61,9 @@ typedef struct NDBOX
|
||||
|
||||
/* in cubescan.l */
|
||||
extern int cube_yylex(void);
|
||||
extern void cube_yyerror(NDBOX **result, const char *message) pg_attribute_noreturn();
|
||||
extern void cube_scanner_init(const char *str);
|
||||
extern void cube_yyerror(NDBOX **result, Size scanbuflen, const char *message) pg_attribute_noreturn();
|
||||
extern void cube_scanner_init(const char *str, Size *scanbuflen);
|
||||
extern void cube_scanner_finish(void);
|
||||
|
||||
/* in cubeparse.y */
|
||||
extern int cube_yyparse(NDBOX **result);
|
||||
extern int cube_yyparse(NDBOX **result, Size scanbuflen);
|
||||
|
@ -23,9 +23,6 @@
|
||||
#define YYMALLOC palloc
|
||||
#define YYFREE pfree
|
||||
|
||||
static char *scanbuf;
|
||||
static int scanbuflen;
|
||||
|
||||
static int item_count(const char *s, char delim);
|
||||
static NDBOX *write_box(int dim, char *str1, char *str2);
|
||||
static NDBOX *write_point_as_box(int dim, char *str);
|
||||
@ -34,6 +31,7 @@ static NDBOX *write_point_as_box(int dim, char *str);
|
||||
|
||||
/* BISON Declarations */
|
||||
%parse-param {NDBOX **result}
|
||||
%parse-param {Size scanbuflen}
|
||||
%expect 0
|
||||
%name-prefix="cube_yy"
|
||||
|
||||
@ -265,5 +263,3 @@ write_point_as_box(int dim, char *str)
|
||||
|
||||
return bp;
|
||||
}
|
||||
|
||||
#include "cubescan.c"
|
||||
|
@ -1,9 +1,21 @@
|
||||
%{
|
||||
%top{
|
||||
/*
|
||||
* A scanner for EMP-style numeric ranges
|
||||
* contrib/cube/cubescan.l
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
/*
|
||||
* NB: include cubeparse.h only AFTER defining YYSTYPE (to match cubeparse.y)
|
||||
* and cubedata.h for NDBOX.
|
||||
*/
|
||||
#include "cubedata.h"
|
||||
#define YYSTYPE char *
|
||||
#include "cubeparse.h"
|
||||
}
|
||||
|
||||
%{
|
||||
/* LCOV_EXCL_START */
|
||||
|
||||
/* No reason to constrain amount of data slurped */
|
||||
@ -21,9 +33,7 @@ fprintf_to_ereport(const char *fmt, const char *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; */
|
||||
static char *scanbuf;
|
||||
%}
|
||||
|
||||
%option 8bit
|
||||
@ -45,14 +55,14 @@ NaN [nN][aA][nN]
|
||||
|
||||
%%
|
||||
|
||||
{float} yylval = yytext; return CUBEFLOAT;
|
||||
{infinity} yylval = yytext; return CUBEFLOAT;
|
||||
{NaN} yylval = yytext; return CUBEFLOAT;
|
||||
\[ yylval = "("; return O_BRACKET;
|
||||
\] yylval = ")"; return C_BRACKET;
|
||||
\( yylval = "("; return O_PAREN;
|
||||
\) yylval = ")"; return C_PAREN;
|
||||
\, yylval = ","; return COMMA;
|
||||
{float} cube_yylval = yytext; return CUBEFLOAT;
|
||||
{infinity} cube_yylval = yytext; return CUBEFLOAT;
|
||||
{NaN} cube_yylval = yytext; return CUBEFLOAT;
|
||||
\[ cube_yylval = "("; return O_BRACKET;
|
||||
\] cube_yylval = ")"; return C_BRACKET;
|
||||
\( cube_yylval = "("; return O_PAREN;
|
||||
\) cube_yylval = ")"; return C_PAREN;
|
||||
\, cube_yylval = ","; return COMMA;
|
||||
[ \t\n\r\f]+ /* discard spaces */
|
||||
. return yytext[0]; /* alert parser of the garbage */
|
||||
|
||||
@ -60,9 +70,9 @@ NaN [nN][aA][nN]
|
||||
|
||||
/* LCOV_EXCL_STOP */
|
||||
|
||||
/* result is not used, but Bison expects this signature */
|
||||
/* result and scanbuflen are not used, but Bison expects this signature */
|
||||
void
|
||||
yyerror(NDBOX **result, const char *message)
|
||||
cube_yyerror(NDBOX **result, Size scanbuflen, const char *message)
|
||||
{
|
||||
if (*yytext == YY_END_OF_BUFFER_CHAR)
|
||||
{
|
||||
@ -87,9 +97,9 @@ yyerror(NDBOX **result, const char *message)
|
||||
* Called before any actual parsing is done
|
||||
*/
|
||||
void
|
||||
cube_scanner_init(const char *str)
|
||||
cube_scanner_init(const char *str, Size *scanbuflen)
|
||||
{
|
||||
Size slen = strlen(str);
|
||||
Size slen = strlen(str);
|
||||
|
||||
/*
|
||||
* Might be left over after ereport()
|
||||
@ -100,7 +110,7 @@ cube_scanner_init(const char *str)
|
||||
/*
|
||||
* Make a scan buffer with special termination needed by flex.
|
||||
*/
|
||||
scanbuflen = slen;
|
||||
*scanbuflen = slen;
|
||||
scanbuf = palloc(slen + 2);
|
||||
memcpy(scanbuf, str, slen);
|
||||
scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
|
||||
|
Reference in New Issue
Block a user