diff options
Diffstat (limited to 'contrib/seg')
-rw-r--r-- | contrib/seg/seg.c | 6 | ||||
-rw-r--r-- | contrib/seg/segparse.y | 69 | ||||
-rw-r--r-- | contrib/seg/segscan.l | 2 |
3 files changed, 39 insertions, 38 deletions
diff --git a/contrib/seg/seg.c b/contrib/seg/seg.c index 1c14c49feca..0cf9853060b 100644 --- a/contrib/seg/seg.c +++ b/contrib/seg/seg.c @@ -23,8 +23,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); @@ -126,7 +126,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 e6a0bad5912..3fad9910bd5 100644 --- a/contrib/seg/segparse.y +++ b/contrib/seg/segparse.y @@ -1,5 +1,5 @@ %{ -#define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */ +/* contrib/seg/segparse.y */ #include "postgres.h" @@ -24,8 +24,8 @@ extern int seg_yylex(void); 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 @@ static char strbuf[25] = { %} /* BISON Declarations */ +%parse-param {SEG *result} %expect 0 %name-prefix="seg_yy" @@ -65,59 +66,59 @@ static char strbuf[25] = { 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 95139f46318..a3e685488a8 100644 --- a/contrib/seg/segscan.l +++ b/contrib/seg/segscan.l @@ -60,7 +60,7 @@ float ({integer}|{real})([eE]{integer})? %% void __attribute__((noreturn)) -yyerror(const char *message) +yyerror(SEG *result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { |