Putting Buffers in main to test things out.
This commit is contained in:
parent
2dcc577f57
commit
ba27e132e3
74
Buffer.cc
74
Buffer.cc
|
@ -22,10 +22,11 @@
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include <iterator>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
|
|
||||||
|
@ -56,6 +57,17 @@ Buffer::Buffer(std::string fName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Buffer::Buffer(std::filesystem::path fPath)
|
||||||
|
: dirty(false), path(OptString(fPath.string()))
|
||||||
|
{
|
||||||
|
this->name = fPath.filename().string();
|
||||||
|
this->Cursor() = Cursor();
|
||||||
|
|
||||||
|
this->file = OptFile(fPath.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Buffer::Buffer(std::string fName, std::string fPath)
|
Buffer::Buffer(std::string fName, std::string fPath)
|
||||||
: dirty(false), name(std::move(fName)), path(fPath)
|
: dirty(false), name(std::move(fName)), path(fPath)
|
||||||
{
|
{
|
||||||
|
@ -141,12 +153,23 @@ Buffer::Refresh()
|
||||||
return FileStatus::FileStatusIOFailed;
|
return FileStatus::FileStatusIOFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t currentLine = 0;
|
|
||||||
|
|
||||||
while (realHandle->good()) {
|
while (realHandle->good()) {
|
||||||
|
std::string temp;
|
||||||
|
while (std::getline(*realHandle, temp)) {
|
||||||
|
std::vector<uint8_t> row(temp.begin(), temp.end());
|
||||||
|
row.push_back('\n');
|
||||||
|
this->contents.push_back(row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto status = Buffer::FileStatus::FileStatusOK;
|
||||||
|
if (!realHandle->eof()) {
|
||||||
|
status = FileStatus::FileStatusIOFailed;
|
||||||
|
}
|
||||||
|
realHandle->close();
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -178,3 +201,48 @@ Buffer::MarkDirty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t
|
||||||
|
Buffer::Size()
|
||||||
|
{
|
||||||
|
size_t size = 0;
|
||||||
|
|
||||||
|
for (const auto& line : this->contents) {
|
||||||
|
size += line.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Buffer::Close()
|
||||||
|
{
|
||||||
|
this->clearContents();
|
||||||
|
this->dirty = false;
|
||||||
|
this->file = std::nullopt;
|
||||||
|
this->path = std::nullopt;
|
||||||
|
this->name = std::string("deleted buffer (" + this->name + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string
|
||||||
|
Buffer::FileStatusToString(Buffer::FileStatus status)
|
||||||
|
{
|
||||||
|
switch (status) {
|
||||||
|
case FileStatus::FileStatusOK:
|
||||||
|
return std::string("OK");
|
||||||
|
case FileStatus::FileStatusReadOnly:
|
||||||
|
return std::string("read-only file");
|
||||||
|
case FileStatus::FileStatusIOFailed:
|
||||||
|
return std::string("I/O failure");
|
||||||
|
case FileStatus::FileStatusVirtual:
|
||||||
|
return std::string("virtual buffer");
|
||||||
|
case FileStatus::FileStatusInvalidPermissions:
|
||||||
|
return std::string("invalid permissions");
|
||||||
|
case FileStatus::FileStatusNonExistent:
|
||||||
|
return std::string("file does not exist");
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
11
Buffer.h
11
Buffer.h
|
@ -59,6 +59,8 @@ public:
|
||||||
FileStatusNonExistent = 5,
|
FileStatusNonExistent = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static std::string FileStatusToString(FileStatus status);
|
||||||
|
|
||||||
|
|
||||||
static bool StatusOK(FileStatus status)
|
static bool StatusOK(FileStatus status)
|
||||||
{ return status == FileStatus::FileStatusOK; }
|
{ return status == FileStatus::FileStatusOK; }
|
||||||
|
@ -74,11 +76,16 @@ public:
|
||||||
/// Instantiate a Buffer pointing to fPath.
|
/// Instantiate a Buffer pointing to fPath.
|
||||||
Buffer(std::string fName, std::string fPath);
|
Buffer(std::string fName, std::string fPath);
|
||||||
|
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
/// Instantiate a buffer from a filesystem path.
|
||||||
|
Buffer(std::filesystem::path fPath);
|
||||||
|
|
||||||
std::string Name() const
|
std::string Name() const
|
||||||
{ return this->name; }
|
{ return this->name; }
|
||||||
|
|
||||||
bool IsVirtual()
|
bool IsVirtual()
|
||||||
{ return this->file.has_value(); }
|
{ return !this->file.has_value(); }
|
||||||
|
|
||||||
Buffer::FileStatus Flush(OptString altPath);
|
Buffer::FileStatus Flush(OptString altPath);
|
||||||
|
|
||||||
|
@ -100,6 +107,8 @@ public:
|
||||||
bool IsDirty()
|
bool IsDirty()
|
||||||
{ return this->dirty; }
|
{ return this->dirty; }
|
||||||
|
|
||||||
|
size_t Size();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void clearContents();
|
void clearContents();
|
||||||
|
|
||||||
|
|
21
File.cc
21
File.cc
|
@ -22,9 +22,24 @@
|
||||||
///
|
///
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <utility>
|
||||||
#include "File.h"
|
#include "File.h"
|
||||||
|
|
||||||
|
|
||||||
|
File::File(std::string fPath)
|
||||||
|
: path(fPath), readOnly(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
File::File(std::filesystem::path fPath)
|
||||||
|
: path(std::move(fPath)), readOnly(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const std::string File::Path()
|
const std::string File::Path()
|
||||||
{
|
{
|
||||||
return this->path.string();
|
return this->path.string();
|
||||||
|
@ -37,12 +52,6 @@ void File::SetPath(const std::string &fPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
File::File(std::string fPath)
|
|
||||||
: path(fPath), readOnly(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
OptOutFileStream File::Flush()
|
OptOutFileStream File::Flush()
|
||||||
{
|
{
|
||||||
// Exit early if we shouldn't be writing to the file.
|
// Exit early if we shouldn't be writing to the file.
|
||||||
|
|
1
File.h
1
File.h
|
@ -47,6 +47,7 @@ static constexpr std::ios::openmode DefaultMode =
|
||||||
class File {
|
class File {
|
||||||
public:
|
public:
|
||||||
File(std::string fPath);
|
File(std::string fPath);
|
||||||
|
File(std::filesystem::path fPath);
|
||||||
|
|
||||||
const std::string Path();
|
const std::string Path();
|
||||||
void SetPath(const std::string &fPath);
|
void SetPath(const std::string &fPath);
|
||||||
|
|
24
main.cc
24
main.cc
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
#include "Cursor.h"
|
#include "Cursor.h"
|
||||||
#include "LineEnding.h"
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -51,13 +50,30 @@ int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if ((argc == 2) && (std::string(argv[1]) == "-h")) {
|
if ((argc == 2) && (std::string(argv[1]) == "-h")) {
|
||||||
std::cout << "help?\n";
|
/// \todo proper command line parsing
|
||||||
usage(std::cout, 0);
|
usage(std::cout, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer frame;
|
for (int i = 1; i < argc; i++) {
|
||||||
std::cout << frame.Name() << "\n";
|
std::filesystem::path path(argv[i]);
|
||||||
|
std::cout << "[+] target: " << path << "\n ";
|
||||||
|
auto buffer = Buffer(path);
|
||||||
|
|
||||||
|
std::cout << "\t[+] created buffer " << buffer.Name() << "\n";
|
||||||
|
auto status = buffer.Refresh();
|
||||||
|
if (!Buffer::StatusOK(status)) {
|
||||||
|
std::cerr << "[!] failed to read buffer ";
|
||||||
|
std::cerr << buffer.Name() << "\n";
|
||||||
|
std::cerr << "\t[!] reason: ";
|
||||||
|
std::cerr << Buffer::FileStatusToString(status);
|
||||||
|
std::cerr << "\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "\t[+] loaded buffer " << buffer.Name()
|
||||||
|
<< " of " << buffer.Size() << " bytes.\n";
|
||||||
|
buffer.Close();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue