home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / prog1 / boss719a.lzh / WN_HELP.C < prev    next >
C/C++ Source or Header  |  1990-05-31  |  10KB  |  291 lines

  1. /*
  2. ** HELP - Help driver for The Window Boss
  3. **
  4. ** Copyright (c) 1985 - 1990 - Philip A. Mongelluzzo
  5. ** All rights reserved.
  6. **
  7. ** Comments:
  8. **
  9. **  Help files must be formatted properly!
  10. **
  11. **  Use GENINDEX to create the index file.
  12. **
  13. */
  14.  
  15. /* Header files */
  16.  
  17. #include "windows.h"
  18. #include "math.h"                       /* needed for atol */
  19.  
  20. /* Prototypes for this function */
  21.  
  22. #if CI86
  23. #else
  24. static  void showpage(long offset);
  25. static  int filbuf(long offset);
  26. #endif
  27.  
  28. /* Equates & definitions */
  29.  
  30. #if AZTEC
  31. #define RD "r"
  32. #else
  33. #define RD "rb"                         /* file access mode */
  34. #endif
  35.  
  36. #if CI86                                /* Compiler specific stuff */
  37. #define atol atoi                       
  38. #endif
  39.  
  40. /* Function declarations (just to be sure) */
  41.  
  42. extern FILE *fopen();                   /* Stream I/O */
  43. extern char *fgets();                   /* file line input */
  44. extern char *strcpy();                  /* string copy */
  45. extern char *strcat();                  /* concat function */
  46. extern long atol();                     /* ascii to integer */
  47. extern int fseek();                     /* DASD seek */
  48. extern long ftell();                    /* where are we DASD */
  49.  
  50. static struct list {                    /* master list structure */
  51.   char *key;                            /* pointer to %info string */
  52.   long loc;                             /* file offset */
  53.   int type;                             /* type <0=toc; 1=page; 2=menu> */
  54. } master[HLPMAXKY];                     /* master ISAM structure */
  55.  
  56. #if CI86
  57. static char **scrbuf = NUL;             /* screen buffer (array of ptrs) */
  58. static char *line = NUL;                /* line buffer */
  59. #else
  60. static char **scrbuf = (char **) NULPTR;/* screen buffer (array of ptrs) */
  61. static char *line = (char *) NULPTR;    /* line buffer */
  62. #endif
  63. static initflg = FALSE;                 /* init complete flag */
  64. static int hrow, hcol;                  /* help window origin */
  65. static int hwidth, hheight;             /* help window size */
  66. static int hlsize;                      /* help line size */
  67. static unsigned int hwatr, hbatr;       /* help window atributes */
  68.  
  69. static int cpg, eoh;                    /* clear screen, end of help flags */
  70. static FILE *fp;                        /* stream file pointer */
  71.  
  72. static WINDOWPTR wn1;                   /* window pointer */
  73. static int row, col;                    /* original cursor location */
  74.  
  75. #ifdef COMMENTS
  76. /*
  77. ************
  78. * showpage *                            /* internal */        
  79. ************
  80. */
  81. #endif
  82.  
  83. static void showpage(offset)            /* display page function */
  84. long offset;
  85. {
  86. int i,j;                                /* scratch integers */
  87. long pages[HLPMAXKY];                   /* stack of pages */
  88. int pndx;                               /* stack pointer */
  89. int keyflg;                             /* vaild key flag */
  90.  
  91.   pndx = 0;                             /* init stack pointer */
  92.   pages[0] = offset;                    /* initial page */
  93.  
  94.   while(TRUE) {                         /* till forever ... */
  95.     i = filbuf(offset);                 /* fill the buffer */
  96.     for(j=0; j<i; j++)                  /* display buffer */
  97.       wn_puts(wn1,j,0,scrbuf[j]);
  98.     if(eoh) 
  99.       wn_putsa(wn1, 22, 0, " End of help, PgUp for previous screen, any other key to continue...", (wn1->style | BOLD));
  100.     else
  101.       wn_putsa(wn1, 22, 0, " Esc to quit help, PgUp for previous screen, any other key to continue...", (wn1->style | BOLD));
  102.     keyflg = FALSE;                     /* valid key flag */
  103.     do {                                /* loop till vaild key */
  104.       switch (v_getch() ) {             /* based on user input */
  105.         case PGUP:                      /* do all the right things */
  106.           pndx--;
  107.           if(pndx <0) {
  108.             wn_close(wn1);
  109.             v_locate(0, row, col);
  110.             return;
  111.           }
  112.           offset = pages[pndx];
  113.           keyflg = TRUE;
  114.           eoh = FALSE;                  /* force clear screen */
  115.           cpg = TRUE;                   /* and cancel end of help flag */
  116.           break;
  117.         case ESCAPE:
  118.           wn_close(wn1);
  119.           v_locate(0, row, col);
  120.           return;
  121.         default:
  122.           offset = pages[++pndx] = ftell(fp);
  123.           keyflg = TRUE;
  124.           break;
  125.       }
  126.     } while (!keyflg);                  /* loop till valid key */
  127.     if(cpg) wn_clr(wn1);
  128.     if(eoh) {
  129.       wn_close(wn1);
  130.       v_locate(0, row, col);
  131.       return;
  132.     }
  133.   }
  134. }
  135.  
  136. #ifdef COMMENTS
  137. /*
  138. **********
  139. * filbuf *                              /* internal */
  140. **********
  141. */
  142. #endif
  143.  
  144. static filbuf(offset)                   /* fill screen buffer */
  145. long offset;
  146. {
  147. int i;
  148. char *p, *p1;
  149.  
  150.   i=0;                                  /* initialize */
  151.   cpg = eoh = FALSE;                    /* assume nothing */
  152.   fseek(fp, offset, 0);                 /* position file */
  153.   do {
  154.     fgets(line, hlsize, fp);            /* fetch a line */
  155.       cpg = !strncmp(".cp", line,3);    /* lite clear screen and */
  156.       eoh = !strncmp("*END*\n",line,5); /* end of help flags */
  157.       if(cpg || eoh) break;
  158.       p = &line[0];                     /* a long way around to */
  159.       p1 = scrbuf[i];                   /* filter the carriage */
  160.       while (*p) {                      /* returns !! */
  161.         switch (*p) {
  162.           case '\r':
  163.           case '\n':
  164.             p++;
  165.             break;
  166.           default:
  167.             *p1++ = *p++;
  168.             break;
  169.         }
  170.       }
  171.       *p1 = '\0';
  172.       i++;
  173.   } while (TRUE);
  174.   return(i);                            /* return the # of lines on page */
  175. }
  176.  
  177. /*
  178. *************
  179. * wn_hlinit *
  180. *************
  181. */
  182.  
  183. wn_hlinit(row,col,width,height,atrib,batrib,help_file_name)
  184. int row, col;                           /* origin of help window */
  185. int width, height;                      /* width and height */
  186. unsigned int atrib, batrib;             /* window & boarder attributes */
  187. char *help_file_name;                   /* help file name */
  188. {
  189.   if(initflg) {                         /* already called ?? */
  190.     if(initflg == -2) return(FALSE);    /* died last time ?? */
  191.     return(TRUE);                       /* avoid foolishness */
  192.   }
  193.  
  194.   hrow = row;                           /* origin */
  195.   hcol = col;
  196.   hwidth = width;                       /* window size */
  197.   hheight = height;       
  198.   hlsize = width+2;                     /* line size (width+2 for border) */
  199.   hwatr = atrib;                        /* attributes */
  200.   hbatr = batrib;
  201.  
  202.   scrbuf = malloc((height+2) * sizeof(char *) * HLPMAXKY); 
  203.   if(!scrbuf) return(FALSE);
  204.   line = malloc((width+2) * sizeof(char)); 
  205.   if(!line) return(FALSE);
  206.  
  207.   if(!wn_help("@")) {                   /* allocate the memory */
  208.     initflg = -2;                       /* DONT ALLOW FURTHER ATTEMPTS */
  209.     return(FALSE);                      /* return if error */
  210.   }
  211.   else {                                /* set up buffers if ok.. */
  212.     return(wn_help(help_file_name));    /* setup help ISAM */
  213.   }
  214. }
  215.  
  216. /*
  217. ***********
  218. * wn_help *
  219. ***********
  220. */
  221.  
  222. wn_help(subject)                        /* help function */
  223. char *subject;                          /* help subject request */
  224. {
  225. char tmpname[80];                       /* temporary filename */
  226. int i;                                  /* scratch integer */
  227.  
  228.   switch(subject[0]) {                  /* on first char of subject ... */
  229.     case '%':                           /* subject page */
  230.       wn1 = wn_open(0, hrow, hcol, hwidth, hheight, hwatr, hbatr);
  231.       if(!wn1) return(FALSE);           /* error return */
  232.       wn_wrap(wn1,FALSE);               /* no wrap thank you */
  233.       v_rcpos(0, &row, &col);           /* remember current location */
  234.       v_hidec();                        /* hide the physical cursor */
  235.       wn_locate(wn1,0,0);               /* home virtual cursor */
  236.       if(!initflg) return(FALSE);       /* illegal sequence of calls */
  237.       i=0;                              /* start search index */
  238.       while(i < HLPMAXKY) {             /* look for match in key table */
  239.         if(!strncmp(subject,master[i].key,strlen(subject))) {
  240.           showpage(master[i].loc);      /* display all pages */
  241.           return(TRUE);                 /* return .. all is well */
  242.         }
  243.         i++;
  244.       }
  245.       wn_printf(wn1," Sorry... No info on %s\n", subject);
  246.       wn_printf(wn1," Press any key to continue...");
  247.       v_getch();
  248.       wn_close(wn1);
  249.       return(FALSE);                    /* no match !! */
  250.     case '$':                           /* menu page */
  251.       break;                            /* sometime in the future */
  252.     case '@':                           /* Initialize (allocate memory) */
  253.       for(i=0; i<HLPMAXKY; i++) {
  254.         master[i].key = malloc(HLPKEYLN);  /* keys can be 25 chars long */
  255.         if(!master[i].key) return(FALSE);
  256.       }
  257.       for(i=0; i<hheight+1; i++) {       /* allocate memory for screen bfr */
  258.         scrbuf[i] =  malloc((hlsize+1) * sizeof(char*));
  259.         if(!scrbuf[i]) return(FALSE);
  260.       }
  261.       initflg = TRUE;
  262.       return(TRUE);
  263.     default:                            /* assume help filename */
  264.       if(!initflg) return(FALSE);       /* illegal sequence of calls */
  265.       strcpy(tmpname,subject);          /* form filename from root */
  266.       strcat(tmpname,".ndx");
  267.       if(!(fp = fopen(tmpname,RD))) {   /* index file cant be found ! */
  268.         printf("Can't find index file\n");
  269.         printf("Press any key to continue...");
  270.         v_getch();
  271.         return(FALSE);
  272.       }
  273.       i = 0;                            /* read and process key file */
  274.       while(fgets(line,hlsize,fp)) {    /* build the master index table */
  275.         strcpy(master[i].key, line);
  276.         if(line[0] != '%')              /* ignore all but subects */
  277.           continue;
  278.         fgets(line,hlsize,fp);
  279.         master[i].loc = atol(line);
  280.         i++;
  281.       }
  282.       fclose(fp);                       /* close index file */
  283.       strcpy(tmpname, subject);         /* form help file name from root */
  284.       strcat(tmpname, ".hlp");          /* open and leave open ! */
  285.       if(!(fp = fopen(tmpname, RD))) return(FALSE);
  286.       return(TRUE);
  287.   }
  288. }
  289.  
  290. /* End */
  291.