Skip to content

Commit 25ad143

Browse files
committed
Major update of ecpg preprocessor
From: Michael Meskes <meskes@topsystem.de>
1 parent 30f737f commit 25ad143

File tree

13 files changed

+379
-254
lines changed

13 files changed

+379
-254
lines changed

src/interfaces/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#
88
#
99
# IDENTIFICATION
10-
# $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.6 1998/02/12 02:14:14 scrappy Exp $
10+
# $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.7 1998/02/17 01:47:19 scrappy Exp $
1111
#
1212
#-------------------------------------------------------------------------
1313

@@ -16,7 +16,7 @@ include $(SRCDIR)/Makefile.global
1616

1717
.DEFAULT all:
1818
$(MAKE) -C libpq $@
19-
# $(MAKE) -C ecpg $@
19+
$(MAKE) -C ecpg $@
2020
ifeq ($(HAVE_Cplusplus), true)
2121
$(MAKE) -C libpq++ $@
2222
else

src/interfaces/ecpg/ChangeLog

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,17 @@ Wed Feb 11 10:58:13 CET 1998
99
Thu Feb 12 14:45:07 CET 1998
1010

1111
- Changed parser to correctly handle local variables.
12+
- Allow static and extern variable definitions.
13+
- free() variable structure completely.
14+
15+
Fri Feb 13 12:35:58 CET 1998
16+
17+
- ecpg can use structs to store data, but only if the complete
18+
definition of the struct lies inside the sql declare section
19+
and only simple types used.
20+
21+
Fre Feb 13 14:12:41 CET 1998
22+
23+
- Structure now work completely.
24+
25+

src/interfaces/ecpg/TODO

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ just -1 for them all.
1616

1717
Missing library functions to_date et al.
1818

19-
Possibility to define records or structs in the declare section in a way
20-
that the record can be filled from one row in the database. This is a
21-
simpler way to handle an entire row at a time.
22-
2319
Oracle has array operations that enhances speed. When implementing it in
2420
ecpg it is done for compatibility reasons only. For them to improve speed
2521
would require a lot more insight in the postgres internal mechanisms than I
@@ -44,5 +40,6 @@ could be realised in a script.
4440

4541
Now comes my list (MM):
4642

47-
Variable definitions containing static/volatile have to be possible.
43+
What do we do with enum data types?
4844

45+
'signed' isn't understood so far

src/interfaces/ecpg/lib/Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ $(shlib): ecpglib.o typename.o
4747
clean:
4848
rm -f *.o *.a core a.out *~ $(shlib) libecpg.so
4949

50-
install: libecpg.a
50+
install: libecpg.a $(shlib)
5151
install -m 644 libecpg.a $(DESTDIR)$(LIBDIR)
5252
install -m 644 $(shlib) $(DESTDIR)$(LIBDIR)
5353
ln -sf $(shlib) $(DESTDIR)$(LIBDIR)/libecpg.so

