X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/8e1d70b89ebb2cf718bdb26eece7dc94a1155cc9..aaed0657ced484643203272352b867f8e5bb310e:/usr/src/usr.bin/sort/sort.c diff --git a/usr/src/usr.bin/sort/sort.c b/usr/src/usr.bin/sort/sort.c index 5ba1b6dcb8..5e0d19b61a 100644 --- a/usr/src/usr.bin/sort/sort.c +++ b/usr/src/usr.bin/sort/sort.c @@ -1,24 +1,26 @@ -static char *sccsid = "@(#)sort.c 4.6 (Berkeley) %G%"; +static char *sccsid = "@(#)sort.c 4.13 (Berkeley) %G%"; +#include #include #include #include -#include #include -#define L 1024 +#define L 2048 #define N 7 #define C 20 #ifndef pdp11 -#define MEM (64*2048) +#define MEM (128*2048) #else #define MEM (16*2048) #endif #define NF 10 +#define rline(mp) (fgets((mp)->l, L, (mp)->b) == NULL) + FILE *is, *os; char *dirtry[] = {"/usr/tmp", "/tmp", NULL}; char **dirs; -char file1[30]; +char file1[MAXPATHLEN]; char *file = file1; char *filep; int nfiles; @@ -300,54 +302,70 @@ sort() { register char *cp; register char **lp; - register c; - int done; - int i; + register lines, text, len; + int done = 0; + int i = 0; char *f; + char c; + + if((f = setfil(i++)) == NULL) + is = stdin; + else if((is = fopen(f, "r")) == NULL) + cant(f); - done = 0; - i = 0; - c = EOF; do { cp = tspace; lp = (char **)lspace; - while(lp < (char **)lspace+nlines && cp < tspace+ntext) { - *lp++ = cp; - while(c != '\n') { - if(c != EOF) { - *cp++ = c; - c = getc(is); - continue; - } else if(is) - fclose(is); - if(i < eargc) { - if((f = setfil(i++)) == 0) - is = stdin; - else if((is = fopen(f, "r")) == NULL) - cant(f); - c = getc(is); - } else + lines = nlines; + text = ntext; + while(lines > 0 && text > 0) { + if(fgets(cp, L, is) == NULL) { + if(i >= eargc) { + ++done; break; + } + fclose(is); + if((f = setfil(i++)) == NULL) + is = stdin; + else if((is = fopen(f, "r")) == NULL) + cant(f); + continue; } - *cp++ = '\n'; - if(c == EOF) { - done++; - lp--; - break; - } - c = getc(is); + *lp++ = cp; + len = strlen(cp) + 1; /* null terminate */ + if(cp[len - 2] != '\n') + if (len == L) { + diag("line too long (skipped): ", cp); + while((c=getc(is)) != EOF && c != '\n') + /* throw it away */; + --lp; + continue; + } else { + diag("missing newline before EOF in ", + f ? f : "standard input"); + /* be friendly, append a newline */ + ++len; + cp[len - 2] = '\n'; + cp[len - 1] = '\0'; + } + cp += len; + --lines; + text -= len; } qsort((char **)lspace, lp); if(done == 0 || nfiles != eargc) newfile(); else oldfile(); + clearerr(os); while(lp > (char **)lspace) { cp = *--lp; if(*cp) - do - putc(*cp, os); - while(*cp++ != '\n'); + fputs(cp, os); + if (ferror(os)) { + error = 1; + term(); + } } fclose(os); } while(done == 0); @@ -401,15 +419,19 @@ merge(a,b) } } while(l); + clearerr(os); muflg = mflg & uflg | cflg; i = j; while(i > 0) { cp = ibuf[i-1]->l; if (!cflg && (uflg == 0 || muflg || i == 1 || - (*compare)(ibuf[i-1]->l,ibuf[i-2]->l))) - do - putc(*cp, os); - while(*cp++ != '\n'); + (*compare)(ibuf[i-1]->l,ibuf[i-2]->l))) { + fputs(cp, os); + if (ferror(os)) { + error = 1; + term(); + } + } if(muflg){ cp = ibuf[i-1]->l; dp = p->l; @@ -453,28 +475,6 @@ merge(a,b) fclose(os); } -rline(mp) -struct merg *mp; -{ - register char *cp; - register char *ce; - FILE *bp; - register 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; { @@ -720,7 +720,7 @@ char *pp; else goto ret; } } - if(tabchar==0&&fp->bflg[j]) + if(tabchar==0||fp->bflg[j]) while(blank(*p)) p++; i = fp->n[j]; @@ -828,15 +828,6 @@ char **ppa; return(n); } -#ifndef blank -blank(c) -{ - if(c==' ' || c=='\t') - return(1); - return(0); -} -#endif - #define qsexc(p,q) t= *p;*p= *q;*q=t #define qstexc(p,q,r) t= *p;*p= *r;*r= *q;*q=t