root/usr/src/cmd/refer/hunt6.c
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved. The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#include <stdio.h>
#include <assert.h>
#include <string.h>
#define TXTLEN 1000

char *outbuf = 0;
extern char *soutput;
extern int soutlen, iflong;
extern long indexdate;
union ptr {
        unsigned *a;
        long *b;
};

extern int corout();
extern int fgrep();
extern long findline();

static int auxil(char *, char *);

int
baddrop(unsigned *mptr, int nf, FILE *fc, int nitem,
            char *qitem[], char *rprog, int full)
{
        /* checks list of drops for real bad drops; finds items with "deliv" */
        int i, g, j, need, got, na, len;
        long lp;
        char res[100], *ar[50], output[TXTLEN], *mput;
        union ptr master;
        extern int colevel, reached;

        if (iflong) {
                master.b = (long *)mptr;
        } else {
                master.a = mptr;
        }

#if D1
        if (iflong)
                fprintf(stderr, "in baddrop, nf %d master %ld %ld %ld\n",
                    nf, master.b[0], master.b[1], master.b[2]);
        else
                fprintf(stderr, "in baddrop, nf %d master %d %d %d\n",
                    nf, master.a[0], master.a[1], master.a[2]);
#endif
        for (i = g = 0; i < nf; i++) {
                lp = iflong ? master.b[i] : master.a[i];
#if D1
                if (iflong)
                        fprintf(stderr, "i %d master %lo lp %lo\n",
                            i, master.b[i], lp);
                else
                        fprintf(stderr, "i %d master %o lp %lo\n",
                            i, master.a[i], lp);
#endif
                fseek(fc, lp, 0);
                fgets(res, 100, fc);
#if D1
                fprintf(stderr, "tag %s", res);
#endif
                if (!auxil(res, output)) {
                        char *s;
                        int c;
#if D1
                        fprintf(stderr, "not auxil try rprog %c\n",
                            rprog ? 'y': 'n');
#endif
                        for (s = res; c = *s; s++)
                                if (c == ';' || c == '\n') {
                                        *s = 0;
                                        break;
                                }

                        if (rprog)
                                len = corout(res, output, rprog, "", TXTLEN);
                        else {
                                len = findline(res, &mput, TXTLEN, indexdate);
                                if (len > 0) {  /* copy and free */
                                        strncpy(output, mput, TXTLEN);
                                        free(mput);
                                } else /* insufficient memory or other... */
                                        len = 0;
                        }
                }
#if D1
                assert(len < TXTLEN);
                fprintf(stderr, "item %d of %d, tag %s len %d output\n%s\n..\n",
                    i, nf, res, len, output);
#endif
                if (len == 0)
                        continue;
                need = colevel ? reached : nitem;
                na = 0;
                ar[na++] = "fgrep";
                ar[na++] = "-r";
                ar[na++] = "-n";
                ar[na++] = (char *)need;
                ar[na++] = "-i";
                ar[na++] = output;
                ar[na++] = (char *)len;
                for (j = 0; j < nitem; j++)
                        ar[na++] = qitem[j];
#ifdef D1
                fprintf(stderr, "calling fgrep len %d ar[4] %s %o %d \n",
                    len, ar[4], ar[5], ar[6]);
#endif
                if (fgrep(na, ar) == 0) {
#ifdef D1
                        fprintf(stderr, "fgrep found it\n");
#endif
                        if (iflong)
                                master.b[g++] = master.b[i];
                        else
                                master.a[g++] = master.a[i];
                        if (full >= g)
                                if (soutput == 0)
                                        fputs(output, stdout);
                                else
                                        strcpy(soutput, output);
                }
#ifdef D1
                fprintf(stderr, "after fgrep\n");
#endif
        }
        return (g);
}

static int
auxil(char *res, char *output)
{
        extern FILE *fd;
        long lp, c;
        int len;
        if (fd == 0)
                return (0);
        while (c = *res++) {
                if (c == ';') {
                        sscanf(res, "%ld,%d", &lp, &len);
                        fseek(fd, lp, 0);
                        fgets(output, len, fd);
                        return (1);
                }
        }
        return (0);
}