@@ -224,16 +224,16 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
224224{
225225/* Informix accepts DECLARE with variables that are out of scope when OPEN is called.
226226 * For instance you can DECLARE a cursor in one function, and OPEN/FETCH/CLOSE
227- * it inother functions. This is very useful for e.g. event-driver programming,
227+ * it inanother functions. This is very useful for e.g. event-driver programming,
228228 * but may also lead to dangerous programming. The limitation when this is allowed
229- * and doesn's cause problems have to be documented, like the allocated variables
229+ * and doesn't cause problems have to be documented, like the allocated variables
230230 * must not be realloc()'ed.
231231 *
232232 * We have to change the variables to our own struct and just store the pointer
233233 * instead of the variable. Do it only for local variables, not for globals.
234234 */
235235
236- char *result =mm_strdup("") ;
236+ char *result =EMPTY ;
237237int insert;
238238
239239for (insert = 1; insert >= 0; insert--)
@@ -247,13 +247,14 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
247247
248248for (ptr = list; ptr != NULL; ptr = ptr->next)
249249{
250- chartemp [20];
250+ charvar_text [20];
251251char *original_var;
252252bool skip_set_var = false;
253+ bool var_ptr = false;
253254
254255/* change variable name to "ECPGget_var(<counter>)" */
255256original_var = ptr->variable->name;
256- sprintf(temp , "%d))", ecpg_internal_var);
257+ sprintf(var_text , "%d))", ecpg_internal_var);
257258
258259/* Don't emit ECPGset_var() calls for global variables */
259260if (ptr->variable->brace_level == 0)
@@ -276,13 +277,12 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
276277newvar = new_variable(cat_str(4, mm_strdup("("),
277278 mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)),
278279 mm_strdup(" *)(ECPGget_var("),
279- mm_strdup(temp )),
280+ mm_strdup(var_text )),
280281 ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
281282 mm_strdup("1"),
282283 ptr->variable->type->u.element->counter),
283284 ptr->variable->type->size),
284285 0);
285- sprintf(temp, "%d, (", ecpg_internal_var++);
286286}
287287else if ((ptr->variable->type->type == ECPGt_varchar
288288 || ptr->variable->type->type == ECPGt_char
@@ -293,79 +293,80 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
293293newvar = new_variable(cat_str(4, mm_strdup("("),
294294 mm_strdup(ecpg_type_name(ptr->variable->type->type)),
295295 mm_strdup(" *)(ECPGget_var("),
296- mm_strdup(temp )),
296+ mm_strdup(var_text )),
297297 ECPGmake_simple_type(ptr->variable->type->type,
298298 ptr->variable->type->size,
299299 ptr->variable->type->counter),
300300 0);
301301if (ptr->variable->type->type == ECPGt_varchar)
302- sprintf(temp, "%d, &(", ecpg_internal_var++);
303- else
304- sprintf(temp, "%d, (", ecpg_internal_var++);
302+ var_ptr = true;
305303}
306304else if (ptr->variable->type->type == ECPGt_struct
307305 || ptr->variable->type->type == ECPGt_union)
308306{
309- sprintf(temp, "%d)))", ecpg_internal_var);
310- newvar = new_variable(cat_str(4, mm_strdup("(*("),
307+ newvar = new_variable(cat_str(5, mm_strdup("(*("),
311308 mm_strdup(ptr->variable->type->type_name),
312309 mm_strdup(" *)(ECPGget_var("),
313- mm_strdup(temp)),
310+ mm_strdup(var_text),
311+ mm_strdup(")")),
314312 ECPGmake_struct_type(ptr->variable->type->u.members,
315313 ptr->variable->type->type,
316314 ptr->variable->type->type_name,
317315 ptr->variable->type->struct_sizeof),
318316 0);
319- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
317+ var_ptr = true ;
320318}
321319else if (ptr->variable->type->type == ECPGt_array)
322320{
323321if (ptr->variable->type->u.element->type == ECPGt_struct
324322|| ptr->variable->type->u.element->type == ECPGt_union)
325323{
326- sprintf(temp, "%d)))", ecpg_internal_var);
327- newvar = new_variable(cat_str(4, mm_strdup("(*("),
328- mm_strdup(ptr->variable->type->u.element->type_name),
329- mm_strdup(" *)(ECPGget_var("), mm_strdup(temp)),
324+ newvar = new_variable(cat_str(5, mm_strdup("(*("),
325+ mm_strdup(ptr->variable->type->u.element->type_name),
326+ mm_strdup(" *)(ECPGget_var("),
327+ mm_strdup(var_text),
328+ mm_strdup(")")),
330329 ECPGmake_struct_type(ptr->variable->type->u.element->u.members,
331330 ptr->variable->type->u.element->type,
332331 ptr->variable->type->u.element->type_name,
333332 ptr->variable->type->u.element->struct_sizeof),
334333 0);
335- sprintf(temp, "%d, (", ecpg_internal_var++);
336334}
337335else
338336{
339337newvar = new_variable(cat_str(4, mm_strdup("("),
340338 mm_strdup(ecpg_type_name(ptr->variable->type->type)),
341339 mm_strdup(" *)(ECPGget_var("),
342- mm_strdup(temp )),
340+ mm_strdup(var_text )),
343341 ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
344342 ptr->variable->type->u.element->size,
345343 ptr->variable->type->u.element->counter),
346344 ptr->variable->type->size),
347345 0);
348- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
346+ var_ptr = true ;
349347}
350348}
351349else
352350{
353351newvar = new_variable(cat_str(4, mm_strdup("*("),
354352 mm_strdup(ecpg_type_name(ptr->variable->type->type)),
355353 mm_strdup(" *)(ECPGget_var("),
356- mm_strdup(temp )),
354+ mm_strdup(var_text )),
357355 ECPGmake_simple_type(ptr->variable->type->type,
358356 ptr->variable->type->size,
359357 ptr->variable->type->counter),
360358 0);
361- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
359+ var_ptr = true ;
362360}
363361
364- /* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
362+ /* create call to "ECPGset_var(<counter>, <connection>, < pointer>. <line number>)" */
365363if (!skip_set_var)
364+ {
365+ sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
366366result = cat_str(5, result, mm_strdup("ECPGset_var("),
367- mm_strdup(temp ), mm_strdup(original_var),
367+ mm_strdup(var_text ), mm_strdup(original_var),
368368 mm_strdup("), __LINE__);\n"));
369+ }
369370
370371/* now the indicator if there is one and it's not a global variable */
371372if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0))
@@ -376,80 +377,81 @@ adjust_outofscope_cursor_vars(struct cursor *cur)
376377{
377378/* change variable name to "ECPGget_var(<counter>)" */
378379original_var = ptr->indicator->name;
379- sprintf(temp, "%d))", ecpg_internal_var);
380+ sprintf(var_text, "%d))", ecpg_internal_var);
381+ var_ptr = false;
380382
381383if (ptr->indicator->type->type == ECPGt_struct
382384|| ptr->indicator->type->type == ECPGt_union)
383385{
384- sprintf(temp, "%d)))", ecpg_internal_var);
385- newind = new_variable(cat_str(4, mm_strdup("(*(" ),
386- mm_strdup(ptr->indicator->type->type_name ),
387- mm_strdup(" *)(ECPGget_var(" ),
388- mm_strdup(temp )),
386+ newind = new_variable(cat_str(5, mm_strdup("(*("),
387+ mm_strdup(ptr->indicator->type->type_name ),
388+ mm_strdup(" *)(ECPGget_var(" ),
389+ mm_strdup(var_text ),
390+ mm_strdup(")" )),
389391 ECPGmake_struct_type(ptr->indicator->type->u.members,
390392 ptr->indicator->type->type,
391393 ptr->indicator->type->type_name,
392394 ptr->indicator->type->struct_sizeof),
393395 0);
394- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
396+ var_ptr = true ;
395397}
396398else if (ptr->indicator->type->type == ECPGt_array)
397399{
398400if (ptr->indicator->type->u.element->type == ECPGt_struct
399401|| ptr->indicator->type->u.element->type == ECPGt_union)
400402{
401- sprintf(temp, "%d)))", ecpg_internal_var);
402- newind = new_variable(cat_str(4, mm_strdup("(*("),
403- mm_strdup(ptr->indicator->type->u.element->type_name),
404- mm_strdup(" *)(ECPGget_var("), mm_strdup(temp)),
403+ newind = new_variable(cat_str(5, mm_strdup("(*("),
404+ mm_strdup(ptr->indicator->type->u.element->type_name),
405+ mm_strdup(" *)(ECPGget_var("),
406+ mm_strdup(var_text),
407+ mm_strdup(")")),
405408 ECPGmake_struct_type(ptr->indicator->type->u.element->u.members,
406409 ptr->indicator->type->u.element->type,
407410 ptr->indicator->type->u.element->type_name,
408411 ptr->indicator->type->u.element->struct_sizeof),
409412 0);
410- sprintf(temp, "%d, (", ecpg_internal_var++);
411413}
412414else
413415{
414416newind = new_variable(cat_str(4, mm_strdup("("),
415417 mm_strdup(ecpg_type_name(ptr->indicator->type->u.element->type)),
416- mm_strdup(" *)(ECPGget_var("), mm_strdup(temp )),
418+ mm_strdup(" *)(ECPGget_var("), mm_strdup(var_text )),
417419 ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type,
418420 ptr->indicator->type->u.element->size,
419421 ptr->indicator->type->u.element->counter),
420422 ptr->indicator->type->size),
421423 0);
422- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
424+ var_ptr = true ;
423425}
424426}
425427else if (atoi(ptr->indicator->type->size) > 1)
426428{
427429newind = new_variable(cat_str(4, mm_strdup("("),
428430 mm_strdup(ecpg_type_name(ptr->indicator->type->type)),
429431 mm_strdup(" *)(ECPGget_var("),
430- mm_strdup(temp )),
432+ mm_strdup(var_text )),
431433 ECPGmake_simple_type(ptr->indicator->type->type,
432434 ptr->indicator->type->size,
433435 ptr->variable->type->counter),
434436 0);
435- sprintf(temp, "%d, (", ecpg_internal_var++);
436437}
437438else
438439{
439440newind = new_variable(cat_str(4, mm_strdup("*("),
440441 mm_strdup(ecpg_type_name(ptr->indicator->type->type)),
441442 mm_strdup(" *)(ECPGget_var("),
442- mm_strdup(temp )),
443+ mm_strdup(var_text )),
443444 ECPGmake_simple_type(ptr->indicator->type->type,
444445 ptr->indicator->type->size,
445446 ptr->variable->type->counter),
446447 0);
447- sprintf(temp, "%d, &(", ecpg_internal_var++) ;
448+ var_ptr = true ;
448449}
449450
450451/* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
452+ sprintf(var_text, "%d, %s", ecpg_internal_var++, var_ptr ? "&(" : "(");
451453result = cat_str(5, result, mm_strdup("ECPGset_var("),
452- mm_strdup(temp ), mm_strdup(original_var),
454+ mm_strdup(var_text ), mm_strdup(original_var),
453455 mm_strdup("), __LINE__);\n"));
454456}
455457