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

Commit74e0159

Browse files
committed
Update the preprocessor code
From: Michael Meskes <meskes@topsystem.de>
1 parent922ea91 commit74e0159

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 ecpgpreproc.tab.h y.tab.c*~
14+
rm -f*.o core a.out ecpgy.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_STARTSQL_SEMISQL_STRINGSQL_INTO
182182
%token<tagname>SQL_BEGINSQL_ENDSQL_DECLARESQL_SECTIONSQL_INCLUDE
183-
%token<tagname>SQL_CONNECTSQL_OPEN
184-
%token<tagname>SQL_COMMITSQL_ROLLBACK
183+
%token<tagname>SQL_CONNECTSQL_OPENSQL_EXECUTESQL_IMMEDIATE
184+
%token<tagname>SQL_COMMITSQL_ROLLBACKSQL_RELEASESQL_WORK
185185

186186
%token<tagname>S_SYMBOLS_LENGTHS_ANYTHING
187187
%token<tagname>S_VARCHARS_VARCHAR2
188188
%token<tagname>S_EXTERNS_STATICS_AUTOS_CONSTS_REGISTERS_STRUCT
189189
%token<tagname>S_UNSIGNEDS_SIGNED
190190
%token<tagname>S_LONGS_SHORTS_INTS_CHARS_FLOATS_DOUBLES_BOOL
191-
%token<tagname>'['']'';'',''{''}'
191+
%token<tagname>'['']'';'',''{''}''=''*'
192192

193193
%type<type>typetype_detailedvarchar_typesimple_typearray_typestruct_type
194194
%type<symbolname>symbol
195-
%type<tagname>maybe_storage_clausevarchar_tag
195+
%type<tagname>maybe_storage_clausevarchar_tagdb_name
196196
%type<type_enum>simple_tag
197197
%type<indexsize>indexlength
198-
%type<tagname>canythingsqlanythingboth_anything
198+
%type<tagname>canythingsqlanythingboth_anythingvartextcommit_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_STARTSQL_BEGINSQL_DECLARESQL_SECTIONSQL_SEMI{
223224
fprintf(yyout,"/* exec sql begin declare section */\n");
224225
output_line_number();
225-
};
226+
}
227+
226228
sql_enddeclare :SQL_STARTSQL_ENDSQL_DECLARESQL_SECTIONSQL_SEMI {
227229
fprintf(yyout,"/* exec sql end declare section */\n");
228230
output_line_number();
229-
};
231+
}
230232

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

234236
/* Here is where we can enter support for typedef.*/
235-
variable_declaration :type';'{
237+
variable_declaration :typeinitializer';'{
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+
|vartextboth_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_tagsymbolindex {
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_tagsymbolindex {
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_STRUCTsymbol {
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
|filenamecthing;
344369

345-
sqlconnect :SQL_STARTSQL_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_STARTSQL_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+
structvariable *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_STARTSQL_OPENsqlgarbageSQL_SEMI { output_line_number(); };
@@ -353,21 +393,37 @@ sqlgarbage : /* Empty */
353393
|sqlgarbagesqlanything;
354394

355395

356-
sqlcommit :SQL_STARTSQL_COMMITSQL_SEMI {
396+
sqlcommit :SQL_STARTcommit_releaseSQL_SEMI {
357397
fprintf(yyout,"ECPGcommit(__LINE__);");
358398
output_line_number();
359-
};
399+
}
400+
401+
commit_release :SQL_COMMIT
402+
|SQL_COMMITSQL_RELEASE
403+
|SQL_COMMITSQL_WORKSQL_RELEASE;
404+
360405
sqlrollback :SQL_STARTSQL_ROLLBACKSQL_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_EXECUTESQL_IMMEDIATEsqlstatement_wordsSQL_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_wordsSQL_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)

[8]ページ先頭

©2009-2025 Movatter.jp