delta.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 904 行 · 第 1/2 页
C
904 行
{ if(Mrs) { error("input CMR's ignored"); Mrs = ""; } if(!deltack(pkt->p_file,Cmrs,Nsid,Sflags[CMFFLAG - 'a'])) { fatal("Delta denied due to CMR difficulties"); } putcmrs(pkt); /* this routine puts cmrs on the out put file */ } sprintf(str,"%c%c ",CTLCHAR,COMMENTS); putline(pkt,str);/* sprintf(str,"%s",savecmt(Comments)); putline(pkt,str);*/ putline(pkt, savecmt(Comments)); /* D. Long - 9/14/88 */ putline(pkt,"\n"); sprintf(str,CTLSTR,CTLCHAR,EDELTAB); putline(pkt,str); if (nulldel) /* insert 'null' deltas */ while (--ser_inc) { sprintf(str,"%c%c %s/%s/%05u\n", CTLCHAR, STATS, "00000", "00000", orig_nlines); putline(pkt,str); dt.d_sid.s_rel -= 1; dt.d_serial -= 1; if (ser_inc != 1) dt.d_pred -= 1; else dt.d_pred = opred; /* point to old pred */ del_ba(&dt,str); putline(pkt,str); sprintf(str,"%c%c ",CTLCHAR,COMMENTS); putline(pkt,str); putline(pkt,"AUTO NULL DELTA\n"); sprintf(str,CTLSTR,CTLCHAR,EDELTAB); putline(pkt,str); } return(newser);}mkixg(pkt,reason,ch)struct packet *pkt;int reason;char ch;{ int n; char str[LINEWIDTH+1]; sprintf(str,"%c%c",CTLCHAR,ch); putline(pkt,str); for (n = maxser(pkt); n; n--) { if (pkt->p_apply[n].a_reason == reason) { sprintf(str," %u",n); putline(pkt,str); } } putline(pkt,"\n");}# define LENMR 60putmrs(pkt)struct packet *pkt;{ register char **argv; char str[LENMR+6]; extern char **Varg; for (argv = &Varg[PWVSTART]; *argv; argv++) { sprintf(str,"%c%c %s\n",CTLCHAR,MRNUM,*argv); putline(pkt,str); }}/*** putcmrs takes the cmrs list on the Mrs line built by deltack* and puts them in the packet* */ putcmrs(pkt) struct packet *pkt; { char str[510]; sprintf(str,"%c%c %s\n",CTLCHAR,MRNUM,Cmrs); putline(pkt,str); }static char ambig[] = "ambiguous `r' keyletter value (de15)";struct pfile *rdpfile(pkt,sp)register struct packet *pkt;struct sid *sp;{ char *user; struct pfile pf; static struct pfile goodpf; char line[LINEWIDTH+1]; int cnt, uniq; FILE *in, *out; uniq = cnt = -1; user = logname(); zero(&goodpf,sizeof(goodpf)); in = xfopen(auxf(pkt->p_file,'p'),0); out = xfcreat(auxf(pkt->p_file,'q'),0644); while (fgets(line,sizeof(line),in) != NULL) { pf_ab(line,&pf,1); if (equal(pf.pf_user,user)) { if (sp->s_rel == 0) { if (++cnt) { if(fclose(out)==EOF) FAILPUT; fclose(in); fatal("missing -r argument (de1)"); } goodpf = pf; continue; } else if ((sp->s_rel == pf.pf_nsid.s_rel && sp->s_lev == pf.pf_nsid.s_lev && sp->s_br == pf.pf_nsid.s_br && sp->s_seq == pf.pf_nsid.s_seq) || (sp->s_rel == pf.pf_gsid.s_rel && sp->s_lev == pf.pf_gsid.s_lev && sp->s_br == pf.pf_gsid.s_br && sp->s_seq == pf.pf_gsid.s_seq)) { if (++uniq) { fclose(in); if(fclose(out)==EOF) FAILPUT; fatal(ambig); } goodpf = pf; continue; } } fputs(line,out); if(ferror(out)) FAILPUT; } if(fflush(out)==EOF) FAILPUT; fstat(fileno(out),&Statbuf); Szqfile = Statbuf.st_size; copy(auxf(pkt->p_file,'p'),Pfilename); fclose(out); fclose(in); if (!goodpf.pf_user[0]) fatal("login name or SID specified not in p-file (de2)"); return(&goodpf);}FILE *dodiff(newf,oldf,difflim)char *newf, *oldf;int difflim;{ register int i; int pfd[2]; FILE *iop; extern char Diffpgm[]; char num[10]; xpipe(pfd); if ((i = fork()) < 0) { close(pfd[0]); close(pfd[1]); fatal("cannot fork, try again (de11)"); } else if (i == 0) { close(pfd[0]); close(1); dup(pfd[1]); close(pfd[1]); for (i = 5; i < 15; i++) close(i); sprintf(num,"%d",difflim); execl(Diffpgm,Diffpgm,oldf,newf,num,"-s",0); close(1); exit(32); /* tell parent that 'execl' failed */ } else { close(pfd[1]); iop = fdfopen(pfd[0],0); return(iop); }}getdiff(type,plinenum)register char *type;register int *plinenum;{ char line[LINEWIDTH+1]; register char *p; char *rddiff(), *linerange(); int num_lines; static int chg_num, chg_ln; int lowline, highline; if ((p = rddiff(line, sizeof line)) == NULL) return(0); if (*p == '-') { *type = INS; *plinenum = chg_ln; num_lines = chg_num; } else { p = linerange(p,&lowline,&highline); *plinenum = lowline; switch(*p++) { case 'd': num_lines = highline - lowline + 1; *type = DEL; /* ch skipline -> skiplines -- depp */ skiplines(line,num_lines); break; case 'a': linerange(p,&lowline,&highline); num_lines = highline - lowline + 1; *type = INS; break; case 'c': chg_ln = lowline; num_lines = highline - lowline + 1; linerange(p,&lowline,&highline); chg_num = highline - lowline + 1; *type = DEL; /* ch skipline -> skiplines -- depp */ skiplines(line,num_lines); break; } } return(num_lines);}insert(pkt,linenum,n,ser)register struct packet *pkt;register int linenum;register int n;int ser;{ char str[LINEWIDTH+1]; after(pkt,linenum); sprintf(str,"%c%c %u\n",CTLCHAR,INS,ser); putline(pkt,str); for (++n; --n; ) { rddiff(str,sizeof(str)); putline(pkt,&str[2]); } sprintf(str,"%c%c %u\n",CTLCHAR,END,ser); putline(pkt,str);}delete(pkt,linenum,n,ser)register struct packet *pkt;register int linenum;int n;register int ser;{ char str[LINEWIDTH+1]; before(pkt,linenum); sprintf(str,"%c%c %u\n",CTLCHAR,DEL,ser); putline(pkt,str); after(pkt,linenum + n - 1); sprintf(str,"%c%c %u\n",CTLCHAR,END,ser); putline(pkt,str);}after(pkt,n)register struct packet *pkt;register int n;{ before(pkt,n); if (pkt->p_glnno == n) putline(pkt,(char *) 0);}before(pkt,n)register struct packet *pkt;register int n;{ while (pkt->p_glnno < n) { if (!readmod(pkt)) break; }}char *linerange(cp,low,high)register char *cp;register int *low, *high;{ cp = satoi(cp,low); if (*cp == ',') cp = satoi(++cp,high); else *high = *low; return(cp);}skiplines(lp,num)register char *lp;register int num;{ for (++num;--num;) rddiff(lp, LINEWIDTH);}char *rddiff(s,n)register char *s;register int n;{ register char *r; if ((r = fgets(s,n,Diffin)) != NULL && HADP) { fputs(s,gpkt.p_stdout); if(ferror(gpkt.p_stdout)) FAILPUT; } return(r);}enter(pkt,ch,n,sidp)struct packet *pkt;char ch;int n;struct sid *sidp;{ char str[32]; register struct apply *ap; sid_ba(sidp,str); ap = &pkt->p_apply[n]; if (pkt->p_cutoff > pkt->p_idel[n].i_datetime) switch(ap->a_code) { case SX_EMPTY: switch (ch) { case INCLUDE: condset(ap,APPLY,INCLUSER); break; case EXCLUDE: condset(ap,NOAPPLY,EXCLUSER); break; case IGNORE: condset(ap,SX_EMPTY,IGNRUSER); break; } break; case APPLY: fatal("internal error in delta/enter() (de5)"); break; case NOAPPLY: fatal("internal error in delta/enter() (de6)"); break; default: fatal("internal error in delta/enter() (de7)"); break; }}escdodelt() /* dummy routine for dodelt() */{}fredck() /*dummy routine for dodelt()*/{}clean_up(n){ if (mylock(auxf(gpkt.p_file,'z'),getpid())) { if (gpkt.p_iop) fclose(gpkt.p_iop); if (Xiop) { fclose(Xiop); unlink(auxf(gpkt.p_file,'x')); } if(Gin) fclose(Gin); unlink(auxf(gpkt.p_file,'d')); unlink(auxf(gpkt.p_file,'q')); xrm(&gpkt); ffreeall(); unlockit(auxf(gpkt.p_file,'z'),getpid()); }}static char bd[] = "leading SOH char in line %d of file `%s' not allowed (de14)";fgetchk(file,pkt)register char *file;register struct packet *pkt;{ FILE *iptr; char line[LINEWIDTH+1]; register int k; int i; iptr = xfopen(file,0); for (k = 1; fgets(line,sizeof(line),iptr); k++) { if (*line == CTLCHAR) { fclose(iptr); sprintf(Error,bd,k,auxf(pkt->p_file,'g')); fatal(Error); } i = strlen(line); if(i == ((sizeof line)-1) && line[i-1] != '\n') { sprintf(Error, "%s line %d is longer than %d characters", /* (de??) */ file, k, LINEWIDTH); fatal(Error); } if(line[i-1] != '\n') { sprintf(Error, "%s line %d does not end with a newline", /* (de??) */ file, k); fatal(Error); } } fclose(iptr);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?