Mercurial > docs > cut
annotate code/cut.c__system_iii.1980-04-11 @ 41:e2961496d097 default tip
Add script to generate the PDFs
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Tue, 10 Nov 2015 21:13:22 +0100 |
parents | 21ad1c1548c4 |
children |
rev | line source |
---|---|
14
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
1 # |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
2 /* cut : cut and paste columns of a table (projection of a relation) (GWRL) */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
3 /* Release 1.5; handles single backspaces as produced by nroff */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
4 # include <stdio.h> /* make: cc cut.c */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
5 # define NFIELDS 512 /* max no of fields or resulting line length */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
6 # define BACKSPACE 8 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
7 main(argc, argv) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
8 int argc; char **argv; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
9 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
10 int del = '\t'; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
11 int i, j, count, poscnt, r, s, t; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
12 int endflag, supflag, cflag, fflag, backflag, filenr; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
13 int sel[NFIELDS]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
14 register int c; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
15 register char *p1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
16 char *p2, outbuf[NFIELDS]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
17 FILE *inptr; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
18 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
19 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
20 while (argc > 1 && argv[1][0] == '-'){ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
21 for (i = 1; (c = argv[1][i]) != '\0'; i++) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
22 switch(c) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
23 case 'd' : del = argv[1][++i]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
24 if (del == '\0') diag("no delimiter\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
25 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
26 case 's': supflag++ ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
27 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
28 case 'c': cflag++ ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
29 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
30 case 'f': fflag++ ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
31 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
32 default : diag("Usage: cut [-s] [-d<char>] {-c<list> | -f<list>} file ...\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
33 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
34 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
35 if (!endflag && (cflag || fflag)) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
36 endflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
37 r = s = t = 0; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
38 do { c = argv[1][++i]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
39 switch(c) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
40 case '-' : if (r) diagl(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
41 r = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
42 if (t == 0) s = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
43 else {s = t; t = 0;} |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
44 continue; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
45 case '\0' : |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
46 case ',' : if (t >= NFIELDS) diagl(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
47 if (r) { if (t == 0) t = NFIELDS - 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
48 if (t<s) diagl(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
49 for(j = s; j <= t; j++) sel[j] = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
50 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
51 else sel[t] = (t > 0 ? 1 : 0); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
52 r = s = t = 0; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
53 if (c == '\0') {i--; break;} |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
54 continue; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
55 default : |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
56 if (c< '0' || c> '9') diagl(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
57 t = 10*t + c - '0'; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
58 continue; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
59 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
60 for (j = t = 0; j < NFIELDS; j++) t += sel[j]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
61 if (t == 0) diag("no fields\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
62 } while (c != '\0'); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
63 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
64 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
65 --argc; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
66 ++argv; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
67 } /* end options */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
68 if (!(cflag || fflag)) diagl(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
69 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
70 --argc; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
71 filenr = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
72 do { /* for all input files */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
73 if (argc > 0) inptr = fopen(argv[filenr], "r"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
74 else inptr = stdin; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
75 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
76 if (inptr == NULL) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
77 write(2,"Cannot open :",14); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
78 diag(argv[filenr]); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
79 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
80 endflag = 0; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
81 do { /* for all lines of a file */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
82 count = poscnt = backflag = 0; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
83 p1 = &outbuf[0] - 1 ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
84 p2 = p1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
85 do { /* for all char of the line */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
86 c = fgetc(inptr); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
87 if (c == EOF) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
88 endflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
89 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
90 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
91 if (count == NFIELDS - 1) diag("line too long\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
92 if (c != '\n') *++p1 = c; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
93 if (cflag && (c == BACKSPACE)) backflag++ ; else |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
94 { if ( !backflag ) poscnt += 1 ; else backflag-- ;} |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
95 if ( backflag > 1 ) diag("cannot handle multiple adjacent backspaces\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
96 if ( ((c == '\n') && count > 0) || c == del || cflag) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
97 count += 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
98 if (fflag) poscnt = count ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
99 if (sel[poscnt]) p2 = p1; else p1 = p2; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
100 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
101 }while (c != '\n'); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
102 if ( !endflag && (count > 0 || !supflag)) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
103 if (*p1 == del) *p1 = '\0'; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
104 else *++p1 = '\0'; /*suppress trailing delimiter*/ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
105 puts(outbuf); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
106 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
107 } while (!endflag) ; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
108 fclose(inptr); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
109 } while(++filenr <= argc); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
110 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
111 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
112 diag(s) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
113 char *s; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
114 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
115 write(2, "cut : ", 6); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
116 while(*s) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
117 write(2,s++,1); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
118 exit(2); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
119 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
120 diagl() |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
121 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
122 diag("bad list for c/f option\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
123 } |