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