LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/preproc - output.c (source / functions) Coverage Total Hit
Test: Code coverage Lines: 0.0 % 130 0
Test Date: 2026-01-26 10:56:24 Functions: 0.0 % 9 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* src/interfaces/ecpg/preproc/output.c */
       2              : 
       3              : #include "postgres_fe.h"
       4              : 
       5              : #include "preproc_extern.h"
       6              : 
       7              : static void output_escaped_str(const char *str, bool quoted);
       8              : 
       9              : void
      10            0 : output_line_number(void)
      11              : {
      12            0 :         char       *line = hashline_number();
      13              : 
      14            0 :         fprintf(base_yyout, "%s", line);
      15            0 : }
      16              : 
      17              : void
      18            0 : output_simple_statement(const char *stmt, int whenever_mode)
      19              : {
      20            0 :         output_escaped_str(stmt, false);
      21            0 :         if (whenever_mode)
      22            0 :                 whenever_action(whenever_mode);
      23            0 :         output_line_number();
      24            0 : }
      25              : 
      26              : 
      27              : /*
      28              :  * store the whenever action here
      29              :  */
      30              : struct when when_error,
      31              :                         when_nf,
      32              :                         when_warn;
      33              : 
      34              : static void
      35            0 : print_action(struct when *w)
      36              : {
      37            0 :         switch (w->code)
      38              :         {
      39              :                 case W_SQLPRINT:
      40            0 :                         fprintf(base_yyout, "sqlprint();");
      41            0 :                         break;
      42              :                 case W_GOTO:
      43            0 :                         fprintf(base_yyout, "goto %s;", w->command);
      44            0 :                         break;
      45              :                 case W_DO:
      46            0 :                         fprintf(base_yyout, "%s;", w->command);
      47            0 :                         break;
      48              :                 case W_STOP:
      49            0 :                         fprintf(base_yyout, "exit (1);");
      50            0 :                         break;
      51              :                 case W_BREAK:
      52            0 :                         fprintf(base_yyout, "break;");
      53            0 :                         break;
      54              :                 case W_CONTINUE:
      55            0 :                         fprintf(base_yyout, "continue;");
      56            0 :                         break;
      57              :                 default:
      58            0 :                         fprintf(base_yyout, "{/* %d not implemented yet */}", w->code);
      59            0 :                         break;
      60              :         }
      61            0 : }
      62              : 
      63              : void
      64            0 : whenever_action(int mode)
      65              : {
      66            0 :         if ((mode & 1) == 1 && when_nf.code != W_NOTHING)
      67              :         {
      68            0 :                 output_line_number();
      69            0 :                 fprintf(base_yyout, "\nif (sqlca.sqlcode == ECPG_NOT_FOUND) ");
      70            0 :                 print_action(&when_nf);
      71            0 :         }
      72            0 :         if (when_warn.code != W_NOTHING)
      73              :         {
      74            0 :                 output_line_number();
      75            0 :                 fprintf(base_yyout, "\nif (sqlca.sqlwarn[0] == 'W') ");
      76            0 :                 print_action(&when_warn);
      77            0 :         }
      78            0 :         if (when_error.code != W_NOTHING)
      79              :         {
      80            0 :                 output_line_number();
      81            0 :                 fprintf(base_yyout, "\nif (sqlca.sqlcode < 0) ");
      82            0 :                 print_action(&when_error);
      83            0 :         }
      84              : 
      85            0 :         if ((mode & 2) == 2)
      86            0 :                 fputc('}', base_yyout);
      87              : 
      88            0 :         output_line_number();
      89            0 : }
      90              : 
      91              : char *
      92            0 : hashline_number(void)
      93              : {
      94              :         /* do not print line numbers if we are in debug mode */
      95            0 :         if (input_filename
      96              : #ifdef YYDEBUG
      97              :                 && !base_yydebug
      98              : #endif
      99              :                 )
     100              :         {
     101              :                 /* "* 2" here is for escaping '\' and '"' below */
     102            0 :                 char       *line = loc_alloc(strlen("\n#line %d \"%s\"\n") + sizeof(int) * CHAR_BIT * 10 / 3 + strlen(input_filename) * 2);
     103            0 :                 char       *src,
     104              :                                    *dest;
     105              : 
     106            0 :                 sprintf(line, "\n#line %d \"", base_yylineno);
     107            0 :                 src = input_filename;
     108            0 :                 dest = line + strlen(line);
     109            0 :                 while (*src)
     110              :                 {
     111            0 :                         if (*src == '\\' || *src == '"')
     112            0 :                                 *dest++ = '\\';
     113            0 :                         *dest++ = *src++;
     114              :                 }
     115            0 :                 *dest = '\0';
     116            0 :                 strcat(dest, "\"\n");
     117              : 
     118            0 :                 return line;
     119            0 :         }
     120              : 
     121            0 :         return "";
     122            0 : }
     123              : 
     124              : static char *ecpg_statement_type_name[] = {
     125              :         "ECPGst_normal",
     126              :         "ECPGst_execute",
     127              :         "ECPGst_exec_immediate",
     128              :         "ECPGst_prepnormal",
     129              :         "ECPGst_prepare",
     130              :         "ECPGst_exec_with_exprlist"
     131              : };
     132              : 
     133              : void
     134            0 : output_statement(const char *stmt, int whenever_mode, enum ECPG_statement_type st)
     135              : {
     136            0 :         fprintf(base_yyout, "{ ECPGdo(__LINE__, %d, %d, %s, %d, ", compat, force_indicator, connection ? connection : "NULL", questionmarks);
     137              : 
     138            0 :         if (st == ECPGst_prepnormal && !auto_prepare)
     139            0 :                 st = ECPGst_normal;
     140              : 
     141              :         /*
     142              :          * In following cases, stmt is CSTRING or char_variable. They must be
     143              :          * output directly. - prepared_name of EXECUTE without exprlist -
     144              :          * execstring of EXECUTE IMMEDIATE
     145              :          */
     146            0 :         fprintf(base_yyout, "%s, ", ecpg_statement_type_name[st]);
     147            0 :         if (st == ECPGst_execute || st == ECPGst_exec_immediate)
     148            0 :                 fprintf(base_yyout, "%s, ", stmt);
     149              :         else
     150              :         {
     151            0 :                 fputs("\"", base_yyout);
     152            0 :                 output_escaped_str(stmt, false);
     153            0 :                 fputs("\", ", base_yyout);
     154              :         }
     155              : 
     156              :         /* dump variables to C file */
     157            0 :         dump_variables(argsinsert, 1);
     158            0 :         argsinsert = NULL;
     159            0 :         fputs("ECPGt_EOIT, ", base_yyout);
     160            0 :         dump_variables(argsresult, 1);
     161            0 :         argsresult = NULL;
     162            0 :         fputs("ECPGt_EORT);", base_yyout);
     163              : 
     164            0 :         whenever_action(whenever_mode | 2);
     165            0 : }
     166              : 
     167              : void
     168            0 : output_prepare_statement(const char *name, const char *stmt)
     169              : {
     170            0 :         fprintf(base_yyout, "{ ECPGprepare(__LINE__, %s, %d, ", connection ? connection : "NULL", questionmarks);
     171            0 :         output_escaped_str(name, true);
     172            0 :         fputs(", ", base_yyout);
     173            0 :         output_escaped_str(stmt, true);
     174            0 :         fputs(");", base_yyout);
     175            0 :         whenever_action(2);
     176            0 : }
     177              : 
     178              : void
     179            0 : output_deallocate_prepare_statement(const char *name)
     180              : {
     181            0 :         const char *con = connection ? connection : "NULL";
     182              : 
     183            0 :         if (strcmp(name, "all") != 0)
     184              :         {
     185            0 :                 fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, ", compat, con);
     186            0 :                 output_escaped_str(name, true);
     187            0 :                 fputs(");", base_yyout);
     188            0 :         }
     189              :         else
     190            0 :                 fprintf(base_yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
     191              : 
     192            0 :         whenever_action(2);
     193            0 : }
     194              : 
     195              : static void
     196            0 : output_escaped_str(const char *str, bool quoted)
     197              : {
     198            0 :         int                     i = 0;
     199            0 :         int                     len = strlen(str);
     200              : 
     201            0 :         if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
     202              :                                                                                                                  * at beginning and end
     203              :                                                                                                                  * if quoted string */
     204              :         {
     205            0 :                 i = 1;
     206            0 :                 len--;
     207            0 :                 fputs("\"", base_yyout);
     208            0 :         }
     209              : 
     210              :         /* output this char by char as we have to filter " and \n */
     211            0 :         for (; i < len; i++)
     212              :         {
     213            0 :                 if (str[i] == '"')
     214            0 :                         fputs("\\\"", base_yyout);
     215            0 :                 else if (str[i] == '\n')
     216            0 :                         fputs("\\\n", base_yyout);
     217            0 :                 else if (str[i] == '\\')
     218              :                 {
     219            0 :                         int                     j = i;
     220              : 
     221              :                         /*
     222              :                          * check whether this is a continuation line if it is, do not
     223              :                          * output anything because newlines are escaped anyway
     224              :                          */
     225              : 
     226              :                         /* accept blanks after the '\' as some other compilers do too */
     227            0 :                         do
     228              :                         {
     229            0 :                                 j++;
     230            0 :                         } while (str[j] == ' ' || str[j] == '\t');
     231              : 
     232            0 :                         if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
     233              :                                                                                                                                                          * newline */
     234            0 :                                 fputs("\\\\", base_yyout);
     235            0 :                 }
     236            0 :                 else if (str[i] == '\r' && str[i + 1] == '\n')
     237              :                 {
     238            0 :                         fputs("\\\r\n", base_yyout);
     239            0 :                         i++;
     240            0 :                 }
     241              :                 else
     242            0 :                         fputc(str[i], base_yyout);
     243            0 :         }
     244              : 
     245            0 :         if (quoted && str[0] == '"' && str[len] == '"')
     246            0 :                 fputs("\"", base_yyout);
     247            0 : }
        

Generated by: LCOV version 2.3.2-1