#include "iostd.h"
BOOL IoStdIsValid(LPVOID h){
return !!(h);
}
LPVOID IoStdOpenFile(LPCTSTR fname, BOOL read){
if(read==FILE_READ){
return fopen((const char*)fname,"rb");
} else if(read==FILE_WRITE){
return fopen((const char*)fname,"wb");
} else if(read==FILE_APPEND){
FILE *f=fopen((const char*)fname,"r+b");
if(!f){
f=fopen((const char*)fname,"wb");
}
return f;
} else if(read==FILE_READWRITE){
FILE *f=fopen((const char*)fname,"r+b");
fseek(f,0,SEEK_SET);
return f;
}
return NULL;
}
DWORD IoStdReadFile(LPVOID h, LPVOID p, DWORD sz){
FILE *f=(FILE*)h;
DWORD ret;
BOOL e;
e=feof(f);
if(e||sz==0){
return 0;
} else {
LONG oldtell=ftell(f);
fread(p,sz,1,f);
return ftell(f)-oldtell;
}
}
BOOL IoStdWriteFile(LPVOID h, LPVOID p, DWORD sz){
FILE *f=(FILE*)h;
DWORD ret;
if(sz==0){
return 0;
} else {
LONG oldtell=ftell(f);
fwrite(p,sz,1,f);
return ftell(f)-oldtell;
}
}
BOOL IoStdFlushFile(LPVOID h, LPVOID p, DWORD sz){
FILE *f=(FILE*)h;
return fflush(f)>=0;
}
BOOL IoStdCloseFile(LPVOID h){
FILE *f=(FILE*)h;
fclose(f);
return !!(f);
}
LONG IoStdSeekFile(LPVOID h, LONG lo, DWORD mode){
FILE *f=(FILE*)h;
switch(mode){
case FILE_BEGIN:
fseek(f,lo,SEEK_SET);
return ftell(f);
case FILE_CURRENT:
if(lo){
fseek(f,lo,SEEK_CUR);
}
return ftell(f);
case FILE_END:
fseek(f,lo,SEEK_END);
return ftell(f);
default:
return 0;
}
}
DWORD IoStdGetSize(LPVOID h){
FILE *f=(FILE*)h;
LONG tmp;
LONG sz;
tmp=ftell(f);
fseek(f,0,SEEK_END);
sz=ftell(f);
fseek(f,tmp,SEEK_SET);
return (DWORD)sz;
}
IOSTRUCT StdIo={
IoStdIsValid,
IoStdOpenFile,
IoStdCloseFile,
IoStdReadFile,
IoStdWriteFile,
IoStdSeekFile,
IoStdGetSize,
IoStdFlushFile
};
IOSTRUCT *GetNativeIo(void){
return &StdIo;
}