1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Abstract the details of reading from zip files versus FILE *'s.
#include "reader.h"
// Generic constructor/destructor
Reader::Reader(void){}
Reader::~Reader(){}
// snes9x.h STREAM reader
fReader::fReader(STREAM f){
fp=f;
}
fReader::~fReader(void){}
int fReader::get_char(){
return GETC_STREAM(fp);
}
char *fReader::gets(char *buf, size_t len){
return GETS_STREAM(buf, len, fp);
}
size_t fReader::read(char *buf, size_t len){
return READ_STREAM(buf, len, fp);
}
// unzip reader
#ifdef UNZIP_SUPPORT
unzReader::unzReader(unzFile &v){
file=v;
head=NULL;
numbytes=0;
}
unzReader::~unzReader(void){}
int unzReader::get_char(){
unsigned char c;
if(numbytes<=0){
numbytes=unzReadCurrentFile(file, buffer, unz_BUFFSIZ);
if(numbytes<=0) return (EOF);
head=buffer;
}
c=*head;
head++;
numbytes--;
return (int) c;
}
char *unzReader::gets(char *buf, size_t len){
size_t i;
int c;
for(i=0; i<len-1; i++){
c=get_char();
if(c==(EOF)){
if(i==0) return NULL;
break;
}
buf[i]=(char)c;
if(buf[i]=='\n') break;
}
buf[i]='\0';
return buf;
}
size_t unzReader::read(char *buf, size_t len){
if(len==0) return len;
if(len<=numbytes){
memcpy(buf, head, len);
numbytes-=len;
head+=len;
return len;
}
size_t numread=0;
if(numbytes>0){
memcpy(buf, head, numbytes);
numread+=numbytes;
head=NULL;
numbytes=0;
}
int l=unzReadCurrentFile(file, buf+numread, len-numread);
if(l>0) numread+=l;
return numread;
}
#endif
|