[9] | 1 | /*
|
---|
| 2 | * a small awk clone
|
---|
| 3 | *
|
---|
| 4 | * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi
|
---|
| 5 | *
|
---|
| 6 | * Absolutely no warranty. Use this software with your own risk.
|
---|
| 7 | *
|
---|
| 8 | * Permission to use, copy, modify and distribute this software for any
|
---|
| 9 | * purpose and without fee is hereby granted, provided that the above
|
---|
| 10 | * copyright and disclaimer notice.
|
---|
| 11 | *
|
---|
| 12 | * This program was written to fit into 64K+64K memory of the Minix 1.2.
|
---|
| 13 | */
|
---|
| 14 |
|
---|
| 15 |
|
---|
| 16 | #include <stdio.h>
|
---|
| 17 | #include <sys/types.h>
|
---|
| 18 | #include <signal.h>
|
---|
| 19 | #include "awk.h"
|
---|
| 20 |
|
---|
| 21 | extern char **FS, **FILENAME;
|
---|
| 22 | extern char record[];
|
---|
| 23 | extern FILE *ifp;
|
---|
| 24 |
|
---|
| 25 | NODE *parse();
|
---|
| 26 | CELL *execute();
|
---|
| 27 | FILE *efopen(), *fopen();
|
---|
| 28 | char *strsave();
|
---|
| 29 |
|
---|
| 30 | int xargc;
|
---|
| 31 | char **xargv;
|
---|
| 32 | char *srcprg;
|
---|
| 33 | FILE *pfp;
|
---|
| 34 | char *cmd;
|
---|
| 35 | #if 0
|
---|
| 36 | int iflg; /* interactive mode */
|
---|
| 37 | #endif
|
---|
| 38 |
|
---|
| 39 | main(argc, argv) char **argv;
|
---|
| 40 | {
|
---|
| 41 | char *s, *strpbrk(), *strchr();
|
---|
| 42 | void onint();
|
---|
| 43 |
|
---|
| 44 | #ifdef DOS
|
---|
| 45 | _sharg(&argc, &argv);
|
---|
| 46 | #endif
|
---|
| 47 | signal(SIGINT, onint);
|
---|
| 48 | signal(SIGFPE, onint);
|
---|
| 49 | cmd = argv[0];
|
---|
| 50 | init();
|
---|
| 51 | while (--argc > 0 && (*++argv)[0] == '-')
|
---|
| 52 | for (s = argv[0]+1; *s; s++)
|
---|
| 53 | if (strcmp(argv[0], "-") == 0)
|
---|
| 54 | break;
|
---|
| 55 | else
|
---|
| 56 | switch (*s) {
|
---|
| 57 | #if 0
|
---|
| 58 | case 'i':
|
---|
| 59 | iflg++;
|
---|
| 60 | pfp = stdin;
|
---|
| 61 | interactive();
|
---|
| 62 | /* no return */
|
---|
| 63 | #endif
|
---|
| 64 | case 'F':
|
---|
| 65 | *FS = ++s;
|
---|
| 66 | break;
|
---|
| 67 | case 'f':
|
---|
| 68 | if (*(s+1))
|
---|
| 69 | s++;
|
---|
| 70 | else {
|
---|
| 71 | argc--; s = *++argv;
|
---|
| 72 | }
|
---|
| 73 | pfp = efopen(s, "r");
|
---|
| 74 | s += strlen(s) - 1;
|
---|
| 75 | break;
|
---|
| 76 | }
|
---|
| 77 | xargc = argc; xargv = argv;
|
---|
| 78 | if (pfp == NULL && xargc > 0) {
|
---|
| 79 | srcprg = *xargv++; xargc--;
|
---|
| 80 | }
|
---|
| 81 | /*
|
---|
| 82 | if (pfp == NULL && xargc > 0) {
|
---|
| 83 | if (strpbrk(xargv[0], " !$^()={}[];<>,/~") != NULL) {
|
---|
| 84 | sprintf(record, "%s\n", xargv[0]);
|
---|
| 85 | srcprg = strsave(record);
|
---|
| 86 | }
|
---|
| 87 | else {
|
---|
| 88 | sprintf(record, "%s.awk", xargv[0]);
|
---|
| 89 | if ((pfp = fopen(record, "r")) == NULL)
|
---|
| 90 | error("can't open %s", record);
|
---|
| 91 | }
|
---|
| 92 | xargc--; xargv++;
|
---|
| 93 | }
|
---|
| 94 | */
|
---|
| 95 |
|
---|
| 96 | while (*xargv != NULL && strchr(*xargv, '=') != NULL) {
|
---|
| 97 | setvar(*xargv++);
|
---|
| 98 | xargc--;
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | initarg(cmd, xargc, xargv);
|
---|
| 102 | if (xargc == 0) {
|
---|
| 103 | ifp = stdin; *FILENAME = "-";
|
---|
| 104 | }
|
---|
| 105 | parse();
|
---|
| 106 | closeall();
|
---|
| 107 | exit(0);
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | FILE *
|
---|
| 111 | efopen(file, mode) char *file, *mode;
|
---|
| 112 | {
|
---|
| 113 | FILE *fp, *fopen();
|
---|
| 114 |
|
---|
| 115 | if ((fp = fopen(file, mode)) == NULL)
|
---|
| 116 | error("cannot open %s", file);
|
---|
| 117 | return fp;
|
---|
| 118 | }
|
---|
| 119 |
|
---|
| 120 | error(s, t) char *s, *t;
|
---|
| 121 | {
|
---|
| 122 | extern double *NR;
|
---|
| 123 |
|
---|
| 124 | fprintf(stderr, "awk: ");
|
---|
| 125 | fprintf(stderr, s, t);
|
---|
| 126 | fprintf(stderr, "\n");
|
---|
| 127 | if (NR != NULL) {
|
---|
| 128 | fprintf(stderr, "record number %g\n", *NR);
|
---|
| 129 | }
|
---|
| 130 | #ifdef DOS
|
---|
| 131 | closeall();
|
---|
| 132 | #endif
|
---|
| 133 | exit(1);
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 | void
|
---|
| 137 | onint(i)
|
---|
| 138 | {
|
---|
| 139 | closeall();
|
---|
| 140 | exit(0x80 | i);
|
---|
| 141 | }
|
---|