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