Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit25ad143

Browse files
committed
Major update of ecpg preprocessor
From: Michael Meskes <meskes@topsystem.de>
1 parent30f737f commit25ad143

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
.DEFAULTall:
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
externvoidlex_init(void);
1212
externchar*input_filename;
1313
externintyyparse(void);
14+
externvoid*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+
intdebugging =0;
16+
staticintstruct_level =0;
17+
18+
/* temporarily store record members while creating the data structure*/
19+
structECPGrecord_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
structvariable * 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_SYMBOLS_LENGTHS_ANYTHING
181187
%token<tagname>S_VARCHARS_VARCHAR2
182-
%token<tagname>S_EXTERNS_STATIC
188+
%token<tagname>S_EXTERNS_STATICS_AUTOS_CONSTS_REGISTERS_STRUCT
183189
%token<tagname>S_UNSIGNEDS_SIGNED
184190
%token<tagname>S_LONGS_SHORTS_INTS_CHARS_FLOATS_DOUBLES_BOOL
185191
%token<tagname>'['']'';'',''{''}'
186192

187-
%type<type>typetype_detailedvarchar_typesimple_typearray_type
193+
%type<type>typetype_detailedvarchar_typesimple_typearray_typestruct_type
188194
%type<symbolname>symbol
189195
%type<tagname>maybe_storage_clausevarchar_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_clausetype_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_tagsymbolindex {
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_tagsymbol {
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_tagsymbolindex {
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_STRUCTsymbol {
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)

[8]ページ先頭

©2009-2025 Movatter.jp