Skip to content

Commit 74e0159

Browse files
committed
Update the preprocessor code
From: Michael Meskes <meskes@topsystem.de>
1 parent 922ea91 commit 74e0159

File tree

4 files changed

+107
-35
lines changed

4 files changed

+107
-35
lines changed

src/interfaces/ecpg/ChangeLog

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,24 @@ Wed Feb 11 10:58:13 CET 1998
88

99
Thu Feb 12 14:45:07 CET 1998
1010

11-
- Changed parser to correctly handle local variables.
12-
- Allow static and extern variable definitions.
13-
- free() variable structure completely.
11+
- changed parser to correctly handle local variables.
12+
13+
Thu Feb 12 15:55:37 CET 1998
14+
15+
- allow static and extern variable definitions.
16+
- free() variable structure completely.
1417

1518
Fri Feb 13 12:35:58 CET 1998
1619

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+
- ecpg can use structs to store data, but only if the complete
21+
definition of the struct lies inside the sql declare section
22+
and only simple types used.
2023

2124
Fre Feb 13 14:12:41 CET 1998
2225

23-
- Structure now work completely.
26+
- struct definitions now work completely.
2427

28+
Mon Feb 16 16:17:21 CET 1998
2529

30+
- enable initialisation in declare section.
31+
- connect call accepts a variable as well.

src/interfaces/ecpg/preproc/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
SRCDIR= ../../..
33
include $(SRCDIR)/Makefile.global
44

5-
MAJOR_VERSION=0
6-
MINOR_VERSION=5
7-
PATCHLEVEL=1
5+
MAJOR_VERSION=1
6+
MINOR_VERSION=0
7+
PATCHLEVEL=0
88

99
CFLAGS=-I../include -O2 -g -Wall -DMAJOR_VERSION=$(MAJOR_VERSION) -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL)
1010

1111
all:: ecpg
1212

1313
clean:
14-
rm -f *.o core a.out ecpg preproc.tab.h y.tab.c *~
14+
rm -f *.o core a.out ecpg y.tab.h y.tab.c *~
1515

1616
install: all
1717
install -c -m 755 ecpg $(DESTDIR)$(BINDIR)

src/interfaces/ecpg/preproc/pgc.l

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ symbol {letter}({letter}|{digit})*
1818
string '[^']*'
1919
2020
exec [eE][xX][eE][cC]
21+
execute [eE][xX][eE][cC][uU][tT][eE]
2122
sql [sS][qQ][lL]
2223
varchar [vV][aA][rR][cC][hH][aA][rR]
2324
varchar2 [vV][aA][rR][cC][hH][aA][rR]2
@@ -30,18 +31,25 @@ include [iI][nN][cC][lL][uU][dD][eE]
3031
connect [cC][oO][nN][nN][eE][cC][tT]
3132
open [oO][pP][eE][nN]
3233
commit [cC][oO][mM][mM][iI][tT]
34+
immediate [iI][mM][mM][eE][dD][iI][aA][tT][eE]
35+
release [rR][eE][lL][eE][aA][sS][eE]
3336
rollback [rR][oO][lL][lL][bB][aA][cC][kK]
37+
work [wW][oO][rR][kK]
3438
%%
3539
<C>{exec}{ws}{sql} { BEGIN SQL; dbg(SQL_START); return SQL_START; }
3640
<SQL>";" { BEGIN C; dbg(SQL_SEMI); return SQL_SEMI; }
3741
<SQL>{begin} { dbg(SQL_BEGIN); return SQL_BEGIN; }
3842
<SQL>{end} { dbg(SQL_END); return SQL_END; }
3943
<SQL>{declare} { dbg(SQL_DECLARE); return SQL_DECLARE; }
44+
<SQL>{execute} { dbg(SQL_EXECUTE); return SQL_EXECUTE; }
45+
<SQL>{immediate} { dbg(SQL_IMMEDIATE); return SQL_IMMEDIATE; }
4046
<SQL>{section} { dbg(SQL_SECTION); return SQL_SECTION; }
4147
<SQL>{include} { dbg(SQL_INCLUDE); return SQL_INCLUDE; }
4248
<SQL>{connect} { dbg(SQL_CONNECT); return SQL_CONNECT; }
4349
<SQL>{open} { dbg(SQL_OPEN); return SQL_OPEN; }
4450
<SQL>{commit} { dbg(SQL_COMMIT); return SQL_COMMIT; }
51+
<SQL>{release} { dbg(SQL_RELEASE); return SQL_RELEASE; }
52+
<SQL>{work} { dbg(SQL_WORK); return SQL_WORK; }
4553
<SQL>{rollback} { dbg(SQL_ROLLBACK); return SQL_ROLLBACK; }
4654
4755
<SQL>{into} { dbg(SQL_INTO); return SQL_INTO; }
@@ -104,9 +112,11 @@ struct { dbg(S_STRUCT); return S_STRUCT; }
104112
"[" { dbg([); return '['; }
105113
"]" { dbg(]); return ']'; }
106114
";" { dbg(;); return ';'; }
115+
"=" { dbg(=); return '='; }
107116
"," { dbg(komma); return ','; }
108117
\{ { dbg(blockstart); return '{'; }
109118
\} { dbg(blockend); return'}'; }
119+
\* { dbg(*); return('*'); }
110120
111121
<SQL>":" { dbg(:); return ':'; }
112122

src/interfaces/ecpg/preproc/preproc.y

Lines changed: 80 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -180,22 +180,22 @@ dump_variables(struct arguments * list)
180180

181181
%token <tagname> SQL_START SQL_SEMI SQL_STRING SQL_INTO
182182
%token <tagname> SQL_BEGIN SQL_END SQL_DECLARE SQL_SECTION SQL_INCLUDE
183-
%token <tagname> SQL_CONNECT SQL_OPEN
184-
%token <tagname> SQL_COMMIT SQL_ROLLBACK
183+
%token <tagname> SQL_CONNECT SQL_OPEN SQL_EXECUTE SQL_IMMEDIATE
184+
%token <tagname> SQL_COMMIT SQL_ROLLBACK SQL_RELEASE SQL_WORK
185185

186186
%token <tagname> S_SYMBOL S_LENGTH S_ANYTHING
187187
%token <tagname> S_VARCHAR S_VARCHAR2
188188
%token <tagname> S_EXTERN S_STATIC S_AUTO S_CONST S_REGISTER S_STRUCT
189189
%token <tagname> S_UNSIGNED S_SIGNED
190190
%token <tagname> S_LONG S_SHORT S_INT S_CHAR S_FLOAT S_DOUBLE S_BOOL
191-
%token <tagname> '[' ']' ';' ',' '{' '}'
191+
%token <tagname> '[' ']' ';' ',' '{' '}' '=' '*'
192192

193193
%type <type> type type_detailed varchar_type simple_type array_type struct_type
194194
%type <symbolname> symbol
195-
%type <tagname> maybe_storage_clause varchar_tag
195+
%type <tagname> maybe_storage_clause varchar_tag db_name
196196
%type <type_enum> simple_tag
197197
%type <indexsize> index length
198-
%type <tagname> canything sqlanything both_anything
198+
%type <tagname> canything sqlanything both_anything vartext commit_release
199199

200200

201201
%%
@@ -210,6 +210,7 @@ statement : sqldeclaration
210210
| sqlopen
211211
| sqlcommit
212212
| sqlrollback
213+
| sqlexecute
213214
| sqlstatement
214215
| cthing
215216
| blockstart
@@ -222,17 +223,18 @@ sqldeclaration : sql_startdeclare
222223
sql_startdeclare : SQL_START SQL_BEGIN SQL_DECLARE SQL_SECTION SQL_SEMI {
223224
fprintf(yyout, "/* exec sql begin declare section */\n");
224225
output_line_number();
225-
};
226+
}
227+
226228
sql_enddeclare : SQL_START SQL_END SQL_DECLARE SQL_SECTION SQL_SEMI {
227229
fprintf(yyout,"/* exec sql end declare section */\n");
228230
output_line_number();
229-
};
231+
}
230232

231233
variable_declarations : /* empty */
232-
| variable_declarations variable_declaration ;
234+
| variable_declarations variable_declaration;
233235

234236
/* Here is where we can enter support for typedef. */
235-
variable_declaration : type ';' {
237+
variable_declaration : type initializer ';' {
236238
/* don't worry about our list when we're working on a struct */
237239
if (struct_level == 0)
238240
{
@@ -242,6 +244,12 @@ variable_declaration : type ';' {
242244
fprintf(yyout, ";");
243245
}
244246

247+
initializer : /*empty */
248+
| '=' {fwrite(yytext, yyleng, 1, yyout);} vartext;
249+
250+
vartext : both_anything {fwrite(yytext, yyleng, 1, yyout);}
251+
| vartext both_anything {fwrite(yytext, yyleng, 1, yyout);}
252+
245253
symbol : S_SYMBOL {
246254
char * name = (char *)malloc(yyleng + 1);
247255

@@ -255,10 +263,14 @@ type : maybe_storage_clause type_detailed { $<type>$ = $<type>2; };
255263
type_detailed : varchar_type { $<type>$ = $<type>1; }
256264
| simple_type { $<type>$ = $<type>1; }
257265
| array_type {$<type>$ = $<type>1; }
266+
| pointer_type {$<type>$ = $<type>1; }
258267
| struct_type {$<type>$ = $<type>1; };
259268

260269
varchar_type : varchar_tag symbol index {
261-
fprintf(yyout, "struct varchar_%s { int len; char arr[%d]; } %s", $<symbolname>2, $<indexsize>3, $<symbolname>2);
270+
if ($<indexsize>3 > 0)
271+
fprintf(yyout, "struct varchar_%s { int len; char arr[%d]; } %s", $<symbolname>2, $<indexsize>3, $<symbolname>2);
272+
else
273+
fprintf(yyout, "struct varchar_%s { int len; char arr[%d]; } %s", $<symbolname>2, $<indexsize>3, $<symbolname>2);
262274
if (struct_level == 0)
263275
{
264276
$<type>$.name = $<symbolname>2;
@@ -283,7 +295,10 @@ simple_type : simple_tag symbol {
283295
}
284296

285297
array_type : simple_tag symbol index {
286-
fprintf(yyout, "%s %s [%d]", ECPGtype_name($<type_enum>1), $<symbolname>2, $<indexsize>3);
298+
if ($<indexsize>3 > 0)
299+
fprintf(yyout, "%s %s [%d]", ECPGtype_name($<type_enum>1), $<symbolname>2, $<indexsize>3);
300+
else
301+
fprintf(yyout, "%s %s []", ECPGtype_name($<type_enum>1), $<symbolname>2);
287302
if (struct_level == 0)
288303
{
289304
$<type>$.name = $<symbolname>2;
@@ -293,6 +308,17 @@ array_type : simple_tag symbol index {
293308
ECPGmake_record_member($<symbolname>2, ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<indexsize>3), &(record_member_list[struct_level-1]));
294309
}
295310

311+
pointer_type : simple_tag '*' symbol {
312+
fprintf(yyout, "%s * %s", ECPGtype_name($<type_enum>1), $<symbolname>3);
313+
if (struct_level == 0)
314+
{
315+
$<type>$.name = $<symbolname>3;
316+
$<type>$.typ = ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), 0);
317+
}
318+
else
319+
ECPGmake_record_member($<symbolname>3, ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), 0), &(record_member_list[struct_level-1]));
320+
}
321+
296322
s_struct : S_STRUCT symbol {
297323
struct_level++;
298324
fprintf(yyout, "struct %s {", $<symbolname>2);
@@ -330,9 +356,8 @@ maybe_storage_clause : S_EXTERN { fwrite(yytext, yyleng, 1, yyout); }
330356
| S_AUTO { fwrite(yytext, yyleng, 1, yyout); }
331357
| /* empty */ { };
332358

333-
index : '[' length ']' {
334-
$<indexsize>$ = $<indexsize>2;
335-
};
359+
index : '[' length ']' { $<indexsize>$ = $<indexsize>2; }
360+
| '[' ']' { $<indexsize>$ = 0; }
336361

337362
length : S_LENGTH { $<indexsize>$ = atoi(yytext); }
338363

@@ -342,9 +367,24 @@ sqlinclude : SQL_START SQL_INCLUDE { fprintf(yyout, "#include \""); }
342367
filename : cthing
343368
| filename cthing;
344369

345-
sqlconnect : SQL_START SQL_CONNECT { fprintf(yyout, "ECPGconnect(\""); }
346-
SQL_STRING { fwrite(yytext + 1, yyleng - 2, 1, yyout); }
347-
SQL_SEMI { fprintf(yyout, "\");"); output_line_number(); };
370+
sqlconnect : SQL_START SQL_CONNECT { fprintf(yyout, "ECPGconnect("); }
371+
db_name
372+
SQL_SEMI { fprintf(yyout, ");"); output_line_number();}
373+
374+
db_name : SQL_STRING { fprintf(yyout, "\""); fwrite(yytext + 1, yyleng - 2, 1, yyout); fprintf(yyout, "\""); }
375+
| ':' symbol { /* check if we have a char variabnle */
376+
struct variable *p = find_variable($<symbolname>2);
377+
enum ECPGttype typ = p->type->typ;
378+
379+
/* if array see what's inside */
380+
if (typ == ECPGt_array)
381+
typ = p->type->u.element->typ;
382+
383+
if (typ != ECPGt_char && typ != ECPGt_unsigned_char)
384+
yyerror("invalid datatype");
385+
386+
fprintf(yyout, "%s", $<symbolname>2);
387+
}
348388

349389
/* Open is an open cursor. Removed. */
350390
sqlopen : SQL_START SQL_OPEN sqlgarbage SQL_SEMI { output_line_number(); };
@@ -353,21 +393,37 @@ sqlgarbage : /* Empty */
353393
| sqlgarbage sqlanything;
354394

355395

356-
sqlcommit : SQL_START SQL_COMMIT SQL_SEMI {
396+
sqlcommit : SQL_START commit_release SQL_SEMI {
357397
fprintf(yyout, "ECPGcommit(__LINE__);");
358398
output_line_number();
359-
};
399+
}
400+
401+
commit_release : SQL_COMMIT
402+
| SQL_COMMIT SQL_RELEASE
403+
| SQL_COMMIT SQL_WORK SQL_RELEASE;
404+
360405
sqlrollback : SQL_START SQL_ROLLBACK SQL_SEMI {
361406
fprintf(yyout, "ECPGrollback(__LINE__);");
362407
output_line_number();
363408
};
364409

410+
sqlexecute : SQL_START { /* Reset stack */
411+
reset_variables();
412+
fprintf(yyout, "ECPGdo(__LINE__, \"");
413+
} SQL_EXECUTE SQL_IMMEDIATE sqlstatement_words SQL_SEMI {
414+
/* Dump */
415+
fprintf(yyout, "\", ");
416+
dump_variables(argsinsert);
417+
fprintf(yyout, "ECPGt_EOIT, ");
418+
dump_variables(argsresult);
419+
fprintf(yyout, "ECPGt_EORT );");
420+
output_line_number();
421+
};
422+
365423
sqlstatement : SQL_START { /* Reset stack */
366424
reset_variables();
367425
fprintf(yyout, "ECPGdo(__LINE__, \"");
368-
}
369-
sqlstatement_words
370-
SQL_SEMI {
426+
} sqlstatement_words SQL_SEMI {
371427
/* Dump */
372428
fprintf(yyout, "\", ");
373429
dump_variables(argsinsert);
@@ -416,15 +472,15 @@ canything : both_anything
416472
sqlanything : both_anything;
417473

418474
both_anything : S_LENGTH | S_VARCHAR | S_VARCHAR2
419-
| S_LONG | S_SHORT | S_INT | S_CHAR | S_FLOAT | S_DOUBLE | S_BOOL
475+
| S_LONG | S_SHORT | S_INT | S_CHAR | S_FLOAT | S_DOUBLE | S_BOOL
420476
| SQL_OPEN | SQL_CONNECT
421477
| SQL_STRING
422478
| SQL_BEGIN | SQL_END
423479
| SQL_DECLARE | SQL_SECTION
424480
| SQL_INCLUDE
425481
| S_SYMBOL
426482
| S_STATIC | S_EXTERN | S_AUTO | S_CONST | S_REGISTER | S_STRUCT
427-
| '[' | ']' | ','
483+
| '[' | ']' | ',' | '=' | '*'
428484
| S_ANYTHING;
429485

430486
blockstart : '{' {

0 commit comments

Comments
 (0)