src/interfaces/ecpg/preproc/ecpg.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ main(int argc, char *const argv[])
5151
{
5252
char *filename, *ptr2ext;
5353

54-
filename = malloc(strlen(argv[fnr]) + 2);
55-
if (filename == NULL)
56-
{
57-
perror("malloc");
58-
continue;
59-
}
54+
filename = mm_alloc(strlen(argv[fnr]) + 2);
6055

6156
strcpy(filename, argv[fnr]);
6257

src/interfaces/ecpg/preproc/extern.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ extern FILE *yyin, *yyout;
1111
extern void lex_init(void);
1212
extern char * input_filename;
1313
extern int yyparse(void);
14+
extern void *mm_alloc(size_t);

src/interfaces/ecpg/preproc/pgc.l

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ float { dbg(S_FLOAT); return S_FLOAT; }
5858
double { dbg(S_DOUBLE); return S_DOUBLE; }
5959
bool { dbg(S_BOOL); return S_BOOL; }
6060
61+
static { dbg(S_STATIC); return S_STATIC; }
62+
extern { dbg(S_EXTERN); return S_EXTERN; }
63+
auto { dbg(S_AUTO); return S_AUTO; }
64+
const { dbg(S_CONST); return S_CONST; }
65+
register { dbg(S_REGISTER); return S_REGISTER; }
66+
67+
struct { dbg(S_STRUCT); return S_STRUCT; }
68+
6169
{string} { dbg(SQL_STRING); return SQL_STRING; }
6270
<SQL>{ws} ;
6371
{symbol} { dbg(S_SYMBOL); return S_SYMBOL; }

src/interfaces/ecpg/preproc/preproc.y

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ static void yyerror(char *);
1212
/*
1313
* Variables containing simple states.
1414
*/
15-
int debugging = 0;
15+
int debugging = 0;
16+
static int struct_level = 0;
17+
18+
/* temporarily store record members while creating the data structure */
19+
struct ECPGrecord_member *record_member_list[128] = { NULL };
1620

1721
/*
1822
* Handle the filename and line numbering.
@@ -86,7 +90,7 @@ remove_variables(int brace_level)
8690
{
8791
struct variable * p, *prev;
8892

89-
for (p = prev = allvariables; p; p = p->next)
93+
for (p = prev = allvariables; p; p = p ? p->next : NULL)
9094
{
9195
if (p->brace_level >= brace_level)
9296
{
@@ -96,6 +100,8 @@ remove_variables(int brace_level)
96100
else
97101
prev->next = p->next;
98102

103+
ECPGfree_type(p->type);
104+
free(p->name);
99105
free(p);
100106
p = prev;
101107
}
@@ -157,7 +163,7 @@ dump_variables(struct arguments * list)
157163
dump_variables(list->next);
158164

159165
/* Then the current element. */
160-
ECPGdump_a_type(yyout, list->variable->name, list->variable->type);
166+
ECPGdump_a_type(yyout, list->variable->name, list->variable->type, NULL);
161167

162168
/* Then release the list element. */
163169
free(list);
@@ -179,12 +185,12 @@ dump_variables(struct arguments * list)
179185

180186
%token <tagname> S_SYMBOL S_LENGTH S_ANYTHING
181187
%token <tagname> S_VARCHAR S_VARCHAR2
182-
%token <tagname> S_EXTERN S_STATIC
188+
%token <tagname> S_EXTERN S_STATIC S_AUTO S_CONST S_REGISTER S_STRUCT
183189
%token <tagname> S_UNSIGNED S_SIGNED
184190
%token <tagname> S_LONG S_SHORT S_INT S_CHAR S_FLOAT S_DOUBLE S_BOOL
185191
%token <tagname> '[' ']' ';' ',' '{' '}'
186192

187-
%type <type> type type_detailed varchar_type simple_type array_type
193+
%type <type> type type_detailed varchar_type simple_type array_type struct_type
188194
%type <symbolname> symbol
189195
%type <tagname> maybe_storage_clause varchar_tag
190196
%type <type_enum> simple_tag
@@ -227,8 +233,12 @@ variable_declarations : /* empty */
227233

228234
/* Here is where we can enter support for typedef. */
229235
variable_declaration : type ';' {
230-
new_variable($<type>1.name, $<type>1.typ);
231-
free($<type>1.name);
236+
/* don't worry about our list when we're working on a struct */
237+
if (struct_level == 0)
238+
{
239+
new_variable($<type>1.name, $<type>1.typ);
240+
free($<type>1.name);
241+
}
232242
fprintf(yyout, ";");
233243
}
234244

@@ -244,27 +254,61 @@ symbol : S_SYMBOL {
244254
type : maybe_storage_clause type_detailed { $<type>$ = $<type>2; };
245255
type_detailed : varchar_type { $<type>$ = $<type>1; }
246256
| simple_type { $<type>$ = $<type>1; }
247-
| array_type {$<type>$ = $<type>1; };
257+
| array_type {$<type>$ = $<type>1; }
258+
| struct_type {$<type>$ = $<type>1; };
248259

249260
varchar_type : varchar_tag symbol index {
250261
fprintf(yyout, "struct varchar_%s { int len; char arr[%d]; } %s", $<symbolname>2, $<indexsize>3, $<symbolname>2);
251-
$<type>$.name = $<symbolname>2;
252-
$<type>$.typ = ECPGmake_varchar_type(ECPGt_varchar, $<indexsize>3);
262+
if (struct_level == 0)
263+
{
264+
$<type>$.name = $<symbolname>2;
265+
$<type>$.typ = ECPGmake_varchar_type(ECPGt_varchar, $<indexsize>3);
266+
}
267+
else
268+
ECPGmake_record_member($<symbolname>2, ECPGmake_varchar_type(ECPGt_varchar, $<indexsize>3), &(record_member_list[struct_level-1]));
253269
}
254270

255271
varchar_tag : S_VARCHAR { $<tagname>$ = $<tagname>1; }
256272
| S_VARCHAR2 { $<tagname>$ = $<tagname>1; };
257273

258274
simple_type : simple_tag symbol {
259275
fprintf(yyout, "%s %s", ECPGtype_name($<type_enum>1), $<symbolname>2);
260-
$<type>$.name = $<symbolname>2;
261-
$<type>$.typ = ECPGmake_simple_type($<type_enum>1);
276+
if (struct_level == 0)
277+
{
278+
$<type>$.name = $<symbolname>2;
279+
$<type>$.typ = ECPGmake_simple_type($<type_enum>1);
280+
}
281+
else
282+
ECPGmake_record_member($<symbolname>2, ECPGmake_simple_type($<type_enum>1), &(record_member_list[struct_level-1]));
262283
}
263284

264285
array_type : simple_tag symbol index {
265286
fprintf(yyout, "%s %s [%d]", ECPGtype_name($<type_enum>1), $<symbolname>2, $<indexsize>3);
266-
$<type>$.name = $<symbolname>2;
267-
$<type>$.typ = ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<indexsize>3);
287+
if (struct_level == 0)
288+
{
289+
$<type>$.name = $<symbolname>2;
290+
$<type>$.typ = ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<indexsize>3);
291+
}
292+
else
293+
ECPGmake_record_member($<symbolname>2, ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<indexsize>3), &(record_member_list[struct_level-1]));
294+
}
295+
296+
s_struct : S_STRUCT symbol {
297+
struct_level++;
298+
fprintf(yyout, "struct %s {", $<symbolname>2);
299+
}
300+
301+
struct_type : s_struct '{' variable_declarations '}' symbol {
302+
struct_level--;
303+
if (struct_level == 0)
304+
{
305+
$<type>$.name = $<symbolname>5;
306+
$<type>$.typ = ECPGmake_record_type(record_member_list[struct_level]);
307+
}
308+
else
309+
ECPGmake_record_member($<symbolname>5, ECPGmake_record_type(record_member_list[struct_level]), &(record_member_list[struct_level-1]));
310+
fprintf(yyout, "} %s", $<symbolname>5);
311+
record_member_list[struct_level] = NULL;
268312
}
269313

270314
simple_tag : S_CHAR { $<type_enum>$ = ECPGt_char; }
@@ -281,6 +325,9 @@ simple_tag : S_CHAR { $<type_enum>$ = ECPGt_char; }
281325

282326
maybe_storage_clause : S_EXTERN { fwrite(yytext, yyleng, 1, yyout); }
283327
| S_STATIC { fwrite(yytext, yyleng, 1, yyout); }
328+
| S_CONST { fwrite(yytext, yyleng, 1, yyout); }
329+
| S_REGISTER { fwrite(yytext, yyleng, 1, yyout); }
330+
| S_AUTO { fwrite(yytext, yyleng, 1, yyout); }
284331
| /* empty */ { };
285332

286333
index : '[' length ']' {
@@ -369,13 +416,14 @@ canything : both_anything
369416
sqlanything : both_anything;
370417

371418
both_anything : S_LENGTH | S_VARCHAR | S_VARCHAR2
372-
| S_LONG | S_SHORT | S_INT | S_CHAR | S_FLOAT | S_DOUBLE
419+
| S_LONG | S_SHORT | S_INT | S_CHAR | S_FLOAT | S_DOUBLE | S_BOOL
373420
| SQL_OPEN | SQL_CONNECT
374421
| SQL_STRING
375422
| SQL_BEGIN | SQL_END
376423
| SQL_DECLARE | SQL_SECTION
377424
| SQL_INCLUDE
378425
| S_SYMBOL
426+
| S_STATIC | S_EXTERN | S_AUTO | S_CONST | S_REGISTER | S_STRUCT
379427
| '[' | ']' | ','
380428
| S_ANYTHING;
381429

0 commit comments

Comments
 (0)