1 # include	"../hdr/defines.h"
2 # include	"../hdr/had.h"
3 
4 static char Sccsid[] = "@(#)comb.c	4.3	02/15/87";
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();
71 	Fflags &= ~FTLEXIT;
72 	Fflags |= FTLJMP;
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)));
107 	bzero(Cvec, n);
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 }
251