mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: add compile time format check to format_string_std
Had to rewrite the thing, because gcc's warnings don't work with templatized var-args. Since there is no string-format.cpp and I didn't want to inline it, moved it to format.cpp. String formatting is distributed around at least four headers: membuffer.h, subsurface-string.h, format.h and format-string.h. This really should be unified! Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
a123589efb
commit
322c3b55e6
8 changed files with 27 additions and 14 deletions
|
@ -10,6 +10,7 @@
|
|||
#include "qthelper.h"
|
||||
#include "git-access.h"
|
||||
#include "errorhelper.h"
|
||||
#include "core/format.h"
|
||||
#include "core/subsurface-string.h"
|
||||
#include "core/membuffer.h"
|
||||
#include "core/settings/qPrefCloudStorage.h"
|
||||
|
|
|
@ -417,3 +417,21 @@ std::string casprintf_loc(const char *cformat, ...)
|
|||
va_end(ap);
|
||||
return std::string(utf8.constData(), utf8.size());
|
||||
}
|
||||
|
||||
std::string __printf(1, 2) format_string_std(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
size_t stringsize = vsnprintf(NULL, 0, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stringsize == 0)
|
||||
return std::string();
|
||||
std::string res;
|
||||
res.resize(stringsize); // Pointless clearing, oh my.
|
||||
// This overwrites the terminal null-byte of std::string.
|
||||
// That's probably "undefined behavior". Oh my.
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(res.data(), stringsize + 1, fmt, ap);
|
||||
va_end(ap);
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,9 @@ __printf(2, 0) int vasprintf_loc(char **dst, const char *cformat, va_list ap);
|
|||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
__printf(1, 2) std::string format_string_std(const char *fmt, ...);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "sample.h"
|
||||
#include "subsurface-float.h"
|
||||
#include "subsurface-string.h"
|
||||
#include "format.h"
|
||||
#include "device.h"
|
||||
#include "dive.h"
|
||||
#include "errorhelper.h"
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "errorhelper.h"
|
||||
#include "sample.h"
|
||||
#include "subsurface-string.h"
|
||||
#include "format.h"
|
||||
#include "trip.h"
|
||||
#include "device.h"
|
||||
#include "git-access.h"
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "divesite.h"
|
||||
#include "errorhelper.h"
|
||||
#include "parse.h"
|
||||
#include "format.h"
|
||||
#include "subsurface-float.h"
|
||||
#include "subsurface-string.h"
|
||||
#include "subsurface-time.h"
|
||||
|
|
|
@ -62,19 +62,6 @@ extern double strtod_flags(const char *str, const char **ptr, unsigned int flags
|
|||
}
|
||||
|
||||
#include <string>
|
||||
template <class... Args>
|
||||
std::string format_string_std(const char *fmt, Args&&... args)
|
||||
{
|
||||
size_t stringsize = snprintf(NULL, 0, fmt, std::forward<Args>(args)...);
|
||||
if (stringsize == 0)
|
||||
return std::string();
|
||||
std::string res;
|
||||
res.resize(stringsize); // Pointless clearing, oh my.
|
||||
// This overwrites the terminal null-byte of std::string.
|
||||
// That's probably "undefined behavior". Oh my.
|
||||
snprintf(res.data(), stringsize + 1, fmt, std::forward<Args>(args)...);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Sadly, starts_with only with C++20!
|
||||
inline bool starts_with(const std::string &s, const char *s2)
|
||||
|
@ -83,4 +70,5 @@ inline bool starts_with(const std::string &s, const char *s2)
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif // SUBSURFACE_STRING_H
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "errorhelper.h"
|
||||
#include "file.h"
|
||||
#include "save-html.h"
|
||||
#include "subsurface-string.h"
|
||||
#include "format.h"
|
||||
#include "worldmap-save.h"
|
||||
#include "worldmap-options.h"
|
||||
#include "gettext.h"
|
||||
|
|
Loading…
Add table
Reference in a new issue