#ifndef LOADER_H #define LOADER_H #include #include #include #include "file_reader.h" #include class Machine; using std::shared_ptr; using std::string; class Loader { public: Loader( shared_ptr machine, string filename) : _machine(machine), _filename(filename) { _file_reader = std::make_shared(filename, std::ios::in); if (!_file_reader->good()) { throw std::runtime_error("Loader: failed to open file: " + filename); } } ~Loader(); enum class RecordType { HEADER, TEXT, END, UNKNOWN }; struct HeaderMetadata { string program_name; int start_address; int length; }; struct TextRecord { int start_address; std::vector data; }; struct EndRecord { int execution_start_address; }; void load(); private : static RecordType parseRecordType(char c); shared_ptr _machine; string _filename; shared_ptr _file_reader; HeaderMetadata readHeader(); TextRecord readTextRecord(); EndRecord readEndRecord(); bool load_into_memory(int start_address, const std::vector& data); }; #endif // LOADER_H