Blame


1 bc7cb1a1 2003-11-23 devnull /* join F1 F2 on stuff */
2 bc7cb1a1 2003-11-23 devnull #include <u.h>
3 bc7cb1a1 2003-11-23 devnull #include <libc.h>
4 bc7cb1a1 2003-11-23 devnull #include <stdio.h>
5 bc7cb1a1 2003-11-23 devnull #include <ctype.h>
6 bc7cb1a1 2003-11-23 devnull #define F1 0
7 bc7cb1a1 2003-11-23 devnull #define F2 1
8 bc7cb1a1 2003-11-23 devnull #define F0 3
9 bc7cb1a1 2003-11-23 devnull #define NFLD 100 /* max field per line */
10 bc7cb1a1 2003-11-23 devnull #define comp() runecmp(ppi[F1][j1],ppi[F2][j2])
11 bc7cb1a1 2003-11-23 devnull FILE *f[2];
12 bc7cb1a1 2003-11-23 devnull Rune buf[2][BUFSIZ]; /*input lines */
13 63002b3e 2014-03-03 0intro Rune *ppi[4][NFLD+1]; /* pointers to fields in lines */
14 bc7cb1a1 2003-11-23 devnull Rune *s1,*s2;
15 bc7cb1a1 2003-11-23 devnull #define j1 joinj1
16 bc7cb1a1 2003-11-23 devnull #define j2 joinj2
17 bc7cb1a1 2003-11-23 devnull
18 bc7cb1a1 2003-11-23 devnull int j1 = 1; /* join of this field of file 1 */
19 bc7cb1a1 2003-11-23 devnull int j2 = 1; /* join of this field of file 2 */
20 bc7cb1a1 2003-11-23 devnull int olist[2*NFLD]; /* output these fields */
21 bc7cb1a1 2003-11-23 devnull int olistf[2*NFLD]; /* from these files */
22 bc7cb1a1 2003-11-23 devnull int no; /* number of entries in olist */
23 bc7cb1a1 2003-11-23 devnull Rune sep1 = ' '; /* default field separator */
24 bc7cb1a1 2003-11-23 devnull Rune sep2 = '\t';
25 bc7cb1a1 2003-11-23 devnull char *sepstr=" ";
26 bc7cb1a1 2003-11-23 devnull int discard; /* count of truncated lines */
27 bc7cb1a1 2003-11-23 devnull Rune null[BUFSIZ]/* = L""*/;
28 bc7cb1a1 2003-11-23 devnull int a1;
29 bc7cb1a1 2003-11-23 devnull int a2;
30 bc7cb1a1 2003-11-23 devnull
31 bc7cb1a1 2003-11-23 devnull char *getoptarg(int*, char***);
32 bc7cb1a1 2003-11-23 devnull void output(int, int);
33 bc7cb1a1 2003-11-23 devnull int input(int);
34 bc7cb1a1 2003-11-23 devnull void oparse(char*);
35 bc7cb1a1 2003-11-23 devnull void error(char*, char*);
36 bc7cb1a1 2003-11-23 devnull void seek1(void), seek2(void);
37 bc7cb1a1 2003-11-23 devnull Rune *strtorune(Rune *, char *);
38 bc7cb1a1 2003-11-23 devnull
39 bc7cb1a1 2003-11-23 devnull
40 bc7cb1a1 2003-11-23 devnull void
41 bc7cb1a1 2003-11-23 devnull main(int argc, char **argv)
42 bc7cb1a1 2003-11-23 devnull {
43 bc7cb1a1 2003-11-23 devnull int i;
44 bc7cb1a1 2003-11-23 devnull
45 bc7cb1a1 2003-11-23 devnull while (argc > 1 && argv[1][0] == '-') {
46 bc7cb1a1 2003-11-23 devnull if (argv[1][1] == '\0')
47 bc7cb1a1 2003-11-23 devnull break;
48 bc7cb1a1 2003-11-23 devnull switch (argv[1][1]) {
49 bc7cb1a1 2003-11-23 devnull case '-':
50 bc7cb1a1 2003-11-23 devnull argc--;
51 bc7cb1a1 2003-11-23 devnull argv++;
52 bc7cb1a1 2003-11-23 devnull goto proceed;
53 bc7cb1a1 2003-11-23 devnull case 'a':
54 bc7cb1a1 2003-11-23 devnull switch(*getoptarg(&argc, &argv)) {
55 bc7cb1a1 2003-11-23 devnull case '1':
56 bc7cb1a1 2003-11-23 devnull a1++;
57 bc7cb1a1 2003-11-23 devnull break;
58 bc7cb1a1 2003-11-23 devnull case '2':
59 bc7cb1a1 2003-11-23 devnull a2++;
60 bc7cb1a1 2003-11-23 devnull break;
61 bc7cb1a1 2003-11-23 devnull default:
62 bc7cb1a1 2003-11-23 devnull error("incomplete option -a","");
63 bc7cb1a1 2003-11-23 devnull }
64 bc7cb1a1 2003-11-23 devnull break;
65 bc7cb1a1 2003-11-23 devnull case 'e':
66 bc7cb1a1 2003-11-23 devnull strtorune(null, getoptarg(&argc, &argv));
67 bc7cb1a1 2003-11-23 devnull break;
68 bc7cb1a1 2003-11-23 devnull case 't':
69 bc7cb1a1 2003-11-23 devnull sepstr=getoptarg(&argc, &argv);
70 bc7cb1a1 2003-11-23 devnull chartorune(&sep1, sepstr);
71 bc7cb1a1 2003-11-23 devnull sep2 = sep1;
72 bc7cb1a1 2003-11-23 devnull break;
73 bc7cb1a1 2003-11-23 devnull case 'o':
74 bc7cb1a1 2003-11-23 devnull if(argv[1][2]!=0 ||
75 bc7cb1a1 2003-11-23 devnull argc>2 && strchr(argv[2],',')!=0)
76 bc7cb1a1 2003-11-23 devnull oparse(getoptarg(&argc, &argv));
77 bc7cb1a1 2003-11-23 devnull else for (no = 0; no<2*NFLD && argc>2; no++){
78 bc7cb1a1 2003-11-23 devnull if (argv[2][0] == '1' && argv[2][1] == '.') {
79 bc7cb1a1 2003-11-23 devnull olistf[no] = F1;
80 bc7cb1a1 2003-11-23 devnull olist[no] = atoi(&argv[2][2]);
81 bc7cb1a1 2003-11-23 devnull } else if (argv[2][0] == '2' && argv[2][1] == '.') {
82 bc7cb1a1 2003-11-23 devnull olist[no] = atoi(&argv[2][2]);
83 bc7cb1a1 2003-11-23 devnull olistf[no] = F2;
84 bc7cb1a1 2003-11-23 devnull } else if (argv[2][0] == '0')
85 bc7cb1a1 2003-11-23 devnull olistf[no] = F0;
86 bc7cb1a1 2003-11-23 devnull else
87 bc7cb1a1 2003-11-23 devnull break;
88 bc7cb1a1 2003-11-23 devnull argc--;
89 bc7cb1a1 2003-11-23 devnull argv++;
90 bc7cb1a1 2003-11-23 devnull }
91 bc7cb1a1 2003-11-23 devnull break;
92 bc7cb1a1 2003-11-23 devnull case 'j':
93 bc7cb1a1 2003-11-23 devnull if(argc <= 2)
94 bc7cb1a1 2003-11-23 devnull break;
95 bc7cb1a1 2003-11-23 devnull if (argv[1][2] == '1')
96 bc7cb1a1 2003-11-23 devnull j1 = atoi(argv[2]);
97 bc7cb1a1 2003-11-23 devnull else if (argv[1][2] == '2')
98 bc7cb1a1 2003-11-23 devnull j2 = atoi(argv[2]);
99 bc7cb1a1 2003-11-23 devnull else
100 bc7cb1a1 2003-11-23 devnull j1 = j2 = atoi(argv[2]);
101 bc7cb1a1 2003-11-23 devnull argc--;
102 bc7cb1a1 2003-11-23 devnull argv++;
103 bc7cb1a1 2003-11-23 devnull break;
104 bc7cb1a1 2003-11-23 devnull case '1':
105 bc7cb1a1 2003-11-23 devnull j1 = atoi(getoptarg(&argc, &argv));
106 bc7cb1a1 2003-11-23 devnull break;
107 bc7cb1a1 2003-11-23 devnull case '2':
108 bc7cb1a1 2003-11-23 devnull j2 = atoi(getoptarg(&argc, &argv));
109 bc7cb1a1 2003-11-23 devnull break;
110 bc7cb1a1 2003-11-23 devnull }
111 bc7cb1a1 2003-11-23 devnull argc--;
112 bc7cb1a1 2003-11-23 devnull argv++;
113 bc7cb1a1 2003-11-23 devnull }
114 bc7cb1a1 2003-11-23 devnull proceed:
115 bc7cb1a1 2003-11-23 devnull for (i = 0; i < no; i++)
116 bc7cb1a1 2003-11-23 devnull if (olist[i]-- > NFLD) /* 0 origin */
117 bc7cb1a1 2003-11-23 devnull error("field number too big in -o","");
118 bc7cb1a1 2003-11-23 devnull if (argc != 3)
119 bc7cb1a1 2003-11-23 devnull error("usage: join [-1 x -2 y] [-o list] file1 file2","");
120 bc7cb1a1 2003-11-23 devnull j1--;
121 bc7cb1a1 2003-11-23 devnull j2--; /* everyone else believes in 0 origin */
122 bc7cb1a1 2003-11-23 devnull s1 = ppi[F1][j1];
123 bc7cb1a1 2003-11-23 devnull s2 = ppi[F2][j2];
124 bc7cb1a1 2003-11-23 devnull if (strcmp(argv[1], "-") == 0)
125 bc7cb1a1 2003-11-23 devnull f[F1] = stdin;
126 bc7cb1a1 2003-11-23 devnull else if ((f[F1] = fopen(argv[1], "r")) == 0)
127 bc7cb1a1 2003-11-23 devnull error("can't open %s", argv[1]);
128 bc7cb1a1 2003-11-23 devnull if(strcmp(argv[2], "-") == 0) {
129 bc7cb1a1 2003-11-23 devnull f[F2] = stdin;
130 bc7cb1a1 2003-11-23 devnull } else if ((f[F2] = fopen(argv[2], "r")) == 0)
131 bc7cb1a1 2003-11-23 devnull error("can't open %s", argv[2]);
132 bc7cb1a1 2003-11-23 devnull
133 bc7cb1a1 2003-11-23 devnull if(ftell(f[F2]) >= 0)
134 bc7cb1a1 2003-11-23 devnull seek2();
135 bc7cb1a1 2003-11-23 devnull else if(ftell(f[F1]) >= 0)
136 bc7cb1a1 2003-11-23 devnull seek1();
137 bc7cb1a1 2003-11-23 devnull else
138 bc7cb1a1 2003-11-23 devnull error("neither file is randomly accessible","");
139 bc7cb1a1 2003-11-23 devnull if (discard)
140 bc7cb1a1 2003-11-23 devnull error("some input line was truncated", "");
141 bc7cb1a1 2003-11-23 devnull exits("");
142 bc7cb1a1 2003-11-23 devnull }
143 bc7cb1a1 2003-11-23 devnull int runecmp(Rune *a, Rune *b){
144 bc7cb1a1 2003-11-23 devnull while(*a==*b){
145 bc7cb1a1 2003-11-23 devnull if(*a=='\0') return 0;
146 bc7cb1a1 2003-11-23 devnull a++;
147 bc7cb1a1 2003-11-23 devnull b++;
148 bc7cb1a1 2003-11-23 devnull }
149 bc7cb1a1 2003-11-23 devnull if(*a<*b) return -1;
150 bc7cb1a1 2003-11-23 devnull return 1;
151 bc7cb1a1 2003-11-23 devnull }
152 bc7cb1a1 2003-11-23 devnull char *runetostr(char *buf, Rune *r){
153 bc7cb1a1 2003-11-23 devnull char *s;
154 bc7cb1a1 2003-11-23 devnull for(s=buf;*r;r++) s+=runetochar(s, r);
155 bc7cb1a1 2003-11-23 devnull *s='\0';
156 bc7cb1a1 2003-11-23 devnull return buf;
157 bc7cb1a1 2003-11-23 devnull }
158 bc7cb1a1 2003-11-23 devnull Rune *strtorune(Rune *buf, char *s){
159 bc7cb1a1 2003-11-23 devnull Rune *r;
160 bc7cb1a1 2003-11-23 devnull for(r=buf;*s;r++) s+=chartorune(r, s);
161 bc7cb1a1 2003-11-23 devnull *r='\0';
162 bc7cb1a1 2003-11-23 devnull return buf;
163 bc7cb1a1 2003-11-23 devnull }
164 bc7cb1a1 2003-11-23 devnull /* lazy. there ought to be a clean way to combine seek1 & seek2 */
165 bc7cb1a1 2003-11-23 devnull #define get1() n1=input(F1)
166 bc7cb1a1 2003-11-23 devnull #define get2() n2=input(F2)
167 bc7cb1a1 2003-11-23 devnull void
168 2b604081 2005-05-07 devnull seek2(void)
169 bc7cb1a1 2003-11-23 devnull {
170 bc7cb1a1 2003-11-23 devnull int n1, n2;
171 bc7cb1a1 2003-11-23 devnull int top2=0;
172 bc7cb1a1 2003-11-23 devnull int bot2 = ftell(f[F2]);
173 bc7cb1a1 2003-11-23 devnull get1();
174 bc7cb1a1 2003-11-23 devnull get2();
175 bc7cb1a1 2003-11-23 devnull while(n1>0 && n2>0 || (a1||a2) && n1+n2>0) {
176 bc7cb1a1 2003-11-23 devnull if(n1>0 && n2>0 && comp()>0 || n1==0) {
177 bc7cb1a1 2003-11-23 devnull if(a2) output(0, n2);
178 bc7cb1a1 2003-11-23 devnull bot2 = ftell(f[F2]);
179 bc7cb1a1 2003-11-23 devnull get2();
180 bc7cb1a1 2003-11-23 devnull } else if(n1>0 && n2>0 && comp()<0 || n2==0) {
181 bc7cb1a1 2003-11-23 devnull if(a1) output(n1, 0);
182 bc7cb1a1 2003-11-23 devnull get1();
183 bc7cb1a1 2003-11-23 devnull } else /*(n1>0 && n2>0 && comp()==0)*/ {
184 bc7cb1a1 2003-11-23 devnull while(n2>0 && comp()==0) {
185 bc7cb1a1 2003-11-23 devnull output(n1, n2);
186 bc7cb1a1 2003-11-23 devnull top2 = ftell(f[F2]);
187 bc7cb1a1 2003-11-23 devnull get2();
188 bc7cb1a1 2003-11-23 devnull }
189 bc7cb1a1 2003-11-23 devnull fseek(f[F2], bot2, 0);
190 bc7cb1a1 2003-11-23 devnull get2();
191 bc7cb1a1 2003-11-23 devnull get1();
192 bc7cb1a1 2003-11-23 devnull for(;;) {
193 bc7cb1a1 2003-11-23 devnull if(n1>0 && n2>0 && comp()==0) {
194 bc7cb1a1 2003-11-23 devnull output(n1, n2);
195 bc7cb1a1 2003-11-23 devnull get2();
196 bc7cb1a1 2003-11-23 devnull } else if(n1>0 && n2>0 && comp()<0 || n2==0) {
197 bc7cb1a1 2003-11-23 devnull fseek(f[F2], bot2, 0);
198 bc7cb1a1 2003-11-23 devnull get2();
199 bc7cb1a1 2003-11-23 devnull get1();
200 bc7cb1a1 2003-11-23 devnull } else /*(n1>0 && n2>0 && comp()>0 || n1==0)*/{
201 bc7cb1a1 2003-11-23 devnull fseek(f[F2], top2, 0);
202 bc7cb1a1 2003-11-23 devnull bot2 = top2;
203 bc7cb1a1 2003-11-23 devnull get2();
204 bc7cb1a1 2003-11-23 devnull break;
205 bc7cb1a1 2003-11-23 devnull }
206 bc7cb1a1 2003-11-23 devnull }
207 bc7cb1a1 2003-11-23 devnull }
208 bc7cb1a1 2003-11-23 devnull }
209 bc7cb1a1 2003-11-23 devnull }
210 bc7cb1a1 2003-11-23 devnull void
211 2b604081 2005-05-07 devnull seek1(void)
212 bc7cb1a1 2003-11-23 devnull {
213 bc7cb1a1 2003-11-23 devnull int n1, n2;
214 bc7cb1a1 2003-11-23 devnull int top1=0;
215 bc7cb1a1 2003-11-23 devnull int bot1 = ftell(f[F1]);
216 bc7cb1a1 2003-11-23 devnull get1();
217 bc7cb1a1 2003-11-23 devnull get2();
218 bc7cb1a1 2003-11-23 devnull while(n1>0 && n2>0 || (a1||a2) && n1+n2>0) {
219 bc7cb1a1 2003-11-23 devnull if(n1>0 && n2>0 && comp()>0 || n1==0) {
220 bc7cb1a1 2003-11-23 devnull if(a2) output(0, n2);
221 bc7cb1a1 2003-11-23 devnull get2();
222 bc7cb1a1 2003-11-23 devnull } else if(n1>0 && n2>0 && comp()<0 || n2==0) {
223 bc7cb1a1 2003-11-23 devnull if(a1) output(n1, 0);
224 bc7cb1a1 2003-11-23 devnull bot1 = ftell(f[F1]);
225 bc7cb1a1 2003-11-23 devnull get1();
226 bc7cb1a1 2003-11-23 devnull } else /*(n1>0 && n2>0 && comp()==0)*/ {
227 bc7cb1a1 2003-11-23 devnull while(n2>0 && comp()==0) {
228 bc7cb1a1 2003-11-23 devnull output(n1, n2);
229 bc7cb1a1 2003-11-23 devnull top1 = ftell(f[F1]);
230 bc7cb1a1 2003-11-23 devnull get1();
231 bc7cb1a1 2003-11-23 devnull }
232 bc7cb1a1 2003-11-23 devnull fseek(f[F1], bot1, 0);
233 bc7cb1a1 2003-11-23 devnull get2();
234 bc7cb1a1 2003-11-23 devnull get1();
235 bc7cb1a1 2003-11-23 devnull for(;;) {
236 bc7cb1a1 2003-11-23 devnull if(n1>0 && n2>0 && comp()==0) {
237 bc7cb1a1 2003-11-23 devnull output(n1, n2);
238 bc7cb1a1 2003-11-23 devnull get1();
239 bc7cb1a1 2003-11-23 devnull } else if(n1>0 && n2>0 && comp()>0 || n1==0) {
240 bc7cb1a1 2003-11-23 devnull fseek(f[F1], bot1, 0);
241 bc7cb1a1 2003-11-23 devnull get2();
242 bc7cb1a1 2003-11-23 devnull get1();
243 bc7cb1a1 2003-11-23 devnull } else /*(n1>0 && n2>0 && comp()<0 || n2==0)*/{
244 bc7cb1a1 2003-11-23 devnull fseek(f[F1], top1, 0);
245 bc7cb1a1 2003-11-23 devnull bot1 = top1;
246 bc7cb1a1 2003-11-23 devnull get1();
247 bc7cb1a1 2003-11-23 devnull break;
248 bc7cb1a1 2003-11-23 devnull }
249 bc7cb1a1 2003-11-23 devnull }
250 bc7cb1a1 2003-11-23 devnull }
251 bc7cb1a1 2003-11-23 devnull }
252 bc7cb1a1 2003-11-23 devnull }
253 bc7cb1a1 2003-11-23 devnull
254 bc7cb1a1 2003-11-23 devnull int
255 bc7cb1a1 2003-11-23 devnull input(int n) /* get input line and split into fields */
256 bc7cb1a1 2003-11-23 devnull {
257 bc7cb1a1 2003-11-23 devnull register int i, c;
258 bc7cb1a1 2003-11-23 devnull Rune *bp;
259 bc7cb1a1 2003-11-23 devnull Rune **pp;
260 bc7cb1a1 2003-11-23 devnull char line[BUFSIZ];
261 bc7cb1a1 2003-11-23 devnull
262 bc7cb1a1 2003-11-23 devnull bp = buf[n];
263 bc7cb1a1 2003-11-23 devnull pp = ppi[n];
264 bc7cb1a1 2003-11-23 devnull if (fgets(line, BUFSIZ, f[n]) == 0)
265 bc7cb1a1 2003-11-23 devnull return(0);
266 bc7cb1a1 2003-11-23 devnull strtorune(bp, line);
267 bc7cb1a1 2003-11-23 devnull i = 0;
268 bc7cb1a1 2003-11-23 devnull do {
269 bc7cb1a1 2003-11-23 devnull i++;
270 bc7cb1a1 2003-11-23 devnull if (sep1 == ' ') /* strip multiples */
271 bc7cb1a1 2003-11-23 devnull while ((c = *bp) == sep1 || c == sep2)
272 bc7cb1a1 2003-11-23 devnull bp++; /* skip blanks */
273 bc7cb1a1 2003-11-23 devnull *pp++ = bp; /* record beginning */
274 bc7cb1a1 2003-11-23 devnull while ((c = *bp) != sep1 && c != '\n' && c != sep2 && c != '\0')
275 bc7cb1a1 2003-11-23 devnull bp++;
276 bc7cb1a1 2003-11-23 devnull *bp++ = '\0'; /* mark end by overwriting blank */
277 bc7cb1a1 2003-11-23 devnull } while (c != '\n' && c != '\0' && i < NFLD-1);
278 bc7cb1a1 2003-11-23 devnull if (c != '\n')
279 bc7cb1a1 2003-11-23 devnull discard++;
280 bc7cb1a1 2003-11-23 devnull
281 bc7cb1a1 2003-11-23 devnull *pp = 0;
282 bc7cb1a1 2003-11-23 devnull return(i);
283 bc7cb1a1 2003-11-23 devnull }
284 bc7cb1a1 2003-11-23 devnull
285 bc7cb1a1 2003-11-23 devnull void
286 bc7cb1a1 2003-11-23 devnull output(int on1, int on2) /* print items from olist */
287 bc7cb1a1 2003-11-23 devnull {
288 bc7cb1a1 2003-11-23 devnull int i;
289 bc7cb1a1 2003-11-23 devnull Rune *temp;
290 bc7cb1a1 2003-11-23 devnull char buf[BUFSIZ];
291 bc7cb1a1 2003-11-23 devnull
292 bc7cb1a1 2003-11-23 devnull if (no <= 0) { /* default case */
293 bc7cb1a1 2003-11-23 devnull printf("%s", runetostr(buf, on1? ppi[F1][j1]: ppi[F2][j2]));
294 bc7cb1a1 2003-11-23 devnull for (i = 0; i < on1; i++)
295 bc7cb1a1 2003-11-23 devnull if (i != j1)
296 bc7cb1a1 2003-11-23 devnull printf("%s%s", sepstr, runetostr(buf, ppi[F1][i]));
297 bc7cb1a1 2003-11-23 devnull for (i = 0; i < on2; i++)
298 bc7cb1a1 2003-11-23 devnull if (i != j2)
299 bc7cb1a1 2003-11-23 devnull printf("%s%s", sepstr, runetostr(buf, ppi[F2][i]));
300 bc7cb1a1 2003-11-23 devnull printf("\n");
301 bc7cb1a1 2003-11-23 devnull } else {
302 bc7cb1a1 2003-11-23 devnull for (i = 0; i < no; i++) {
303 bc7cb1a1 2003-11-23 devnull if (olistf[i]==F0 && on1>j1)
304 bc7cb1a1 2003-11-23 devnull temp = ppi[F1][j1];
305 bc7cb1a1 2003-11-23 devnull else if (olistf[i]==F0 && on2>j2)
306 bc7cb1a1 2003-11-23 devnull temp = ppi[F2][j2];
307 bc7cb1a1 2003-11-23 devnull else {
308 bc7cb1a1 2003-11-23 devnull temp = ppi[olistf[i]][olist[i]];
309 bc7cb1a1 2003-11-23 devnull if(olistf[i]==F1 && on1<=olist[i] ||
310 bc7cb1a1 2003-11-23 devnull olistf[i]==F2 && on2<=olist[i] ||
311 bc7cb1a1 2003-11-23 devnull *temp==0)
312 bc7cb1a1 2003-11-23 devnull temp = null;
313 bc7cb1a1 2003-11-23 devnull }
314 bc7cb1a1 2003-11-23 devnull printf("%s", runetostr(buf, temp));
315 bc7cb1a1 2003-11-23 devnull if (i == no - 1)
316 bc7cb1a1 2003-11-23 devnull printf("\n");
317 bc7cb1a1 2003-11-23 devnull else
318 bc7cb1a1 2003-11-23 devnull printf("%s", sepstr);
319 bc7cb1a1 2003-11-23 devnull }
320 bc7cb1a1 2003-11-23 devnull }
321 bc7cb1a1 2003-11-23 devnull }
322 bc7cb1a1 2003-11-23 devnull
323 bc7cb1a1 2003-11-23 devnull void
324 bc7cb1a1 2003-11-23 devnull error(char *s1, char *s2)
325 bc7cb1a1 2003-11-23 devnull {
326 bc7cb1a1 2003-11-23 devnull fprintf(stderr, "join: ");
327 bc7cb1a1 2003-11-23 devnull fprintf(stderr, s1, s2);
328 bc7cb1a1 2003-11-23 devnull fprintf(stderr, "\n");
329 bc7cb1a1 2003-11-23 devnull exits(s1);
330 bc7cb1a1 2003-11-23 devnull }
331 bc7cb1a1 2003-11-23 devnull
332 bc7cb1a1 2003-11-23 devnull char *
333 bc7cb1a1 2003-11-23 devnull getoptarg(int *argcp, char ***argvp)
334 bc7cb1a1 2003-11-23 devnull {
335 bc7cb1a1 2003-11-23 devnull int argc = *argcp;
336 bc7cb1a1 2003-11-23 devnull char **argv = *argvp;
337 bc7cb1a1 2003-11-23 devnull if(argv[1][2] != 0)
338 bc7cb1a1 2003-11-23 devnull return &argv[1][2];
339 bc7cb1a1 2003-11-23 devnull if(argc<=2 || argv[2][0]=='-')
340 bc7cb1a1 2003-11-23 devnull error("incomplete option %s", argv[1]);
341 bc7cb1a1 2003-11-23 devnull *argcp = argc-1;
342 bc7cb1a1 2003-11-23 devnull *argvp = ++argv;
343 bc7cb1a1 2003-11-23 devnull return argv[1];
344 bc7cb1a1 2003-11-23 devnull }
345 bc7cb1a1 2003-11-23 devnull
346 bc7cb1a1 2003-11-23 devnull void
347 bc7cb1a1 2003-11-23 devnull oparse(char *s)
348 bc7cb1a1 2003-11-23 devnull {
349 bc7cb1a1 2003-11-23 devnull for (no = 0; no<2*NFLD && *s; no++, s++) {
350 bc7cb1a1 2003-11-23 devnull switch(*s) {
351 bc7cb1a1 2003-11-23 devnull case 0:
352 bc7cb1a1 2003-11-23 devnull return;
353 bc7cb1a1 2003-11-23 devnull case '0':
354 bc7cb1a1 2003-11-23 devnull olistf[no] = F0;
355 bc7cb1a1 2003-11-23 devnull break;
356 bc7cb1a1 2003-11-23 devnull case '1':
357 bc7cb1a1 2003-11-23 devnull case '2':
358 1c171e3a 2005-07-19 devnull if(s[1] == '.' && isdigit((uchar)s[2])) {
359 bc7cb1a1 2003-11-23 devnull olistf[no] = *s=='1'? F1: F2;
360 bc7cb1a1 2003-11-23 devnull olist[no] = atoi(s += 2);
361 bc7cb1a1 2003-11-23 devnull break;
362 bc7cb1a1 2003-11-23 devnull } /* fall thru */
363 bc7cb1a1 2003-11-23 devnull default:
364 bc7cb1a1 2003-11-23 devnull error("invalid -o list", "");
365 bc7cb1a1 2003-11-23 devnull }
366 bc7cb1a1 2003-11-23 devnull if(s[1] == ',')
367 bc7cb1a1 2003-11-23 devnull s++;
368 bc7cb1a1 2003-11-23 devnull }
369 bc7cb1a1 2003-11-23 devnull }