Module Name: src
Committed By: dsl
Date: Sat Aug 15 18:40:02 UTC 2009
Modified Files:
src/usr.bin/sort: fields.c files.c sort.h
Log Message:
Remove reference to db.h by using separate ptr+len fields for the only
structure that used it.
Pass end of keybuf area, not size to enterkey() - largely to remove a
variable who'se use isn't obvious from the name!
The structute of this code sucks.
To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/sort/fields.c
cvs rdiff -u -r1.31 -r1.32 src/usr.bin/sort/files.c
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/sort/sort.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/sort/fields.c
diff -u src/usr.bin/sort/fields.c:1.21 src/usr.bin/sort/fields.c:1.22
--- src/usr.bin/sort/fields.c:1.21 Sat Aug 15 09:48:46 2009
+++ src/usr.bin/sort/fields.c Sat Aug 15 18:40:01 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: fields.c,v 1.21 2009/08/15 09:48:46 dsl Exp $ */
+/* $NetBSD: fields.c,v 1.22 2009/08/15 18:40:01 dsl Exp $ */
/*-
* Copyright (c) 2000-2003 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
#include "sort.h"
#ifndef lint
-__RCSID("$NetBSD: fields.c,v 1.21 2009/08/15 09:48:46 dsl Exp $");
+__RCSID("$NetBSD: fields.c,v 1.22 2009/08/15 18:40:01 dsl Exp $");
__SCCSID("@(#)fields.c 8.1 (Berkeley) 6/6/93");
#endif /* not lint */
@@ -81,8 +81,8 @@
while ((*(pos+1) != '\0') && !((FLD_D | REC_D_F) & l_d_mask[*++pos]));\
}
-static u_char *enterfield(u_char *, u_char *, struct field *, int);
-static u_char *number(u_char *, u_char *, u_char *, u_char *, int);
+static u_char *enterfield(u_char *, const u_char *, struct field *, int);
+static u_char *number(u_char *, const u_char *, u_char *, u_char *, int);
#define DECIMAL '.'
#define OFFSET 128
@@ -97,19 +97,21 @@
* followed by the original line.
*/
length_t
-enterkey(RECHEADER *keybuf, DBT *line, int size, struct field fieldtable[])
+enterkey(RECHEADER *keybuf, const u_char *keybuf_end, u_char *line_data, size_t line_size, struct field fieldtable[])
/* keybuf: pointer to start of key */
{
int i;
u_char *l_d_mask;
u_char *lineend, *pos;
- u_char *endkey, *keypos;
+ const u_char *endkey;
+ u_char *keypos;
struct coldesc *clpos;
int col = 1;
struct field *ftpos;
+
l_d_mask = d_mask;
- pos = (u_char *) line->data - 1;
- lineend = (u_char *) line->data + line->size-1;
+ pos = line_data - 1;
+ lineend = line_data + line_size-1;
/* don't include rec_delimiter */
for (i = 0; i < ncols; i++) {
@@ -131,19 +133,19 @@
}
for (; i <= ncols; i++)
clist[i].start = clist[i].end = lineend;
- if (clist[0].start < (u_char *) line->data)
+ if (clist[0].start < line_data)
clist[0].start++;
keypos = keybuf->data;
- endkey = (u_char *) keybuf + size - line->size;
+ endkey = keybuf_end - line_size;
for (ftpos = fieldtable + 1; ftpos->icol.num; ftpos++)
if ((keypos = enterfield(keypos, endkey, ftpos,
fieldtable->flags)) == NULL)
return (1);
keybuf->offset = keypos - keybuf->data;
- keybuf->length = keybuf->offset + line->size;
- if (keybuf->length + sizeof(TRECHEADER) > (length_t)size) {
+ keybuf->length = keybuf->offset + line_size;
+ if (keybuf->data + keybuf->length > keybuf_end) {
/* line too long for buffer */
return (1);
}
@@ -154,10 +156,10 @@
* 2. we want stable sort and so the items should be sorted only by
* the relevant field[s]
*/
- if (UNIQUE || (stable_sort && keybuf->offset < line->size))
+ if (UNIQUE || (stable_sort && keybuf->offset < line_size))
keypos[-1] = REC_D;
- memcpy(keybuf->data + keybuf->offset, line->data, line->size);
+ memcpy(keybuf->data + keybuf->offset, line_data, line_size);
return (0);
}
@@ -165,7 +167,7 @@
* constructs a field (as defined by -k) within a key
*/
static u_char *
-enterfield(u_char *tablepos, u_char *endkey, struct field *cur_fld, int gflags)
+enterfield(u_char *tablepos, const u_char *endkey, struct field *cur_fld, int gflags)
{
u_char *start, *end, *lineend, *mask, *lweight;
struct column icol, tcol;
@@ -233,7 +235,7 @@
*/
static u_char *
-number(u_char *pos, u_char *bufend, u_char *line, u_char *lineend, int Rflag)
+number(u_char *pos, const u_char *bufend, u_char *line, u_char *lineend, int Rflag)
{
int or_sign, parity = 0;
int expincr = 1, exponent = -1;
Index: src/usr.bin/sort/files.c
diff -u src/usr.bin/sort/files.c:1.31 src/usr.bin/sort/files.c:1.32
--- src/usr.bin/sort/files.c:1.31 Sat Aug 15 16:50:29 2009
+++ src/usr.bin/sort/files.c Sat Aug 15 18:40:01 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: files.c,v 1.31 2009/08/15 16:50:29 dsl Exp $ */
+/* $NetBSD: files.c,v 1.32 2009/08/15 18:40:01 dsl Exp $ */
/*-
* Copyright (c) 2000-2003 The NetBSD Foundation, Inc.
@@ -65,13 +65,13 @@
#include "fsort.h"
#ifndef lint
-__RCSID("$NetBSD: files.c,v 1.31 2009/08/15 16:50:29 dsl Exp $");
+__RCSID("$NetBSD: files.c,v 1.32 2009/08/15 18:40:01 dsl Exp $");
__SCCSID("@(#)files.c 8.1 (Berkeley) 6/6/93");
#endif /* not lint */
#include <string.h>
-static int seq(FILE *, DBT *);
+static ssize_t seq(FILE *, u_char **);
/*
* this is the subroutine for file management for fsort().
@@ -174,6 +174,7 @@
pos += osz;
overflow = 0;
}
+
for (;;) {
if (flno >= 0 && (fp = fstack[flno].fp) == NULL)
return (EOF);
@@ -235,19 +236,17 @@
{
static int filenum = 0;
static FILE *dbdesc = 0;
- static DBT line[1];
+ static u_char *line_data;
+ static ssize_t line_size;
static int overflow = 0;
- int c;
+ /* We get re-entered after returning BUFFEND - save old data */
if (overflow) {
- overflow = enterkey(recbuf, line, bufend - (u_char *)recbuf,
- ftbl);
- if (overflow)
- return (BUFFEND);
- else
- return (0);
+ overflow = enterkey(recbuf, bufend, line_data, line_size, ftbl);
+ return overflow ? BUFFEND : 0;
}
+ /* Loop through files until we find a line of input */
for (;;) {
if (flno >= 0) {
if (!(dbdesc = fstack[flno].fp))
@@ -260,35 +259,31 @@
err(2, "%s", filelist->names[filenum]);
filenum++;
}
- if (!(c = seq(dbdesc, line))) {
- if ((signed)line->size > bufend - recbuf->data) {
- overflow = 1;
- } else {
- overflow = enterkey(recbuf, line,
- bufend - (u_char *) recbuf, ftbl);
- }
- if (overflow)
- return (BUFFEND);
- else
- return (0);
- }
- if (c == EOF) {
- FCLOSE(dbdesc);
- dbdesc = 0;
- if (flno >= 0)
- fstack[flno].fp = 0;
- } else {
- warnx("makekey: line too long: ignoring %.60s...",
- (char *)line->data);
- }
+ line_size = seq(dbdesc, &line_data);
+ if (line_size != 0)
+ /* Got a line */
+ break;
+
+ /* End of file ... */
+ FCLOSE(dbdesc);
+ dbdesc = 0;
+ if (flno >= 0)
+ fstack[flno].fp = 0;
+ }
+
+ if (line_size > bufend - recbuf->data) {
+ overflow = 1;
+ } else {
+ overflow = enterkey(recbuf, bufend, line_data, line_size, ftbl);
}
+ return overflow ? BUFFEND : 0;
}
/*
- * get a line pair from fp
+ * get a line of input from fp
*/
-static int
-seq(FILE *fp, DBT *line)
+static ssize_t
+seq(FILE *fp, u_char **line)
{
static u_char *buf;
static size_t buf_size = DEFLLEN;
@@ -302,18 +297,19 @@
if (!buf)
err(2, "malloc of linebuf for %zu bytes failed",
buf_size);
- line->data = buf;
}
end = buf + buf_size;
pos = buf;
while ((c = getc(fp)) != EOF) {
- if ((*pos++ = c) == REC_D) {
- line->size = pos - buf;
- return (0);
+ *pos++ = c;
+ if (c == REC_D) {
+ *line = buf;
+ return pos - buf;
}
if (pos == end) {
/* Long line - double size of buffer */
+ /* XXX: Check here for stupidly long lines */
buf_size *= 2;
new_buf = realloc(buf, buf_size);
if (!new_buf)
@@ -323,18 +319,17 @@
end = new_buf + buf_size;
pos = new_buf + (pos - buf);
buf = new_buf;
- line->data = buf;
}
}
if (pos != buf) {
/* EOF part way through line - add line terminator */
*pos++ = REC_D;
- line->size = pos - buf;
- return (0);
+ *line = buf;
+ return pos - buf;
}
- return (EOF);
+ return 0;
}
/*
Index: src/usr.bin/sort/sort.h
diff -u src/usr.bin/sort/sort.h:1.20 src/usr.bin/sort/sort.h:1.21
--- src/usr.bin/sort/sort.h:1.20 Mon Apr 13 11:07:59 2009
+++ src/usr.bin/sort/sort.h Sat Aug 15 18:40:01 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sort.h,v 1.20 2009/04/13 11:07:59 lukem Exp $ */
+/* $NetBSD: sort.h,v 1.21 2009/08/15 18:40:01 dsl Exp $ */
/*-
* Copyright (c) 2000-2003 The NetBSD Foundation, Inc.
@@ -65,7 +65,6 @@
#include <sys/param.h>
-#include <db.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
@@ -174,7 +173,7 @@
void append(const u_char **, int, int, FILE *,
void (*)(const RECHEADER *, FILE *), struct field *);
void concat(FILE *, FILE *);
-length_t enterkey(RECHEADER *, DBT *, int, struct field *);
+length_t enterkey(RECHEADER *, const u_char *, u_char *, size_t, struct field *);
void fixit(int *, char **);
void fldreset(struct field *);
FILE *ftmp(void);