2022-08-22 15:33:46 +02:00
|
|
|
|
|
|
|
#include "zen/config.hpp"
|
|
|
|
|
|
|
|
#include "bolt/Text.hpp"
|
|
|
|
#include "bolt/ByteString.hpp"
|
|
|
|
|
|
|
|
namespace bolt {
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
TextFile::TextFile(ByteString Path, ByteString Text):
|
|
|
|
Path(Path), Text(Text) {
|
|
|
|
LineOffsets.push_back(0);
|
|
|
|
for (size_t I = 0; I < Text.size(); I++) {
|
|
|
|
auto Chr = Text[I];
|
|
|
|
if (Chr == '\n') {
|
|
|
|
LineOffsets.push_back(I+1);
|
2022-08-22 15:33:46 +02:00
|
|
|
}
|
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
LineOffsets.push_back(Text.size());
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getLineCount() const {
|
|
|
|
return LineOffsets.size();
|
|
|
|
}
|
2022-08-22 15:33:46 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getStartOffset(size_t Line) const {
|
|
|
|
return LineOffsets[Line-1];
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t TextFile::getLine(size_t Offset) const {
|
|
|
|
ZEN_ASSERT(Offset < Text.size());
|
|
|
|
for (size_t I = 0; I < LineOffsets.size(); ++I) {
|
|
|
|
if (LineOffsets[I] > Offset) {
|
|
|
|
return I;
|
2022-08-22 15:33:46 +02:00
|
|
|
}
|
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
ZEN_UNREACHABLE
|
|
|
|
}
|
2022-08-22 15:33:46 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getColumn(size_t Offset) const {
|
|
|
|
auto Line = getLine(Offset);
|
|
|
|
auto StartOffset = getStartOffset(Line);
|
|
|
|
return Offset - StartOffset + 1 ;
|
|
|
|
}
|
2022-08-22 15:33:46 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
ByteString TextFile::getPath() const {
|
|
|
|
return Path;
|
|
|
|
}
|
2022-08-22 15:33:46 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
ByteString TextFile::getText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
2022-08-22 15:33:46 +02:00
|
|
|
|
|
|
|
}
|