diff options
author | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:14 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2016-09-17 09:58:14 +0200 |
commit | 36969a9058806e71078efcb04a91cc263612d42e (patch) | |
tree | 7f6046c1f4e87c5158666dd95aeab10d32c221f4 /src | |
parent | 0e54dbeb4e7a6c3d2b534b1a64f7044b3ddb7bfc (diff) |
Change loadsave:do_std_string() to handle NUL properly
Diffstat (limited to 'src')
-rw-r--r-- | src/loadsave.cc | 51 |
1 files changed, 18 insertions, 33 deletions
diff --git a/src/loadsave.cc b/src/loadsave.cc index b3b04b9c..1843c414 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -249,45 +249,30 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void load_std_string(std::string &s) +static void do_std_string(std::string &s, ls_flag_t flag) { - s.clear(); - while (true) + // Length prefix. + u32b saved_size = s.size(); + do_u32b(&saved_size, flag); + // Convert to size_t + std::size_t n = saved_size; + // Load/save goes a little differently since we cannot + // assume anything about 's' when loading. + if (flag == ls_flag_t::LOAD) { - byte u8 = sf_get(); - if (u8) - { - s += u8; - } - else + s.clear(); + s.reserve(n); + for (std::size_t i = 0; i < n; i++) { - break; + s += sf_get(); } } -} - -static void save_std_string(std::string &s) -{ - for (std::size_t i = 0; i < s.length(); i++) - { - assert(s[i] != 0); // Sanity check; we cannot handle NULs in strings - sf_put(s[i]); - } - sf_put(0); // NUL terminator -} - -static void do_std_string(std::string &s, ls_flag_t flag) -{ - switch(flag) - { - case ls_flag_t::LOAD: + else { - load_std_string(s); - break; - } - case ls_flag_t::SAVE: - save_std_string(s); - break; + for (std::size_t i = 0; i < n; i++) + { + sf_put(s[i]); + } } } |