12146Seric # include	"../hdr/defines.h"
22146Seric # include	"../hdr/had.h"
32146Seric 
4*33423Sbostic static char Sccsid[] = "@(#)comb.c	4.4	02/02/88";
52146Seric USXALLOC();
62146Seric 
72146Seric struct packet gpkt;
82146Seric struct sid sid;
92146Seric int	num_files;
102146Seric char	had[26];
112146Seric char	*clist;
122146Seric int	*Cvec;
132146Seric int	Cnt;
142146Seric FILE	*iop;
152146Seric 
main(argc,argv)162146Seric main(argc,argv)
172146Seric int argc;
182146Seric register char *argv[];
192146Seric {
202146Seric 	register int i;
212146Seric 	register char *p;
222146Seric 	char c;
232146Seric 	int testmore;
242146Seric 	extern comb();
252146Seric 	extern int Fcnt;
262146Seric 
272146Seric 	Fflags = FTLEXIT | FTLMSG | FTLCLN;
282146Seric 	for(i = 1; i < argc; i++)
292146Seric 		if(argv[i][0] == '-' && (c=argv[i][1])) {
302146Seric 			p = &argv[i][2];
312146Seric 			testmore = 0;
322146Seric 			switch (c) {
332146Seric 
342146Seric 			case 'p':
352146Seric 				if (!p[0]) {
362146Seric 					argv[i] = 0;
372146Seric 					continue;
382146Seric 				}
392146Seric 				chksid(sid_ab(p,&sid),&sid);
402146Seric 				break;
412146Seric 			case 'c':
422146Seric 				clist = p;
432146Seric 				break;
442146Seric 			case 'o':
452146Seric 				testmore++;
462146Seric 				break;
472146Seric 			case 's':
482146Seric 				testmore++;
492146Seric 				break;
502146Seric 			default:
512146Seric 				fatal("unknown key letter (cm1)");
522146Seric 			}
532146Seric 
542146Seric 			if (testmore) {
552146Seric 				testmore = 0;
56*33423Sbostic 				if (*p) {
57*33423Sbostic 					sprintf(Error, "value after %c arg (cm7)",c);
58*33423Sbostic 					fatal(Error);
59*33423Sbostic 				}
602146Seric 			}
612146Seric 			if (had[c - 'a']++)
622146Seric 				fatal("key letter twice (cm2)");
632146Seric 			argv[i] = 0;
642146Seric 		}
652146Seric 		else num_files++;
662146Seric 
672146Seric 	if(num_files == 0)
682146Seric 		fatal("missing file arg (cm3)");
692146Seric 	if (HADP && HADC)
702146Seric 		fatal("can't have both -p and -c (cb2)");
712146Seric 	setsig();
7230498Slepreau 	Fflags &= ~FTLEXIT;
7330498Slepreau 	Fflags |= FTLJMP;
742146Seric 	iop = stdout;
752146Seric 	for (i = 1; i < argc; i++)
762146Seric 		if (p=argv[i])
772146Seric 			do_file(p,comb);
782146Seric 	fclose(iop);
792146Seric 	exit(Fcnt ? 1 : 0);
802146Seric }
812146Seric 
822146Seric 
comb(file)832146Seric comb(file)
842146Seric {
852146Seric 	register int i, n;
862146Seric 	register struct idel *rdp;
872146Seric 	char *p;
882146Seric 	int succnt;
892146Seric 	struct sid *sp;
902146Seric 	extern char had_dir, had_standinp;
912146Seric 	extern char *Sflags[];
922146Seric 	struct stats stats;
932146Seric 
942146Seric 	if (setjmp(Fjmp))
952146Seric 		return;
962146Seric 	sinit(&gpkt, file, 1);
972146Seric 	gpkt.p_verbose = -1;
982146Seric 	gpkt.p_stdout = stderr;
992146Seric 	if (gpkt.p_verbose && (num_files > 1 || had_dir || had_standinp))
1002146Seric 		fprintf(gpkt.p_stdout,"\n%s:\n",gpkt.p_file);
1012146Seric 	if (exists(auxf(gpkt.p_file, 'p')))
1022146Seric 		fatal("p-file exists (cb1)");
1032146Seric 
1042146Seric 	if (dodelt(&gpkt,&stats,0,0) == 0)
1052146Seric 		fmterr(&gpkt);
1062146Seric 
1072146Seric 	Cvec = alloc(n = ((maxser(&gpkt) + 1) * sizeof(*Cvec)));
10819941Ssam 	bzero(Cvec, n);
1092146Seric 	Cnt = 0;
1102146Seric 
1112146Seric 	if (HADP) {
1122146Seric 		if (!(n = sidtoser(&sid, &gpkt)))
1132146Seric 			fatal("sid doesn't exist (cb3)");
1142146Seric 		while (n <= maxser(&gpkt))
1152146Seric 			Cvec[Cnt++] = n++;
1162146Seric 	}
1172146Seric 	else if (HADC) {
1182146Seric 		dolist(&gpkt, clist, 0);
1192146Seric 	}
1202146Seric 	else {
1212146Seric 		rdp = gpkt.p_idel;
1222146Seric 		for (i = 1; i <= maxser(&gpkt); i++) {
1232146Seric 			succnt = 0;
1242146Seric 			for (n = i + 1; n <= maxser(&gpkt); n++)
1252146Seric 				if (rdp[n].i_pred == i)
1262146Seric 					succnt++;
1272146Seric 			if (succnt != 1)
1282146Seric 				Cvec[Cnt++] = i;
1292146Seric 		}
1302146Seric 	}
1312146Seric 	finduser(&gpkt);
1322146Seric 	doflags(&gpkt);
1332146Seric 	fclose(gpkt.p_iop);
1342146Seric 	gpkt.p_iop = 0;
1352146Seric 	if (!Cnt)
1362146Seric 		fatal("nothing to do (cb4)");
1372146Seric 	rdp = gpkt.p_idel;
1382146Seric 	sp = prtget(rdp, Cvec[0], iop, gpkt.p_file);
1392146Seric 	fprintf(iop, "admin -iCOMB -r%d s.COMB\n", sp->s_rel);
1402146Seric 	fprintf(iop, "rm -f COMB\n");
1412146Seric 	for (i = 1; i < Cnt; i++) {
1422146Seric 		n = getpred(rdp, Cvec, i);
1432146Seric 		if (HADO)
1442146Seric 			fprintf(iop, "get -s -r%d -g -e -t s.COMB\n",
1452146Seric 				rdp[Cvec[i]].i_sid.s_rel);
1462146Seric 		else
1472146Seric 			fprintf(iop, "get -s -a%d -r%d -g -e s.COMB\n",
1482146Seric 				n + 1, rdp[Cvec[i]].i_sid.s_rel);
1492146Seric 		prtget(rdp, Cvec[i], iop, gpkt.p_file);
1502146Seric 		fprintf(iop, "delta -s '-yThis was COMBined' s.COMB\n");
1512146Seric 	}
1522146Seric 	fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n",
1532146Seric 		CTLCHAR, BUSERTXT, CTLCHAR, EUSERTXT, gpkt.p_file);
1542146Seric 	fprintf(iop, "ed - comb${pid} <<\\!\n");
1552146Seric 	fprintf(iop, "1d\n");
1562146Seric 	fprintf(iop, "$c\n");
1572146Seric 	fprintf(iop, " *** DELTA TABLE PRIOR TO COMBINE ***\n");
1582146Seric 	fprintf(iop, ".\n");
1592146Seric 	fprintf(iop, "w\n");
1602146Seric 	fprintf(iop, "q\n");
1612146Seric 	fprintf(iop, "!\n");
1622146Seric 	fprintf(iop, "prt -a %s >>comb${pid}\n", gpkt.p_file);
1632146Seric 	fprintf(iop, "admin -tcomb${pid} s.COMB\\\n");
1642146Seric 	for (i = 0; i < NFLAGS; i++)
1652146Seric 		if (p = Sflags[i])
1662146Seric 			fprintf(iop, " -f%c%s\\\n", i + 'a', p);
1672146Seric 	fprintf(iop, "\n");
1682146Seric 	fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n",
1692146Seric 		CTLCHAR, BUSERNAM, CTLCHAR, EUSERNAM, gpkt.p_file);
1702146Seric 	fprintf(iop, "ed - comb${pid} <<\\!\n");
1712146Seric 	fprintf(iop, "v/^%c/s/.*/-a& \\\\/\n", CTLCHAR);
1722146Seric 	fprintf(iop, "1c\n");
1732146Seric 	fprintf(iop, "admin s.COMB\\\n");
1742146Seric 	fprintf(iop, ".\n");
1752146Seric 	fprintf(iop, "$c\n");
1762146Seric 	fprintf(iop, "\n");
1772146Seric 	fprintf(iop, ".\n");
1782146Seric 	fprintf(iop, "w\n");
1792146Seric 	fprintf(iop, "q\n");
1802146Seric 	fprintf(iop, "!\n");
1812146Seric 	fprintf(iop, "sh comb${pid}\n");
1822146Seric 	fprintf(iop, "rm comb${pid}\n");
1832146Seric 	if (!HADS) {
1842146Seric 		fprintf(iop, "rm -f %s\n", gpkt.p_file);
1852146Seric 		fprintf(iop, "mv s.COMB %s\n", gpkt.p_file);
1862146Seric 	}
1872146Seric 	else {
1882146Seric 		fprintf(iop, "set a=`echo \\`ls -s s.COMB\\``\n");
1892146Seric 		fprintf(iop, "set b=`echo \\`ls -s %s\\``\n",gpkt.p_file);
1902146Seric 		fprintf(iop, "set c=`expr 100 - 100 '*' ${a} / ${b}`\n");
1912146Seric 		fprintf(iop, "echo '%s\t' ${c}'%%\t' ${a}/${b}\n", gpkt.p_file);
1922146Seric 		fprintf(iop, "rm -f s.COMB\n");
1932146Seric 	}
1942146Seric }
1952146Seric 
1962146Seric 
1972146Seric enter(pkt,ch,n,sidp)
1982146Seric struct packet *pkt;
1992146Seric char ch;
2002146Seric int n;
2012146Seric struct sid *sidp;
2022146Seric {
2032146Seric 	Cvec[Cnt++] = n;
2042146Seric }
2052146Seric 
2062146Seric 
2072146Seric prtget(idp, ser, iop, file)
2082146Seric struct idel *idp;
2092146Seric int ser;
2102146Seric FILE *iop;
2112146Seric char *file;
2122146Seric {
2132146Seric 	char buf[32];
2142146Seric 	struct sid *sp;
2152146Seric 
2162146Seric 	sid_ba(sp = &idp[ser].i_sid, buf);
2172146Seric 	fprintf(iop, ":\t/bin/bsh\n");
2182146Seric 	fprintf(iop, "get -s -k -r%s -p %s > COMB\n", buf, file);
2192146Seric 	return(sp);
2202146Seric }
2212146Seric 
2222146Seric 
2232146Seric getpred(idp, vec, i)
2242146Seric struct idel *idp;
2252146Seric int *vec;
2262146Seric int i;
2272146Seric {
2282146Seric 	int ser, pred, acpred;
2292146Seric 
2302146Seric 	ser = vec[i];
2312146Seric 	while (--i) {
2322146Seric 		pred = vec[i];
2332146Seric 		for (acpred = idp[ser].i_pred; acpred; acpred = idp[acpred].i_pred)
2342146Seric 			if (pred == acpred)
2352146Seric 				break;
2362146Seric 		if (pred == acpred)
2372146Seric 			break;
2382146Seric 	}
2392146Seric 	return(i);
2402146Seric }
2412146Seric 
2422146Seric 
clean_up(n)2432146Seric clean_up(n)
2442146Seric {
2452146Seric 	xfreeall();
2462146Seric }
2472146Seric 
2482146Seric 
escdodelt()2492146Seric escdodelt()	/* dummy for dodelt() */
2502146Seric {
2512146Seric }
252