|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.