OpenSolaris_b135/cmd/refer/mkey2.c

Compare this file to the similar file:
Show the results in this format:

/*
 * 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.
 */

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#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;
	}
}