// Copyright (C) 2005, Ondra Kamenik // $Id: memory_file.h 762 2006-05-22 13:00:07Z kamenik $ #ifndef OGU_MEMORY_FILE #define OGU_MEMORY_FILE namespace ogu { /** This function calculates an offset of a given position in a * given string. The position is given by the line number and by * the offset in the line (both starting from 1). */ int calc_pos_offset(int length, const char* str, int line, int col); /** This function calculates a line number and column number of a * character given by the offset in the string. It is inverse to * calc_pos_offset. */ void calc_pos_line_and_col(int length, const char* str, int offset, int& line, int& col); /** This class opens a given file and makes its copy in memory and * appends it with the '\0' character. Since the type of length is * int, it can store files with size at most 4GB. If the file * could be opened for reading, data is NULL and length is -1. If * the file is empty but exists, len is zero and data points to a * newly allocated memory containing '\0' character at the end. */ class MemoryFile { protected: int len; char* data; public: MemoryFile(const char* fname); virtual ~MemoryFile() {if (data) delete [] data;} int length() const {return len;} const char* base() const {return data;} bool exists() const {return len != -1;} /** Return the offset of a character in the given line * (starting from 1) with the given offset in the line. */ int offset(int line, int lineoff) const {return calc_pos_offset(len, data, line, lineoff);} /** Return the line number and column number of the character * defined by the offset. */ void line_and_col(int offset, int& line, int& col) const {calc_pos_line_and_col(len, data, offset, line, col);} }; }; #endif // Local Variables: // mode:C++ // End: