void dokey_m(Key*, uchar*, uchar*, Field*);
void dokey_r(Key*, uchar*, uchar*, Field*);
void done(char*);
+void* emalloc(ulong);
+void* erealloc(void*, ulong);
int kcmp(Key*, Key*);
void makemapd(Field*);
void makemapm(Field*);
void mergeout(Biobuf*);
void newfield(void);
Line* newline(Biobuf*);
-void nomem(void);
void notifyf(void*, char*);
void printargs(void);
void printout(Biobuf*);
printargs();
for(i=1; i<argc; i++) {
- s = argv[i];
- if(s == 0)
+ if((s = argv[i]) == nil)
continue;
if(strcmp(s, "-") == 0) {
Binit(&bbuf, 0, OREAD);
Bterm(&bbuf);
}
if(args.cflag)
- done(0);
+ done(nil);
if(args.vflag)
fprint(2, "=========\n");
printout(&bbuf);
}
Bterm(&bbuf);
- done(0);
+ done(nil);
}
void
int n;
if(args.cflag) {
- ol = newline(b);
- if(ol == 0)
+ if((ol = newline(b)) == nil)
return;
for(;;) {
- l = newline(b);
- if(l == 0)
+ if((l = newline(b)) == nil)
break;
n = kcmp(ol->key, l->key);
if(n > 0 || (n == 0 && args.uflag)) {
return;
}
- if(args.linep == 0) {
- args.linep = malloc(args.mline * sizeof(args.linep));
- if(args.linep == 0)
- nomem();
- }
+ if(args.linep == nil)
+ args.linep = emalloc(args.mline * sizeof(args.linep));
for(;;) {
- l = newline(b);
- if(l == 0)
+ if((l = newline(b)) == nil)
break;
if(args.nline >= args.mline)
tempout();
{
if(strcmp(s, "interrupt") == 0)
- done(0);
+ done(nil);
if(strcmp(s, "hangup") == 0)
- done(0);
+ done(nil);
if(strcmp(s, "kill") == 0)
- done(0);
+ done(nil);
if(strncmp(s, "sys: write on closed pipe", 25) == 0)
- done(0);
+ done(nil);
fprint(2, "sort: note: %s\n", s);
abort();
}
p = Brdline(b, '\n');
n = Blinelen(b);
- if(p == 0) {
+ if(p == nil) {
if(n == 0)
return 0;
- l = 0;
+ l = nil;
for(n=0;;) {
- if((n & 31) == 0) {
- l = realloc(l, sizeof(Line) +
+ if((n & 31) == 0)
+ l = erealloc(l, sizeof(Line) +
(n+31)*sizeof(l->line[0]));
- if(l == 0)
- nomem();
- }
c = Bgetc(b);
if(c < 0) {
fprint(2, "sort: newline added\n");
c = '\n';
}
+ if(l == nil)
+ sysfatal("bug: l == nil");
l->line[n++] = c;
if(c == '\n')
break;
buildkey(l);
return l;
}
- l = malloc(sizeof(Line) +
- (n-1)*sizeof(l->line[0]));
- if(l == 0)
- nomem();
+ l = emalloc(sizeof(Line) + (n-1)*sizeof(l->line[0]));
l->llen = n;
memmove(l->line, p, n);
buildkey(l);
exits(xs);
}
-void
-nomem(void)
+void*
+erealloc(void *v, ulong n)
{
- fprint(2, "sort: out of memory\n");
- done("mem");
+ if((v = realloc(v, n)) == nil && n != 0){
+ fprint(2, "realloc: %r\n");
+ done("realloc");
+ }
+
+ return v;
+}
+
+void*
+emalloc(ulong n)
+{
+ void *v;
+
+ if((v = malloc(n)) == nil){
+ fprint(2, "malloc: %r\n");
+ done("malloc");
+ }
+ memset(v, 0, n);
+
+ return v;
}
char*
}
}
- sprint(file, "%s/sort.%.4d.%.4d", dir, pid%10000, n);
+ snprint(file, sizeof(file), "%s/sort.%.4d.%.4d", dir, pid%10000, n);
return file;
}
char *tf;
int i, f, nn;
- mmp = malloc(n*sizeof(*mmp));
- mp = malloc(n*sizeof(*mp));
- if(mmp == 0 || mp == 0)
- nomem();
+ mmp = emalloc(n*sizeof(*mmp));
+ mp = emalloc(n*sizeof(*mp));
nn = 0;
m = mp;
Binit(&m->b, f, OREAD);
mmp[nn] = m;
- l = newline(&m->b);
- if(l == 0)
+ if((l = newline(&m->b)) == nil)
continue;
nn++;
m->line = l;
}
l = newline(&m->b);
- if(l == 0) {
+ if(l == nil) {
nn--;
mmp[0] = mmp[nn];
break;
s = strchr(s, 0);
break;
case 'k': /* posix key (what were they thinking?) */
- p = 0;
+ p = nil;
if(*s == 0) {
i++;
if(i < argc) {
} else
p = s;
s = strchr(s, 0);
- if(p == 0)
+ if(p == nil)
break;
newfield();
q = strchr(p, ',');
- if(q)
+ if(q != nil)
*q++ = 0;
f = &args.field[args.nfield];
dofield(p, &f->beg1, &f->beg2, 1, 1);
f->flags |= B1flag;
f->flags &= ~Bflag;
}
- if(q) {
+ if(q != nil) {
dofield(q, &f->end1, &f->end2, 1, 0);
if(f->end2 <= 0)
f->end1++;
uchar*
skip(uchar *l, int n1, int n2, int bflag, int endfield)
{
- int i, c, tc;
+ int i, c, ln, tc;
Rune r;
if(endfield && n1 < 0)
return 0;
c = *l++;
+ ln = 1;
tc = args.tabchar;
if(tc) {
if(tc < Runeself) {
}
} else {
l--;
- l += chartorune(&r, (char*)l);
+ l += ln = chartorune(&r, (char*)l);
for(i=n1; i>0; i--) {
while(r != tc) {
if(r == '\n')
return 0;
- l += chartorune(&r, (char*)l);
+ l += ln = chartorune(&r, (char*)l);
}
if(!(endfield && i == 1))
- l += chartorune(&r, (char*)l);
+ l += ln = chartorune(&r, (char*)l);
}
c = r;
}
}
if(bflag)
- while(c == ' ' || c == '\t')
+ while(c == ' ' || c == '\t'){
c = *l++;
+ ln = 1;
+ }
- l--;
+ l -= ln;
for(i=n2; i>0; i--) {
c = *l;
if(c < Runeself) {
for(i=1; i<=args.nfield; i++) {
f = &args.field[i];
- lp = skip(l->line, f->beg1, f->beg2, f->flags&B1flag, 0);
- if(lp == 0)
+ if((lp = skip(l->line, f->beg1, f->beg2, f->flags&B1flag, 0)) == nil)
lp = l->line + ll;
- lpe = skip(l->line, f->end1, f->end2, f->flags&Bflag, 1);
- if(lpe == 0)
+ if((lpe = skip(l->line, f->end1, f->end2, f->flags&Bflag, 1)) == nil)
lpe = l->line + ll;
n = (lpe - lp) + 1;
if(n <= 0)
n = 1;
if(cl+(n+4) > kl) {
kl = cl+(n+4);
- k = realloc(k, sizeof(Key) +
+ k = erealloc(k, sizeof(Key) +
(kl-1)*sizeof(k->key[0]));
- if(k == 0)
- nomem();
}
k->klen = cl;
(*f->dokey)(k, lp, lpe, f);
f = &args.field[0];
if(cl+(ll+4) > kl) {
kl = cl+(ll+4);
- k = realloc(k, sizeof(Key) +
+ k = erealloc(k, sizeof(Key) +
(kl-1)*sizeof(k->key[0]));
- if(k == 0)
- nomem();
}
k->klen = cl;
(*f->dokey)(k, l->line, l->line+ll, f);
k->klen = cl;
if(args.vflag) {
- write(2, l->line, l->llen);
+ if(write(2, l->line, l->llen) != l->llen)
+ exits("write");
for(i=0; i<k->klen; i++) {
fprint(2, " %.2x", k->key[i]);
if(k->key[i] == 0x00 || k->key[i] == 0xff)