modern syntax for asgops & inits cause Donn's latest ccom rejects the old.
[unix-history] / usr / src / local / sccscmds / sccscmds.2 / cmd / comb.c
CommitLineData
c1c3fa19
EA
1# include "../hdr/defines.h"
2# include "../hdr/had.h"
3
38c01699 4static char Sccsid[] = "@(#)comb.c 4.3 %G%";
c1c3fa19
EA
5USXALLOC();
6
7struct packet gpkt;
8struct sid sid;
9int num_files;
10char had[26];
11char *clist;
12int *Cvec;
13int Cnt;
14FILE *iop;
15
16main(argc,argv)
17int argc;
18register 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
82comb(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
196enter(pkt,ch,n,sidp)
197struct packet *pkt;
198char ch;
199int n;
200struct sid *sidp;
201{
202 Cvec[Cnt++] = n;
203}
204
205
206prtget(idp, ser, iop, file)
207struct idel *idp;
208int ser;
209FILE *iop;
210char *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
222getpred(idp, vec, i)
223struct idel *idp;
224int *vec;
225int 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
242clean_up(n)
243{
244 xfreeall();
245}
246
247
248escdodelt() /* dummy for dodelt() */
249{
250}