Allow input from stdin and output to stdout.
authorMichael Meskes <meskes@postgresql.org>
Tue, 27 May 2003 14:36:00 +0000 (14:36 +0000)
committerMichael Meskes <meskes@postgresql.org>
Tue, 27 May 2003 14:36:00 +0000 (14:36 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/preproc/pgc.l

index a2a97d0df727d0bbe077b237b840921bf5a0c956..02fe1e9d41ff78b630bcc0a8ba326c703b2085b7 100644 (file)
@@ -1445,6 +1445,10 @@ Fri May 23 11:46:15 CEST 2003
 Tue May 27 13:29:28 CEST 2003
 
    - Fixed incorrect output for some structs.
+   
+Tue May 27 16:33:36 CEST 2003
+
+   - Accept stdin/stdout as input/output file.
    - Set ecpg version to 2.12.0.
    - Set ecpg library to 3.4.2.
    - Set pgtypes library to 1.0.0
index d40779b112020d04a5f41e013bda421aa4f24ec5..740703faf6e31a80f7241b09c2546cf8060211fd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.70 2003/05/14 14:37:35 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.71 2003/05/27 14:36:00 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -137,7 +137,11 @@ main(int argc, char *const argv[])
        switch (c)
        {
            case 'o':
-               yyout = fopen(optarg, PG_BINARY_W);
+               if (strcmp(optarg, "-") == 0) 
+                   yyout = stdout;
+               else
+                   yyout = fopen(optarg, PG_BINARY_W);
+               
                if (yyout == NULL)
                    perror(optarg);
                else
@@ -219,47 +223,62 @@ main(int argc, char *const argv[])
            char       *output_filename = NULL,
                       *ptr2ext;
 
-           input_filename = mm_alloc(strlen(argv[fnr]) + 5);
-
-           strcpy(input_filename, argv[fnr]);
+           /* If argv[fnr] is "-" we have to read from stdin */
+           if (strcmp(argv[fnr], "-") == 0)
+           {
+               input_filename = mm_alloc(strlen("stdin")+1);
+               strcpy(input_filename, "stdin");
+               yyin = stdin;
+           }
+           else
+           {
+               input_filename = mm_alloc(strlen(argv[fnr]) + 5);
+               strcpy(input_filename, argv[fnr]);
 
-           /* take care of relative paths */
-           ptr2ext = last_path_separator(input_filename);
-           ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
+               /* take care of relative paths */
+               ptr2ext = last_path_separator(input_filename);
+               ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
 
-           /* no extension? */
-           if (ptr2ext == NULL)
-           {
-               ptr2ext = input_filename + strlen(input_filename);
-
-               /* no extension => add .pgc */
-               ptr2ext[0] = '.';
-               ptr2ext[1] = 'p';
-               ptr2ext[2] = 'g';
-               ptr2ext[3] = 'c';
-               ptr2ext[4] = '\0';
+               /* no extension? */
+               if (ptr2ext == NULL)
+               {
+                   ptr2ext = input_filename + strlen(input_filename);
+
+                   /* no extension => add .pgc */
+                   ptr2ext[0] = '.';
+                   ptr2ext[1] = 'p';
+                   ptr2ext[2] = 'g';
+                   ptr2ext[3] = 'c';
+                   ptr2ext[4] = '\0';
+               }
+               
+               yyin = fopen(input_filename, PG_BINARY_R);
            }
 
            if (out_option == 0)    /* calculate the output name */
            {
-               output_filename = strdup(input_filename);
+               if (strcmp(input_filename, "stdin") == 0)
+                   yyout = stdout;
+               else
+               {
+                   output_filename = strdup(input_filename);
 
-               ptr2ext = strrchr(output_filename, '.');
-               /* make extension = .c */
-               ptr2ext[1] = 'c';
-               ptr2ext[2] = '\0';
+                   ptr2ext = strrchr(output_filename, '.');
+                   /* make extension = .c */
+                   ptr2ext[1] = 'c';
+                   ptr2ext[2] = '\0';
 
-               yyout = fopen(output_filename, PG_BINARY_W);
-               if (yyout == NULL)
-               {
-                   perror(output_filename);
-                   free(output_filename);
-                   free(input_filename);
-                   continue;
+                   yyout = fopen(output_filename, PG_BINARY_W);
+                   if (yyout == NULL)
+                   {
+                       perror(output_filename);
+                       free(output_filename);
+                       free(input_filename);
+                       continue;
+                   }
                }
            }
 
-           yyin = fopen(input_filename, PG_BINARY_R);
            if (yyin == NULL)
                perror(argv[fnr]);
            else
@@ -341,7 +360,7 @@ main(int argc, char *const argv[])
 
                /* finally the actual connection */
                connection = NULL;
-
+               
                /* initialize lex */
                lex_init();
 
@@ -355,9 +374,9 @@ main(int argc, char *const argv[])
                /* and parse the source */
                yyparse();
 
-               if (yyin != NULL)
+               if (yyin != NULL && yyin != stdin)
                    fclose(yyin);
-               if (out_option == 0)
+               if (out_option == 0 && yyout != stdout)
                    fclose(yyout);
            }
 
index 6b197e5655d52bd7f6d41ff95940f76ce2376c05..c489f64dcb9529db6cbe52d4714aad091d76f274 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.110 2003/05/22 07:58:41 meskes Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.111 2003/05/27 14:36:00 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -399,14 +399,6 @@ cppline            {space}*#(.*\\{space})+.*
                        BEGIN(state_before);
                        if (literallen == 0)
                            mmerror(PARSE_ERROR, ET_ERROR, "zero-length delimited identifier");
-                       if (literallen >= NAMEDATALEN)
-                       {
-                           snprintf(errortext, sizeof(errortext), "identifier \"%s\" will be truncated to \"%.*s\"",
-                                   literalbuf, NAMEDATALEN-1, literalbuf);
-                           literalbuf[NAMEDATALEN-1] = '\0';
-                           mmerror(PARSE_ERROR, ET_WARNING, errortext);
-                       }
-                   
                        yylval.str = mm_strdup(literalbuf);
                        return CSTRING;
                    }