make tmp file MAXPATHLEN; bug report 4.3BSD/usr.bin/96
[unix-history] / usr / src / usr.bin / sort / sort.c
index bcc0d7b..5e0d19b 100644 (file)
@@ -1,24 +1,26 @@
-static char *sccsid = "@(#)sort.c      4.5 (Berkeley) %G%";
+static char *sccsid = "@(#)sort.c      4.13 (Berkeley) %G%";
+#include <sys/param.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <signal.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <signal.h>
-#include <sys/types.h>
 #include <sys/stat.h>
 
 #include <sys/stat.h>
 
-#define        L       1024
+#define        L       2048
 #define        N       7
 #define        C       20
 #define        N       7
 #define        C       20
-#ifdef vax
-#define        MEM     (64*2048)
+#ifndef pdp11
+#define        MEM     (128*2048)
 #else
 #define        MEM     (16*2048)
 #endif
 #define NF     10
 
 #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;
 FILE   *is, *os;
 char   *dirtry[] = {"/usr/tmp", "/tmp", NULL};
 char   **dirs;
-char   file1[30];
+char   file1[MAXPATHLEN];
 char   *file = file1;
 char   *filep;
 int    nfiles;
 char   *file = file1;
 char   *filep;
 int    nfiles;
@@ -300,54 +302,70 @@ sort()
 {
        register char *cp;
        register char **lp;
 {
        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 *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;
        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;
                                        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();
                }
                qsort((char **)lspace, lp);
                if(done == 0 || nfiles != eargc)
                        newfile();
                else
                        oldfile();
+               clearerr(os);
                while(lp > (char **)lspace) {
                        cp = *--lp;
                        if(*cp)
                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);
                }
                fclose(os);
        } while(done == 0);
@@ -401,15 +419,19 @@ merge(a,b)
                }
        } while(l);
 
                }
        } while(l);
 
+       clearerr(os);
        muflg = mflg & uflg | cflg;
        i = j;
        while(i > 0) {
                cp = ibuf[i-1]->l;
        muflg = mflg & uflg | cflg;
        i = j;
        while(i > 0) {
                cp = ibuf[i-1]->l;
-               if(!cflg && (uflg == 0 || muflg ||
-                       (*compare)(ibuf[i-1]->l,ibuf[i-2]->l)))
-                       do
-                               putc(*cp, os);
-                       while(*cp++ != '\n');
+               if (!cflg && (uflg == 0 || muflg || i == 1 ||
+                       (*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;
                if(muflg){
                        cp = ibuf[i-1]->l;
                        dp = p->l;
@@ -453,28 +475,6 @@ merge(a,b)
        fclose(os);
 }
 
        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;
 {
 disorder(s,t)
 char *s, *t;
 {
@@ -720,7 +720,7 @@ char *pp;
                                else goto ret;
                }
        }
                                else goto ret;
                }
        }
-       if(tabchar==0&&fp->bflg[j])
+       if(tabchar==0||fp->bflg[j])
                while(blank(*p))
                        p++;
        i = fp->n[j];
                while(blank(*p))
                        p++;
        i = fp->n[j];
@@ -828,15 +828,6 @@ char **ppa;
        return(n);
 }
 
        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
 
 #define qsexc(p,q) t= *p;*p= *q;*q=t
 #define qstexc(p,q,r) t= *p;*p= *r;*r= *q;*q=t