annotate code/cut.c__4.3bsd-uwisc.1986-11-07 @ 14:21ad1c1548c4

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