mirror of https://github.com/libAthena/athena.git
* Changed how TextStream works; It's now less derpish and doesn't
produce a corrupted buffer everytime you edit a line.
This commit is contained in:
parent
3c8b493014
commit
f644c7d1a3
|
@ -21,9 +21,7 @@
|
|||
/*! \class FileNotFoundException
|
||||
* \brief An excpeption thrown when a file could not be found at the given path.
|
||||
*
|
||||
* This should only be thrown when the library tries to write to a buffer
|
||||
* e.g when the position is greater than the position and the stream
|
||||
* is not set to autoresize.<br />
|
||||
* This should only be thrown when the Stream is unable to open a file.<br />
|
||||
* <br />
|
||||
* It is <b>NOT</b> appropriate to use <b>throw new</b> so avoid doing so,
|
||||
* keeping things on the stack as much as possible is very important for speed.
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#ifndef __FILESTREAM_HPP__
|
||||
#define __FILESTREAM_HPP__
|
||||
|
||||
#include "Stream.hpp"
|
||||
#include <string>
|
||||
|
||||
class FileStream : public Stream
|
||||
{
|
||||
public:
|
||||
enum FileMode { Open, Create, OpenOrCreate = Open|Create, Truncate, Append };
|
||||
enum AccessMode { ReadOnly, WriteOnly, ReadWrite };
|
||||
FileStream(const std::string& filename, FileMode fileMode, AccessMode accessMode);
|
||||
|
||||
|
||||
private:
|
||||
std::string m_filename;
|
||||
FileMode m_filemode;
|
||||
AccessMode m_accessmode;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -26,9 +26,12 @@ public:
|
|||
void setCurrentLine(Uint32 line);
|
||||
Uint32 currentLine() const;
|
||||
private:
|
||||
void loadLines();
|
||||
std::string m_filename;
|
||||
FileMode m_filemode;
|
||||
AccessMode m_accessmode;
|
||||
|
||||
std::vector<std::string> m_lines;
|
||||
Uint32 m_currentLine;
|
||||
Uint32 m_startLength;
|
||||
};
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
<Unit filename="include/IOException.hpp" />
|
||||
<Unit filename="include/InvalidOperationException.hpp" />
|
||||
<Unit filename="include/Stream.hpp" />
|
||||
<Unit filename="include/TextStream.hpp" />
|
||||
<Unit filename="include/Types.hpp" />
|
||||
<Unit filename="include/utf8.h" />
|
||||
<Unit filename="include/utf8/checked.h" />
|
||||
|
@ -84,6 +85,7 @@
|
|||
<Unit filename="src/BinaryReader.cpp" />
|
||||
<Unit filename="src/BinaryWriter.cpp" />
|
||||
<Unit filename="src/Stream.cpp" />
|
||||
<Unit filename="src/TextStream.cpp" />
|
||||
<Unit filename="src/utility.cpp" />
|
||||
<Extensions>
|
||||
<code_completion />
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
#include "FileStream.hpp"
|
||||
#include <stdio.h>
|
||||
#include "FileNotFoundException.hpp"
|
||||
#include "IOException.hpp"
|
||||
|
||||
FileStream::FileStream(const std::string& filename, FileMode fileMode, AccessMode accessMode) :
|
||||
m_filename(filename),
|
||||
m_filemode(fileMode),
|
||||
m_accessmode(accessMode)
|
||||
{
|
||||
FILE* in;
|
||||
int length;
|
||||
in = fopen(filename.c_str(), "rb");
|
||||
|
||||
if (!in)
|
||||
{
|
||||
if((fileMode & Create) != Create)
|
||||
throw FileNotFoundException(filename.c_str());
|
||||
|
||||
in = fopen(filename.c_str(), "w+b");
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
length = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
m_data = new Uint8[length];
|
||||
|
||||
fread(m_data, 1, length, in);
|
||||
fclose(in);
|
||||
printf("%i\n", length);
|
||||
m_length = length;
|
||||
m_position = 0;
|
||||
}
|
|
@ -161,7 +161,7 @@ Int8 Stream::readByte()
|
|||
m_position += sizeof(Uint8);
|
||||
}
|
||||
if (m_position + 1 > m_length)
|
||||
throw IOException("Position passed stream bounds: " + m_position);
|
||||
throw IOException("Position passed stream bounds");
|
||||
|
||||
return *(Int8*)(m_data + m_position++);
|
||||
}
|
||||
|
@ -228,7 +228,7 @@ void Stream::seek(Int64 position, SeekOrigin origin)
|
|||
void Stream::resize(Uint64 newSize)
|
||||
{
|
||||
if (newSize < m_length)
|
||||
throw InvalidOperationException("Stream:Resize() -> New size cannot be less to the old size.");
|
||||
throw InvalidOperationException("Stream::Resize() -> New size cannot be less to the old size.");
|
||||
|
||||
// Allocate and copy new buffer
|
||||
Uint8* newArray = new Uint8[newSize];
|
||||
|
@ -274,7 +274,7 @@ Int64 Stream::position()
|
|||
|
||||
bool Stream::atEnd()
|
||||
{
|
||||
return m_position == m_length;
|
||||
return m_position >= m_length;
|
||||
}
|
||||
|
||||
void Stream::setAutoResizing(bool val)
|
||||
|
|
|
@ -46,6 +46,8 @@ TextStream::TextStream(const std::string& filename, FileMode fileMode, AccessMod
|
|||
|
||||
m_length = length;
|
||||
m_startLength = length;
|
||||
|
||||
loadLines();
|
||||
}
|
||||
|
||||
void TextStream::save(const std::string& filename)
|
||||
|
@ -53,6 +55,20 @@ void TextStream::save(const std::string& filename)
|
|||
if (filename != std::string())
|
||||
m_filename = filename;
|
||||
|
||||
// We need a new buffer to write the new lines
|
||||
if (m_data)
|
||||
delete[] m_data;
|
||||
|
||||
m_position = 0;
|
||||
m_length = 1;
|
||||
|
||||
// Set the new buffer
|
||||
m_data = new Uint8[m_length];
|
||||
|
||||
// Now write all the strings to the new buffer
|
||||
for (std::string s : m_lines)
|
||||
writeBytes((Int8*)s.c_str(), s.size());
|
||||
|
||||
FILE* out = fopen(m_filename.c_str(), "wb");
|
||||
|
||||
if(out)
|
||||
|
@ -63,43 +79,27 @@ void TextStream::save(const std::string& filename)
|
|||
else
|
||||
throw FileNotFoundException(m_filename);
|
||||
}
|
||||
|
||||
std::string TextStream::readLine()
|
||||
{
|
||||
std::string ret;
|
||||
Uint8 c;
|
||||
for (;;)
|
||||
{
|
||||
c = readByte();
|
||||
|
||||
if (c == '\r' || c == '\n')
|
||||
{
|
||||
m_currentLine++;
|
||||
ret.push_back(c);
|
||||
if (*(Uint8*)(m_data + m_position + 1) == '\n')
|
||||
{
|
||||
ret.push_back('\n');
|
||||
m_currentLine++;
|
||||
m_position++; // advance position past the new line character
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (c == '\0')
|
||||
{
|
||||
ret.push_back('\n');
|
||||
m_currentLine++;
|
||||
break;
|
||||
}
|
||||
ret.push_back(c);
|
||||
}
|
||||
return ret;
|
||||
if (m_currentLine > m_lines.size())
|
||||
throw IOException("Position past stream bounds");
|
||||
return m_lines[m_currentLine++];
|
||||
}
|
||||
|
||||
|
||||
void TextStream::writeLine(const std::string& str)
|
||||
{
|
||||
this->writeBytes((Int8*)str.c_str(), str.size());
|
||||
m_currentLine++;
|
||||
if (m_currentLine > m_lines.size() && !m_autoResize)
|
||||
throw IOException("Position past stream bounds");
|
||||
else if (m_currentLine > m_lines.size())
|
||||
{
|
||||
m_lines.push_back(str);
|
||||
m_currentLine++;
|
||||
return;
|
||||
}
|
||||
|
||||
m_lines[m_currentLine++] = str;
|
||||
}
|
||||
|
||||
void TextStream::writeLines(std::vector<std::string> strings)
|
||||
|
@ -110,14 +110,11 @@ void TextStream::writeLines(std::vector<std::string> strings)
|
|||
|
||||
std::vector<std::string> TextStream::readLines(Uint32 numLines)
|
||||
{
|
||||
m_position = 0;
|
||||
m_currentLine = 0;
|
||||
Uint32 currentLine = m_currentLine;
|
||||
std::vector<std::string> ret;
|
||||
|
||||
while ((numLines--) > 0)
|
||||
{
|
||||
ret.push_back(readLine());
|
||||
}
|
||||
while ((m_currentLine++) <= currentLine + numLines)
|
||||
ret.push_back(m_lines[m_currentLine]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -127,44 +124,56 @@ std::string TextStream::readLineAt(Uint32 line)
|
|||
if (line <= 0)
|
||||
throw InvalidOperationException("A line cannot be zero indexed");
|
||||
|
||||
m_position = 0;
|
||||
m_currentLine = 0;
|
||||
while (m_currentLine < line - 1)
|
||||
{
|
||||
readLine();
|
||||
}
|
||||
|
||||
return readLine();
|
||||
return m_lines[line - 1];
|
||||
}
|
||||
|
||||
std::vector<std::string> TextStream::readAllLines()
|
||||
{
|
||||
m_position = 0;
|
||||
m_currentLine = 0;
|
||||
std::vector<std::string> ret;
|
||||
|
||||
while (!atEnd())
|
||||
{
|
||||
ret.push_back(readLine());
|
||||
}
|
||||
|
||||
return ret;
|
||||
return m_lines;
|
||||
}
|
||||
|
||||
void TextStream::setCurrentLine(Uint32 line)
|
||||
{
|
||||
if (line <= 0)
|
||||
throw InvalidOperationException("A line cannot be zero indexed");
|
||||
m_currentLine = 0;
|
||||
m_position = 0;
|
||||
|
||||
while(m_currentLine != line - 1)
|
||||
{
|
||||
readLine();
|
||||
}
|
||||
m_currentLine = line - 1;
|
||||
}
|
||||
|
||||
Uint32 TextStream::currentLine() const
|
||||
{
|
||||
return m_currentLine;
|
||||
return m_currentLine + 1;
|
||||
}
|
||||
|
||||
void TextStream::loadLines()
|
||||
{
|
||||
while (!atEnd())
|
||||
{
|
||||
std::string line;
|
||||
Uint8 c;
|
||||
for (;;)
|
||||
{
|
||||
c = readByte();
|
||||
|
||||
if (c == '\r' || c == '\n')
|
||||
{
|
||||
m_currentLine++;
|
||||
line.push_back(c);
|
||||
if (*(Uint8*)(m_data + m_position + 1) == '\n')
|
||||
{
|
||||
line.push_back('\n');
|
||||
m_position++; // advance position past the new line character
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (c == '\0')
|
||||
{
|
||||
line.push_back('\n');
|
||||
break;
|
||||
}
|
||||
line.push_back(c);
|
||||
}
|
||||
|
||||
m_lines.push_back(line);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue