diff rvinterf/etmsync/help.c @ 27:24cb10d508d7

fc-fsio help command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Oct 2016 01:33:21 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/help.c	Sun Oct 23 01:33:21 2016 +0000
@@ -0,0 +1,71 @@
+/*
+ * This module implements the fc-fsio help facility.
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "exitcodes.h"
+
+extern char help_file_pathname[];
+
+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(ERROR_UNIX);
+	}
+	for (;;) {
+		if (!fgets(linebuf, sizeof linebuf, f)) {
+			fprintf(stderr, "Help topic \"%s\" not found\n", topic);
+			fclose(f);
+			return(ERROR_USAGE);
+		}
+		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);
+}
+
+cmd_help(argc, argv)
+	char **argv;
+{
+	switch (argc) {
+	case 1:
+		return show_help_topic("main");
+	case 2:
+		return show_help_topic(argv[1]);
+	default:
+		fprintf(stderr, "internal error in cmd_help(): bad argc\n");
+		abort();
+	}
+}