12146Seric # include	"../hdr/defines.h"
22146Seric # include	"../hdr/had.h"
32146Seric 
4*19941Ssam SCCSID(@(#)comb.c	4.2);
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 
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;
562146Seric 				if (*p)
572146Seric 					fatal(sprintf(Error,
582146Seric 					  "value after %c arg (cm7)",c));
592146Seric 			}
602146Seric 			if (had[c - 'a']++)
612146Seric 				fatal("key letter twice (cm2)");
622146Seric 			argv[i] = 0;
632146Seric 		}
642146Seric 		else num_files++;
652146Seric 
662146Seric 	if(num_files == 0)
672146Seric 		fatal("missing file arg (cm3)");
682146Seric 	if (HADP && HADC)
692146Seric 		fatal("can't have both -p and -c (cb2)");
702146Seric 	setsig();
712146Seric 	Fflags =& ~FTLEXIT;
722146Seric 	Fflags =| FTLJMP;
732146Seric 	iop = stdout;
742146Seric 	for (i = 1; i < argc; i++)
752146Seric 		if (p=argv[i])
762146Seric 			do_file(p,comb);
772146Seric 	fclose(iop);
782146Seric 	exit(Fcnt ? 1 : 0);
792146Seric }
802146Seric 
812146Seric 
822146Seric comb(file)
832146Seric {
842146Seric 	register int i, n;
852146Seric 	register struct idel *rdp;
862146Seric 	char *p;
872146Seric 	int succnt;
882146Seric 	struct sid *sp;
892146Seric 	extern char had_dir, had_standinp;
902146Seric 	extern char *Sflags[];
912146Seric 	struct stats stats;
922146Seric 
932146Seric 	if (setjmp(Fjmp))
942146Seric 		return;
952146Seric 	sinit(&gpkt, file, 1);
962146Seric 	gpkt.p_verbose = -1;
972146Seric 	gpkt.p_stdout = stderr;
982146Seric 	if (gpkt.p_verbose && (num_files > 1 || had_dir || had_standinp))
992146Seric 		fprintf(gpkt.p_stdout,"\n%s:\n",gpkt.p_file);
1002146Seric 	if (exists(auxf(gpkt.p_file, 'p')))
1012146Seric 		fatal("p-file exists (cb1)");
1022146Seric 
1032146Seric 	if (dodelt(&gpkt,&stats,0,0) == 0)
1042146Seric 		fmterr(&gpkt);
1052146Seric 
1062146Seric 	Cvec = alloc(n = ((maxser(&gpkt) + 1) * sizeof(*Cvec)));
107*19941Ssam 	bzero(Cvec, n);
1082146Seric 	Cnt = 0;
1092146Seric 
1102146Seric 	if (HADP) {
1112146Seric 		if (!(n = sidtoser(&sid, &gpkt)))
1122146Seric 			fatal("sid doesn't exist (cb3)");
1132146Seric 		while (n <= maxser(&gpkt))
1142146Seric 			Cvec[Cnt++] = n++;
1152146Seric 	}
1162146Seric 	else if (HADC) {
1172146Seric 		dolist(&gpkt, clist, 0);
1182146Seric 	}
1192146Seric 	else {
1202146Seric 		rdp = gpkt.p_idel;
1212146Seric 		for (i = 1; i <= maxser(&gpkt); i++) {
1222146Seric 			succnt = 0;
1232146Seric 			for (n = i + 1; n <= maxser(&gpkt); n++)
1242146Seric 				if (rdp[n].i_pred == i)
1252146Seric 					succnt++;
1262146Seric 			if (succnt != 1)
1272146Seric 				Cvec[Cnt++] = i;
1282146Seric 		}
1292146Seric 	}
1302146Seric 	finduser(&gpkt);
1312146Seric 	doflags(&gpkt);
1322146Seric 	fclose(gpkt.p_iop);
1332146Seric 	gpkt.p_iop = 0;
1342146Seric 	if (!Cnt)
1352146Seric 		fatal("nothing to do (cb4)");
1362146Seric 	rdp = gpkt.p_idel;
1372146Seric 	sp = prtget(rdp, Cvec[0], iop, gpkt.p_file);
1382146Seric 	fprintf(iop, "admin -iCOMB -r%d s.COMB\n", sp->s_rel);
1392146Seric 	fprintf(iop, "rm -f COMB\n");
1402146Seric 	for (i = 1; i < Cnt; i++) {
1412146Seric 		n = getpred(rdp, Cvec, i);
1422146Seric 		if (HADO)
1432146Seric 			fprintf(iop, "get -s -r%d -g -e -t s.COMB\n",
1442146Seric 				rdp[Cvec[i]].i_sid.s_rel);
1452146Seric 		else
1462146Seric 			fprintf(iop, "get -s -a%d -r%d -g -e s.COMB\n",
1472146Seric 				n + 1, rdp[Cvec[i]].i_sid.s_rel);
1482146Seric 		prtget(rdp, Cvec[i], iop, gpkt.p_file);
1492146Seric 		fprintf(iop, "delta -s '-yThis was COMBined' s.COMB\n");
1502146Seric 	}
1512146Seric 	fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n",
1522146Seric 		CTLCHAR, BUSERTXT, CTLCHAR, EUSERTXT, gpkt.p_file);
1532146Seric 	fprintf(iop, "ed - comb${pid} <<\\!\n");
1542146Seric 	fprintf(iop, "1d\n");
1552146Seric 	fprintf(iop, "$c\n");
1562146Seric 	fprintf(iop, " *** DELTA TABLE PRIOR TO COMBINE ***\n");
1572146Seric 	fprintf(iop, ".\n");
1582146Seric 	fprintf(iop, "w\n");
1592146Seric 	fprintf(iop, "q\n");
1602146Seric 	fprintf(iop, "!\n");
1612146Seric 	fprintf(iop, "prt -a %s >>comb${pid}\n", gpkt.p_file);
1622146Seric 	fprintf(iop, "admin -tcomb${pid} s.COMB\\\n");
1632146Seric 	for (i = 0; i < NFLAGS; i++)
1642146Seric 		if (p = Sflags[i])
1652146Seric 			fprintf(iop, " -f%c%s\\\n", i + 'a', p);
1662146Seric 	fprintf(iop, "\n");
1672146Seric 	fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb${pid}\n",
1682146Seric 		CTLCHAR, BUSERNAM, CTLCHAR, EUSERNAM, gpkt.p_file);
1692146Seric 	fprintf(iop, "ed - comb${pid} <<\\!\n");
1702146Seric 	fprintf(iop, "v/^%c/s/.*/-a& \\\\/\n", CTLCHAR);
1712146Seric 	fprintf(iop, "1c\n");
1722146Seric 	fprintf(iop, "admin s.COMB\\\n");
1732146Seric 	fprintf(iop, ".\n");
1742146Seric 	fprintf(iop, "$c\n");
1752146Seric 	fprintf(iop, "\n");
1762146Seric 	fprintf(iop, ".\n");
1772146Seric 	fprintf(iop, "w\n");
1782146Seric 	fprintf(iop, "q\n");
1792146Seric 	fprintf(iop, "!\n");
1802146Seric 	fprintf(iop, "sh comb${pid}\n");
1812146Seric 	fprintf(iop, "rm comb${pid}\n");
1822146Seric 	if (!HADS) {
1832146Seric 		fprintf(iop, "rm -f %s\n", gpkt.p_file);
1842146Seric 		fprintf(iop, "mv s.COMB %s\n", gpkt.p_file);
1852146Seric 	}
1862146Seric 	else {
1872146Seric 		fprintf(iop, "set a=`echo \\`ls -s s.COMB\\``\n");
1882146Seric 		fprintf(iop, "set b=`echo \\`ls -s %s\\``\n",gpkt.p_file);
1892146Seric 		fprintf(iop, "set c=`expr 100 - 100 '*' ${a} / ${b}`\n");
1902146Seric 		fprintf(iop, "echo '%s\t' ${c}'%%\t' ${a}/${b}\n", gpkt.p_file);
1912146Seric 		fprintf(iop, "rm -f s.COMB\n");
1922146Seric 	}
1932146Seric }
1942146Seric 
1952146Seric 
1962146Seric enter(pkt,ch,n,sidp)
1972146Seric struct packet *pkt;
1982146Seric char ch;
1992146Seric int n;
2002146Seric struct sid *sidp;
2012146Seric {
2022146Seric 	Cvec[Cnt++] = n;
2032146Seric }
2042146Seric 
2052146Seric 
2062146Seric prtget(idp, ser, iop, file)
2072146Seric struct idel *idp;
2082146Seric int ser;
2092146Seric FILE *iop;
2102146Seric char *file;
2112146Seric {
2122146Seric 	char buf[32];
2132146Seric 	struct sid *sp;
2142146Seric 
2152146Seric 	sid_ba(sp = &idp[ser].i_sid, buf);
2162146Seric 	fprintf(iop, ":\t/bin/bsh\n");
2172146Seric 	fprintf(iop, "get -s -k -r%s -p %s > COMB\n", buf, file);
2182146Seric 	return(sp);
2192146Seric }
2202146Seric 
2212146Seric 
2222146Seric getpred(idp, vec, i)
2232146Seric struct idel *idp;
2242146Seric int *vec;
2252146Seric int i;
2262146Seric {
2272146Seric 	int ser, pred, acpred;
2282146Seric 
2292146Seric 	ser = vec[i];
2302146Seric 	while (--i) {
2312146Seric 		pred = vec[i];
2322146Seric 		for (acpred = idp[ser].i_pred; acpred; acpred = idp[acpred].i_pred)
2332146Seric 			if (pred == acpred)
2342146Seric 				break;
2352146Seric 		if (pred == acpred)
2362146Seric 			break;
2372146Seric 	}
2382146Seric 	return(i);
2392146Seric }
2402146Seric 
2412146Seric 
2422146Seric clean_up(n)
2432146Seric {
2442146Seric 	xfreeall();
2452146Seric }
2462146Seric 
2472146Seric 
2482146Seric escdodelt()	/* dummy for dodelt() */
2492146Seric {
2502146Seric }
251