1: static char *rcsid = "$Header$";
2: /*
3: * phelp - on-line help for a project
4: *
5: * Author: Peter J. Nicklin
6: */
7: #include <sys/types.h>
8: #include <sys/dir.h>
9: #include <stdio.h>
10: #include "getarg.h"
11: #include "macro.h"
12: #include "null.h"
13: #include "path.h"
14: #include "phelp.h"
15: #include "spms.h"
16: #include "yesno.h"
17:
18: char *PGN = "phelp"; /* program name */
19: char PHELP_CMD[PATHSIZE]; /* help command file pathname */
20: char PHELP_HELP[PATHSIZE]; /* help introduction file pathname */
21: int INTERACTIVE; /* phelp interactive? */
22: int HELPLEVEL; /* help hierarchy level */
23:
24: main(argc, argv)
25: int argc;
26: char **argv;
27: {
28: extern int PPDEBUG; /* project pathname debug flag */
29: char *getcwp(); /* get current working project */
30: char *pathcat(); /* pathname concatenation */
31: char *ppathname = CURPROJECT; /* project pathname */
32: int isintract(); /* find out if interactive */
33: int printhelp(); /* print a help file */
34: int printtopic(); /* print topic file and index */
35: int processtopic(); /* process help topic on stack */
36: int status = 0; /* exit status */
37: void gettopic(); /* get next help topic from stdin */
38: void printnotopics(); /* print "no topics" error message */
39: void prompt(); /* prompt for a topic */
40: void puttopic(); /* add help topic to request queue */
41:
42: {
43: register char *s; /* option pointer */
44: while (--argc > 0 && **++argv == '-')
45: {
46: for (s = argv[0]+1; *s != '\0'; s++)
47: switch (*s)
48: {
49: case 'D':
50: PPDEBUG = YES;
51: break;
52: case 'P':
53: ppathname = GETARG(s);
54: if (*ppathname == '\0')
55: {
56: warn("missing project name");
57: status = 1;
58: }
59: goto endfor;
60: default:
61: warn("bad option -%c", *s);
62: status = 1;
63: goto endfor;
64: }
65: endfor: continue;
66: }
67: }
68: if (status == 1)
69: fatal("usage: phelp [-P projectname] [topic [subtopic ...]]");
70:
71: if (getcwp() == NULL)
72: fatal("There is no project environment");
73:
74: if (chghelp(ppathname) == NO)
75: exit(1);
76:
77: pathcat(PHELP_CMD, SPMSLIB, PHELP_CMD_FILE);
78: pathcat(PHELP_HELP, SPMSLIB, PHELP_HELP_FILE);
79:
80: INTERACTIVE = isintract();
81:
82: if (argc == 0 || (argc == 1 && PHELP))
83: { /* general introduction */
84: if (printtopic(PHELP_HELP, CURDIR) > 1)
85: {
86: printnotopics(ppathname);
87: exit(1);
88: }
89: }
90: else { /* command line arguments */
91: while (argc-- > 0)
92: puttopic(*argv++);
93: status = processtopic();
94: }
95: if (INTERACTIVE == YES) /* further help topics */
96: while (HELPLEVEL >= 0)
97: {
98: prompt();
99: gettopic();
100: status = processtopic();
101: }
102:
103: exit(status);
104: }
105:
106:
107:
108: /*
109: * chghelp() changes to another help hierarchy. Returns YES if
110: * successful, otherwise NO.
111: */
112: chghelp(ppathname)
113: char *ppathname; /* project pathname */
114: {
115: char helpath[PATHSIZE]; /* help directory pathname */
116: char *oldcwp; /* old current working project */
117: char *pathcat(); /* pathname concatenation */
118: char *strsav(); /* save a string somewhere */
119: int chproject(); /* change project */
120: void printnotopics(); /* print "no topics" error message */
121:
122: oldcwp = strsav(getcwp());
123: if (chproject(ppathname) == NO)
124: {
125: free(oldcwp);
126: return(NO);
127: }
128: pathcat(helpath, getcwp(), "help");
129: if (!CHDIR(helpath))
130: {
131: printnotopics(ppathname);
132: return(NO);
133: }
134: return(YES);
135: }
136:
137:
138:
139: /*
140: * mkndir() makes a directory name by appending ".d" to a topic name.
141: */
142: char *
143: mkndir(basename)
144: char *basename; /* topic name */
145: {
146: static char dirnam[MAXNAMLEN]; /* directory name buffer */
147: char *strcpy(); /* string copy */
148: char *strcat(); /* string concatenation */
149:
150: strcpy(dirnam, basename);
151: strcat(dirnam, ".d");
152: return(dirnam);
153: }
154:
155:
156:
157: /*
158: * printhelp() prints a help file on output stream ofp. Returns YES if
159: * file can be opened and read, otherwise NO.
160: */
161: printhelp(helpfile, ofp)
162: char *helpfile; /* file containing help information */
163: register FILE *ofp; /* output stream */
164: {
165: register FILE *ifp; /* input file stream */
166: register int c; /* current character */
167: FILE *fopen(); /* open file */
168:
169: if ((ifp = fopen(helpfile, "r")) == NULL)
170: return(NO);
171: if ((c = getc(ifp)) != EOF)
172: {
173: putc(c, ofp);
174: while ((c = getc(ifp)) != EOF)
175: putc(c, ofp);
176: fclose(ifp);
177: return(YES);
178: }
179: else {
180: fclose(ifp);
181: return(NO);
182: }
183: }
184:
185:
186:
187: /* printtopic() prints a help topic plus a list of available subtopics. The
188: * output is piped through more(1) if phelp is interactive. Returns 0 if
189: * topic and subtopics printed; 1 if subtopics printed only; 2 if file printed
190: * only; 3 if nothing printed.
191: */
192: printtopic(topic, subtopicdir)
193: char *topic; /* name of topic file to be printed */
194: char *subtopicdir; /* name of subtopic directory */
195: {
196: FILE *popen(); /* open pipe for writing */
197: FILE *ofp; /* output stream */
198: int mkindex(); /* make topic index */
199: int printhelp(); /* print help file */
200: int status = 0; /* printhelp status */
201: void printindex(); /* print topic index */
202:
203: if (INTERACTIVE == NO || (ofp = popen("more -d", "w")) == NULL)
204: ofp = stdout;
205: if (printhelp(topic, ofp) == NO)
206: status = 1;
207: if (mkindex(subtopicdir) == YES)
208: printindex(ofp);
209: else
210: status += 2;
211: if (ofp != stdout)
212: pclose(ofp);
213: return(status);
214: }
Defined functions
main
defined in line
24;
never used
Defined variables
PGN
defined in line
18;
never used
rcsid
defined in line
1;
never used