summaryrefslogtreecommitdiffstats
path: root/contrib/sort/files.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sort/files.c')
-rw-r--r--contrib/sort/files.c372
1 files changed, 0 insertions, 372 deletions
diff --git a/contrib/sort/files.c b/contrib/sort/files.c
deleted file mode 100644
index 7c7a58b..0000000
--- a/contrib/sort/files.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* $NetBSD: files.c,v 1.17 2001/05/15 11:18:23 jdolecek Exp $ */
-
-/*-
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Peter McIlroy.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "sort.h"
-#include "fsort.h"
-
-#ifndef lint
-__RCSID("$NetBSD: files.c,v 1.17 2001/05/15 11:18:23 jdolecek Exp $");
-__SCCSID("@(#)files.c 8.1 (Berkeley) 6/6/93");
-#endif /* not lint */
-
-#include <string.h>
-
-static int seq __P((FILE *, DBT *, DBT *));
-
-/*
- * this is the subroutine for file management for fsort().
- * It keeps the buffers for all temporary files.
- */
-int
-getnext(binno, infl0, filelist, nfiles, pos, end, dummy)
- int binno, infl0;
- struct filelist *filelist;
- int nfiles;
- RECHEADER *pos;
- u_char *end;
- struct field *dummy;
-{
- int i;
- u_char *hp;
- static size_t nleft = 0;
- static int cnt = 0, flag = -1;
- static u_char maxb = 0;
- static FILE *fp;
-
- if (nleft == 0) {
- if (binno < 0) /* reset files. */ {
- for (i = 0; i < nfiles; i++) {
- rewind(fstack[infl0 + i].fp);
- fstack[infl0 + i].max_o = 0;
- }
- flag = -1;
- nleft = cnt = 0;
- return (-1);
- }
- maxb = fstack[infl0].maxb;
- for (; nleft == 0; cnt++) {
- if (cnt >= nfiles) {
- cnt = 0;
- return (EOF);
- }
- fp = fstack[infl0 + cnt].fp;
- fread(&nleft, sizeof(nleft), 1, fp);
- if (binno < maxb)
- fstack[infl0+cnt].max_o
- += sizeof(nleft) + nleft;
- else if (binno == maxb) {
- if (binno != fstack[infl0].lastb) {
- fseek(fp, fstack[infl0+
- cnt].max_o, SEEK_SET);
- fread(&nleft, sizeof(nleft), 1, fp);
- }
- if (nleft == 0)
- fclose(fp);
- } else if (binno == maxb + 1) { /* skip a bin */
- fseek(fp, nleft, SEEK_CUR);
- fread(&nleft, sizeof(nleft), 1, fp);
- flag = cnt;
- }
- }
- }
- if ((u_char *) pos > end - sizeof(TRECHEADER))
- return (BUFFEND);
- fread(pos, sizeof(TRECHEADER), 1, fp);
- if (end - pos->data < pos->length) {
- hp = ((u_char *)pos) + sizeof(TRECHEADER);
- for (i = sizeof(TRECHEADER); i ; i--)
- ungetc(*--hp, fp);
- return (BUFFEND);
- }
- fread(pos->data, pos->length, 1, fp);
- nleft -= pos->length + sizeof(TRECHEADER);
- if (nleft == 0 && binno == fstack[infl0].maxb)
- fclose(fp);
- return (0);
-}
-
-/*
- * this is called when there is no special key. It's only called
- * in the first fsort pass.
- */
-int
-makeline(flno, top, filelist, nfiles, recbuf, bufend, dummy2)
- int flno, top;
- struct filelist *filelist;
- int nfiles;
- RECHEADER *recbuf;
- u_char *bufend;
- struct field *dummy2;
-{
- static u_char *obufend;
- static size_t osz;
- char *pos;
- static int filenum = 0, overflow = 0;
- static FILE *fp = 0;
- int c;
-
- pos = (char *) recbuf->data;
- if (overflow) {
- /*
- * Buffer shortage is solved by either of two ways:
- * o flush previous buffered data and start using the
- * buffer from start (see fsort())
- * o realloc buffer and bump bufend
- *
- * The former is preferred, realloc is only done when
- * there is exactly one item in buffer which does not fit.
- */
- if (bufend == obufend)
- memmove(pos, bufend - osz, osz);
-
- pos += osz;
- overflow = 0;
- }
- for (;;) {
- if (flno >= 0 && (fp = fstack[flno].fp) == NULL)
- return (EOF);
- else if (fp == NULL) {
- if (filenum >= nfiles)
- return (EOF);
- if (!(fp = fopen(filelist->names[filenum], "r")))
- err(2, "%s", filelist->names[filenum]);
- filenum++;
- }
- while ((pos < (char *)bufend) && ((c = getc(fp)) != EOF)) {
- if ((*pos++ = c) == REC_D) {
- recbuf->offset = 0;
- recbuf->length = pos - (char *) recbuf->data;
- return (0);
- }
- }
- if (pos >= (char *)bufend) {
- if (recbuf->data < bufend) {
- overflow = 1;
- obufend = bufend;
- osz = (pos - (char *) recbuf->data);
- }
- return (BUFFEND);
- } else if (c == EOF) {
- if (recbuf->data != (u_char *) pos) {
- *pos++ = REC_D;
- recbuf->offset = 0;
- recbuf->length = pos - (char *) recbuf->data;
- return (0);
- }
- FCLOSE(fp);
- fp = 0;
- if (flno >= 0)
- fstack[flno].fp = 0;
- } else {
-
- warnx("makeline: line too long: ignoring '%.100s...'", recbuf->data);
-
- /* Consume the rest of line from input */
- while((c = getc(fp)) != REC_D && c != EOF)
- ;
-
- recbuf->offset = 0;
- recbuf->length = 0;
-
- return (BUFFEND);
- }
- }
-}
-
-/*
- * This generates keys. It's only called in the first fsort pass
- */
-int
-makekey(flno, top, filelist, nfiles, recbuf, bufend, ftbl)
- int flno, top;
- struct filelist *filelist;
- int nfiles;
- RECHEADER *recbuf;
- u_char *bufend;
- struct field *ftbl;
-{
- static int filenum = 0;
- static FILE *dbdesc = 0;
- static DBT dbkey[1], line[1];
- static int overflow = 0;
- int c;
-
- if (overflow) {
- overflow = enterkey(recbuf, line, bufend - (u_char *)recbuf,
- ftbl);
- if (overflow)
- return (BUFFEND);
- else
- return (0);
- }
-
- for (;;) {
- if (flno >= 0) {
- if (!(dbdesc = fstack[flno].fp))
- return (EOF);
- } else if (!dbdesc) {
- if (filenum >= nfiles)
- return (EOF);
- dbdesc = fopen(filelist->names[filenum], "r");
- if (!dbdesc)
- err(2, "%s", filelist->names[filenum]);
- filenum++;
- }
- if (!(c = seq(dbdesc, line, dbkey))) {
- 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 {
- ((char *) line->data)[60] = '\000';
- warnx("makekey: line too long: ignoring %.100s...",
- (char *)line->data);
- }
- }
-}
-
-/*
- * get a key/line pair from fp
- */
-static int
-seq(fp, line, key)
- FILE *fp;
- DBT *key, *line;
-{
- static char *buf, flag = 1;
- char *end, *pos;
- int c;
-
- if (flag) {
- flag = 0;
- buf = (char *) linebuf;
- end = buf + linebuf_size;
- line->data = buf;
- }
- pos = buf;
- while ((c = getc(fp)) != EOF) {
- if ((*pos++ = c) == REC_D) {
- line->size = pos - buf;
- return (0);
- }
- if (pos == end) {
- linebuf_size *= 2;
- linebuf = realloc(linebuf, linebuf_size);
- if (!linebuf)
- err(2, "realloc of linebuf to %lu bytes failed",
- (unsigned long)linebuf_size);
-
- end = linebuf + linebuf_size;
- pos = linebuf + (pos - buf);
- line->data = buf = (char *)linebuf;
- continue;
- }
- }
- if (pos != buf) {
- *pos++ = REC_D;
- line->size = pos - buf;
- return (0);
- } else
- return (EOF);
-}
-
-/*
- * write a key/line pair to a temporary file
- */
-void
-putrec(rec, fp)
- const RECHEADER *rec;
- FILE *fp;
-{
- EWRITE(rec, 1, rec->length + sizeof(TRECHEADER), fp);
-}
-
-/*
- * write a line to output
- */
-void
-putline(rec, fp)
- const RECHEADER *rec;
- FILE *fp;
-{
- EWRITE(rec->data+rec->offset, 1, rec->length - rec->offset, fp);
-}
-
-/*
- * get a record from a temporary file. (Used by merge sort.)
- */
-int
-geteasy(flno, top, filelist, nfiles, rec, end, dummy2)
- int flno, top;
- struct filelist *filelist;
- int nfiles;
- RECHEADER *rec;
- u_char *end;
- struct field *dummy2;
-{
- int i;
- FILE *fp;
-
- fp = fstack[flno].fp;
- if ((u_char *) rec > end - sizeof(TRECHEADER))
- return (BUFFEND);
- if (!fread(rec, 1, sizeof(TRECHEADER), fp)) {
- fclose(fp);
- fstack[flno].fp = 0;
- return (EOF);
- }
- if (end - rec->data < rec->length) {
- for (i = sizeof(TRECHEADER) - 1; i >= 0; i--)
- ungetc(*((char *) rec + i), fp);
- return (BUFFEND);
- }
- fread(rec->data, rec->length, 1, fp);
- return (0);
-}
OpenPOWER on IntegriCloud