File:  [local] / rpl / rplawk / main.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Sep 7 12:53:05 2010 UTC (13 years, 8 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_9, rpl-4_1_8, rpl-4_1_7, rpl-4_1_6, rpl-4_1_5, rpl-4_1_4, rpl-4_1_3, rpl-4_1_2, rpl-4_1_13, rpl-4_1_12, rpl-4_1_11, rpl-4_1_10, rpl-4_1_1, rpl-4_1_0, rpl-4_0_24, rpl-4_0_22, rpl-4_0_21, rpl-4_0_20, rpl-4_0_19, rpl-4_0, HEAD
Ajout d'un AWK interne pour éviter des problèmes sur les OS non Unix.

    1: /****************************************************************
    2: Copyright (C) Lucent Technologies 1997
    3: All Rights Reserved
    4: 
    5: Permission to use, copy, modify, and distribute this software and
    6: its documentation for any purpose and without fee is hereby
    7: granted, provided that the above copyright notice appear in all
    8: copies and that both that the copyright notice and this
    9: permission notice and warranty disclaimer appear in supporting
   10: documentation, and that the name Lucent Technologies or any of
   11: its entities not be used in advertising or publicity pertaining
   12: to distribution of the software without specific, written prior
   13: permission.
   14: 
   15: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   16: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
   17: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
   18: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   19: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
   20: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
   21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
   22: THIS SOFTWARE.
   23: ****************************************************************/
   24: 
   25: const char  *version = "version 20100523";
   26: 
   27: #define DEBUG
   28: #include <stdio.h>
   29: #include <ctype.h>
   30: #include <locale.h>
   31: #include <stdlib.h>
   32: #include <string.h>
   33: #include <signal.h>
   34: #include "awk.h"
   35: #include "ytab.h"
   36: 
   37: extern  char    **environ;
   38: extern  int nfields;
   39: 
   40: int dbg = 0;
   41: char    *cmdname;   /* gets argv[0] for error messages */
   42: extern  FILE    *yyin;  /* lex input file */
   43: char    *lexprog;   /* points to program argument if it exists */
   44: extern  int errorflag;  /* non-zero if any syntax errors; set by yyerror */
   45: int compile_time = 2;   /* for error printing: */
   46:                 /* 2 = cmdline, 1 = compile, 0 = running */
   47: 
   48: #define MAX_PFILE   20  /* max number of -f's */
   49: 
   50: char    *pfile[MAX_PFILE];  /* program filenames from -f's */
   51: int npfile = 0; /* number of filenames */
   52: int curpfile = 0;   /* current filename */
   53: 
   54: int safe    = 0;    /* 1 => "safe" mode */
   55: 
   56: int main(int argc, char *argv[])
   57: {
   58:     const char *fs = NULL;
   59: 
   60:     setlocale(LC_CTYPE, "");
   61:     setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
   62:     cmdname = argv[0];
   63:     if (argc == 1) {
   64:         fprintf(stderr, 
   65:           "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n", 
   66:           cmdname);
   67:         exit(1);
   68:     }
   69:     signal(SIGFPE, fpecatch);
   70:     yyin = NULL;
   71:     symtab = makesymtab(NSYMTAB/NSYMTAB);
   72:     while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
   73:         if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) {
   74:             printf("awk %s\n", version);
   75:             exit(0);
   76:             break;
   77:         }
   78:         if (strncmp(argv[1], "--", 2) == 0) {   /* explicit end of args */
   79:             argc--;
   80:             argv++;
   81:             break;
   82:         }
   83:         switch (argv[1][1]) {
   84:         case 's':
   85:             if (strcmp(argv[1], "-safe") == 0)
   86:                 safe = 1;
   87:             break;
   88:         case 'f':   /* next argument is program filename */
   89:             argc--;
   90:             argv++;
   91:             if (argc <= 1)
   92:                 FATAL("no program filename");
   93:             if (npfile >= MAX_PFILE - 1)
   94:                 FATAL("too many -f options"); 
   95:             pfile[npfile++] = argv[1];
   96:             break;
   97:         case 'F':   /* set field separator */
   98:             if (argv[1][2] != 0) {  /* arg is -Fsomething */
   99:                 if (argv[1][2] == 't' && argv[1][3] == 0)   /* wart: t=>\t */
  100:                     fs = "\t";
  101:                 else if (argv[1][2] != 0)
  102:                     fs = &argv[1][2];
  103:             } else {        /* arg is -F something */
  104:                 argc--; argv++;
  105:                 if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0)   /* wart: t=>\t */
  106:                     fs = "\t";
  107:                 else if (argc > 1 && argv[1][0] != 0)
  108:                     fs = &argv[1][0];
  109:             }
  110:             if (fs == NULL || *fs == '\0')
  111:                 WARNING("field separator FS is empty");
  112:             break;
  113:         case 'v':   /* -v a=1 to be done NOW.  one -v for each */
  114:             if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1]))
  115:                 setclvar(argv[1]);
  116:             else if (argv[1][2] != '\0')
  117:                 setclvar(&argv[1][2]);
  118:             break;
  119:         case 'd':
  120:             dbg = atoi(&argv[1][2]);
  121:             if (dbg == 0)
  122:                 dbg = 1;
  123:             printf("awk %s\n", version);
  124:             break;
  125:         default:
  126:             WARNING("unknown option %s ignored", argv[1]);
  127:             break;
  128:         }
  129:         argc--;
  130:         argv++;
  131:     }
  132:     /* argv[1] is now the first argument */
  133:     if (npfile == 0) {  /* no -f; first argument is program */
  134:         if (argc <= 1) {
  135:             if (dbg)
  136:                 exit(0);
  137:             FATAL("no program given");
  138:         }
  139:            dprintf( ("program = |%s|\n", argv[1]) );
  140:         lexprog = argv[1];
  141:         argc--;
  142:         argv++;
  143:     }
  144:     recinit(recsize);
  145:     syminit();
  146:     compile_time = 1;
  147:     argv[0] = cmdname;  /* put prog name at front of arglist */
  148:        dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
  149:     arginit(argc, argv);
  150:     if (!safe)
  151:         envinit(environ);
  152:     yyparse();
  153:     setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
  154:     if (fs)
  155:         *FS = qstring(fs, '\0');
  156:        dprintf( ("errorflag=%d\n", errorflag) );
  157:     if (errorflag == 0) {
  158:         compile_time = 0;
  159:         run(winner);
  160:     } else
  161:         bracecheck();
  162:     return(errorflag);
  163: }
  164: 
  165: int pgetc(void)     /* get 1 character from awk program */
  166: {
  167:     int c;
  168: 
  169:     for (;;) {
  170:         if (yyin == NULL) {
  171:             if (curpfile >= npfile)
  172:                 return EOF;
  173:             if (strcmp(pfile[curpfile], "-") == 0)
  174:                 yyin = stdin;
  175:             else if ((yyin = fopen(pfile[curpfile], "r")) == NULL)
  176:                 FATAL("can't open file %s", pfile[curpfile]);
  177:             lineno = 1;
  178:         }
  179:         if ((c = getc(yyin)) != EOF)
  180:             return c;
  181:         if (yyin != stdin)
  182:             fclose(yyin);
  183:         yyin = NULL;
  184:         curpfile++;
  185:     }
  186: }
  187: 
  188: char *cursource(void)   /* current source file name */
  189: {
  190:     if (npfile > 0)
  191:         return pfile[curpfile];
  192:     else
  193:         return NULL;
  194: }

CVSweb interface <joel.bertrand@systella.fr>