root/usr/src/cmd/refer/refer1.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 <stdlib.h>
#include <signal.h>
#include <locale.h>
#include "refer..c"

extern void clfgrep();
extern void doref();
extern void dumpold();
extern void err();
extern void output();
extern int prefix();
extern void recopy();

void cleanup(void);
void signals(void);

int
main(int argc, char *argv[])    /* process command-line arguments */
{
        char line[BUFSIZ], *s;
        int nodeflt = 0;

        (void) setlocale(LC_ALL, "");
#if !defined(TEXT_DOMAIN)
#define TEXT_DOMAIN "SYS_TEST"
#endif
        (void) textdomain(TEXT_DOMAIN);

        signals();
        while (argc > 1 && argv[1][0] == '-') {
                switch (argv[1][1]) {
                case 'e':
                        endpush++;
                        break;
                case 's':
                        sort++;
                        endpush = 1;
                        if (argv[1][2])
                                keystr = argv[1]+2;
                        break;
                case 'l':
                        labels++;
                        s = argv[1]+2;
                        nmlen = atoi(s);
                        while (*s)
                                if (*s++ == ',')
                                        break;
                        dtlen = atoi(s);
                        break;
                case 'k':
                        keywant = (argv[1][2] ? argv[1][2] : 'L');
                        labels++;
                        break;
                case 'n':
                        nodeflt = 1;
                        break;
                case 'p':
                        argc--;
                        argv++;
                        *search++ = argv[1];
                        if (search-rdata > NSERCH)
                                err(gettext(
                                    "too many -p options (%d)"), NSERCH);
                        break;
                case 'a':
                        authrev = atoi(argv[1]+2);
                        if (authrev <= 0)
                                authrev = 1000;
                        break;
                case 'b':
                        bare = (argv[1][2] == '1') ? 1 : 2;
                        break;
                case 'c':
                        smallcaps = argv[1]+2;
                        break;
                case 'f':
                        refnum = atoi(argv[1]+2) - 1;
                        break;
                case 'B':
                        biblio++;
                        bare = 2;
                        if (argv[1][2])
                                convert = argv[1]+2;
                        break;
                case 'S':
                        science++;
                        labels = 1;
                        break;
                case 'P':
                        postpunct++;
                        break;
                }
                argc--;
                argv++;
        }
        if (getenv("REFER") != NULL)
                *search++ = getenv("REFER");
        else if (nodeflt == 0)
                *search++ = "/usr/lib/refer/papers/Ind";
        if (sort && !labels) {
                sprintf(ofile, "/tmp/rj%db", getpid());
                ftemp = fopen(ofile, "w");
                if (ftemp == NULL) {
                        fprintf(stderr, gettext("Can't open scratch file\n"));
                        exit(1);
                }
        }
        if (endpush) {
                sprintf(tfile, "/tmp/rj%da", getpid());
                fo = fopen(tfile, "w");
                if (fo == NULL) {
                        fo = ftemp;
                        fprintf(stderr, gettext("Can't open scratch file"));
                }
                sep = 002; /* separate records without confusing sort.. */
        } else
                fo = ftemp;
        do {
                if (argc > 1) {
                        fclose(in);
                        Iline = 0;
                        in = fopen(Ifile = argv[1], "r");
                        argc--;
                        argv++;
                        if (in == NULL) {
                                err(gettext("Can't read %s"), Ifile);
                                continue;
                        }
                }
                while (input(line)) {
                        Iline++;
                        if (biblio && *line == '\n')
                                doref(line);
                        else if (biblio && Iline == 1 && *line == '%')
                                doref(line);
                        else if (!prefix(".[", line))
                                output(line);
                        else
                                doref(line);
                }
        } while (argc > 1);

        if (endpush && fo != NULL)
                dumpold();
        output("");
        if (sort && !labels)
                recopy(ofile);
        clfgrep();
        cleanup();
        return (0);
}

extern void intr();

void
signals(void)
{
        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                signal(SIGINT, intr);
        signal(SIGHUP, intr);
        signal(SIGPIPE, intr);
        signal(SIGTERM, intr);
}

void
intr(void)
{
        signal(SIGINT, SIG_IGN);
        cleanup();
        exit(1);
}

void
cleanup(void)
{
        if (tfile[0])
                unlink(tfile);
        if (gfile[0])
                unlink(gfile);
        if (ofile[0])
                unlink(ofile);
        if (hidenam[0])
                unlink(hidenam);
}