76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
// 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:
|