view rvinterf/asyncshell/help.c @ 400:be2683e1ac5e

CHANGES: fc-shell key command addition documented
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Mar 2018 01:59:34 +0000
parents 27d7d7e2d9bd
children
line wrap: on
line source

/*
 * This module implements the fc-shell help facility.
 */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

char help_file_pathname[] = "/opt/freecalypso/helpfiles/fc-shell.help";

show_help_topic(topic)
	char *topic;
{
	FILE *f;
	char linebuf[256];
	char *cp, *np;
	int flag;

	f = fopen(help_file_pathname, "r");
	if (!f) {
		perror(help_file_pathname);
		return(-1);
	}
	for (;;) {
		if (!fgets(linebuf, sizeof linebuf, f)) {
			printf("error: help topic \"%s\" not found\n", topic);
			fclose(f);
			return(-1);
		}
		if (linebuf[0] != '=' || linebuf[1] != '=' || linebuf[2] != '=')
			continue;
		for (cp = linebuf + 3; isspace(*cp); cp++)
			;
		for (np = cp; *cp && !isspace(*cp); cp++)
			;
		if (*cp)
			*cp++ = '\0';
		if (!strcmp(np, topic))
			break;
	}
	for (flag = 0; fgets(linebuf, sizeof linebuf, f); ) {
		if (linebuf[0] == '=' && linebuf[1] == '=' &&
		    linebuf[2] == '=') {
			if (flag)
				break;
			else
				continue;
		}
		fputs(linebuf, stdout);
		flag = 1;
	}
	fclose(f);
	return(0);
}

void
cmd_help(argstr)
	char *argstr;
{
	char *argv[3], dbltopic[34];
	int argc, rc;

	rc = parse_interactive_command_into_argv(argstr, argv, 0, 2, &argc);
	if (rc < 0)
		return;
	switch (argc) {
	case 0:
		show_help_topic("main");
		break;
	case 1:
		show_help_topic(argv[0]);
		break;
	case 2:
		if (strlen(argv[0]) <= 16 && strlen(argv[1]) <= 16) {
			sprintf(dbltopic, "%s:%s", argv[0], argv[1]);
			show_help_topic(dbltopic);
		} else
			printf("error: no such help topic\n");
		break;
	default:
		fprintf(stderr, "internal error in cmd_help(): bad argc\n");
		abort();
	}
}