summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2016-09-17 09:58:14 +0200
committerBardur Arantsson <bardur@scientician.net>2016-09-17 09:58:14 +0200
commit36969a9058806e71078efcb04a91cc263612d42e (patch)
tree7f6046c1f4e87c5158666dd95aeab10d32c221f4 /src
parent0e54dbeb4e7a6c3d2b534b1a64f7044b3ddb7bfc (diff)
Change loadsave:do_std_string() to handle NUL properly
Diffstat (limited to 'src')
-rw-r--r--src/loadsave.cc51
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]);
+ }
}
}