-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 <sys/types.h>
#include <sys/stat.h>
-#define L 1024
+#define L 2048
#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
+#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;
{
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);
}
} while(l);
+ clearerr(os);
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;
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;
{
else goto ret;
}
}
- if(tabchar==0&&fp->bflg[j])
+ if(tabchar==0||fp->bflg[j])
while(blank(*p))
p++;
i = fp->n[j];
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