home *** CD-ROM | disk | FTP | other *** search
/ C++ Games Programming / CPPGAMES.ISO / mt / filefunc.c < prev    next >
C/C++ Source or Header  |  1989-01-14  |  8KB  |  283 lines

  1. /* filefunc.c   standard file utilities */
  2. /* `MIDI Sequencing In C', Jim Conger, M&T Books, 1989 */
  3.  
  4. /* #define TURBOC 1   Define if using TURBOC, leave out for Microsoft */
  5.  
  6. #include <conio.h>              /* compiler library module headers */
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #ifdef TURBOC
  11.     #include <dir.h>
  12. #else
  13.     #include <dos.h>
  14. #endif
  15.  
  16. #include "standard.h"           /* header files */
  17. #include "screenf.h"
  18. #include "video.h"
  19. #include "filefunc.h"           /* must be included to use pick_file */
  20.  
  21. /* allow user to pick file matching wild card allow user to pick file  */
  22. /* matching wild card string. Return number of choice in struct */
  23. /* selement g_file_disp (see filefunc.h) */
  24. int
  25. pick_file(char *dir, char *match_str, char *str)
  26. {   
  27.     char buf[SCRNWIDE];
  28.     int num_files, pick;
  29.     
  30.     num_files = disp_files(dir, match_str);
  31.     if (num_files == 0){
  32.         strcpy(buf, "There are no files matching ");
  33.         strcat(buf, match_str);
  34.         strcat(buf, " on this drive/directory.");
  35.         writerr(buf, g_text_char_v, g_norm_attrib, g_norm_attrib);
  36.         return(-1);
  37.     }
  38.     fwriteword(str, 1, g_text_char_v - 1, g_emph_attrib, g_text_mode);
  39.     pick = movescrn(g_text_mode, g_file_disp, 0, num_files - 1, g_norm_attrib,
  40.         g_cursor_attrib);
  41.     if (pick >= num_files)
  42.         return(-1);
  43.     else
  44.         return(pick);
  45. }
  46.  
  47.  
  48. /* display file names matching str, returns # of files displayed */
  49. int
  50. disp_files(char *dir, char *match_str)
  51. {           
  52.     char buf[SCRNWIDE], *s;
  53.     int i, status;
  54.  
  55. #ifdef TURBOC
  56.     struct ffblk ffblk;             /* define in dir.h */
  57. #else
  58.     struct find_t c_file;           /* defined in dos.h */
  59. #endif
  60.  
  61.     for (i = 0; i < NPARAM_FILE; i++){
  62.         strcpy(g_file_disp[i].content, " ");
  63.     }
  64.     
  65.     clearscreen(g_norm_attrib);
  66.     strcpy(buf, "Files matching ");
  67.     strcat(buf, match_str);
  68.     strcat(buf, " on your selected drive (");
  69.     strcat(buf, dir);
  70.     strcat(buf, "):\n");
  71.     writeword(buf, 1, 1, g_emph_attrib);
  72.     
  73.     strcpy(buf, dir);       /* build up full path\:*.XXX string for DOS */
  74.     s = (char *)strchr(buf,'\0');
  75.     if(*(--s) != '\\'){     /* add '\' if necessary*/
  76.         *(++s) = '\\';
  77.         *(++s) = '\0';
  78.     }
  79.     strcat(buf, match_str);
  80.  
  81.  
  82. #ifdef TURBOC
  83.     status = findfirst(buf, &ffblk, 0);
  84. #else
  85.     status = _dos_findfirst(buf, _A_NORMAL, &c_file);
  86. #endif
  87.     if (status){
  88.         return(0);
  89.     }
  90. #ifdef TURBOC
  91.     strcpy(g_file_disp[0].content, ffblk.ff_name);
  92. #else
  93.     strcpy(g_file_disp[0].content, c_file.name);    /* copy file names to */
  94. #endif
  95.                                                     /* screen data array */
  96.     i = 1;
  97.     do {
  98. #ifdef TURBOC
  99.         status = findnext(&ffblk);
  100. #else
  101.         status = _dos_findnext(&c_file);
  102. #endif
  103.         if (status)
  104.             break;
  105.         else
  106. #ifdef TURBOC
  107.             strcpy(g_file_disp[i].content, ffblk.ff_name);
  108. #else
  109.             strcpy(g_file_disp[i].content, c_file.name);
  110. #endif
  111.     } while (++i < NPARAM_FILE);
  112.     
  113.     finitscrn(g_file_disp, 0, i - 1, g_norm_attrib, g_text_mode);   
  114.     return(i);
  115. }
  116.  
  117.  
  118.  
  119. int                     /* prompt for drive/directory to store data */
  120. getdrive(char *prodir, char *sampdir)
  121. {
  122.     char tmpdir[51], errbuf[80];
  123.     
  124.     while(1){
  125.         if(getstr(g_text_char_v - 1, "Enter drive/directory ->", tmpdir, 50, 
  126.             g_norm_attrib)){
  127.             
  128.             if (tmpdir[1] == '\0'){     /* convert C to C: */
  129.                 tmpdir[1] = ':';
  130.                 tmpdir[2] = '\0';
  131.             }           
  132.             if (tmpdir[2] == '\0'){     /* convert C: to C:\ */
  133.                 tmpdir[2] = '\\';
  134.                 tmpdir[3] = '\0';
  135.             }
  136.  
  137.             if(chdir(tmpdir) != -1){    /* make sure directory exists */
  138.                 strcpy(sampdir, tmpdir);
  139.                 chdir(prodir);
  140.                 return(1);
  141.             }
  142.             else{
  143.                 chdir(prodir);
  144.                 strcpy(errbuf,"Could not open directory ");
  145.                 strcat(errbuf, tmpdir);
  146.                 writerr(errbuf, g_text_char_v, g_norm_attrib, g_emph_attrib);
  147.             }
  148.         }
  149.         else{
  150.             return(0);
  151.         }
  152.     }
  153. }
  154.  
  155.  
  156. void                                        /* put near data to stream */
  157. put_to_file(void *addr, int size, FILE *stream)
  158. {
  159.     int i;
  160.     char *addr2;
  161.     
  162.     addr2 = (char *)addr;
  163.     for(i = 0; i < size; i++){
  164.         fputc(*addr2++, stream);
  165.     }
  166. }
  167.  
  168.  
  169. void                                        /* put far data to stream */
  170. fput_to_file(void far *addr, int size, FILE *stream)
  171. {
  172.     int i;
  173.     char far *addr2;
  174.     
  175.     addr2 = (char far *)addr;
  176.     for(i = 0; i < size; i++){
  177.         fputc(*addr2++, stream);
  178.     }
  179. }
  180.  
  181.  
  182. void                    /* get data from stream, put into near memory */
  183. get_from_file(void *addr, int size, FILE *stream)
  184. {
  185.     int i;
  186.     char *addr2;
  187.     
  188.     addr2 = (char *)addr;
  189.     for(i = 0; i < size; i++){
  190.         *addr2++ = fgetc(stream);
  191.     }
  192. }
  193.  
  194.  
  195. void                        /* get data from stream, put into far memory */
  196. fget_from_file(void far *addr, int size, FILE *stream)
  197. {
  198.     int i;
  199.     char far *addr2;
  200.     
  201.     addr2 = (char far *)addr;
  202.     for(i = 0; i < size; i++){
  203.         *addr2++ = fgetc(stream);
  204.     }
  205. }
  206.  
  207.  
  208. /* Load screen files into memory as linked lists. */
  209. void
  210. loadscrn(struct strchain *chain[], int number, char *namestr)
  211. {
  212.     int i;
  213.     char nbuf[10], buf[50];
  214.     
  215.     fputs("\nLoading screen images....\n",stdout);
  216.     
  217.     for(i = 1; i <= number; i++){
  218.         strcpy(buf, namestr);       /* screen names are "namestr"1.scr,... */
  219.         nbuf[0] = '0' + i;      
  220.         nbuf[1] = '\0';
  221.         strcat(buf,nbuf);
  222.         strcat(buf,".scr");
  223.         chain[i] = inpchain(buf,SCRNWIDE + 1);
  224.     }
  225.     
  226.     for(i = 1; i <= number; i++){
  227.         if(chain[i] == NULL){
  228.             fputs("Failed to load screen file ",stdout);
  229.             fputs(namestr, stdout);
  230.             itoa(i+1, buf, 10);
  231.             fputs(buf, stdout);
  232.             fputs(".scr\n", stdout);
  233.             fputs("Be sure you run the program from the default drive.",
  234.                 stdout);
  235.             exit(0);
  236.         }
  237.     }
  238. }    
  239.  
  240.  
  241. /* Load values from filename into global data defined in video.h.  This */
  242. /* is the counterpart to the INSTALL program that builds a video data file. */
  243. int
  244. load_video_data(char *filename)
  245. {
  246.     FILE *infile;
  247.  
  248.     infile = fopen(filename, "r");
  249.     
  250.     if (infile == NULL)
  251.         return(0);
  252.     
  253.     get_from_file(&g_text_mode, sizeof(int), infile);
  254.     get_from_file(&g_graph_mode, sizeof(int), infile);
  255.     get_from_file(&g_dots_v, sizeof(int), infile);
  256.     get_from_file(&g_dots_h, sizeof(int), infile);
  257.     get_from_file(&g_norm_attrib, sizeof(int), infile);
  258.     get_from_file(&g_cursor_attrib, sizeof(int), infile);
  259.     get_from_file(&g_emph_attrib, sizeof(int), infile);
  260.     get_from_file(&g_let_dots_v, sizeof(int), infile);
  261.     get_from_file(&g_let_dots_h, sizeof(int), infile);
  262.     get_from_file(&g_text_char_h, sizeof(int), infile);
  263.     get_from_file(&g_text_char_v, sizeof(int), infile);
  264.     get_from_file(&g_graph_char_h, sizeof(int), infile);
  265.     get_from_file(&g_graph_char_v, sizeof(int), infile);
  266.     get_from_file(&g_text_colors, sizeof(int), infile);
  267.     get_from_file(&g_graph_colors, sizeof(int), infile);
  268.     
  269.     if (g_graph_colors >= 4){
  270.         g_line_color = g_norm_attrib & 0x0F;
  271.         g_back_color = (g_norm_attrib & 0xF0) >> 4;
  272.         g_emph_color = g_emph_attrib & 0x0F;
  273.     }
  274.     else{                   /* for black/white display modes */
  275.         g_line_color = 1;
  276.         g_back_color = 0;
  277.         g_emph_color = 1;
  278.     }
  279.     
  280.     fclose(infile);
  281.     return(1);
  282. }
  283.