LibD/src/System/Filesystem/InputFileStream.cpp
Rtch90 f182e6749c [Add] I don't want to talk about it.
-- Should be pretty usable now.
2012-09-02 23:57:19 +01:00

123 lines
2.9 KiB
C++

#include <fstream>
#include "../Debug.h"
#include "InputFileStream.h"
namespace saracraft {
namespace filesystem {
struct InputFileStreamBufferData {
FILE* fp;
size_t size;
InputFileStreamBufferData(const std::string filename) : fp(0), size(0) {
fp = fopen(filename.c_str(), "rb");
#ifdef __UNIX__
// Another ugly as hell case sensitive hack.
// if anyone finds a nice way to handle this. Please implement it. -- Allanis
if(!fp) {
std::string filename = filename;
for(unsigned int i = 0; i < filename.size(); i++) {
if(isupper(filename[i]))
filename[i] = tolower(filename[i]);
else if(filename[i] == '\\')
filename[i] = '/';
}
fp = fopen(filename.c_str(), "rb");
}
#endif
if(fp) {
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
}
if(!size)
Close();
}
~InputFileStreamBufferData(void) {
Close();
}
void Close(void) {
if(fp) {
fclose(fp);
fp = 0;
}
}
};
InputFileStreamBuffer::~InputFileStreamBuffer(void) {
}
unsigned char InputFileStreamBuffer::PopByte(void) {
char byte = 0;
if(_data->fp) {
int input = fgetc(_data->fp);
if(input == EOF)
_data->Close();
else
byte = (char)input;
}
return byte;
}
bool InputFileStreamBuffer::IsEof(void) const {
if(!_data->fp)
return true;
return false;
}
int InputFileStreamBuffer::GetSize(void) const {
if(!_data->fp)
return 0;
// This could cause maybe about a 2GB limimitation to file size
// by casting to int. Feel free to FIXME.
// -- Allanis
return int(_data->size);
}
void InputFileStreamBuffer::PopBytes(char* buffer, int bytes) {
if(!_data->fp) {
for(int i = 0; i < bytes; ++i)
buffer[i] = 0;
} else {
//_data->stream.read(buffer, bytes);
if(fread(buffer, 1, bytes, _data->fp) != (unsigned)bytes)
_data->Close();
}
}
// HACK: ffs. This is needed to get some sense into the input stream error reporting.
//bool input_file_stream_no_nonexisting_error_message = false;
//void SetInputStreamErrorReporting(bool logNonExisting) {
// input_file_stream_no_nonexisting_error_message = !logNonExisting;
//}
InputStream CreateInputFileStream(const std::string& filename) {
// This whole method is pissing me off!!!!!!!!!!
//There..
//InputStream inputStream;
//boost::shared_ptr<InputFileStreamBuffer> inputBuffer(new InputFileStreamBuffer(filename));
// Eh.. No.
// TODO: Would need a seperate error check, eof is not the same as the file does not exist..
// This would just spam error messages. We don't want that.
/*if(!inputBuffer->IsEof()) {
if(!input_file_stream_no_nonexisting_error_message) {
Debug->logger("CreateInputFileStream - File \"%s\"does not exist or is zero length.", filename.c_str());
}
}*/
//inputStream.SetBuffer(inputBuffer);
//return inputStream;
}
} // Namespace filesystem.
} // Namespace saracraft.