⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sort.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
			fputs(cp, os);			if (ferror(os)) {				error = 1;				term();			}		}		if(muflg){			cp = ibuf[i-1]->l;			dp = p->l;			do {			} while((*dp++ = *cp++) != '\n');		}		for(;;) {			if(rline(ibuf[i-1])) {				i--;				if(i == 0)					break;				if(i == 1)					muflg = uflg;			}			ip = &ibuf[i];			while(--ip>ibuf&&(*compare)(ip[0]->l,ip[-1]->l)<0){				jp = *ip;				*ip = *(ip-1);				*(ip-1) = jp;			}			if(!muflg)				break;			j = (*compare)(ibuf[i-1]->l,p->l);			if(cflg) {				if(j > 0)					disorder("disorder:",ibuf[i-1]->l);				else if(uflg && j==0)					disorder("nonunique:",ibuf[i-1]->l);			} else if(j == 0)				continue;			break;		}	}	p = (struct merg *)lspace;	for(i=a; i<b; i++) {		fclose(p->b);		p++;		if(i >= eargc)			unlink(setfil(i));	}	fclose(os);}disorder(s,t)char *s, *t;{	register char *u;	for(u=t; *u!='\n';u++) ;	*u = 0;	diag(s,t);	term();}newfile(){	register char *f;	f = setfil(nfiles);	if((os=fopen(f, "w")) == NULL) {		diag("can't create ",f);		term();	}	nfiles++;}char *setfil(i){	if(i < eargc)		if(eargv[i][0] == '-' && eargv[i][1] == '\0')			return(0);		else			return(eargv[i]);	i -= eargc;	filep[0] = i/26 + 'a';	filep[1] = i%26 + 'a';	return(file);}oldfile(){	if(outfil) {		if((os=fopen(outfil, "w")) == NULL) {			diag("can't create ",outfil);			term();		}	} else		os = stdout;}safeoutfil(){	register int i;	struct stat obuf,ibuf;	if(!mflg||outfil==0)		return;	if(stat(outfil,&obuf)==-1)		return;	for(i=eargc-N;i<eargc;i++) {	/*-N is suff., not nec.*/		if(stat(eargv[i],&ibuf)==-1)			continue;		if(obuf.st_dev==ibuf.st_dev&&		   obuf.st_ino==ibuf.st_ino)			unsafeout++;	}}cant(f)char *f;{	perror(f);	term();}diag(s,t)char *s, *t;{	fputs("sort: ",stderr);	fputs(s,stderr);	fputs(t,stderr);	fputs("\n",stderr);}voidterm(){	register i;	signal(SIGINT, SIG_IGN);	signal(SIGHUP, SIG_IGN);	signal(SIGTERM, SIG_IGN);	if(nfiles == eargc)		nfiles++;	for(i=eargc; i<=nfiles; i++) {	/*<= in case of interrupt*/		unlink(setfil(i));	/*with nfiles not updated*/	}	_exit(error);}cmp(i, j)char *i, *j;{	register char *pa, *pb;	char *skip();	char *code, *ignore;	int a, b;	int k;	char *la, *lb;	register int sa;	int sb;	char *ipa, *ipb, *jpa, *jpb;	struct field *fp;	for(k = nfields>0; k<=nfields; k++) {		fp = &fields[k];		pa = i;		pb = j;		if(k) {			la = skip(pa, fp, 1);			pa = skip(pa, fp, 0);			lb = skip(pb, fp, 1);			pb = skip(pb, fp, 0);		} else {			la = eol(pa);			lb = eol(pb);		}		if(fp->nflg) {			if(tabchar) {				if(pa<la&&*pa==tabchar)					pa++;				if(pb<lb&&*pb==tabchar)					pb++;			}			while(blank(*pa))				pa++;			while(blank(*pb))				pb++;			sa = sb = fp->rflg;			if(*pa == '-') {				pa++;				sa = -sa;			}			if(*pb == '-') {				pb++;				sb = -sb;			}			for(ipa = pa; ipa<la&&isdigit(*ipa); ipa++) ;			for(ipb = pb; ipb<lb&&isdigit(*ipb); ipb++) ;			jpa = ipa;			jpb = ipb;			a = 0;			if(sa==sb)				while(ipa > pa && ipb > pb)					if(b = *--ipb - *--ipa)						a = b;			while(ipa > pa)				if(*--ipa != '0')					return(-sa);			while(ipb > pb)				if(*--ipb != '0')					return(sb);			if(a) return(a*sa);			if(*(pa=jpa) == '.')				pa++;			if(*(pb=jpb) == '.')				pb++;			if(sa==sb)				while(pa<la && isdigit(*pa)				   && pb<lb && isdigit(*pb))					if(a = *pb++ - *pa++)						return(a*sa);			while(pa<la && isdigit(*pa))				if(*pa++ != '0')					return(-sa);			while(pb<lb && isdigit(*pb))				if(*pb++ != '0')					return(sb);			continue;		}		code = fp->code;		ignore = fp->ignore;loop: 		while(ignore[*pa])			pa++;		while(ignore[*pb])			pb++;		if(pa>=la || *pa=='\n')			if(pb<lb && *pb!='\n')				return(fp->rflg);			else continue;		if(pb>=lb || *pb=='\n')			return(-fp->rflg);		if((sa = code[*pb++]-code[*pa++]) == 0)			goto loop;		return(sa*fp->rflg);	}	if(uflg)		return(0);	return(cmpa(i, j));}cmpa(pa, pb)register char *pa, *pb;{	while(*pa == *pb) {		if(*pa++ == '\n')			return(0);		pb++;	}	return(		*pa == '\n' ? fields[0].rflg:		*pb == '\n' ?-fields[0].rflg:		*pb > *pa   ? fields[0].rflg:		-fields[0].rflg	);}char *skip(pp, fp, j)struct field *fp;char *pp;{	register i;	register char *p;	p = pp;	if( (i=fp->m[j]) < 0)		return(eol(p));	while(i-- > 0) {		if(tabchar != 0) {			while(*p != tabchar)				if(*p != '\n')					p++;				else goto ret;			if(i>0||j==0)				p++;		} else {			while(blank(*p))				p++;			while(!blank(*p))				if(*p != '\n')					p++;				else goto ret;		}	}	if(tabchar==0||fp->bflg[j])		while(blank(*p))			p++;	i = fp->n[j];	while(i-- > 0) {		if(*p != '\n')			p++;		else goto ret;	} ret:	return(p);}char *eol(p)register char *p;{	while(*p != '\n') p++;	return(p);}copyproto(){	register i;	register int *p, *q;	p = (int *)&proto;	q = (int *)&fields[nfields];	for(i=0; i<sizeof(proto)/sizeof(*p); i++)		*q++ = *p++;}field(s,k)char *s;{	register struct field *p;	register d;	p = &fields[nfields];	d = 0;	for(; *s!=0; s++) {		switch(*s) {		case '\0':			return;		case 'b':			p->bflg[k]++;			break;		case 'd':			p->ignore = dict+128;			break;		case 'f':			p->code = fold+128;			break;		case 'i':			p->ignore = nonprint+128;			break;		case 'c':			cflg = 1;			continue;		case 'm':			mflg = 1;			continue;		case 'n':			p->nflg++;			break;		case 't':			tabchar = *++s;			if(tabchar == 0) s--;			continue;		case 'r':			p->rflg = -1;			continue;		case 'u':			uflg = 1;			break;		case '.':			if(p->m[k] == -1)	/* -m.n with m missing */				p->m[k] = 0;			d = &fields[0].n[0]-&fields[0].m[0];		default:			p->m[k+d] = number(&s);		}		compare = cmp;	}}number(ppa)char **ppa;{	int n;	register char *pa;	pa = *ppa;	n = 0;	while(isdigit(*pa)) {		n = n*10 + *pa - '0';		*ppa = pa++;	}	return(n);}#define qsexc(p,q) t= *p;*p= *q;*q=t#define qstexc(p,q,r) t= *p;*p= *r;*r= *q;*q=tqsort(a,l)char **a, **l;{	register char **i, **j;	char **k;	char **lp, **hp;	int c;	char *t;	unsigned n;start:	if((n=l-a) <= 1)		return;	n /= 2;	hp = lp = a+n;	i = a;	j = l-1;	for(;;) {		if(i < lp) {			if((c = (*compare)(*i, *lp)) == 0) {				--lp;				qsexc(i, lp);				continue;			}			if(c < 0) {				++i;				continue;			}		}loop:		if(j > hp) {			if((c = (*compare)(*hp, *j)) == 0) {				++hp;				qsexc(hp, j);				goto loop;			}			if(c > 0) {				if(i == lp) {					++hp;					qstexc(i, hp, j);					i = ++lp;					goto loop;				}				qsexc(i, j);				--j;				++i;				continue;			}			--j;			goto loop;		}		if(i == lp) {			if(uflg)				for(k=lp+1; k<=hp;) **k++ = '\0';			if(lp-a >= l-hp) {				qsort(hp+1, l);				l = lp;			} else {				qsort(a, lp);				a = hp+1;			}			goto start;		}		--lp;		qstexc(j, lp, i);		j = --hp;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -