DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T h

⟦daccb9221⟧ TextFile

    Length: 4306 (0x10d2)
    Types: TextFile
    Names: »help.c«

Derivation

└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z« 
        └─⟦036c765ac⟧ 
            └─⟦this⟧ »TeX3.0/TeXcontrib/gnutex/Help/help.c« 

TextFile

#include <stdio.h>
#ifdef MSDOS
extern int errno;
#else
#include <errno.h>
#endif
#ifdef GOULD_NP1
extern int errno;
#endif

#ifdef vms
extern int strcmp();
extern int strlen();
extern char *strcpy();
extern char *strncpy();
#else
# include <string.h>
#endif


#define	SAME	0	/* for strcmp() */

#include "help.h"	/* values passed back */

/* help -- help subsystem that understands defined keywords
**
** Looks for the desired keyword in the help file at runtime, so you
** can give extra help or supply local customizations by merely editing
** the help file.
**
** The original (single-file) idea and algorithm is by John D. Johnson,
** Hewlett-Packard Company.  Thanx and a tip of the Hatlo hat!
**
** The help file looks like (the question marks are really in column 1):
** 
** 	?topic
** 	This line is printed when the user wants help on "topic".
** 	?keyword
** 	?Keyword
** 	?KEYWORD
** 	These lines will be printed on the screen if the user wanted
** 	help on "keyword", "Keyword", or "KEYWORD".  No casefolding is
**	done on the keywords.
** 	?subject
** 	?alias
** 	This line is printed for help on "subject" and "alias".
** 	?
**	??
** 	Since there is a null keyword for this line, this section
** 	is printed when the user wants general help (when a help
** 	keyword isn't given).  A command summary is usually here.
**	Notice that the null keyword is equivalent to a "?" keyword
**	here, because of the '?' and '??' topic lines above.
** 	?last-subject
** 	Note that help sections are terminated by the start of the next
** 	'?' entry or by EOF.  So you can't have a leading '?' on a line
** 	of any help section.  You can re-define the magic character to
**	recognize in column 1, though, if '?' is too useful.  (Try ^A.)
*/

#define	KEYFLAG	'?'	/* leading char in help file topic lines */

/*
** Calling sequence:
**	int result;		# 0 == success
**	char *keyword;		# topic to give help on
**	char *pathname;		# path of help file
**	result = help(keyword, pathname);
** Sample:
**	cmd = "search\n";
**	helpfile = "/usr/local/lib/program/program.help";
**	if (help(cmd, helpfile) != H_FOUND)
**		printf("Sorry, no help for %s", cmd);
**
**
** Speed this up by replacing the stdio calls with open/close/read/write.
*/
#ifdef	WDLEN
#  define	PATHSIZE	WDLEN
#else
#  define	PATHSIZE	BUFSIZ
#endif

help(keyword, path)	/* print a help message */
	char *keyword;	/* on this topic */
	char *path;	/* from this file */
{
	static char oldpath[PATHSIZE] = '\0';	/* previous help file */
	char *oldpathp = oldpath;	/* pointer to same */

	static FILE *helpfp = NULL;
	FILE *fopen();

	char buf[BUFSIZ];	/* line from help file */
	char *bufp = buf;	/* pointer to same */
	char *bufkeyp = bufp + 1;	/* start of key in help line */

/*
** Open the help file if necessary (say, first time we enter this routine,
** or if the help file changes from the last time we were called).
*/
	errno = 0;
	if (strcmp(oldpathp, path) == SAME)
		rewind(helpfp);	/* start at the beginning each time */
	else
	{	/* first time the user asked for help using this file */
		if ((helpfp = fopen(path, "r")) == NULL)
		{	/* can't open help file, so error exit */
			return H_ERROR;
		}
		/* save the new path in oldpath */
		if (strlen(path) < sizeof oldpath)
			strcpy(oldpathp, path);
		else
		{	/* not enough room in oldpath, sigh */
			strncpy(oldpathp, path, sizeof oldpath);
			oldpath[sizeof oldpath] = NULL;
		}
	}

/*
** The correct help file is open.  Look in there for the keyword.
*/
	while (fgets(buf, sizeof buf, helpfp) != NULL)
	{	/*
		** If we find the keyword:
		**	skip to the first non-keyword line
		**	print lines until you find another keyword line or EOF
		**	return success
		*/
		if (buf[0] == KEYFLAG && strcmp(keyword, bufkeyp) == SAME)
		{	/* found the key */
			while (fgets(buf, sizeof buf, helpfp) != NULL
				&& buf[0] == KEYFLAG)
				;	/* eat additional keyword lines */

			fputs(bufp, stdout);		/* print help */
			while (fgets(buf, sizeof buf, helpfp) != NULL
				&& buf[0] != KEYFLAG)
				fputs(bufp, stdout);	/* print help */
			return H_FOUND;
		}
	}

/* 
** Didn't find anything in the help file for the poor user.  Return failure.
** Don't close the help file!  The luser may want further help, and
** re-opening an already-open help file is wasteful of time.
*/
	return H_NOTFOUND;
}