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 + -
显示快捷键?