diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-09-01 15:58:53 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-09-01 20:10:06 -0700 |
commit | a49bc41365bf6b4f0c006c5fbdcb4b519634c42c (patch) | |
tree | 664075c7652dfe7eb75cfdb6c54e7b226215bc2d /subx/011run.cc | |
parent | 6ff9ce26e84f686a96ada723f63ce95879216cca (diff) | |
download | mu-a49bc41365bf6b4f0c006c5fbdcb4b519634c42c.tar.gz |
4531 - automatically compute segment addresses
Diffstat (limited to 'subx/011run.cc')
-rw-r--r-- | subx/011run.cc | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/subx/011run.cc b/subx/011run.cc index 9c024e27..bca04289 100644 --- a/subx/011run.cc +++ b/subx/011run.cc @@ -104,7 +104,11 @@ struct program { struct segment { uint32_t start; vector<line> lines; - segment() :start(0) {} + // End segment Fields + segment() { + start = 0; + // End segment Constructor + } }; :(before "struct segment") struct line { @@ -145,7 +149,10 @@ void parse(istream& fin, program& out) { out.segments.back().lines.swap(l); } segment s; - lin >> std::hex >> s.start; + string segment_title; + lin >> segment_title; + if (starts_with(segment_title, "0x")) + s.start = parse_int(segment_title); trace(99, "parse") << "new segment from " << HEXWORD << s.start << end(); out.segments.push_back(s); // todo? @@ -296,3 +303,35 @@ int32_t imm32() { result |= (next()<<24); return result; } + +:(code) +int32_t parse_int(const string& s) { + if (s.empty()) return 0; + istringstream in(s); + in >> std::hex; + if (s.at(0) == '-') { + int32_t result = 0; + in >> result; + if (!in || !in.eof()) { + raise << "not a number: " << s << '\n' << end(); + return 0; + } + return result; + } + uint32_t uresult = 0; + in >> uresult; + if (!in || !in.eof()) { + raise << "not a number: " << s << '\n' << end(); + return 0; + } + return static_cast<int32_t>(uresult); +} +:(before "End Unit Tests") +void test_parse_int() { + CHECK_EQ(0, parse_int("0")); + CHECK_EQ(0, parse_int("0x0")); + CHECK_EQ(0, parse_int("0x0")); + CHECK_EQ(16, parse_int("10")); // hex always + CHECK_EQ(-1, parse_int("-1")); + CHECK_EQ(-1, parse_int("0xffffffff")); +} |