root/usr/src/cmd/refer/mkey2.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 <ctype.h>
#define MAXLINE 500

static int eof = 0;
static long lp, lim;
static int alph, used, prevc;
static char *p, key[20];

extern int common();
extern char *mindex();

static void chkey(int, char *);
static long grec(char *, FILE *);

void
dofile(FILE *f, char *name)
{
        /* read file f & spit out keys & ptrs */

        char line[MAXLINE], *s;
        extern int minlen, keycount, labels;
        int c;
        extern int wholefile;
        extern char *iglist;
        alph = used = prevc = eof = 0;

        lp = 0;
        if (wholefile == 0) {
                while (lim = grec(line, f)) {
#if D1
                        fprintf(stderr, "line: /%s", line);
#endif
                        used = alph = 0;
                        p = key;
                        for (s = line; (c = *s) && (used < keycount); s++)
                                chkey(c, name);
                        lp += lim;
                        if (used) putchar('\n');
                }
        } else {
                p = key;
                used = alph = 0;
                while ((c = getc(f)) != EOF && used < keycount)
                        chkey(c, name);
                if (used) putchar('\n');
        }
        fclose(f);
}

static int
outkey(char *ky, int lead, int trail)
{
        int n;
        extern int minlen;
        n = strlen(ky);
        if (n < minlen)
                return (0);
        if (n < 3) {
                if (trail == '.')
                        return (0);
                if (mindex(".%,!#$%&'();+:*", lead) != 0)
                        return (0);
        }
        if (isdigit(ky[0]))
                /* Allow years 1000 - 2099 */
                if (!(ky[0] == '1' || (ky[0] == '2' && ky[1] == '0')) || n != 4)
                        return (0);
        if (common(ky))
                return (0);
        return (1);
}

static long
grec(char *s, FILE *f)
{
        char tm[200];
        int curtype = 0;
        long len = 0L, tlen = 0L;
        extern int wholefile;
        extern char *iglist;
        if (eof)
                return (0);
        *s = 0;
        while (fgets(tm, 200, f)) {
                tlen += strlen(tm);
                if (tm[0] == '%' || tm[0] == '.')
                        curtype = tm[1];
                if (tlen < MAXLINE && mindex(iglist, curtype) == 0)
                        strcat(s, tm);
                len = tlen;
                if (wholefile == 0 && tm[0] == '\n')
                        return (len);
                if (wholefile > 0 && len >= MAXLINE) {
                        fseek(f, 0L, 2);
                        return (ftell(f));
                }
        }
        eof = 1;
        return (s[0] ? len : 0L);
}

char *
trimnl(char *ln)
{
        char *p = ln;
        while (*p) p++;
        p--;
        if (*p == '\n') *p = 0;
        return (ln);
}

static void
chkey(int c, char *name)
{
        extern int labels;
        extern int wholefile;
        if (isalpha(c) || isdigit(c)) {
                if (alph++ < 6)
                        *p++ = c;
        } else {
                *p = 0;
                for (p = key; *p; p++)
                        *p |= 040;
                if (outkey(p = key, prevc, c)) {
                        if (used == 0) {
                                if (labels) {
                                        if (wholefile == 0)
                                                printf("%s:%ld,%ld\t", name,
                                                    lp, lim);
                                        else
                                                printf("%s\t", name);
                                }
                        } else
                                putchar(' ');
                        fputs(key, stdout);
                        used++;
                }
                prevc = c;
                alph = 0;
        }
}