summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-12-17 15:51:51 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-12-17 15:51:51 +0100
commit354816b2ff6361a8286a547c0c130e0de170f0a7 (patch)
tree8bc4e53c456ec49fce0c64a4ba3828b61c48482a /crawl-ref/source
parent1ab177757bec9eb28482785f75fd8a4fb8a1313c (diff)
downloadcrawl-ref-354816b2ff6361a8286a547c0c130e0de170f0a7.tar.gz
crawl-ref-354816b2ff6361a8286a547c0c130e0de170f0a7.zip
Fix bad varargs handling.
You can't pass a va_list to a variadic function.
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/format.cc2
-rw-r--r--crawl-ref/source/hiscores.cc2
-rw-r--r--crawl-ref/source/libutil.cc18
-rw-r--r--crawl-ref/source/libutil.h1
4 files changed, 15 insertions, 8 deletions
diff --git a/crawl-ref/source/format.cc b/crawl-ref/source/format.cc
index 59fc8152bf..94c6b3cdfa 100644
--- a/crawl-ref/source/format.cc
+++ b/crawl-ref/source/format.cc
@@ -516,7 +516,7 @@ void formatted_string::cprintf(const char *s, ...)
{
va_list args;
va_start(args, s);
- cprintf(make_stringf(s, args));
+ cprintf(vmake_stringf(s, args));
va_end(args);
}
diff --git a/crawl-ref/source/hiscores.cc b/crawl-ref/source/hiscores.cc
index cbbd3b518c..4fa9d16826 100644
--- a/crawl-ref/source/hiscores.cc
+++ b/crawl-ref/source/hiscores.cc
@@ -2123,7 +2123,7 @@ void xlog_fields::add_field(const std::string &key,
{
va_list args;
va_start(args, format);
- std::string buf = make_stringf(format, args);
+ std::string buf = vmake_stringf(format, args);
va_end(args);
fields.push_back( std::pair<std::string, std::string>( key, buf ) );
diff --git a/crawl-ref/source/libutil.cc b/crawl-ref/source/libutil.cc
index 0243452e77..ce7fcbb429 100644
--- a/crawl-ref/source/libutil.cc
+++ b/crawl-ref/source/libutil.cc
@@ -136,24 +136,30 @@ std::string strip_filename_unsafe_chars(const std::string &s)
return replace_all_of(s, " .&`\"\'|;{}()[]<>*%$#@!~?", "");
}
-std::string make_stringf(const char *s, ...)
+std::string vmake_stringf(const char* s, va_list args)
{
- va_list args;
- va_start(args, s);
char buf1[400];
size_t len = vsnprintf(buf1, sizeof buf1, s, args);
- va_end(args);
if (len < sizeof buf1)
return (buf1);
+
char *buf2 = (char*)malloc(len + 1);
- va_start(args, s);
vsnprintf(buf2, len + 1, s, args);
std::string ret(buf2);
free(buf2);
- va_end(args);
+
return (ret);
}
+std::string make_stringf(const char *s, ...)
+{
+ va_list args;
+ va_start(args, s);
+ std::string ret = vmake_stringf(s, args);
+ va_end(args);
+ return ret;
+}
+
std::string &escape_path_spaces(std::string &s)
{
std::string result;
diff --git a/crawl-ref/source/libutil.h b/crawl-ref/source/libutil.h
index 66cb9bb693..51bd4520b0 100644
--- a/crawl-ref/source/libutil.h
+++ b/crawl-ref/source/libutil.h
@@ -65,6 +65,7 @@ int ends_with(const std::string &s, const char *suffixes[]);
std::string strip_filename_unsafe_chars(const std::string &s);
+std::string vmake_stringf(const char *format, va_list args);
std::string make_stringf(const char *format, ...);
std::string replace_all(std::string s,