home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / DSIIC2.ZIP / READHLP.C < prev    next >
C/C++ Source or Header  |  1991-07-15  |  4KB  |  165 lines

  1. /* Copyright (c) James L. Pinson 1990,1991  */
  2.  
  3. /**********************   READHLP.C   ***************************/
  4.  
  5. #include "mydef.h"
  6. #include <stdio.h>
  7. #include <io.h>
  8. #include <fcntl.h>
  9. #include <conio.h>
  10.  
  11. #if defined TURBOC
  12. #include <alloc.h>
  13. #endif
  14.  
  15. #if defined QUICKC
  16.  
  17. #include <malloc.h>
  18. #include <sys\types.h>
  19.  
  20. #endif
  21.  
  22. void read_help( void)
  23. {
  24. extern struct screen_structure scr;
  25. extern struct window_structure w[];
  26. extern struct help_structure hlp;
  27.  
  28. static int in_use=FALSE;
  29. int max_pages;
  30. int page;
  31. char ch;
  32. char ext;
  33.  
  34. /* save text attribute for existing window */
  35. char old_attr=scr.current;    
  36. int  old_bold_caps=scr.bold_caps; /* save old bold caps setting */
  37.  
  38. char *buffer;
  39. char far *buffer_ptr;
  40. char far *scrn_ptr;
  41. int buff_size;
  42. int header_size;
  43. int i,j;
  44.  
  45. int handle;
  46. long offset;
  47. struct header_struct{
  48.           int width;
  49.           int height;
  50.           }hlp_header;
  51.  
  52. if(in_use)return;  /* don't invoke help if help already active */
  53. if(hlp.page==0)return; /* return if page =0 (disable help) */
  54.  
  55. in_use=TRUE;       /* now mark in_use as true */
  56.  
  57. scr.bold_caps=FALSE; /* we don't want bold caps on */
  58.  
  59. page=hlp.page-1;
  60.  
  61.  
  62. handle= open(hlp.filename,O_RDWR|O_BINARY);
  63.  
  64. if (handle==(-1)) { /* if file does not exist */
  65.  win_center (40,5,STD_FRAME," Warning: ",hlp.frame_attr,\
  66.           hlp.interior_attr);
  67.  
  68.   cls();
  69.   print(1,1,"The help file ");print_here(hlp.filename);
  70.   print_here(" is not found");
  71.   print(1,3,"Press any key to continue.");
  72.   get_key(&ch,&ext);
  73.   win_delete_top();
  74.  
  75.   /* restore the attribute previously in use */
  76.   scr.current=old_attr; 
  77.   in_use=FALSE;         /* show that help is no longer active */
  78.   return;
  79. }
  80.  
  81. /* read the header */
  82. read(handle,(char *)&hlp_header,2*sizeof(int)); 
  83. offset=lseek(handle,(long)0,SEEK_END); /* how many bytes in file? */
  84. max_pages=(offset-(long)(2*sizeof(int)))/(long)
  85.           (hlp_header.width*hlp_header.height);
  86. if (page>=max_pages) page=max_pages-1;
  87.  
  88. alt_screen(ON);
  89. win_make (hlp.x,hlp.y,hlp_header.width,hlp_header.height,
  90.           STD_FRAME,hlp.message,hlp.frame_attr,hlp.interior_attr);
  91. alt_screen(OFF);
  92. cursor(NO_CURSOR);
  93.  
  94. buff_size=sizeof(char)*(hlp_header.width*hlp_header.height);
  95. header_size=sizeof(int)*2;
  96.  
  97. buffer=NULL;
  98. /* allocate memory for the help buffer */
  99. buffer=(char*)malloc(buff_size);  
  100.  
  101. /* here we begin the loop to read pages (PgUp,PgDn, or Esc) */
  102.  for(;;){
  103.  
  104.    /* load help page into buffer */
  105.    lseek(handle,(long)(header_size+ buff_size*page),SEEK_SET);
  106.    read(handle,buffer,buff_size);
  107.  
  108.    /* copy buffer to active window */
  109.  
  110.       /* scan the help window for characters */
  111.  
  112.       buffer_ptr=buffer;    /* set temp pointer = buffer pointer */
  113.       for(i=0;i<hlp_header.height;i++){  /* get each row */
  114.  
  115.          scrn_ptr=(char far *)(scr.buffer+(scr.top+i-1)*
  116.                   (scr.columns*2)+2*(scr.left-1));
  117.  
  118.           for(j=0;j<hlp_header.width;j++){
  119.  
  120.            /* copy char from buffer to screen */
  121.            *scrn_ptr=*buffer_ptr;      
  122.             buffer_ptr++;scrn_ptr+=2; /* increment both pointers */
  123.           }
  124.        }
  125.  
  126.    get_key(&ch,&ext);
  127.  
  128.    if(ext==PGUP) page--;    /* adjust page according to user input */
  129.    if (ext==PGDN) page++;
  130.    if (ch==ESCAPE) break;
  131.     if(page>max_pages-1)
  132.      page=max_pages-1;
  133.     if(page<0) page=0;
  134.  }
  135.  
  136. /* finish up before exit */
  137.  
  138. close(handle);
  139. if(buffer!=NULL) free(buffer);
  140.  
  141. win_delete_top();
  142.  
  143. /* restore the attribute previously in use */
  144. scr.current=old_attr;          
  145. scr.bold_caps= old_bold_caps;  /* restore bold_caps setting */
  146. in_use=FALSE;                  /* show help no longer in use */
  147. }
  148.  
  149.  
  150. void get_key(char *ch, char *ext)
  151. {
  152.   for(;;){
  153.    *ch=' ';*ext=' ';
  154.  
  155.    *ch=getch();      /* get the character */
  156.  
  157.     if(!*ch){       /* if the character is zero (a special key) */
  158.       *ext=getch(); /* get the extension */
  159.       if (*ext==F1) read_help();
  160.     }
  161.  
  162.     if (*ext!=F1) break;  /* if F1 pressed we must read again */
  163.   }
  164. }
  165.