echo shar: extracting "'getscan.c'" '(5672 characters)'
sed 's/^X//' << \SHAR_EOF > 'getscan.c'
X/* Copyright (c) 1986, Greg McGary */
Xstatic char sccsid[] = "@(#)getscan.c	1.1 86/10/09";
X
X#include	<stdio.h>
X#include	<string.h>
X#include	<id.h>
X#include	<ctype.h>
X#include	<extern.h>
X
Xchar *getLanguage();
Xchar *(*getScanner())();
Xvoid setScanArgs();
X
Xstatic struct sufftab *suffSlot();
Xstatic struct langtab *langSlot();
Xstatic void sorryNoScan();
X
Xvoid setAdaArgs(lang) { sorryNoScan(lang); }
Xchar *getAdaId() { setAdaArgs("ada"); return NULL; }
X
Xvoid setPascalArgs(lang) { sorryNoScan(lang); }
Xchar *getPascalId() { setPascalArgs("pascal"); return NULL; }
X
Xvoid setTextArgs(lang) { sorryNoScan(lang); }
Xchar *getTextId() { setTextArgs("plain text"); return NULL; }
X
Xvoid setRoffArgs(lang) { sorryNoScan(lang); }
Xchar *getRoffId() { setRoffArgs("[nt]roff"); return NULL; }
X
Xvoid setTeXArgs(lang) { sorryNoScan(lang); }
Xchar *getTeXId() { setTeXArgs("TeX"); return NULL; }
X
Xvoid setLispArgs(lang) { sorryNoScan(lang); }
Xchar *getLispId() { setLispArgs("lisp"); return NULL; }
X
Xstruct langtab {
X	struct langtab	*lt_next;
X	char	*lt_name;
X	char	*(*lt_getid)();
X	void	(*lt_setargs)();
X};
X
Xstruct sufftab {
X	struct sufftab	*st_next;
X	char	*st_suffix;
X	struct langtab *st_lang;
X};
X
X
Xstruct langtab langtab[] = {
X#define	SCAN_C		(&langtab[0])
X{	&langtab[1],	"c",		getCId,		setCArgs	},
X#define	SCAN_ASM	(&langtab[1])
X{	&langtab[2],	"asm",		getAsmId,	setAsmArgs	},
X#define	SCAN_ADA	(&langtab[2])
X{	&langtab[3],	"ada",		getAdaId,	setAdaArgs	},
X#define	SCAN_PASCAL	(&langtab[3])
X{	&langtab[4],	"pascal",	getPascalId,	setPascalArgs	},
X#define	SCAN_LISP	(&langtab[4])
X{	&langtab[5],	"lisp",		getLispId,	setLispArgs	},
X#define	SCAN_TEXT	(&langtab[5])
X{	&langtab[6],	"text",		getTextId,	setTextArgs	},
X#define	SCAN_ROFF	(&langtab[6])
X{	&langtab[7],	"roff",		getRoffId,	setRoffArgs	},
X#define	SCAN_TEX	(&langtab[7])
X{	&langtab[8],	"tex",		getTeXId,	setTeXArgs	},
X{ NULL, NULL, NULL, NULL }
X};
X
X/*
X	This is a rather incomplete list of default associations
X	between suffixes and languages.  You may add more to the
X	default list, or you may define them dynamically with the
X	`-S<suff>=<lang>' argument to mkid(1) and idx(1).  e.g. to
X	associate a `.ada' suffix with the Ada language, use
X	`-S.ada=ada'
X*/
Xstruct sufftab sufftab[] = {
X{	&sufftab[1],	".c",	SCAN_C		},
X{	&sufftab[2],	".h",	SCAN_C		},
X{	&sufftab[3],	".y",	SCAN_C		},
X{	&sufftab[4],	".s",	SCAN_ASM	},
X{	&sufftab[5],	".p",	SCAN_PASCAL	},
X{	&sufftab[6],	".pas",	SCAN_PASCAL	},
X{ NULL, NULL, NULL },
X};
X
X/*
X	Return an index into the langtab array for the given suffix.
X*/
Xstatic struct sufftab *
XsuffSlot(suffix)
X	register char	*suffix;
X{
X	register struct sufftab	*stp;
X
X	if (suffix == NULL)
X		suffix = "";
X
X	for (stp = sufftab; stp->st_next; stp = stp->st_next)
X		if (strequ(stp->st_suffix, suffix))
X			return stp;
X	return stp;
X}
X
Xstatic struct langtab *
XlangSlot(lang)
X	char		*lang;
X{
X	register struct langtab	*ltp;
X
X	if (lang == NULL)
X		lang = "";
X
X	for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
X		if (strequ(ltp->lt_name, lang))
X			return ltp;
X	return ltp;
X}
X
Xchar *
XgetLanguage(suffix)
X	char		*suffix;
X{
X	struct sufftab	*stp;
X
X	if ((stp = suffSlot(suffix))->st_next == NULL)
X		return NULL;
X	return (stp->st_lang->lt_name);
X}
X
Xchar *(*
XgetScanner(lang))()
X	char		*lang;
X{
X	struct langtab	*ltp;
X
X	if ((ltp = langSlot(lang))->lt_next == NULL)
X		return NULL;
X	return (ltp->lt_getid);
X}
X
Xstatic void
Xusage()
X{
X	fprintf(stderr, "Usage: %s [-S<suffix>=<lang>] [+S(+|-)<arg>] [-S<lang>(+|-)<arg>]\n", MyName);
X	exit(1);
X}
Xvoid
XsetScanArgs(op, arg)
X	int		op;
X	char		*arg;
X{
X	struct langtab	*ltp;
X	struct sufftab	*stp;
X	char		*lhs;
X	int		count = 0;
X
X	lhs = arg;
X	while (isalnum(*arg) || *arg == '.')
X		arg++;
X
X	if (strequ(lhs, "?=?")) {
X		for (stp = sufftab; stp->st_next; stp = stp->st_next)
X			printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, stp->st_lang->lt_name);
X		if (count)
X			putchar('\n');
X		return;
X	}
X
X	if (strnequ(lhs, "?=", 2)) {
X		lhs += 2;
X		if ((ltp = langSlot(lhs))->lt_next == NULL) {
X			printf("No scanner for language `%s'\n", lhs);
X			return;
X		}
X		for (stp = sufftab; stp->st_next; stp = stp->st_next)
X			if (stp->st_lang == ltp)
X				printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, ltp->lt_name);
X		if (count)
X			putchar('\n');
X		return;
X	}
X
X	if (strequ(arg, "=?")) {
X		lhs[strlen(lhs)-2] = '\0';
X		if ((stp = suffSlot(lhs))->st_next == NULL) {
X			printf("No scanner assigned to suffix `%s'\n", lhs);
X			return;
X		}
X		printf("%s=%s\n", stp->st_suffix, stp->st_lang->lt_name);
X		return;
X	}
X
X	if (*arg == '=') {
X		*arg++ = '\0';
X		
X		if ((ltp = langSlot(arg))->lt_next == NULL) {
X			fprintf(stderr, "%s: Language undefined: %s\n", MyName, arg);
X			return;
X		}
X		if ((stp = suffSlot(lhs))->st_next == NULL) {
X			stp->st_suffix = lhs;
X			stp->st_lang = ltp;
X			stp->st_next = NEW(struct sufftab);
X		} else if (!strequ(arg, stp->st_lang->lt_name)) {
X			fprintf(stderr, "%s: Note: `%s=%s' overrides `%s=%s'\n", MyName, lhs, arg, lhs, stp->st_lang->lt_name);
X			stp->st_lang = ltp;
X		}
X		return;
X	}
X	
X	if (op == '+') {
X		switch (op = *arg++)
X		{
X		case '+':
X		case '-':
X		case '?':
X			break;
X		default:
X			usage();
X		}
X		for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
X			(*ltp->lt_setargs)(NULL, op, arg);
X		return;
X	}
X
X	if (*arg == '-' || *arg == '+' || *arg == '?') {
X		op = *arg;
X		*arg++ = '\0';
X		
X		if ((ltp = langSlot(lhs))->lt_next == NULL) {
X			fprintf(stderr, "%s: Language undefined: %s\n", MyName, lhs);
X			return;
X		}
X		(*ltp->lt_setargs)(lhs, op, arg);
X		return;
X	}
X
X	usage();
X}
X
X/*
X	Notify user of unimplemented scanners.
X*/
Xstatic void
XsorryNoScan(lang)
X	char		*lang;
X{
X	if (lang == NULL)
X		return;
X	fprintf(stderr, "Sorry, no scanner is implemented for %s...\n", lang);
X}
SHAR_EOF
if test 5672 -ne "`wc -c < 'getscan.c'`"
then
	echo shar: error transmitting "'getscan.c'" '(should have been 5672 characters)'
fi
