LCOV - differential code coverage report
Current view: top level - src/interfaces/ecpg/preproc - ecpg.c (source / functions) Coverage Total Hit UNC UBC GNC CBC DUB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 43.9 % 253 111 4 138 111 6
Current Date: 2024-04-14 14:21:10 Functions: 50.0 % 4 2 2 1 1
Baseline: 16@8cea358b128 Branches: 45.8 % 131 60 71 60
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed [..60] days: 0.0 % 4 0 4
(240..) days: 44.6 % 249 111 138 111
Function coverage date bins:
(240..) days: 50.0 % 4 2 2 1 1
Branch coverage date bins:
(240..) days: 45.8 % 131 60 71 60

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /* src/interfaces/ecpg/preproc/ecpg.c */
                                  2                 :                : 
                                  3                 :                : /* Main for ecpg, the PostgreSQL embedded SQL precompiler. */
                                  4                 :                : /* Copyright (c) 1996-2024, PostgreSQL Global Development Group */
                                  5                 :                : 
                                  6                 :                : #include "postgres_fe.h"
                                  7                 :                : 
                                  8                 :                : #include <unistd.h>
                                  9                 :                : 
                                 10                 :                : #include "getopt_long.h"
                                 11                 :                : 
                                 12                 :                : #include "preproc_extern.h"
                                 13                 :                : 
                                 14                 :                : int         ret_value = 0;
                                 15                 :                : bool        autocommit = false,
                                 16                 :                :             auto_create_c = false,
                                 17                 :                :             system_includes = false,
                                 18                 :                :             force_indicator = true,
                                 19                 :                :             questionmarks = false,
                                 20                 :                :             regression_mode = false,
                                 21                 :                :             auto_prepare = false;
                                 22                 :                : 
                                 23                 :                : char       *output_filename;
                                 24                 :                : 
                                 25                 :                : enum COMPAT_MODE compat = ECPG_COMPAT_PGSQL;
                                 26                 :                : 
                                 27                 :                : struct _include_path *include_paths = NULL;
                                 28                 :                : struct cursor *cur = NULL;
                                 29                 :                : struct typedefs *types = NULL;
                                 30                 :                : struct _defines *defines = NULL;
                                 31                 :                : struct declared_list *g_declared_list = NULL;
                                 32                 :                : 
                                 33                 :                : static void
 8269 peter_e@gmx.net            34                 :UBC           0 : help(const char *progname)
                                 35                 :                : {
 5812                            36                 :              0 :     printf(_("%s is the PostgreSQL embedded SQL preprocessor for C programs.\n\n"),
                                 37                 :                :            progname);
                                 38                 :              0 :     printf(_("Usage:\n"
                                 39                 :                :              "  %s [OPTION]... FILE...\n\n"),
                                 40                 :                :            progname);
                                 41                 :              0 :     printf(_("Options:\n"));
                                 42                 :              0 :     printf(_("  -c             automatically generate C code from embedded SQL code;\n"
                                 43                 :                :              "                 this affects EXEC SQL TYPE\n"));
 5560                            44                 :              0 :     printf(_("  -C MODE        set compatibility mode; MODE can be one of\n"
                                 45                 :                :              "                 \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n"));
                                 46                 :                : #ifdef YYDEBUG
                                 47                 :                :     printf(_("  -d             generate parser debug output\n"));
                                 48                 :                : #endif
 5812                            49                 :              0 :     printf(_("  -D SYMBOL      define SYMBOL\n"));
                                 50                 :              0 :     printf(_("  -h             parse a header file, this option includes option \"-c\"\n"));
                                 51                 :              0 :     printf(_("  -i             parse system include files as well\n"));
                                 52                 :              0 :     printf(_("  -I DIRECTORY   search DIRECTORY for include files\n"));
                                 53                 :              0 :     printf(_("  -o OUTFILE     write result to OUTFILE\n"));
 5560                            54                 :              0 :     printf(_("  -r OPTION      specify run-time behavior; OPTION can be:\n"
                                 55                 :                :              "                 \"no_indicator\", \"prepare\", \"questionmarks\"\n"));
 5527                            56                 :              0 :     printf(_("  --regression   run in regression testing mode\n"));
 5812                            57                 :              0 :     printf(_("  -t             turn on autocommit of transactions\n"));
 2765 heikki.linnakangas@i       58                 :              0 :     printf(_("  -V, --version  output version information, then exit\n"));
 4318 peter_e@gmx.net            59                 :              0 :     printf(_("  -?, --help     show this help, then exit\n"));
 5812                            60                 :              0 :     printf(_("\nIf no output file is specified, the name is formed by adding .c to the\n"
                                 61                 :                :              "input file name, after stripping off .pgc if present.\n"));
 1507 peter@eisentraut.org       62                 :              0 :     printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
                                 63                 :              0 :     printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
 9522 bruce@momjian.us           64                 :              0 : }
                                 65                 :                : 
                                 66                 :                : static void
 9357 bruce@momjian.us           67                 :CBC         406 : add_include_path(char *path)
                                 68                 :                : {
 7559                            69                 :            406 :     struct _include_path *ip = include_paths,
                                 70                 :                :                *new;
                                 71                 :                : 
 7642 meskes@postgresql.or       72                 :            406 :     new = mm_alloc(sizeof(struct _include_path));
                                 73                 :            406 :     new->path = path;
                                 74                 :            406 :     new->next = NULL;
                                 75                 :                : 
                                 76         [ +  + ]:            406 :     if (ip == NULL)
                                 77                 :             66 :         include_paths = new;
                                 78                 :                :     else
                                 79                 :                :     {
 7559 bruce@momjian.us           80         [ +  + ]:           1050 :         for (; ip->next != NULL; ip = ip->next);
 7642 meskes@postgresql.or       81                 :            340 :         ip->next = new;
                                 82                 :                :     }
 9564 scrappy@hub.org            83                 :            406 : }
                                 84                 :                : 
                                 85                 :                : static void
 8853 meskes@postgresql.or       86                 :UBC           0 : add_preprocessor_define(char *define)
                                 87                 :                : {
                                 88                 :              0 :     struct _defines *pd = defines;
                                 89                 :                :     char       *ptr,
 7559 bruce@momjian.us           90                 :              0 :                *define_copy = mm_strdup(define);
                                 91                 :                : 
 8853 meskes@postgresql.or       92                 :              0 :     defines = mm_alloc(sizeof(struct _defines));
                                 93                 :                : 
                                 94                 :                :     /* look for = sign */
 7698                            95                 :              0 :     ptr = strchr(define_copy, '=');
                                 96         [ #  # ]:              0 :     if (ptr != NULL)
                                 97                 :                :     {
                                 98                 :                :         char       *tmp;
                                 99                 :                : 
                                100                 :                :         /* symbol has a value */
 7559 bruce@momjian.us          101         [ #  # ]:              0 :         for (tmp = ptr - 1; *tmp == ' '; tmp--);
 7698 meskes@postgresql.or      102                 :              0 :         tmp[1] = '\0';
 1780 tgl@sss.pgh.pa.us         103                 :              0 :         defines->olddef = define_copy;
                                104                 :              0 :         defines->newdef = ptr + 1;
                                105                 :                :     }
                                106                 :                :     else
                                107                 :                :     {
                                108                 :              0 :         defines->olddef = define_copy;
                                109                 :              0 :         defines->newdef = mm_strdup("1");
                                110                 :                :     }
 8853 meskes@postgresql.or      111                 :              0 :     defines->pertinent = true;
 7208                           112                 :              0 :     defines->used = NULL;
 8853                           113                 :              0 :     defines->next = pd;
                                114                 :              0 : }
                                115                 :                : 
                                116                 :                : #define ECPG_GETOPT_LONG_REGRESSION     1
                                117                 :                : int
 9564 scrappy@hub.org           118                 :CBC          66 : main(int argc, char *const argv[])
                                119                 :                : {
                                120                 :                :     static struct option ecpg_options[] = {
                                121                 :                :         {"regression", no_argument, NULL, ECPG_GETOPT_LONG_REGRESSION},
                                122                 :                :         {NULL, 0, NULL, 0}
                                123                 :                :     };
                                124                 :                : 
                                125                 :                :     int         fnr,
                                126                 :                :                 c,
 9357 bruce@momjian.us          127                 :             66 :                 out_option = 0;
 4753                           128                 :             66 :     bool        verbose = false,
 4912 meskes@postgresql.or      129                 :             66 :                 header_mode = false;
                                130                 :                :     struct _include_path *ip;
                                131                 :                :     const char *progname;
                                132                 :                :     char        my_exec_path[MAXPGPATH];
                                133                 :                :     char        include_path[MAXPGPATH];
                                134                 :                : 
 5603 peter_e@gmx.net           135                 :             66 :     set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("ecpg"));
                                136                 :                : 
 7681 bruce@momjian.us          137                 :             66 :     progname = get_progname(argv[0]);
                                138                 :                : 
 3697 sfrost@snowman.net        139         [ -  + ]:             66 :     if (find_my_exec(argv[0], my_exec_path) < 0)
                                140                 :                :     {
 3697 sfrost@snowman.net        141                 :UBC           0 :         fprintf(stderr, _("%s: could not locate my own executable path\n"), argv[0]);
 2432 peter_e@gmx.net           142                 :              0 :         return ILLEGAL_OPTION;
                                143                 :                :     }
                                144                 :                : 
 2765 heikki.linnakangas@i      145         [ +  - ]:CBC          66 :     if (argc > 1)
                                146                 :                :     {
                                147   [ +  -  -  + ]:             66 :         if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
                                148                 :                :         {
 2765 heikki.linnakangas@i      149                 :UBC           0 :             help(progname);
                                150                 :              0 :             exit(0);
                                151                 :                :         }
 2765 heikki.linnakangas@i      152   [ +  -  -  + ]:CBC          66 :         if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
                                153                 :                :         {
 2041 peter_e@gmx.net           154                 :UBC           0 :             printf("ecpg (PostgreSQL) %s\n", PG_VERSION);
 2765 heikki.linnakangas@i      155                 :              0 :             exit(0);
                                156                 :                :         }
                                157                 :                :     }
                                158                 :                : 
 6152 meskes@postgresql.or      159                 :CBC          66 :     output_filename = NULL;
  489 peter@eisentraut.org      160         [ +  + ]:            347 :     while ((c = getopt_long(argc, argv, "cC:dD:hiI:o:r:tv", ecpg_options, NULL)) != -1)
                                161                 :                :     {
 9564 scrappy@hub.org           162   [ +  +  -  -  :            281 :         switch (c)
                                     -  +  +  +  +  
                                        -  -  +  - ]
                                163                 :                :         {
 8060 meskes@postgresql.or      164                 :              2 :             case 'c':
                                165                 :              2 :                 auto_create_c = true;
                                166                 :              2 :                 break;
 7731                           167                 :             11 :             case 'C':
 2284                           168   [ +  +  -  + ]:             11 :                 if (pg_strcasecmp(optarg, "INFORMIX") == 0 || pg_strcasecmp(optarg, "INFORMIX_SE") == 0)
 7698                           169                 :             10 :                 {
                                170                 :                :                     char        pkginclude_path[MAXPGPATH];
                                171                 :                :                     char        informix_path[MAXPGPATH];
                                172                 :                : 
 2284                           173         [ +  - ]:             10 :                     compat = (pg_strcasecmp(optarg, "INFORMIX") == 0) ? ECPG_COMPAT_INFORMIX : ECPG_COMPAT_INFORMIX_SE;
 7272 bruce@momjian.us          174                 :             10 :                     get_pkginclude_path(my_exec_path, pkginclude_path);
                                175                 :             10 :                     snprintf(informix_path, MAXPGPATH, "%s/informix/esql", pkginclude_path);
                                176                 :             10 :                     add_include_path(informix_path);
                                177                 :                :                 }
 1748 meskes@postgresql.or      178         [ +  - ]:              1 :                 else if (pg_strcasecmp(optarg, "ORACLE") == 0)
                                179                 :                :                 {
 2223                           180                 :              1 :                     compat = ECPG_COMPAT_ORACLE;
                                181                 :                :                 }
                                182                 :                :                 else
                                183                 :                :                 {
 5812 peter_e@gmx.net           184                 :UBC           0 :                     fprintf(stderr, _("Try \"%s --help\" for more information.\n"), argv[0]);
 7731 meskes@postgresql.or      185                 :              0 :                     return ILLEGAL_OPTION;
                                186                 :                :                 }
 7731 meskes@postgresql.or      187                 :CBC          11 :                 break;
  489 peter@eisentraut.org      188                 :UBC           0 :             case 'd':
                                189                 :                : #ifdef YYDEBUG
                                190                 :                :                 base_yydebug = 1;
                                191                 :                : #else
                                192                 :              0 :                 fprintf(stderr, _("%s: parser debug support (-d) not available\n"),
                                193                 :                :                         progname);
                                194                 :                : #endif
                                195                 :              0 :                 break;
                                196                 :              0 :             case 'D':
                                197                 :              0 :                 add_preprocessor_define(optarg);
                                198                 :              0 :                 break;
                                199                 :              0 :             case 'h':
                                200                 :              0 :                 header_mode = true;
                                201                 :                :                 /* this must include "-c" to make sense: */
                                202                 :              0 :                 auto_create_c = true;
                                203                 :              0 :                 break;
  489 peter@eisentraut.org      204                 :CBC           1 :             case 'i':
                                205                 :              1 :                 system_includes = true;
                                206                 :              1 :                 break;
                                207                 :            132 :             case 'I':
                                208                 :            132 :                 add_include_path(optarg);
                                209                 :            132 :                 break;
                                210                 :             66 :             case 'o':
                                211                 :             66 :                 output_filename = mm_strdup(optarg);
                                212         [ -  + ]:             66 :                 if (strcmp(output_filename, "-") == 0)
  489 peter@eisentraut.org      213                 :UBC           0 :                     base_yyout = stdout;
                                214                 :                :                 else
  489 peter@eisentraut.org      215                 :CBC          66 :                     base_yyout = fopen(output_filename, PG_BINARY_W);
                                216                 :                : 
                                217         [ -  + ]:             66 :                 if (base_yyout == NULL)
                                218                 :                :                 {
   33 michael@paquier.xyz       219                 :UNC           0 :                     fprintf(stderr, _("%s: could not open file \"%s\": %m\n"),
                                220                 :                :                             progname, output_filename);
  489 peter@eisentraut.org      221                 :UBC           0 :                     output_filename = NULL;
                                222                 :                :                 }
                                223                 :                :                 else
  489 peter@eisentraut.org      224                 :CBC          66 :                     out_option = 1;
                                225                 :             66 :                 break;
 7599 meskes@postgresql.or      226                 :              3 :             case 'r':
 1748                           227         [ +  + ]:              3 :                 if (pg_strcasecmp(optarg, "no_indicator") == 0)
 7599                           228                 :              1 :                     force_indicator = false;
 1748                           229         [ +  + ]:              2 :                 else if (pg_strcasecmp(optarg, "prepare") == 0)
 6088                           230                 :              1 :                     auto_prepare = true;
 1748                           231         [ +  - ]:              1 :                 else if (pg_strcasecmp(optarg, "questionmarks") == 0)
 6088                           232                 :              1 :                     questionmarks = true;
                                233                 :                :                 else
                                234                 :                :                 {
 5812 peter_e@gmx.net           235                 :UBC           0 :                     fprintf(stderr, _("Try \"%s --help\" for more information.\n"), argv[0]);
 7599 meskes@postgresql.or      236                 :              0 :                     return ILLEGAL_OPTION;
                                237                 :                :                 }
 7599 meskes@postgresql.or      238                 :CBC           3 :                 break;
  489 peter@eisentraut.org      239                 :UBC           0 :             case 't':
                                240                 :              0 :                 autocommit = true;
 8768 bruce@momjian.us          241                 :              0 :                 break;
  489 peter@eisentraut.org      242                 :              0 :             case 'v':
                                243                 :              0 :                 verbose = true;
                                244                 :              0 :                 break;
  489 peter@eisentraut.org      245                 :CBC          66 :             case ECPG_GETOPT_LONG_REGRESSION:
                                246                 :             66 :                 regression_mode = true;
 8269 peter_e@gmx.net           247                 :             66 :                 break;
 9564 scrappy@hub.org           248                 :UBC           0 :             default:
 5812 peter_e@gmx.net           249                 :              0 :                 fprintf(stderr, _("Try \"%s --help\" for more information.\n"), argv[0]);
 9357 bruce@momjian.us          250                 :              0 :                 return ILLEGAL_OPTION;
                                251                 :                :         }
                                252                 :                :     }
                                253                 :                : 
 7642 meskes@postgresql.or      254                 :CBC          66 :     add_include_path(".");
                                255                 :             66 :     add_include_path("/usr/local/include");
 7272 bruce@momjian.us          256                 :             66 :     get_include_path(my_exec_path, include_path);
                                257                 :             66 :     add_include_path(include_path);
 7642 meskes@postgresql.or      258                 :             66 :     add_include_path("/usr/include");
                                259                 :                : 
 8879                           260         [ -  + ]:             66 :     if (verbose)
                                261                 :                :     {
 2798 tgl@sss.pgh.pa.us         262                 :UBC           0 :         fprintf(stderr,
                                263                 :              0 :                 _("%s, the PostgreSQL embedded C preprocessor, version %s\n"),
                                264                 :                :                 progname, PG_VERSION);
 5560 peter_e@gmx.net           265                 :              0 :         fprintf(stderr, _("EXEC SQL INCLUDE ... search starts here:\n"));
 8879 meskes@postgresql.or      266         [ #  # ]:              0 :         for (ip = include_paths; ip != NULL; ip = ip->next)
                                267                 :              0 :             fprintf(stderr, " %s\n", ip->path);
 5812 peter_e@gmx.net           268                 :              0 :         fprintf(stderr, _("end of search list\n"));
 8269                           269                 :              0 :         return 0;
                                270                 :                :     }
                                271                 :                : 
 9544 bruce@momjian.us          272         [ -  + ]:CBC          66 :     if (optind >= argc)          /* no files specified */
                                273                 :                :     {
 5812 peter_e@gmx.net           274                 :UBC           0 :         fprintf(stderr, _("%s: no input files specified\n"), progname);
                                275                 :              0 :         fprintf(stderr, _("Try \"%s --help\" for more information.\n"), argv[0]);
 2432                           276                 :              0 :         return ILLEGAL_OPTION;
                                277                 :                :     }
                                278                 :                :     else
                                279                 :                :     {
                                280                 :                :         /* after the options there must not be anything but filenames */
 9559 scrappy@hub.org           281         [ +  + ]:CBC         132 :         for (fnr = optind; fnr < argc; fnr++)
                                282                 :                :         {
                                283                 :                :             char       *ptr2ext;
                                284                 :                : 
                                285                 :                :             /* If argv[fnr] is "-" we have to read from stdin */
 7628 meskes@postgresql.or      286         [ -  + ]:             66 :             if (strcmp(argv[fnr], "-") == 0)
                                287                 :                :             {
 7559 bruce@momjian.us          288                 :UBC           0 :                 input_filename = mm_alloc(strlen("stdin") + 1);
 7628 meskes@postgresql.or      289                 :              0 :                 strcpy(input_filename, "stdin");
 2681 tgl@sss.pgh.pa.us         290                 :              0 :                 base_yyin = stdin;
                                291                 :                :             }
                                292                 :                :             else
                                293                 :                :             {
 7628 meskes@postgresql.or      294                 :CBC          66 :                 input_filename = mm_alloc(strlen(argv[fnr]) + 5);
                                295                 :             66 :                 strcpy(input_filename, argv[fnr]);
                                296                 :                : 
                                297                 :                :                 /* take care of relative paths */
 7248 bruce@momjian.us          298                 :             66 :                 ptr2ext = last_dir_separator(input_filename);
 7628 meskes@postgresql.or      299         [ +  - ]:             66 :                 ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
                                300                 :                : 
                                301                 :                :                 /* no extension? */
                                302         [ -  + ]:             66 :                 if (ptr2ext == NULL)
                                303                 :                :                 {
 7628 meskes@postgresql.or      304                 :UBC           0 :                     ptr2ext = input_filename + strlen(input_filename);
                                305                 :                : 
                                306                 :                :                     /* no extension => add .pgc or .pgh */
                                307                 :              0 :                     ptr2ext[0] = '.';
                                308                 :              0 :                     ptr2ext[1] = 'p';
                                309                 :              0 :                     ptr2ext[2] = 'g';
 7168 bruce@momjian.us          310         [ #  # ]:              0 :                     ptr2ext[3] = (header_mode == true) ? 'h' : 'c';
 7628 meskes@postgresql.or      311                 :              0 :                     ptr2ext[4] = '\0';
                                312                 :                :                 }
                                313                 :                : 
 2681 tgl@sss.pgh.pa.us         314                 :CBC          66 :                 base_yyin = fopen(input_filename, PG_BINARY_R);
                                315                 :                :             }
                                316                 :                : 
 8204 bruce@momjian.us          317         [ -  + ]:             66 :             if (out_option == 0)    /* calculate the output name */
                                318                 :                :             {
 7628 meskes@postgresql.or      319         [ #  # ]:UBC           0 :                 if (strcmp(input_filename, "stdin") == 0)
 2681 tgl@sss.pgh.pa.us         320                 :              0 :                     base_yyout = stdout;
                                321                 :                :                 else
                                322                 :                :                 {
 2670 meskes@postgresql.or      323                 :              0 :                     output_filename = mm_alloc(strlen(input_filename) + 3);
                                324                 :              0 :                     strcpy(output_filename, input_filename);
                                325                 :                : 
 7628                           326                 :              0 :                     ptr2ext = strrchr(output_filename, '.');
                                327                 :                :                     /* make extension = .c resp. .h */
 7168 bruce@momjian.us          328         [ #  # ]:              0 :                     ptr2ext[1] = (header_mode == true) ? 'h' : 'c';
 7628 meskes@postgresql.or      329                 :              0 :                     ptr2ext[2] = '\0';
                                330                 :                : 
 2681 tgl@sss.pgh.pa.us         331                 :              0 :                     base_yyout = fopen(output_filename, PG_BINARY_W);
                                332         [ #  # ]:              0 :                     if (base_yyout == NULL)
                                333                 :                :                     {
   33 michael@paquier.xyz       334                 :UNC           0 :                         fprintf(stderr, _("%s: could not open file \"%s\": %m\n"),
                                335                 :                :                                 progname, output_filename);
 7628 meskes@postgresql.or      336                 :UBC           0 :                         free(output_filename);
 2223                           337                 :              0 :                         output_filename = NULL;
 7628                           338                 :              0 :                         free(input_filename);
                                339                 :              0 :                         continue;
                                340                 :                :                     }
                                341                 :                :                 }
                                342                 :                :             }
                                343                 :                : 
 2681 tgl@sss.pgh.pa.us         344         [ -  + ]:CBC          66 :             if (base_yyin == NULL)
   33 michael@paquier.xyz       345                 :UNC           0 :                 fprintf(stderr, _("%s: could not open file \"%s\": %m\n"),
                                346                 :              0 :                         progname, argv[fnr]);
                                347                 :                :             else
                                348                 :                :             {
                                349                 :                :                 struct cursor *ptr;
                                350                 :                :                 struct _defines *defptr;
                                351                 :                :                 struct typedefs *typeptr;
                                352                 :                :                 struct declared_list *list;
                                353                 :                : 
                                354                 :                :                 /* remove old cursor definitions if any are still there */
 1668 tgl@sss.pgh.pa.us         355         [ -  + ]:CBC          66 :                 for (ptr = cur; ptr != NULL;)
                                356                 :                :                 {
 1668 tgl@sss.pgh.pa.us         357                 :UBC           0 :                     struct cursor *this = ptr;
                                358                 :                :                     struct arguments *l1,
                                359                 :                :                                *l2;
                                360                 :                : 
                                361                 :              0 :                     free(ptr->command);
                                362                 :              0 :                     free(ptr->connection);
                                363                 :              0 :                     free(ptr->name);
                                364         [ #  # ]:              0 :                     for (l1 = ptr->argsinsert; l1; l1 = l2)
                                365                 :                :                     {
                                366                 :              0 :                         l2 = l1->next;
                                367                 :              0 :                         free(l1);
                                368                 :                :                     }
                                369         [ #  # ]:              0 :                     for (l1 = ptr->argsresult; l1; l1 = l2)
                                370                 :                :                     {
                                371                 :              0 :                         l2 = l1->next;
                                372                 :              0 :                         free(l1);
                                373                 :                :                     }
                                374                 :              0 :                     ptr = ptr->next;
                                375                 :              0 :                     free(this);
                                376                 :                :                 }
 1668 tgl@sss.pgh.pa.us         377                 :CBC          66 :                 cur = NULL;
                                378                 :                : 
                                379                 :                :                 /* remove old declared statements if any are still there */
 1117 meskes@postgresql.or      380         [ -  + ]:             66 :                 for (list = g_declared_list; list != NULL;)
                                381                 :                :                 {
 1117 meskes@postgresql.or      382                 :UBC           0 :                     struct declared_list *this = list;
                                383                 :                : 
                                384                 :              0 :                     list = list->next;
                                385                 :              0 :                     free(this);
                                386                 :                :                 }
                                387                 :                : 
                                388                 :                :                 /* remove non-pertinent old defines as well */
 8768 bruce@momjian.us          389   [ -  +  -  - ]:CBC          66 :                 while (defines && !defines->pertinent)
                                390                 :                :                 {
 8768 bruce@momjian.us          391                 :UBC           0 :                     defptr = defines;
                                392                 :              0 :                     defines = defines->next;
                                393                 :                : 
 1780 tgl@sss.pgh.pa.us         394                 :              0 :                     free(defptr->newdef);
                                395                 :              0 :                     free(defptr->olddef);
 8768 bruce@momjian.us          396                 :              0 :                     free(defptr);
                                397                 :                :                 }
                                398                 :                : 
 8768 bruce@momjian.us          399         [ -  + ]:CBC          66 :                 for (defptr = defines; defptr != NULL; defptr = defptr->next)
                                400                 :                :                 {
 8768 bruce@momjian.us          401                 :UBC           0 :                     struct _defines *this = defptr->next;
                                402                 :                : 
                                403   [ #  #  #  # ]:              0 :                     if (this && !this->pertinent)
                                404                 :                :                     {
                                405                 :              0 :                         defptr->next = this->next;
                                406                 :                : 
 1780 tgl@sss.pgh.pa.us         407                 :              0 :                         free(this->newdef);
                                408                 :              0 :                         free(this->olddef);
 8768 bruce@momjian.us          409                 :              0 :                         free(this);
                                410                 :                :                     }
                                411                 :                :                 }
                                412                 :                : 
                                413                 :                :                 /* and old typedefs */
 9185 scrappy@hub.org           414         [ -  + ]:CBC          66 :                 for (typeptr = types; typeptr != NULL;)
                                415                 :                :                 {
 9185 scrappy@hub.org           416                 :UBC           0 :                     struct typedefs *this = typeptr;
                                417                 :                : 
                                418                 :              0 :                     free(typeptr->name);
                                419                 :              0 :                     ECPGfree_struct_member(typeptr->struct_member_list);
 8853 meskes@postgresql.or      420                 :              0 :                     free(typeptr->type);
 9185 scrappy@hub.org           421                 :              0 :                     typeptr = typeptr->next;
                                422                 :              0 :                     free(this);
                                423                 :                :                 }
 8853 meskes@postgresql.or      424                 :CBC          66 :                 types = NULL;
                                425                 :                : 
                                426                 :                :                 /* initialize whenever structures */
                                427                 :             66 :                 memset(&when_error, 0, sizeof(struct when));
                                428                 :             66 :                 memset(&when_nf, 0, sizeof(struct when));
                                429                 :             66 :                 memset(&when_warn, 0, sizeof(struct when));
                                430                 :                : 
                                431                 :                :                 /* and structure member lists */
                                432                 :             66 :                 memset(struct_member_list, 0, sizeof(struct_member_list));
                                433                 :                : 
                                434                 :                :                 /*
                                435                 :                :                  * and our variable counter for out of scope cursors'
                                436                 :                :                  * variables
                                437                 :                :                  */
 5192                           438                 :             66 :                 ecpg_internal_var = 0;
                                439                 :                : 
                                440                 :                :                 /* finally the actual connection */
 8823                           441                 :             66 :                 connection = NULL;
                                442                 :                : 
                                443                 :                :                 /* initialize lex */
 9559 scrappy@hub.org           444                 :             66 :                 lex_init();
                                445                 :                : 
                                446                 :                :                 /* we need several includes */
                                447                 :                :                 /* but not if we are in header mode */
 5995 bruce@momjian.us          448         [ +  - ]:             66 :                 if (regression_mode)
 2681 tgl@sss.pgh.pa.us         449                 :             66 :                     fprintf(base_yyout, "/* Processed by ecpg (regression mode) */\n");
                                450                 :                :                 else
 2681 tgl@sss.pgh.pa.us         451                 :UBC           0 :                     fprintf(base_yyout, "/* Processed by ecpg (%s) */\n", PG_VERSION);
                                452                 :                : 
 7382 meskes@postgresql.or      453         [ +  - ]:CBC          66 :                 if (header_mode == false)
                                454                 :                :                 {
 2681 tgl@sss.pgh.pa.us         455                 :             66 :                     fprintf(base_yyout, "/* These include files are added by the preprocessor */\n#include <ecpglib.h>\n#include <ecpgerrno.h>\n#include <sqlca.h>\n");
                                456                 :                : 
                                457                 :                :                     /* add some compatibility headers */
 7382 meskes@postgresql.or      458   [ +  +  -  + ]:             66 :                     if (INFORMIX_MODE)
 2681 tgl@sss.pgh.pa.us         459                 :             10 :                         fprintf(base_yyout, "/* Needed for informix compatibility */\n#include <ecpg_informix.h>\n");
                                460                 :                : 
                                461                 :             66 :                     fprintf(base_yyout, "/* End of automatic include section */\n");
                                462                 :                :                 }
                                463                 :                : 
 5995 bruce@momjian.us          464         [ +  - ]:             66 :                 if (regression_mode)
 2681 tgl@sss.pgh.pa.us         465                 :             66 :                     fprintf(base_yyout, "#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))\n");
                                466                 :                : 
 6640 meskes@postgresql.or      467                 :             66 :                 output_line_number();
                                468                 :                : 
                                469                 :                :                 /* and parse the source */
 6238                           470                 :             66 :                 base_yyparse();
                                471                 :                : 
                                472                 :                :                 /*
                                473                 :                :                  * Check whether all cursors were indeed opened.  It does not
                                474                 :                :                  * really make sense to declare a cursor but not open it.
                                475                 :                :                  */
 5560 peter_e@gmx.net           476         [ +  + ]:            103 :                 for (ptr = cur; ptr != NULL; ptr = ptr->next)
 7382 meskes@postgresql.or      477         [ -  + ]:             37 :                     if (!(ptr->opened))
 5560 peter_e@gmx.net           478                 :UBC           0 :                         mmerror(PARSE_ERROR, ET_WARNING, "cursor \"%s\" has been declared but not opened", ptr->name);
                                479                 :                : 
 2681 tgl@sss.pgh.pa.us         480   [ +  -  +  - ]:CBC          66 :                 if (base_yyin != NULL && base_yyin != stdin)
                                481                 :             66 :                     fclose(base_yyin);
                                482   [ -  +  -  - ]:             66 :                 if (out_option == 0 && base_yyout != stdout)
 2681 tgl@sss.pgh.pa.us         483                 :UBC           0 :                     fclose(base_yyout);
                                484                 :                : 
                                485                 :                :                 /*
                                486                 :                :                  * If there was an error, delete the output file.
                                487                 :                :                  */
 5125 meskes@postgresql.or      488         [ -  + ]:CBC          66 :                 if (ret_value != 0)
                                489                 :                :                 {
 5125 meskes@postgresql.or      490   [ #  #  #  # ]:UBC           0 :                     if (strcmp(output_filename, "-") != 0 && unlink(output_filename) != 0)
                                491                 :              0 :                         fprintf(stderr, _("could not remove output file \"%s\"\n"), output_filename);
                                492                 :                :                 }
                                493                 :                :             }
                                494                 :                : 
 2180 tgl@sss.pgh.pa.us         495   [ +  -  -  + ]:CBC          66 :             if (output_filename && out_option == 0)
                                496                 :                :             {
 9490 scrappy@hub.org           497                 :UBC           0 :                 free(output_filename);
 2223 meskes@postgresql.or      498                 :              0 :                 output_filename = NULL;
                                499                 :                :             }
                                500                 :                : 
 9522 bruce@momjian.us          501                 :CBC          66 :             free(input_filename);
                                502                 :                :         }
                                503                 :                :     }
 8894 meskes@postgresql.or      504                 :             66 :     return ret_value;
                                505                 :                : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622