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

chghelp defined in line 112; used 2 times
main defined in line 24; never used
mkndir defined in line 142; used 4 times
printhelp defined in line 161; used 3 times
printtopic defined in line 192; used 7 times

Defined variables

HELPLEVEL defined in line 22; used 20 times
INTERACTIVE defined in line 21; used 3 times
PGN defined in line 18; never used
PHELP_CMD defined in line 19; used 1 times
  • in line 77
PHELP_HELP defined in line 20; used 2 times
rcsid defined in line 1; never used
Last modified: 1985-07-03
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1622
Valid CSS Valid XHTML 1.0 Strict