home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 337_01 / hlp_io.c < prev    next >
C/C++ Source or Header  |  1991-01-14  |  8KB  |  292 lines

  1. /* Copyright (c) James L. Pinson 1990,1991  */
  2.  
  3. /**********************   HLP_IO.C   ***************************/
  4.  
  5. /*
  6. link with:
  7. makehelp.c
  8. hlp_menu.c
  9. */
  10.  
  11. #include "mydef.h"
  12. #include "help.h"
  13. #include <stdio.h>
  14. #include  <io.h>
  15. #include <fcntl.h>
  16.  
  17. #if defined TURBOC
  18.  
  19. #include <alloc.h>
  20.  
  21. #endif
  22.  
  23. #if defined QUICKC
  24.  
  25. #include <sys\types.h>
  26. #include <malloc.h>
  27. #include <string.h>
  28.  
  29. #endif
  30.  
  31. #include <sys\stat.h>
  32.  
  33. /* get_name allows the user to select a file from a "point and shoot"
  34.    menu containing all the file names matching the wild card
  35.    filename */
  36.  
  37.  
  38. void get_name(char *filename)
  39. {
  40. extern struct screen_structure scr;
  41. extern struct window_structure w[];
  42. extern struct hlp help;
  43.  
  44. int done=FALSE;
  45. char ch,ext;
  46. int handle;
  47. int i;
  48. int name_win;  /* window handle for name window */
  49. int dir_win;   /* window handle for directory window */
  50. char temp[80];
  51. char dir_name[80];
  52. char orig_dir[80];
  53. int return_code;
  54. long offset;
  55. int page_size;
  56. int header_size;
  57.  
  58. header_size=sizeof(int)*2;
  59.  
  60. name_win= win_make(1,1,78,4,STD_FRAME,"",scr.normal,scr.normal);
  61.  
  62.  while(!done){
  63.   for(;;){  /* loop to get file name */
  64.     cls();
  65.     print(1,1, "Please name a file (new or existing), or");
  66.     print(1,2,"(Press Enter to select from list.");
  67.     gotoxy(1,3);
  68.     getcwd(dir_name,79);  /* get the current directory */
  69.     /* if it doesn't have a backslash then add it */
  70.     if(dir_name[strlen(dir_name)-1]!='\\')
  71.        strcat(dir_name,"\\");              /* add it */
  72.     scr.current=scr.inverse;
  73.     ext=getfield(dir_name,78,strlen(dir_name),scr.current);
  74.     trim(dir_name);   /* remove spaces from ends of string */
  75.     scr.current=scr.normal;
  76.      if(ext==ESCAPE){  /* escape */
  77.             strcpy(filename,"");
  78.             win_delete(name_win);
  79.             return;
  80.      }
  81.  
  82.      /* remove any extension from name */
  83.      i=pos(dir_name,".");
  84.      if (i>=0) dir_name[i]='\0';
  85.     /* Did the user enter the name of a path or drive? */
  86.     if(dir_name[strlen(dir_name)-1]=='\\'
  87.        || dir_name[strlen(dir_name)-1]==':'){
  88.     strcpy(orig_dir,dir_name);  /* save the path */
  89.     strcat(dir_name,"*.hlp");
  90.     strcpy(filename,"");
  91.     dir_win= win_make(10,2,13,10,STD_FRAME," Files: ",
  92.                        scr.normal,scr.normal);
  93.     dir(dir_name,filename);
  94.     win_delete(dir_win);
  95.  
  96.     if(strlen(filename)>0){ /* was a file selected? (in temp) */
  97.       strcpy(temp,orig_dir);
  98.       strcat(temp,filename);
  99.       strcpy(filename,temp);
  100.       break;    /* we have a name (break for(;;) loop) */
  101.      }
  102.        else  filename[0]='\0'; /* no file selected from list */
  103.  
  104.     } /* end (is path) */
  105.  
  106.     else{ /* not path, must be name */
  107.      strcpy(filename,dir_name);
  108.      break;
  109.     }
  110.   }   /* end for(;;) loop to get file name*/
  111.  
  112.  /* entry was not a path or directory, let's try to open it */
  113.  /* add the .hlp extension if none was specified */
  114.  
  115.  if(pos(filename,".")==-1)strcat(filename,".hlp");
  116.  
  117.   /* open for append-create if not exist */
  118.  
  119.   handle= open(filename,O_RDWR|O_BINARY);
  120.  
  121.   if (handle==(-1)) { /* create new file ? */
  122.     cls();
  123.     print(1,1,"The file does not exist:");
  124.     print(1,2,"Create a new file y/n ? ");
  125.      for(;;){   /* find out if user wants a new file */
  126.       get_key(&ch,&ext);
  127.       if (toupper(ch)=='Y'){
  128.            return_code=get_size(); /* prompt user for
  129.                                       size of help screen */
  130.            if (return_code==ESCAPE) break;
  131.            handle= open(filename,O_CREAT|O_BINARY|O_RDWR,
  132.                     S_IREAD|S_IWRITE);
  133.  
  134.            if(handle==(-1)){
  135.               cls();
  136.               print(1,1,"Error opening file!");
  137.               print(1,2,"Press any key to continue.");
  138.               get_key(&ch,&ext);
  139.               break;
  140.            }else
  141.            {
  142.             /* write the header */
  143.             write(handle,(char *)&help,header_size);
  144.             close(handle);
  145.             help.number_pages=0; /* new file, no pages yet */
  146.             done=TRUE;
  147.             break;  /* escape the for(;;) loop */
  148.            }
  149.  
  150.       } /* end of if (toupper(ch)=='Y')*/
  151.  
  152.        if (toupper(ch)=='N'){
  153.         putch(ch);
  154.         strcpy(filename,"");
  155.         break;
  156.        }
  157.  
  158.      } /* end for(;;) which asks if user wants to create file */
  159.  
  160.   }   /* end if (handle==(-1))  (create new file?) */
  161.  
  162.  else{ /* file opened (new or existing), now read header */
  163.    /* read the header */
  164.    read(handle,(char *)&help,header_size);
  165.  
  166.    /* calculate page size */
  167.    page_size=sizeof(char)*(help.width*help.height);
  168.  
  169.    /* how many bytes in file? */
  170.    offset=lseek(handle,(long)0,SEEK_END);
  171.  
  172.    /* calculate the number of pages */
  173.    help.number_pages=(offset-(long)header_size)/(long)page_size;
  174.  
  175.    close(handle);
  176.    done=TRUE;
  177.    /*break;*/
  178.  } /* end (read header) */
  179.      print(1,1,"x");
  180.  }  /* end while(!done); */
  181.  
  182.  win_delete(name_win);
  183. }
  184.  
  185.  
  186. int save_page(int page)  /* saves the current help page */
  187. {
  188. extern struct hlp help;
  189. extern struct screen_structure scr;
  190. extern struct window_structure w[];
  191.  
  192. int file_handle;
  193. char *buffer=NULL;
  194. char far *temp;
  195. char far *scrn_ptr;
  196. int i,j;
  197. int page_size;
  198. int header_size;
  199.  
  200.  page_size=sizeof(char)*(help.width*help.height);
  201.  header_size=sizeof(int)*2;
  202.  
  203.  win_pop_top(help.edit);
  204.  scr.current=win_what_attr(help.edit);
  205.  cursor(NORMAL_CURSOR);
  206.  
  207.  /* allocate space, allow for \0 terminator */
  208.  buffer=(char *)malloc ((help.width*help.height)*sizeof(char));
  209.  temp=buffer;    /* set temp pointer = pointer */
  210.  
  211.  for(i=0;i<help.height;i++){  /* get each row */
  212.  
  213.   scrn_ptr=(char far *)(scr.buffer+(scr.top+i-1)*(scr.columns*2)
  214.                +2*(scr.left-1));
  215.     for(j=0;j<help.width;j++){
  216.       *temp=*scrn_ptr;
  217.       temp++;scrn_ptr+=2; /* adjust pointers, skipping attributes */
  218.     }
  219.  }
  220.  
  221.  /* save image to file */
  222.  file_handle=open (help.filename,O_RDWR|O_BINARY);
  223.  lseek(file_handle,(long)(header_size+ page_size*page),SEEK_SET);
  224.  write(file_handle,buffer,page_size);
  225.  close(file_handle);
  226.  
  227.  if(buffer!=NULL)free(buffer);
  228.  win_cls(help.edit); win_redraw_all();win_pop_top(help.menu);
  229.  return(1);
  230. }
  231.  
  232.  
  233. int load_page(int page)   /* load a help page from the file */
  234. {
  235. extern struct hlp help;
  236. extern struct screen_structure scr;
  237. extern struct window_structure w[];
  238.  
  239. int file_handle;
  240. char *buffer;
  241. char *buffer_ptr;
  242. char far *scrn_ptr;
  243. int page_size;
  244. int header_size;
  245. int i,j;
  246.  
  247. page_size=sizeof(char)*(help.width*help.height);
  248. header_size=sizeof(int)*2;
  249.  
  250. buffer=NULL;
  251. buffer=(char*)malloc(page_size);
  252.  
  253.  /* load help page into buffer */
  254.  file_handle=open (help.filename,O_RDWR|O_BINARY);
  255.  lseek(file_handle,(long)(header_size+ page_size*page),SEEK_SET);
  256.  read(file_handle,buffer,page_size);
  257.  close(file_handle);
  258.  
  259.  /* copy buffer to active window */
  260.  
  261.  /* scan the help window for characters */
  262.  
  263.  buffer_ptr=buffer;    /* set temp pointer = buffer pointer */
  264.  for(i=0;i<help.height;i++){  /* get each row */
  265.    scrn_ptr=(char far *)(scr.buffer+(scr.top+i-1)
  266.               *(scr.columns*2)+2*(scr.left-1));
  267.  
  268.    for(j=0;j<help.width;j++){
  269.      *scrn_ptr=*buffer_ptr;    /* copy char from buffer to screen */
  270.      buffer_ptr++;scrn_ptr+=2; /* increment both pointers */
  271.    }
  272.  }
  273.  
  274. if(buffer!=NULL) free(buffer);
  275. return(0);
  276. }
  277.  
  278. /* append a new help page to the file */
  279.  
  280. int append(char *filename, char *buffer, int page_size)
  281. {
  282. int file_handle;
  283.  
  284.  /* write record use file_handle int */
  285.  
  286.  file_handle=open (filename,O_RDWR|O_APPEND|O_BINARY);
  287.  write(file_handle,buffer,page_size);
  288.  close(file_handle);
  289.  
  290.  return (0);
  291. }
  292.