home *** CD-ROM | disk | FTP | other *** search
/ Quake++ for Quake / Quake++.iso / quake / edquake / code / disk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-12  |  5.2 KB  |  227 lines

  1. /*EdQuake v0.50 source code
  2.   (c) Copyright 1996 Scott Mitting
  3.   email:smitting@netusa1.net
  4.   ----------------------------------
  5.   DISK.C  -  Generic disk routines
  6.  
  7.   __variables:
  8.   <no global variables>
  9.   __functions:
  10.   char * loadDosToMem(char * filename)   -- loads a file from disk to ram
  11.   long fgetl(FILE *f)             -- gets a long integer
  12.   int fgeti(FILE *f)             -- gets an integer
  13.   dentry_t fgetd(FILE *p)                -- gets a bsp entry
  14.   ----------------------------------
  15.   the entire source code is under renovation to make it easier
  16.   to understand.  happy coding.
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <dir.h>
  21. #include <alloc.h>
  22. #include <dos.h>
  23. #include "svgacc.h"
  24. #include "bsp.h"
  25. #include "grfx.h"
  26. #include "input.h"
  27.  
  28. struct ffblk far *ff;//files
  29.  
  30. char * loadDosToMem(char * filename)
  31. {
  32.   char * loadBuffer = NULL;
  33.   long loadBufferIndex = 0;
  34.   long miscNumber;
  35.   long size;
  36.   long bytesLeft;
  37.   FILE * myInStream;
  38.   myInStream = fopen(filename, "rb");
  39.   fseek(myInStream,0, SEEK_END);
  40.   size = ftell(myInStream);
  41.   if (size > 64000) size = 64000;
  42.   loadBuffer = (char *) malloc(size);
  43.   fseek(myInStream,0,SEEK_SET);
  44.   for (bytesLeft = size; bytesLeft > 0;)
  45.   {
  46.     miscNumber = (bytesLeft < 32000) ? bytesLeft : 32000;
  47.     fread(loadBuffer + loadBufferIndex, (int)miscNumber,1,myInStream);
  48.     bytesLeft -= miscNumber;
  49.     loadBufferIndex += miscNumber;
  50.   }
  51.   return loadBuffer;
  52. }
  53.  
  54.  
  55. long fgetl(FILE *f)
  56. {
  57.    long t,
  58.     l;
  59.    l  = fgetc(f);
  60.    t  = fgetc(f);
  61.    l += t << 8;
  62.    t  = fgetc(f);
  63.    l += t << 16;
  64.    t  = fgetc(f);
  65.    l += t << 24;
  66.    return l;
  67. }
  68.  
  69. int fgeti(FILE *f)
  70. {
  71.    long t,
  72.     l;
  73.    l  = fgetc(f);
  74.    t  = fgetc(f);
  75.    l += t << 8;
  76.    return l;
  77. }
  78.  
  79. long getfilesize(FILE *f)
  80. {
  81.    long temp, r;
  82.    temp = ftell(f);
  83.    fseek(f,0,2);
  84.    r = ftell(f);
  85.    fseek(f,temp,0);
  86.    return r;
  87. }
  88.  
  89. void showdir(int cure, int showe)
  90. {
  91.   int t, done;
  92.   char buf[40];
  93.   mousehide();
  94.    for (done = 0; done < 15; done++)
  95.    {
  96.     if (done == cure) t = RED; else t = BLUE;
  97.     if (ff[done+showe].ff_attrib == 0x10)
  98.     {
  99.       sprintf(buf,"  %13s       <DIR>  ", ff[done+showe].ff_name);
  100.       drwstring(SET,WHITE,t,buf,200,(done*14)+250);
  101.     }
  102.     else
  103.     {
  104.       sprintf(buf,"  %13s  %10li  ", ff[done+showe].ff_name,ff[done+showe].ff_fsize);
  105.       drwstring(SET,WHITE,t,buf,200,(done*14)+250);
  106.     }
  107.    }
  108.    mouseshow();
  109. }
  110.  
  111. char *selectdir(char *ext)
  112. {
  113.    struct ffblk fft;
  114.    int numfile;
  115.    int done, t;
  116.    char buf[40];
  117.    int k;
  118.    int cure = 1, showe = 0;
  119.    int mx, my, mbuts;
  120.    button_t xbutton, up, down, ok, doit;
  121.    ff = farmalloc(8500);
  122.    if (!ff) return 0;
  123.    //get files
  124.    done = findfirst(ext,&fft,0);
  125.    ff[numfile = 0] = fft;
  126.    while (!done)
  127.    {
  128.       done = findnext(&fft);
  129.       ff[numfile++] = fft;
  130.    }
  131.    numfile--;
  132.    //get dirs
  133.    done = findfirst("*.",&fft,0x10);
  134.    ff[numfile++] = fft;
  135.    while (!done)
  136.    {
  137.       done = findnext(&fft);
  138.       ff[numfile++] = fft;
  139.       ff[numfile].ff_attrib = 0x10;
  140.    }
  141.    numfile--;
  142.    //sort contents
  143.    for (t = numfile - 1; t >= 0; t--)
  144.    {
  145.       for (done = t; done >= 0; done--)
  146.       {
  147.      if (strcmp(ff[done].ff_name,ff[t].ff_name) > 0)
  148.      {
  149.         fft = ff[t];
  150.         ff[t] = ff[done];
  151.         ff[done] = fft;
  152.      }
  153.      if (ff[done].ff_attrib < ff[t].ff_attrib)
  154.      {
  155.         fft = ff[t];
  156.         ff[t] = ff[done];
  157.         ff[done] = fft;
  158.      }
  159.       }
  160.    }
  161.   //dump contents
  162.    showe=cure=0;
  163.    t = 0;
  164.    mousehide();
  165.    xbutton = inputbox(194,213,448,464,"Select File");
  166.    sprintf(buf," %s ",ext);
  167.    drwfillbox(SET,BLACK,202,235,370,248);
  168.    drwstring(SET,WHITE,BLACK,buf,202,235);
  169.    doit = clearbutton(200,250,430,450);
  170.    ok = button(375,235,440,248,"   Ok");
  171.    up = scrollbutton(432,433,"");
  172.    down = scrollbutton(432,447,"");
  173.    mouseshow();
  174.    while (mbuts) mousestatus(&mx,&my,&mbuts);
  175.    while (k != 27)
  176.    {
  177.      showdir(cure,showe);
  178.      scrollbar(432,250,433,showe+cure,numfile-1);
  179.         while (!kbhit() && !mbuts)
  180.         {
  181.            mousestatus(&mx,&my,&mbuts);
  182.            if (mbuts & 1)//scroll
  183.            {
  184.           if (hitbutton(mx,my,up))
  185.           {
  186.               showe--;
  187.               while (mbuts) mousestatus(&mx,&my,&mbuts);
  188.               mbuts = 1;
  189.           }
  190.           if (hitbutton(mx,my,down))
  191.           {
  192.               showe++;
  193.               while (mbuts) mousestatus(&mx,&my,&mbuts);
  194.               mbuts = 1;
  195.           }
  196.           if (hitbutton(mx,my,xbutton)) return 0;
  197.           //select
  198.           if (hitbutton(mx,my,doit)) cure = (my - 250) / 14;
  199.            }
  200.            if (mbuts & 2)//scroll fast
  201.            {
  202.           if (hitbutton(mx,my,up)) showe--;
  203.           if (hitbutton(mx,my,down)) showe++;
  204.           if (hitbutton(mx,my,doit)) return ff[showe+cure].ff_name;
  205.            }
  206.         }
  207.         if (!mbuts) k = getkey();
  208.         mbuts = 0;
  209.  
  210.      if (k == a_DOWN) cure++;
  211.      if (k == a_UP)   cure--;
  212.      if (k == a_PGDN) showe+=14;
  213.      if (k == a_PGUP) showe-=14;
  214.      if (k == a_HOME) cure=1;
  215.      if (k == a_END)  cure=14;
  216.      if (k == a_ENTER) return ff[showe+cure].ff_name;
  217.      if (k == a_ESC)   return 0;
  218.      if (cure > 14) {showe++;cure=14;}
  219.      if (cure < 0)  {showe--;cure=0;}
  220.      if (showe < 0) {showe = 0; cure = 0;}
  221.      if (showe + 15 > numfile) {showe = numfile - 15; cure=14;}
  222.    }
  223.   farfree(ff);
  224.   return 0;
  225. }
  226.  
  227.