Commit | Line | Data |
---|---|---|
c1c3fa19 EA |
1 | # include "../hdr/defines.h" |
2 | # include "../hdr/had.h" | |
3 | ||
38c01699 | 4 | static char Sccsid[] = "@(#)comb.c 4.3 %G%"; |
c1c3fa19 EA |
5 | USXALLOC(); |
6 | ||
7 | struct packet gpkt; | |
8 | struct sid sid; | |
9 | int num_files; | |
10 | char had[26]; | |
11 | char *clist; | |
12 | int *Cvec; | |
13 | int Cnt; | |
14 | FILE *iop; | |
15 | ||
16 | main(argc,argv) | |
17 | int argc; | |
18 | register char *argv[]; | |
19 | { | |
20 | register int i; | |
21 | register char *p; | |
22 | char c; | |
23 | int testmore; | |
24 | extern comb(); | |
25 | extern int Fcnt; | |
26 | ||
27 | Fflags = FTLEXIT | FTLMSG | FTLCLN; | |
28 | for(i = 1; i < argc; i++) | |
29 | if(argv[i][0] == '-' && (c=argv[i][1])) { | |
30 | p = &argv[i][2]; | |
31 | testmore = 0; | |
32 | switch (c) { | |
33 | ||
34 | case 'p': | |
35 | if (!p[0]) { | |
36 | argv[i] = 0; | |
37 | continue; | |
38 | } | |
39 | chksid(sid_ab(p,&sid),&sid); | |
40 | break; | |
41 | case 'c': | |
42 | clist = p; | |
43 | break; | |
44 | case 'o': | |
45 | testmore++; | |
46 | break; | |
47 | case 's': | |
48 | testmore++; | |
49 | break; | |
50 | default: | |
51 | fatal("unknown key letter (cm1)"); | |
52 | } | |
53 | ||
54 | if (testmore) { | |
55 | testmore = 0; | |
56 | if (*p) | |
57 | fatal(sprintf(Error, | |
58 | "value after %c arg (cm7)",c)); | |
59 | } | |
60 | if (had[c - 'a']++) | |
61 | fatal("key letter twice (cm2)"); | |
62 | argv[i] = 0; | |
63 | } | |
64 | else num_files++; | |
65 | ||
66 | if(num_files == 0) | |
67 | fatal("missing file arg (cm3)"); | |
68 | if (HADP && HADC) | |
69 | fatal("can't have both -p and -c (cb2)"); | |
70 | setsig(); | |
38c01699 JL |
71 | Fflags &= ~FTLEXIT; |
72 | Fflags |= FTLJMP; | |
c1c3fa19 EA |
73 | iop = stdout; |
74 | for (i = 1; i < argc; i++) | |
75 | if (p=argv[i]) | |
76 | do_file(p,comb); | |
77 | fclose(iop); | |
78 | exit(Fcnt ? 1 : 0); | |
79 | } | |
80 | ||
81 | ||
82 | comb(file) | |
83 | { | |
84 | register int i, n; | |
85 | register struct idel *rdp; | |
86 | char *p; | |
87 | int succnt; | |
88 | struct sid *sp; | |
89 | extern char had_dir, had_standinp; | |
90 | extern char *Sflags[]; | |
91 | struct stats stats; | |
92 | ||
93 | if (setjmp(Fjmp)) | |
94 | return; | |
95 | sinit(&gpkt, file, 1); | |
96 | gpkt.p_verbose = -1; | |
97 | gpkt.p_stdout = stderr; | |
98 | if (gpkt.p_verbose && (num_files > 1 || had_dir || had_standinp)) | |
99 | fprintf(gpkt.p_stdout,"\n%s:\n",gpkt.p_file); | |
100 | if (exists(auxf(gpkt.p_file, 'p'))) | |
101 | fatal("p-file exists (cb1)"); | |
102 | ||
103 | if (dodelt(&gpkt,&stats,0,0) == 0) | |
104 | fmterr(&gpkt); | |
105 | ||
106 | Cvec = alloc(n = ((maxser(&gpkt) + 1) * sizeof(*Cvec))); | |
5409addc | 107 | bzero(Cvec, n); |
c1c3fa19 EA |
108 | Cnt = 0; |
109 | ||
110 | if (HADP) { | |
111 | if (!(n = sidtoser(&sid, &gpkt))) | |
112 | fatal("sid doesn't exist (cb3)"); | |
113 | while (n <= maxser(&gpkt)) | |
114 | Cvec[Cnt++] = n++; | |
115 | } | |
116 | else if (HADC) { | |
117 | dolist(&gpkt, clist, 0); | |
118 | } | |
119 | else { | |
120 | rdp = gpkt.p_idel; | |
121 | for (i = 1; i <= maxser(&gpkt); i++) { | |
122 | succnt = 0; | |
123 | for (n = i + 1; n <= maxser(&gpkt); n++) | |
124 | if (rdp[n].i_pred == i) | |
125 | succnt++; | |
126 | if (succnt != 1) | |
127 | Cvec[Cnt++] = i; | |
128 | } | |
129 | } | |
130 | finduser(&gpkt); | |
131 | doflags(&gpkt); | |
132 | fclose(gpkt.p_iop); | |
133 | gpkt.p_iop = 0; | |
134 | if (!Cnt) | |
135 | fatal("nothing to do (cb4)"); | |
136 | rdp = gpkt.p_idel; | |
137 | sp = prtget(rdp, Cvec[0], iop, gpkt.p_file); | |
138 | fprintf(iop, "admin -iCOMB -r%d s.COMB\n", sp->s_rel); | |
139 | fprintf(iop, "rm -f COMB\n"); | |
140 | for (i = 1; i < Cnt; i++) { | |
141 | n = getpred(rdp, Cvec, i); | |
142 | if (HADO) | |
143 | fprintf(iop, "get -s -r%d -g -e -t s.COMB\n", | |
144 | rdp[Cvec[i]].i_sid.s_rel); | |
145 | else | |
146 | fprintf(iop, "get -s -a%d -r%d -g -e s.COMB\n", | |
147 | n + 1, rdp[Cvec[i]].i_sid.s_rel); | |
148 | prtget(rdp, Cvec[i], iop, gpkt.p_file); | |
149 | fprintf(iop, "delta -s '-yThis was COMBined' s.COMB\n"); | |
150 | } | |
151 | fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n", | |
152 | CTLCHAR, BUSERTXT, CTLCHAR, EUSERTXT, gpkt.p_file); | |
153 | fprintf(iop, "ed - comb${pid} <<\\!\n"); | |
154 | fprintf(iop, "1d\n"); | |
155 | fprintf(iop, "$c\n"); | |
156 | fprintf(iop, " *** DELTA TABLE PRIOR TO COMBINE ***\n"); | |
157 | fprintf(iop, ".\n"); | |
158 | fprintf(iop, "w\n"); | |
159 | fprintf(iop, "q\n"); | |
160 | fprintf(iop, "!\n"); | |
161 | fprintf(iop, "prt -a %s >>comb${pid}\n", gpkt.p_file); | |
162 | fprintf(iop, "admin -tcomb${pid} s.COMB\\\n"); | |
163 | for (i = 0; i < NFLAGS; i++) | |
164 | if (p = Sflags[i]) | |
165 | fprintf(iop, " -f%c%s\\\n", i + 'a', p); | |
166 | fprintf(iop, "\n"); | |
167 | fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n", | |
168 | CTLCHAR, BUSERNAM, CTLCHAR, EUSERNAM, gpkt.p_file); | |
169 | fprintf(iop, "ed - comb${pid} <<\\!\n"); | |
170 | fprintf(iop, "v/^%c/s/.*/-a& \\\\/\n", CTLCHAR); | |
171 | fprintf(iop, "1c\n"); | |
172 | fprintf(iop, "admin s.COMB\\\n"); | |
173 | fprintf(iop, ".\n"); | |
174 | fprintf(iop, "$c\n"); | |
175 | fprintf(iop, "\n"); | |
176 | fprintf(iop, ".\n"); | |
177 | fprintf(iop, "w\n"); | |
178 | fprintf(iop, "q\n"); | |
179 | fprintf(iop, "!\n"); | |
180 | fprintf(iop, "sh comb${pid}\n"); | |
181 | fprintf(iop, "rm comb${pid}\n"); | |
182 | if (!HADS) { | |
183 | fprintf(iop, "rm -f %s\n", gpkt.p_file); | |
184 | fprintf(iop, "mv s.COMB %s\n", gpkt.p_file); | |
185 | } | |
186 | else { | |
187 | fprintf(iop, "set a=`echo \\`ls -s s.COMB\\``\n"); | |
188 | fprintf(iop, "set b=`echo \\`ls -s %s\\``\n",gpkt.p_file); | |
189 | fprintf(iop, "set c=`expr 100 - 100 '*' ${a} / ${b}`\n"); | |
190 | fprintf(iop, "echo '%s\t' ${c}'%%\t' ${a}/${b}\n", gpkt.p_file); | |
191 | fprintf(iop, "rm -f s.COMB\n"); | |
192 | } | |
193 | } | |
194 | ||
195 | ||
196 | enter(pkt,ch,n,sidp) | |
197 | struct packet *pkt; | |
198 | char ch; | |
199 | int n; | |
200 | struct sid *sidp; | |
201 | { | |
202 | Cvec[Cnt++] = n; | |
203 | } | |
204 | ||
205 | ||
206 | prtget(idp, ser, iop, file) | |
207 | struct idel *idp; | |
208 | int ser; | |
209 | FILE *iop; | |
210 | char *file; | |
211 | { | |
212 | char buf[32]; | |
213 | struct sid *sp; | |
214 | ||
215 | sid_ba(sp = &idp[ser].i_sid, buf); | |
216 | fprintf(iop, ":\t/bin/bsh\n"); | |
217 | fprintf(iop, "get -s -k -r%s -p %s > COMB\n", buf, file); | |
218 | return(sp); | |
219 | } | |
220 | ||
221 | ||
222 | getpred(idp, vec, i) | |
223 | struct idel *idp; | |
224 | int *vec; | |
225 | int i; | |
226 | { | |
227 | int ser, pred, acpred; | |
228 | ||
229 | ser = vec[i]; | |
230 | while (--i) { | |
231 | pred = vec[i]; | |
232 | for (acpred = idp[ser].i_pred; acpred; acpred = idp[acpred].i_pred) | |
233 | if (pred == acpred) | |
234 | break; | |
235 | if (pred == acpred) | |
236 | break; | |
237 | } | |
238 | return(i); | |
239 | } | |
240 | ||
241 | ||
242 | clean_up(n) | |
243 | { | |
244 | xfreeall(); | |
245 | } | |
246 | ||
247 | ||
248 | escdodelt() /* dummy for dodelt() */ | |
249 | { | |
250 | } |