comb.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 296 行
C
296 行
#ifndef lintstatic char *sccsid = "@(#)comb.c 4.1 (ULTRIX) 7/17/90";#endif lint# include "../hdr/defines.h"# include "../hdr/had.h"struct stat Statbuf;char Error[128];struct packet gpkt;struct sid sid;int num_files;int Do_prs;char had[26];char *clist;char *Val_ptr;char Blank[] = " ";int *Cvec;int Cnt;FILE *iop;main(argc,argv)int argc;register char *argv[];{ register int i; register char *p; char c; char *sid_ab(); int testmore; extern comb(); extern int Fcnt; Fflags = FTLEXIT | FTLMSG | FTLCLN; for(i = 1; i < argc; i++) if(argv[i][0] == '-' && (c=argv[i][1])) { p = &argv[i][2]; testmore = 0; switch (c) { case 'p': if (!p[0]) { argv[i] = 0; continue; } chksid(sid_ab(p,&sid),&sid); break; case 'c': clist = p; break; case 'o': testmore++; break; case 's': testmore++; break; default: fatal("unknown key letter (cm1)"); } if (testmore) { testmore = 0; if (*p) { sprintf(Error, "value after %c arg (cm7)",c); fatal(Error); } } if (had[c - 'a']++) fatal("key letter twice (cm2)"); argv[i] = 0; } else num_files++; if(num_files == 0) fatal("missing file arg (cm3)"); if (HADP && HADC) fatal("can't have both -p and -c (cb2)"); setsig(); Fflags &= ~FTLEXIT; Fflags |= FTLJMP; iop = stdout; for (i = 1; i < argc; i++) if (p=argv[i]) do_file(p,comb); fclose(iop); exit(Fcnt ? 1 : 0);}comb(file)char *file;{ register int i, n; register struct idel *rdp; struct idel *dodelt(); char *p; char *auxf(); char rarg[32], *sid_ba(); int succnt; struct sid *sp, *prtget(); extern char had_dir, had_standinp; extern char *Sflags[]; struct stats stats; if (setjmp(Fjmp)) return; sinit(&gpkt, file, 1); gpkt.p_verbose = -1; gpkt.p_stdout = stderr; if (gpkt.p_verbose && (num_files > 1 || had_dir || had_standinp)) fprintf(gpkt.p_stdout,"\n%s:\n",gpkt.p_file); if (exists(auxf(gpkt.p_file, 'p'))) fatal("p-file exists (cb1)"); if (dodelt(&gpkt,&stats,(struct sid *) 0,0) == 0) fmterr(&gpkt); Cvec = (int *) fmalloc(n = ((maxser(&gpkt) + 1) * sizeof(*Cvec))); zero(Cvec, n); Cnt = 0; if (HADP) { rdp = gpkt.p_idel; if (!(n = sidtoser(&sid, &gpkt))) fatal("sid doesn't exist (cb3)"); while (n <= maxser(&gpkt)) { if (rdp[n].i_sid.s_rel == 0 && rdp[n].i_sid.s_lev == 0 && rdp[n].i_sid.s_br == 0 && rdp[n].i_sid.s_seq == 0) { n++; continue; } Cvec[Cnt++] = n++; } } else if (HADC) { dolist(&gpkt, clist, 0); } else { rdp = gpkt.p_idel; for (i = 1; i <= maxser(&gpkt); i++) { succnt = 0; if (rdp[i].i_sid.s_rel == 0 && rdp[i].i_sid.s_lev == 0 && rdp[i].i_sid.s_br == 0 && rdp[i].i_sid.s_seq == 0) continue; for (n = i + 1; n <= maxser(&gpkt); n++) if (rdp[n].i_pred == i) succnt++; if (succnt != 1) Cvec[Cnt++] = i; } } finduser(&gpkt); doflags(&gpkt); fclose(gpkt.p_iop); gpkt.p_iop = 0; if (!Cnt) fatal("nothing to do (cb4)"); rdp = gpkt.p_idel; Do_prs = 0; sp = prtget(rdp, Cvec[0], iop, gpkt.p_file); sid_ba(sp,rarg); if (!(Val_ptr = Sflags[VALFLAG - 'a'])) Val_ptr = Blank; fprintf(iop, "admin -iCOMB$$ -r%s -fv%s -m '-yThis was COMBined' s.COMB$$\n", rarg,Val_ptr); Do_prs = 1; fprintf(iop, "rm -f COMB$$\n"); for (i = 1; i < Cnt; i++) { n = getpred(rdp, Cvec, i); if (HADO) fprintf(iop, "get -s -r%d -g -e -t s.COMB$$\n", rdp[Cvec[i]].i_sid.s_rel); else fprintf(iop, "get -s -a%d -r%d -g -e s.COMB$$\n", n + 1, rdp[Cvec[i]].i_sid.s_rel); prtget(rdp, Cvec[i], iop, gpkt.p_file); fprintf(iop, "delta -s -m\"$b\" -y\"$a\" s.COMB$$\n"); } fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb$$\n", CTLCHAR, BUSERTXT, CTLCHAR, EUSERTXT, gpkt.p_file); fprintf(iop, "ed - comb$$ <<\\!\n"); fprintf(iop, "1d\n"); fprintf(iop, "$c\n"); fprintf(iop, "*** DELTA TABLE PRIOR TO COMBINE ***\n"); fprintf(iop, ".\n"); fprintf(iop, "w\n"); fprintf(iop, "q\n"); fprintf(iop, "!\n"); fprintf(iop, "prs -e %s >>comb$$\n", gpkt.p_file); fprintf(iop, "admin -tcomb$$ s.COMB$$\\\n"); for (i = 0; i < NFLAGS; i++) if (p = Sflags[i]) fprintf(iop, " -f%c%s\\\n", i + 'a', p); fprintf(iop, "\n"); fprintf(iop, "sed -n '/^%c%c$/,/^%c%c$/p' %s >comb$$\n", CTLCHAR, BUSERNAM, CTLCHAR, EUSERNAM, gpkt.p_file); fprintf(iop, "ed - comb$$ <<\\!\n"); fprintf(iop, "v/^%c/s/.*/ -a& \\\\/\n", CTLCHAR); fprintf(iop, "1c\n"); fprintf(iop, "admin s.COMB$$\\\n"); fprintf(iop, ".\n"); fprintf(iop, "$c\n"); fprintf(iop, "\n"); fprintf(iop, ".\n"); fprintf(iop, "w\n"); fprintf(iop, "q\n"); fprintf(iop, "!\n"); fprintf(iop, ". comb$$\n"); fprintf(iop, "rm comb$$\n"); if (!HADS) { fprintf(iop, "rm -f %s\n", gpkt.p_file); fprintf(iop, "mv s.COMB$$ %s\n", gpkt.p_file); if (!Sflags[VALFLAG - 'a']) fprintf(iop, "admin -dv %s\n", gpkt.p_file); } else { fprintf(iop, "set \`ls -st s.COMB$$ %s\`\n",gpkt.p_file); fprintf(iop, "c=\`expr 100 - 100 '*' $1 / $3\`\n"); fprintf(iop, "echo '%s\t' ${c}'%%\t' $1/$3\n", gpkt.p_file); fprintf(iop, "rm -f s.COMB$$\n"); }}enter(pkt,ch,n,sidp)struct packet *pkt;char ch;int n;struct sid *sidp;{ Cvec[Cnt++] = n;}struct sid *prtget(idp, ser, fptr, file)struct idel *idp;int ser;FILE *fptr;char *file;{ char buf[32], *sid_ba(); struct sid *sp; sid_ba(sp = &idp[ser].i_sid, buf); fprintf(fptr, "get -s -k -r%s -p %s > COMB$$\n", buf, file); if (Do_prs) { fprintf(fptr, "a=\`prs -r%s -d:C: %s\`\n",buf,file); fprintf(fptr, "b=\`prs -r%s -d:MR: %s\`\n",buf,file); } return(sp);}getpred(idp, vec, i)struct idel *idp;int *vec;int i;{ int ser, pred, acpred; ser = vec[i]; while (--i) { pred = vec[i]; for (acpred = idp[ser].i_pred; acpred; acpred = idp[acpred].i_pred) if (pred == acpred) break; if (pred == acpred) break; } return(i);}clean_up(n){ ffreeall();}escdodelt() /* dummy for dodelt() */{}fredck() /*dummy for dodelt() */{}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?