home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / FlyPak / flypak.cpp next >
Encoding:
C/C++ Source or Header  |  2000-02-02  |  4.3 KB  |  290 lines

  1. #include "../Fly3D.h"
  2. #include <direct.h>
  3.  
  4. fly_pak::fly_pak()
  5. {
  6.     pos=0;
  7.     len=0;
  8.     buf=0;
  9.     pakfile=0;
  10. }
  11.  
  12. fly_pak::~fly_pak()
  13. {
  14.     if(buf) delete buf;
  15.     if(pakfile) fclose(pakfile);
  16. }
  17.  
  18. bool fly_pak::open(char *filename)
  19. {
  20.     FILE *fp=fopen(filename, "rb");
  21.     
  22.     if(!fp)
  23.     {
  24.         char *p;
  25.         while(p=strchr(filename, '/')) *p='\\';
  26.  
  27.         if(!pakfile || !same_pak(filename))
  28.             if(!open_pak(filename))
  29.                 return false;
  30.  
  31.         if(!seek_file(filename))
  32.             return false;
  33.  
  34.         buf=new char[len];
  35.         fread(buf, 1, len, pakfile);
  36.         pos=0;
  37.     }
  38.     else
  39.     {
  40.         fseek(fp, 0, SEEK_END);
  41.         len=ftell(fp);
  42.         buf=new char[len];
  43.         fseek(fp, 0, SEEK_SET);
  44.         fread(buf, 1, len, fp);
  45.         pos=0;
  46.         fclose(fp);
  47.     }
  48.  
  49.     return true;
  50. }
  51.  
  52. FILE *fly_pak::get_fp(char *filename)
  53. {
  54.     FILE *fp=fopen(filename, "rb");
  55.  
  56.     if (fp) 
  57.         return fp;
  58.  
  59.     char *p;
  60.     while(p=strchr(filename, '/')) *p='\\';
  61.  
  62.     if(!pakfile || !same_pak(filename))
  63.         if(!open_pak(filename))
  64.             return 0;
  65.  
  66.     if(!seek_file(filename))
  67.         return 0;
  68.  
  69.     fp=pakfile;
  70.     pakfile=0;
  71.  
  72.     return fp;
  73. }
  74.  
  75. void fly_pak::close()
  76. {
  77.     if(buf)
  78.     {
  79.         delete buf;
  80.         buf=0;
  81.         pos=0;
  82.         len=0;
  83.     }
  84. }
  85.  
  86. int fly_pak::read(void *dest, int size)
  87. {
  88.     if(pos+size>=len) size=len-pos;
  89.     memcpy(dest, &buf[pos], size);
  90.     pos+=size;
  91.     return size;
  92. }
  93.  
  94. void fly_pak::get_string(char *dest)
  95. {
  96.     int i=0;
  97.  
  98.     while(pos<len && buf[pos]!='\r' && buf[pos]!='\n') dest[i++]=buf[pos++];
  99.  
  100.     dest[i]='\0';
  101.     if(pos<len && buf[pos]=='\r') pos++;
  102.     if(pos<len && buf[pos]=='\n') pos++;
  103. }
  104.  
  105. bool fly_pak::proc_section(char *section)
  106. {
  107.     char *s;
  108.     int slen, spos, pant=pos;
  109.  
  110.     slen=strlen(section)+2;
  111.     s=new char[slen+1];
  112.     strcpy(s, "[");
  113.     strcat(s, section);
  114.     strcat(s, "]");
  115.  
  116.     pos=0;
  117.     
  118.     while(pos<len)
  119.     {
  120.         if(buf[pos]==s[0])
  121.         {
  122.             spos=0;
  123.             while(pos<len && spos<slen && buf[pos]==s[spos])
  124.             {
  125.                 pos++;
  126.                 spos++;
  127.             }
  128.             if(spos==slen) return true;
  129.         }
  130.         pos++;
  131.     }
  132.  
  133.     pos=pant;
  134.  
  135.     return false;
  136. }
  137.  
  138. bool fly_pak::proc_key(char *key)
  139. {
  140.     char *s;
  141.     int slen, spos, pant=pos;
  142.  
  143.     slen=strlen(key)+1;
  144.     s=new char[slen+1];
  145.     strcpy(s, key);
  146.     strcat(s, "=");
  147.     
  148.     while(pos<len && buf[pos]!='[')
  149.     {
  150.         if(buf[pos]==s[0])
  151.         {
  152.             spos=0;
  153.             while(pos<len && spos<slen && buf[pos]==s[spos])
  154.             {
  155.                 pos++;
  156.                 spos++;
  157.             }
  158.             if(spos==slen)    return true;
  159.         }
  160.         pos++;
  161.     }
  162.     
  163.     pos=pant;
  164.  
  165.     return false;
  166. }
  167.  
  168. void fly_pak::get_profile_string(char *section, char *key, char *dest)
  169. {
  170.     dest[0]='\0';
  171.     if(!proc_section(section)) return;
  172.     if(!proc_key(key)) return;
  173.     get_string(dest);
  174. }
  175.  
  176. float fly_pak::get_float()
  177. {
  178.     char s[64];
  179.     int i=0;
  180.  
  181.     while(pos<len && !((buf[pos]>=48 && buf[pos]<=57) || buf[pos]=='.' || buf[pos]=='-'))
  182.         pos++;
  183.  
  184.     if(pos==len) return 0;
  185.  
  186.     do s[i++]=buf[pos++];
  187.     while(pos<len && ((buf[pos]>=48 && buf[pos]<=57) || buf[pos]=='.'));
  188.         
  189.  
  190.     s[i]='\0';
  191.  
  192.     return (float)atof(s);
  193. }
  194.  
  195. int fly_pak::get_int()
  196. {
  197.     char s[64];
  198.     int i=0;
  199.  
  200.     while(pos<len && !((buf[pos]>=48 && buf[pos]<=57) || buf[pos]=='-'))
  201.         pos++;
  202.  
  203.     if(pos==len) return 0;
  204.  
  205.     do s[i++]=buf[pos++];
  206.     while(pos<len && buf[pos]>=48 && buf[pos]<=57);
  207.         
  208.  
  209.     s[i]='\0';
  210.  
  211.     return atoi(s);
  212. }
  213.  
  214. bool fly_pak::open_pak(char *filename)
  215. {
  216.     char *p;
  217.     char str[MAXP];
  218.  
  219.     if(pakfile)
  220.     {
  221.         fclose(pakfile);
  222.         pakfile=NULL;
  223.     }
  224.  
  225.     strcpy(str, filename);
  226.  
  227.     while(!pakfile && (p=strrchr(str, '\\')))
  228.     {
  229.         *p=0;
  230.         strcpy(fldrname, str);
  231.         strcat(str,".fpk");
  232.         pakfile=fopen(str,"rb");
  233.     }
  234.  
  235.     return pakfile!=NULL;
  236. }
  237.  
  238. bool fly_pak::seek_file(char *filename)
  239. {
  240.     char fp[MAXP];
  241.     unsigned long t;
  242.     unsigned int nfiles;
  243.     struct fileinfo fl;
  244.  
  245.     strcpy(fp, &filename[strlen(fldrname)+1]);
  246.  
  247.     fseek(pakfile, 0, SEEK_SET);
  248.     fread(&nfiles, sizeof(unsigned int), 1, pakfile);
  249.  
  250.     t=sizeof(unsigned int)+nfiles*sizeof(struct fileinfo);
  251.  
  252.     for(nfiles; nfiles>0; nfiles--)
  253.     {
  254.         fread(&fl, sizeof(struct fileinfo), 1, pakfile);
  255.         if(_stricmp(fl.filename, fp)==0)
  256.         {
  257.             len=fl.size;
  258.             break;
  259.         }
  260.         else
  261.             t+=fl.size;
  262.     }
  263.  
  264.     fseek(pakfile, t, SEEK_SET);
  265.  
  266.     return nfiles>0;
  267. }
  268.  
  269. bool fly_pak::same_pak(char *filename)
  270. {
  271.     unsigned int t=strlen(fldrname);
  272.     char str[MAXP];
  273.  
  274.     if(t>strlen(filename))
  275.         return false;
  276.  
  277.     strncpy(str, filename, t);
  278.     str[t]=0;
  279.  
  280.     return _stricmp(filename, str)==0;
  281. }
  282.  
  283. void fly_pak::seek(long offset)
  284. {
  285.     long newpos=pos+offset;
  286.  
  287.     if(newpos>=0 && newpos<(signed)len) pos=newpos;
  288. }
  289.  
  290.