2 #define YYPARSE_PARAM result /* need this to pass a pointer (void *) to yyparse */
9 #include "utils/builtins.h"
12 extern int seg_yylex(void);
14 extern int significant_digits( char *str ); /* defined in seg.c */
16 void seg_yyerror(const char *message);
17 int seg_yyparse(void *result);
19 float seg_atof( char *value );
23 '0', '0', '0', '0', '0',
24 '0', '0', '0', '0', '0',
25 '0', '0', '0', '0', '0',
26 '0', '0', '0', '0', '0',
27 '0', '0', '0', '0', '\0'
32 /* BISON Declarations */
43 %token <text> SEGFLOAT
46 %token <text> EXTENSION
56 boundary PLUMIN deviation {
57 ((SEG *)result)->lower = $1.val - $3.val;
58 ((SEG *)result)->upper = $1.val + $3.val;
59 sprintf(strbuf, "%g", ((SEG *)result)->lower);
60 ((SEG *)result)->l_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd));
61 sprintf(strbuf, "%g", ((SEG *)result)->upper);
62 ((SEG *)result)->u_sigd = Max(Min(6, significant_digits(strbuf)), Max($1.sigd, $3.sigd));
63 ((SEG *)result)->l_ext = '\0';
64 ((SEG *)result)->u_ext = '\0';
67 boundary RANGE boundary {
68 ((SEG *)result)->lower = $1.val;
69 ((SEG *)result)->upper = $3.val;
70 if ( ((SEG *)result)->lower > ((SEG *)result)->upper ) {
72 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
73 errmsg("swapped boundaries: %g is greater than %g",
74 ((SEG *)result)->lower, ((SEG *)result)->upper)));
78 ((SEG *)result)->l_sigd = $1.sigd;
79 ((SEG *)result)->u_sigd = $3.sigd;
80 ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' );
81 ((SEG *)result)->u_ext = ( $3.ext ? $3.ext : '\0' );
85 ((SEG *)result)->lower = $1.val;
86 ((SEG *)result)->upper = HUGE_VAL;
87 ((SEG *)result)->l_sigd = $1.sigd;
88 ((SEG *)result)->u_sigd = 0;
89 ((SEG *)result)->l_ext = ( $1.ext ? $1.ext : '\0' );
90 ((SEG *)result)->u_ext = '-';
94 ((SEG *)result)->lower = -HUGE_VAL;
95 ((SEG *)result)->upper = $2.val;
96 ((SEG *)result)->l_sigd = 0;
97 ((SEG *)result)->u_sigd = $2.sigd;
98 ((SEG *)result)->l_ext = '-';
99 ((SEG *)result)->u_ext = ( $2.ext ? $2.ext : '\0' );
103 ((SEG *)result)->lower = ((SEG *)result)->upper = $1.val;
104 ((SEG *)result)->l_sigd = ((SEG *)result)->u_sigd = $1.sigd;
105 ((SEG *)result)->l_ext = ((SEG *)result)->u_ext = ( $1.ext ? $1.ext : '\0' );
112 $$.sigd = significant_digits($1);
113 $$.val = seg_atof($1);
118 $$.sigd = significant_digits($2);
119 $$.val = seg_atof($2);
126 $$.sigd = significant_digits($1);
127 $$.val = seg_atof($1);
135 seg_atof(char *value)
139 datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
140 return DatumGetFloat4(datum);