From 21c2d4cd62f13780449db3337a202e749b85993a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 29 Jul 2013 10:42:55 -0400 Subject: [PATCH] Fix contrib/cube and contrib/seg to build with bison 3.0. These modules used the YYPARSE_PARAM macro, which has been deprecated by the bison folk since 1.875, and which they finally removed in 3.0. Adjust the code to use the replacement facility, %parse-param, which is a much better solution anyway since it allows specification of the type of the extra parser parameter. We can thus get rid of a lot of unsightly casting. Back-patch to all active branches, since somebody might try to build a back branch with up-to-date tools. --- contrib/cube/cube.c | 8 ++--- contrib/cube/cubeparse.y | 18 +++++----- contrib/cube/cubescan.l | 2 +- contrib/seg/seg.c | 6 ++-- contrib/seg/segparse.y | 71 ++++++++++++++++++++-------------------- contrib/seg/segscan.l | 2 +- 6 files changed, 54 insertions(+), 53 deletions(-) diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c index b8f06238309..5fe1109d1bc 100644 --- a/contrib/cube/cube.c +++ b/contrib/cube/cube.c @@ -27,8 +27,8 @@ PG_MODULE_MAGIC; #define ARRPTR(x) ( (double *) ARR_DATA_PTR(x) ) #define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) -extern int cube_yyparse(); -extern void cube_yyerror(const char *message); +extern int cube_yyparse(NDBOX **result); +extern void cube_yyerror(NDBOX **result, const char *message); extern void cube_scanner_init(const char *str); extern void cube_scanner_finish(void); @@ -159,12 +159,12 @@ Datum cube_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); - void *result; + NDBOX *result; cube_scanner_init(str); if (cube_yyparse(&result) != 0) - cube_yyerror("bogus input"); + cube_yyerror(&result, "bogus input"); cube_scanner_finish(); diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y index 13dc4f55b0b..53894d9d750 100644 --- a/contrib/cube/cubeparse.y +++ b/contrib/cube/cubeparse.y @@ -1,10 +1,9 @@ %{ +/* $PostgreSQL: pgsql/contrib/cube/cubeparse.y,v 1.19 2008/11/26 08:45:11 petere Exp $ */ + /* NdBox = [(lowerleft),(upperright)] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ -/* $PostgreSQL: pgsql/contrib/cube/cubeparse.y,v 1.19 2008/11/26 08:45:11 petere Exp $ */ - -#define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ #define YYSTYPE char * #define YYDEBUG 1 @@ -28,8 +27,8 @@ extern int cube_yylex(void); static char *scanbuf; static int scanbuflen; -void cube_yyerror(const char *message); -int cube_yyparse(void *result); +extern int cube_yyparse(NDBOX **result); +extern void cube_yyerror(NDBOX **result, const char *message); static int delim_count(char *s, char delim); static NDBOX * write_box(unsigned int dim, char *str1, char *str2); @@ -38,6 +37,7 @@ static NDBOX * write_point_as_box(char *s, int dim); %} /* BISON Declarations */ +%parse-param {NDBOX **result} %expect 0 %name-prefix="cube_yy" @@ -70,7 +70,7 @@ box: YYABORT; } - *((void **)result) = write_box( dim, $2, $4 ); + *result = write_box( dim, $2, $4 ); } | @@ -96,7 +96,7 @@ box: YYABORT; } - *((void **)result) = write_box( dim, $1, $3 ); + *result = write_box( dim, $1, $3 ); } | @@ -113,7 +113,7 @@ box: YYABORT; } - *((void **)result) = write_point_as_box($1, dim); + *result = write_point_as_box($1, dim); } | @@ -130,7 +130,7 @@ box: CUBE_MAX_DIM))); YYABORT; } - *((void **)result) = write_point_as_box($1, dim); + *result = write_point_as_box($1, dim); } ; diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index f373d353f2c..597bf02cfb0 100644 --- a/contrib/cube/cubescan.l +++ b/contrib/cube/cubescan.l @@ -54,7 +54,7 @@ float ({integer}|{real})([eE]{integer})? %% void -yyerror(const char *message) +yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { diff --git a/contrib/seg/seg.c b/contrib/seg/seg.c index 9432566abcb..18215969fad 100644 --- a/contrib/seg/seg.c +++ b/contrib/seg/seg.c @@ -24,8 +24,8 @@ PG_MODULE_MAGIC; -extern int seg_yyparse(); -extern void seg_yyerror(const char *message); +extern int seg_yyparse(SEG *result); +extern void seg_yyerror(SEG *result, const char *message); extern void seg_scanner_init(const char *str); extern void seg_scanner_finish(void); @@ -117,7 +117,7 @@ seg_in(PG_FUNCTION_ARGS) seg_scanner_init(str); if (seg_yyparse(result) != 0) - seg_yyerror("bogus input"); + seg_yyerror(result, "bogus input"); seg_scanner_finish(); diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y index ca351c661b3..9aaa9e9ab20 100644 --- a/contrib/seg/segparse.y +++ b/contrib/seg/segparse.y @@ -1,6 +1,6 @@ %{ -#define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ - +/* contrib/seg/segparse.y */ + #include "postgres.h" #include @@ -24,8 +24,8 @@ extern int significant_digits(char *str); /* defined in seg.c */ - void seg_yyerror(const char *message); - int seg_yyparse(void *result); + extern int seg_yyparse(SEG *result); + extern void seg_yyerror(SEG *result, const char *message); static float seg_atof(char *value); @@ -40,6 +40,7 @@ %} /* BISON Declarations */ +%parse-param {SEG *result} %expect 0 %name-prefix="seg_yy" @@ -65,55 +66,55 @@ range: boundary PLUMIN deviation { - ((SEG *)result)->lower = $1.val - $3.val; - ((SEG *)result)->upper = $1.val + $3.val; - sprintf(strbuf, "%g", ((SEG *)result)->lower); - ((SEG *)result)->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); - sprintf(strbuf, "%g", ((SEG *)result)->upper); - ((SEG *)result)->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); - ((SEG *)result)->l_ext = '\0'; - ((SEG *)result)->u_ext = '\0'; + result->lower = $1.val - $3.val; + result->upper = $1.val + $3.val; + sprintf(strbuf, "%g", result->lower); + result->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); + sprintf(strbuf, "%g", result->upper); + result->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); + result->l_ext = '\0'; + result->u_ext = '\0'; } | boundary RANGE boundary { - ((SEG *)result)->lower = $1.val; - ((SEG *)result)->upper = $3.val; - if ( ((SEG *)result)->lower > ((SEG *)result)->upper ) { + result->lower = $1.val; + result->upper = $3.val; + if ( result->lower > result->upper ) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("swapped boundaries: %g is greater than %g", - ((SEG *)result)->lower, ((SEG *)result)->upper))); + result->lower, result->upper))); YYERROR; } - ((SEG *)result)->l_sigd = $1.sigd; - ((SEG *)result)->u_sigd = $3.sigd; - ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); - ((SEG *)result)->u_ext = ( $3.ext ? $3.ext : '\0' ); + result->l_sigd = $1.sigd; + result->u_sigd = $3.sigd; + result->l_ext = ( $1.ext ? $1.ext : '\0' ); + result->u_ext = ( $3.ext ? $3.ext : '\0' ); } | boundary RANGE { - ((SEG *)result)->lower = $1.val; - ((SEG *)result)->upper = HUGE_VAL; - ((SEG *)result)->l_sigd = $1.sigd; - ((SEG *)result)->u_sigd = 0; - ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); - ((SEG *)result)->u_ext = '-'; + result->lower = $1.val; + result->upper = HUGE_VAL; + result->l_sigd = $1.sigd; + result->u_sigd = 0; + result->l_ext = ( $1.ext ? $1.ext : '\0' ); + result->u_ext = '-'; } | RANGE boundary { - ((SEG *)result)->lower = -HUGE_VAL; - ((SEG *)result)->upper = $2.val; - ((SEG *)result)->l_sigd = 0; - ((SEG *)result)->u_sigd = $2.sigd; - ((SEG *)result)->l_ext = '-'; - ((SEG *)result)->u_ext = ( $2.ext ? $2.ext : '\0' ); + result->lower = -HUGE_VAL; + result->upper = $2.val; + result->l_sigd = 0; + result->u_sigd = $2.sigd; + result->l_ext = '-'; + result->u_ext = ( $2.ext ? $2.ext : '\0' ); } | boundary { - ((SEG *)result)->lower = ((SEG *)result)->upper = $1.val; - ((SEG *)result)->l_sigd = ((SEG *)result)->u_sigd = $1.sigd; - ((SEG *)result)->l_ext = ((SEG *)result)->u_ext = ( $1.ext ? $1.ext : '\0' ); + result->lower = result->upper = $1.val; + result->l_sigd = result->u_sigd = $1.sigd; + result->l_ext = result->u_ext = ( $1.ext ? $1.ext : '\0' ); } ; diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l index 36da5fa3957..49b324e6185 100644 --- a/contrib/seg/segscan.l +++ b/contrib/seg/segscan.l @@ -53,7 +53,7 @@ float ({integer}|{real})([eE]{integer})? %% void -yyerror(const char *message) +yyerror(SEG *result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) {