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