Commit 55cbfa53 authored by Tom Lane's avatar Tom Lane

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.
parent 626092a2
...@@ -26,8 +26,8 @@ PG_MODULE_MAGIC; ...@@ -26,8 +26,8 @@ PG_MODULE_MAGIC;
#define ARRPTR(x) ( (double *) ARR_DATA_PTR(x) ) #define ARRPTR(x) ( (double *) ARR_DATA_PTR(x) )
#define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) #define ARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x))
extern int cube_yyparse(); extern int cube_yyparse(NDBOX **result);
extern void cube_yyerror(const char *message); extern void cube_yyerror(NDBOX **result, const char *message);
extern void cube_scanner_init(const char *str); extern void cube_scanner_init(const char *str);
extern void cube_scanner_finish(void); extern void cube_scanner_finish(void);
...@@ -156,12 +156,12 @@ Datum ...@@ -156,12 +156,12 @@ Datum
cube_in(PG_FUNCTION_ARGS) cube_in(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0); char *str = PG_GETARG_CSTRING(0);
void *result; NDBOX *result;
cube_scanner_init(str); cube_scanner_init(str);
if (cube_yyparse(&result) != 0) if (cube_yyparse(&result) != 0)
cube_yyerror("bogus input"); cube_yyerror(&result, "bogus input");
cube_scanner_finish(); cube_scanner_finish();
......
%{ %{
/* contrib/cube/cubeparse.y */
/* NdBox = [(lowerleft),(upperright)] */ /* NdBox = [(lowerleft),(upperright)] */
/* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */ /* [(xLL(1)...xLL(N)),(xUR(1)...xUR(n))] */
/* contrib/cube/cubeparse.y */
#define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */
#define YYSTYPE char * #define YYSTYPE char *
#define YYDEBUG 1 #define YYDEBUG 1
...@@ -28,8 +27,8 @@ extern int cube_yylex(void); ...@@ -28,8 +27,8 @@ extern int cube_yylex(void);
static char *scanbuf; static char *scanbuf;
static int scanbuflen; static int scanbuflen;
void cube_yyerror(const char *message); extern int cube_yyparse(NDBOX **result);
int cube_yyparse(void *result); extern void cube_yyerror(NDBOX **result, const char *message);
static int delim_count(char *s, char delim); static int delim_count(char *s, char delim);
static NDBOX * write_box(unsigned int dim, char *str1, char *str2); 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); ...@@ -38,6 +37,7 @@ static NDBOX * write_point_as_box(char *s, int dim);
%} %}
/* BISON Declarations */ /* BISON Declarations */
%parse-param {NDBOX **result}
%expect 0 %expect 0
%name-prefix="cube_yy" %name-prefix="cube_yy"
...@@ -70,7 +70,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET ...@@ -70,7 +70,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
YYABORT; YYABORT;
} }
*((void **)result) = write_box( dim, $2, $4 ); *result = write_box( dim, $2, $4 );
} }
...@@ -97,7 +97,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET ...@@ -97,7 +97,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
YYABORT; YYABORT;
} }
*((void **)result) = write_box( dim, $1, $3 ); *result = write_box( dim, $1, $3 );
} }
| paren_list | paren_list
...@@ -114,7 +114,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET ...@@ -114,7 +114,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
YYABORT; YYABORT;
} }
*((void **)result) = write_point_as_box($1, dim); *result = write_point_as_box($1, dim);
} }
| list | list
...@@ -130,7 +130,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET ...@@ -130,7 +130,7 @@ box: O_BRACKET paren_list COMMA paren_list C_BRACKET
CUBE_MAX_DIM))); CUBE_MAX_DIM)));
YYABORT; YYABORT;
} }
*((void **)result) = write_point_as_box($1, dim); *result = write_point_as_box($1, dim);
} }
; ;
......
...@@ -61,7 +61,7 @@ float ({integer}|{real})([eE]{integer})? ...@@ -61,7 +61,7 @@ float ({integer}|{real})([eE]{integer})?
%% %%
void __attribute__((noreturn)) void __attribute__((noreturn))
yyerror(const char *message) yyerror(NDBOX **result, const char *message)
{ {
if (*yytext == YY_END_OF_BUFFER_CHAR) if (*yytext == YY_END_OF_BUFFER_CHAR)
{ {
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
extern int seg_yyparse(); extern int seg_yyparse(SEG *result);
extern void seg_yyerror(const char *message); extern void seg_yyerror(SEG *result, const char *message);
extern void seg_scanner_init(const char *str); extern void seg_scanner_init(const char *str);
extern void seg_scanner_finish(void); extern void seg_scanner_finish(void);
...@@ -126,7 +126,7 @@ seg_in(PG_FUNCTION_ARGS) ...@@ -126,7 +126,7 @@ seg_in(PG_FUNCTION_ARGS)
seg_scanner_init(str); seg_scanner_init(str);
if (seg_yyparse(result) != 0) if (seg_yyparse(result) != 0)
seg_yyerror("bogus input"); seg_yyerror(result, "bogus input");
seg_scanner_finish(); seg_scanner_finish();
......
%{ %{
#define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ /* contrib/seg/segparse.y */
#include "postgres.h" #include "postgres.h"
...@@ -24,8 +24,8 @@ extern int seg_yylex(void); ...@@ -24,8 +24,8 @@ extern int seg_yylex(void);
extern int significant_digits(char *str); /* defined in seg.c */ extern int significant_digits(char *str); /* defined in seg.c */
void seg_yyerror(const char *message); extern int seg_yyparse(SEG *result);
int seg_yyparse(void *result); extern void seg_yyerror(SEG *result, const char *message);
static float seg_atof(char *value); static float seg_atof(char *value);
...@@ -40,6 +40,7 @@ static char strbuf[25] = { ...@@ -40,6 +40,7 @@ static char strbuf[25] = {
%} %}
/* BISON Declarations */ /* BISON Declarations */
%parse-param {SEG *result}
%expect 0 %expect 0
%name-prefix="seg_yy" %name-prefix="seg_yy"
...@@ -65,59 +66,59 @@ static char strbuf[25] = { ...@@ -65,59 +66,59 @@ static char strbuf[25] = {
range: boundary PLUMIN deviation range: boundary PLUMIN deviation
{ {
((SEG *)result)->lower = $1.val - $3.val; result->lower = $1.val - $3.val;
((SEG *)result)->upper = $1.val + $3.val; result->upper = $1.val + $3.val;
sprintf(strbuf, "%g", ((SEG *)result)->lower); sprintf(strbuf, "%g", result->lower);
((SEG *)result)->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); result->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd));
sprintf(strbuf, "%g", ((SEG *)result)->upper); sprintf(strbuf, "%g", result->upper);
((SEG *)result)->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd)); result->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd));
((SEG *)result)->l_ext = '\0'; result->l_ext = '\0';
((SEG *)result)->u_ext = '\0'; result->u_ext = '\0';
} }
| boundary RANGE boundary | boundary RANGE boundary
{ {
((SEG *)result)->lower = $1.val; result->lower = $1.val;
((SEG *)result)->upper = $3.val; result->upper = $3.val;
if ( ((SEG *)result)->lower > ((SEG *)result)->upper ) { if ( result->lower > result->upper ) {
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("swapped boundaries: %g is greater than %g", errmsg("swapped boundaries: %g is greater than %g",
((SEG *)result)->lower, ((SEG *)result)->upper))); result->lower, result->upper)));
YYERROR; YYERROR;
} }
((SEG *)result)->l_sigd = $1.sigd; result->l_sigd = $1.sigd;
((SEG *)result)->u_sigd = $3.sigd; result->u_sigd = $3.sigd;
((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); result->l_ext = ( $1.ext ? $1.ext : '\0' );
((SEG *)result)->u_ext = ( $3.ext ? $3.ext : '\0' ); result->u_ext = ( $3.ext ? $3.ext : '\0' );
} }
| boundary RANGE | boundary RANGE
{ {
((SEG *)result)->lower = $1.val; result->lower = $1.val;
((SEG *)result)->upper = HUGE_VAL; result->upper = HUGE_VAL;
((SEG *)result)->l_sigd = $1.sigd; result->l_sigd = $1.sigd;
((SEG *)result)->u_sigd = 0; result->u_sigd = 0;
((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' ); result->l_ext = ( $1.ext ? $1.ext : '\0' );
((SEG *)result)->u_ext = '-'; result->u_ext = '-';
} }
| RANGE boundary | RANGE boundary
{ {
((SEG *)result)->lower = -HUGE_VAL; result->lower = -HUGE_VAL;
((SEG *)result)->upper = $2.val; result->upper = $2.val;
((SEG *)result)->l_sigd = 0; result->l_sigd = 0;
((SEG *)result)->u_sigd = $2.sigd; result->u_sigd = $2.sigd;
((SEG *)result)->l_ext = '-'; result->l_ext = '-';
((SEG *)result)->u_ext = ( $2.ext ? $2.ext : '\0' ); result->u_ext = ( $2.ext ? $2.ext : '\0' );
} }
| boundary | boundary
{ {
((SEG *)result)->lower = ((SEG *)result)->upper = $1.val; result->lower = result->upper = $1.val;
((SEG *)result)->l_sigd = ((SEG *)result)->u_sigd = $1.sigd; result->l_sigd = result->u_sigd = $1.sigd;
((SEG *)result)->l_ext = ((SEG *)result)->u_ext = ( $1.ext ? $1.ext : '\0' ); result->l_ext = result->u_ext = ( $1.ext ? $1.ext : '\0' );
} }
; ;
......
...@@ -60,7 +60,7 @@ float ({integer}|{real})([eE]{integer})? ...@@ -60,7 +60,7 @@ float ({integer}|{real})([eE]{integer})?
%% %%
void __attribute__((noreturn)) void __attribute__((noreturn))
yyerror(const char *message) yyerror(SEG *result, const char *message)
{ {
if (*yytext == YY_END_OF_BUFFER_CHAR) if (*yytext == YY_END_OF_BUFFER_CHAR)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment