11
11
12
12
struct assignment * assignments ;
13
13
14
- void push_assignment (char * var ,char * value )
14
+ void push_assignment (char * var , char * value )
15
15
{
16
- struct assignment * new = (struct assignment * )mm_alloc (sizeof (struct assignment ));
16
+ struct assignment * new = (struct assignment * )mm_alloc (sizeof (struct assignment ));
17
17
18
- new -> next = assignments ;
19
- new -> variable = mm_alloc (strlen (var )+ 1 );
18
+ new -> next = assignments ;
19
+ new -> variable = mm_alloc (strlen (var )+ 1 );
20
20
strcpy (new -> variable ,var );
21
- new -> value = mm_alloc (strlen (value )+ 1 );
21
+ new -> value = mm_alloc (strlen (value )+ 1 );
22
22
strcpy (new -> value ,value );
23
- assignments = new ;
23
+ assignments = new ;
24
24
}
25
25
26
26
static void
27
27
drop_assignments (void )
28
- { while (assignments )
29
- { struct assignment * old_head = assignments ;
28
+ {
29
+ while (assignments )
30
+ {
31
+ struct assignment * old_head = assignments ;
30
32
31
- assignments = old_head -> next ;
33
+ assignments = old_head -> next ;
32
34
free (old_head -> variable );
33
35
free (old_head -> value );
34
36
free (old_head );
35
37
}
36
38
}
37
39
38
- /* XXX: these should be more accurate (consider ECPGdump_a_* ) */
39
40
static void ECPGnumeric_lvalue (FILE * f ,char * name )
40
- { const struct variable * v = find_variable (name );
41
+ {
42
+ const struct variable * v = find_variable (name );
41
43
42
44
switch (v -> type -> typ )
43
45
{
@@ -54,10 +56,10 @@ static void ECPGnumeric_lvalue(FILE *f,char *name)
54
56
,name );
55
57
mmerror (ET_ERROR ,errortext );
56
58
break ;
57
- }
59
+ }
58
60
}
59
61
60
- static void ECPGstring_buffer (FILE * f ,char * name )
62
+ static void ECPGstring_buffer (FILE * f , char * name )
61
63
{
62
64
const struct variable * v = find_variable (name );
63
65
@@ -167,30 +169,94 @@ static void ECPGdata_assignment(char *variable,char *index_plus_1)
167
169
}
168
170
}
169
171
172
+ /*
173
+ * descriptor name lookup
174
+ */
175
+
176
+ static struct descriptor * descriptors ;
177
+
178
+ void add_descriptor (char * name ,char * connection )
179
+ {
180
+ struct descriptor * new = (struct descriptor * )mm_alloc (sizeof (struct descriptor ));
181
+
182
+ new -> next = descriptors ;
183
+ new -> name = mm_alloc (strlen (name )+ 1 );
184
+ strcpy (new -> name ,name );
185
+ if (connection )
186
+ { new -> connection = mm_alloc (strlen (connection )+ 1 );
187
+ strcpy (new -> connection ,connection );
188
+ }
189
+ else new -> connection = connection ;
190
+ descriptors = new ;
191
+ }
192
+
193
+ void
194
+ drop_descriptor (char * name ,char * connection )
195
+ {
196
+ struct descriptor * i ;
197
+ struct descriptor * * lastptr = & descriptors ;
198
+
199
+ for (i = descriptors ;i ;lastptr = & i -> next ,i = i -> next )
200
+ {
201
+ if (!strcmp (name ,i -> name ))
202
+ {
203
+ if ((!connection && !i -> connection )
204
+ || (connection && i -> connection
205
+ && !strcmp (connection ,i -> connection )))
206
+ {
207
+ * lastptr = i -> next ;
208
+ if (i -> connection ) free (i -> connection );
209
+ free (i -> name );
210
+ free (i );
211
+ return ;
212
+ }
213
+ }
214
+ }
215
+ snprintf (errortext ,sizeof errortext ,"unknown descriptor %s" ,name );
216
+ mmerror (ET_WARN ,errortext );
217
+ }
218
+
219
+ struct descriptor
220
+ * lookup_descriptor (char * name ,char * connection )
221
+ {
222
+ struct descriptor * i ;
223
+
224
+ for (i = descriptors ;i ;i = i -> next )
225
+ {
226
+ if (!strcmp (name ,i -> name ))
227
+ {
228
+ if ((!connection && !i -> connection )
229
+ || (connection && i -> connection
230
+ && !strcmp (connection ,i -> connection )))
231
+ {
232
+ return i ;
233
+ }
234
+ }
235
+ }
236
+ snprintf (errortext ,sizeof errortext ,"unknown descriptor %s" ,name );
237
+ mmerror (ET_WARN ,errortext );
238
+ return NULL ;
239
+ }
240
+
170
241
void
171
242
output_get_descr_header (char * desc_name )
172
243
{
173
244
struct assignment * results ;
174
245
175
- fprintf (yyout ,"{\tPGresult *ECPGresult=ECPGresultByDescriptor(%d, \"%s\");\n" ,yylineno ,desc_name );
176
- fputs ("\tif (ECPGresult)\n\t{" ,yyout );
177
- for (results = assignments ;results != NULL ;results = results -> next )
246
+ fprintf (yyout , "{ ECPGget_desc_header(%d, \"%s\", &(" , yylineno , desc_name );
247
+ for (results = assignments ; results != NULL ; results = results -> next )
178
248
{
179
- if (!strcasecmp (results -> value ,"count" ))
180
- {
181
- fputs ("\t\t" ,yyout );
249
+ if (!strcasecmp (results -> value , "count" ))
182
250
ECPGnumeric_lvalue (yyout ,results -> variable );
183
- fputs ("=PQnfields(ECPGresult);\n" ,yyout );
184
- }
185
251
else
186
- { snprintf (errortext ,sizeof errortext ,"unknown descriptor header item '%s'" ,results -> value );
187
- mmerror (ET_WARN ,errortext );
252
+ { snprintf (errortext , sizeof errortext , "unknown descriptor header item '%s'" , results -> value );
253
+ mmerror (ET_WARN , errortext );
188
254
}
189
255
}
190
- drop_assignments ();
191
- fputs ("}" ,yyout );
192
256
193
- whenever_action (2 |1 );
257
+ drop_assignments ();
258
+ fprintf (yyout , "));\n" );
259
+ whenever_action (3 );
194
260
}
195
261
196
262
void
@@ -305,96 +371,3 @@ output_get_descr(char *desc_name)
305
371
306
372
whenever_action (2 |1 );
307
373
}
308
-
309
- /*
310
- * descriptor name lookup
311
- */
312
-
313
- static struct descriptor * descriptors ;
314
-
315
- void add_descriptor (char * name ,char * connection )
316
- {
317
- struct descriptor * new = (struct descriptor * )mm_alloc (sizeof (struct descriptor ));
318
-
319
- new -> next = descriptors ;
320
- new -> name = mm_alloc (strlen (name )+ 1 );
321
- strcpy (new -> name ,name );
322
- if (connection )
323
- { new -> connection = mm_alloc (strlen (connection )+ 1 );
324
- strcpy (new -> connection ,connection );
325
- }
326
- else new -> connection = connection ;
327
- descriptors = new ;
328
- }
329
-
330
- void drop_descriptor (char * name ,char * connection )
331
- {
332
- struct descriptor * i ;
333
- struct descriptor * * lastptr = & descriptors ;
334
-
335
- for (i = descriptors ;i ;lastptr = & i -> next ,i = i -> next )
336
- {
337
- if (!strcmp (name ,i -> name ))
338
- {
339
- if ((!connection && !i -> connection )
340
- || (connection && i -> connection
341
- && !strcmp (connection ,i -> connection )))
342
- {
343
- * lastptr = i -> next ;
344
- if (i -> connection ) free (i -> connection );
345
- free (i -> name );
346
- free (i );
347
- return ;
348
- }
349
- }
350
- }
351
- snprintf (errortext ,sizeof errortext ,"unknown descriptor %s" ,name );
352
- mmerror (ET_WARN ,errortext );
353
- }
354
-
355
- struct descriptor * lookup_descriptor (char * name ,char * connection )
356
- {
357
- struct descriptor * i ;
358
-
359
- for (i = descriptors ;i ;i = i -> next )
360
- {
361
- if (!strcmp (name ,i -> name ))
362
- {
363
- if ((!connection && !i -> connection )
364
- || (connection && i -> connection
365
- && !strcmp (connection ,i -> connection )))
366
- {
367
- return i ;
368
- }
369
- }
370
- }
371
- snprintf (errortext ,sizeof errortext ,"unknown descriptor %s" ,name );
372
- mmerror (ET_WARN ,errortext );
373
- return NULL ;
374
- }
375
-
376
- void
377
- output_statement_desc (char * stmt , int mode )
378
- {
379
- int i , j = strlen (stmt );
380
-
381
- fprintf (yyout , "{ ECPGdo_descriptor(__LINE__, %s, \"%s\", \"" ,
382
- connection ? connection : "NULL" , descriptor_name );
383
-
384
- /* do this char by char as we have to filter '\"' */
385
- for (i = 0 ;i < j ; i ++ ) {
386
- if (stmt [i ] != '\"' )
387
- fputc (stmt [i ], yyout );
388
- else
389
- fputs ("\\\"" , yyout );
390
- }
391
-
392
- fputs ("\");" , yyout );
393
-
394
- mode |= 2 ;
395
- whenever_action (mode );
396
- free (stmt );
397
- if (connection != NULL )
398
- free (connection );
399
- free (descriptor_name );
400
- }
0 commit comments