📄 sort.c
字号:
bp = mp->b; cp = mp->l; ce = cp+L; do { c = getc(bp); if(c == EOF) return(1); if(cp>=ce) cp--; *cp++ = c; } while(c!='\n'); return(0);}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;{ diag("can't open ",f); term();}diag(s,t)char *s, *t;{ fputs("sort: ",stderr); fputs(s,stderr); fputs(t,stderr); fputs("\n",stderr);}term(){ 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) { 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; p++; } else { while(blank(*p)) p++; while(!blank(*p)) if(*p != '\n') p++; else goto ret; } } if(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);}blank(c){ if(c==' ' || c=='\t') return(1); return(0);}#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 + -