// Read the given file into memory and return a pointer to the allocated // buffer. The buffer will be null-terminated, like a C string; you can // also obtain the data length by passing a pointer to an unsigned long // as the (optional) second parameter. The buffer should be freed with // delete[] when no longer needed. char *readFile(const std::string& path, unsigned long *size_ret) { long fileSize; #ifdef BBGE_BUILD_VFS VFILE *vf = vfs.GetFile(path.c_str()); if (!vf) return NULL; char *buffer = (char*)vf->getBuf(NULL, NULL); fileSize = vf->size(); vf->dropBuf(false); // unlink buffer from file #else FILE *f = fopen(path.c_str(), "rb"); if (!f) return NULL; if (fseek(f, 0, SEEK_END) != 0 || (fileSize = ftell(f)) < 0 || fseek(f, 0, SEEK_SET) != 0) { debugLog(path + ": Failed to get file size"); fclose(f); return NULL; } char *buffer = new char[fileSize + 1]; if (!buffer) { std::ostringstream os; os << path << ": Not enough memory for file (" << (fileSize+1) << " bytes)"; debugLog(os.str()); fclose(f); return NULL; } long bytesRead = fread(buffer, 1, fileSize, f); if (bytesRead != fileSize) { std::ostringstream os; os << path << ": Failed to read file (only got " << bytesRead << " of " << fileSize << " bytes)"; debugLog(os.str()); fclose(f); return NULL; } fclose(f); buffer[fileSize] = 0; #endif if (size_ret) *size_ret = fileSize; return buffer; }