Files
@ r12760:308cf6c9a8ac
Branch filter:
Location: cpp/openttd-patchpack/source/src/misc/str.hpp
r12760:308cf6c9a8ac
2.4 KiB
text/x-c++hdr
(svn r17239) -Change [FS#2802]: allow overbuilding the front tile of a roadstation / roaddepot with road
to be consistent with overbuilding the front tile of tunnels/bridges and also to make it easier for AIs to
connect roadstations and roaddepots to the road in front of it
to be consistent with overbuilding the front tile of tunnels/bridges and also to make it easier for AIs to
connect roadstations and roaddepots to the road in front of it
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | /* $Id$ */
/** @file str.hpp String formating? */
#ifndef STR_HPP
#define STR_HPP
#include <errno.h>
#include <stdarg.h>
#include "../string_func.h"
/** Blob based case sensitive ANSI/UTF-8 string */
struct CStrA : public CBlobT<char>
{
typedef CBlobT<char> base; ///< base class
/** Create an empty CStrT */
FORCEINLINE CStrA()
{
}
/** Take over ownership constructor */
FORCEINLINE CStrA(const OnTransfer& ot)
: base(ot)
{
}
/** Grow the actual buffer and fix the trailing zero at the end. */
FORCEINLINE char *GrowSizeNC(bsize_t count)
{
char *ret = base::GrowSizeNC(count);
base::FixTail();
return ret;
}
/** Append zero-ended C string. */
FORCEINLINE void AppendStr(const char *str)
{
if (!StrEmpty(str)) {
base::Append(str, strlen(str));
base::FixTail();
}
}
/** Assignment from C string. */
FORCEINLINE CStrA& operator = (const char *src)
{
base::Clear();
AppendStr(src);
return *this;
}
/** Lower-than operator (to support stl collections) */
FORCEINLINE bool operator < (const CStrA &other) const
{
return strcmp(base::Data(), other.Data()) < 0;
}
/** Add formated string (like vsprintf) at the end of existing contents. */
int AddFormatL(const char *format, va_list args)
{
bsize_t addSize = max<size_t>(strlen(format), 16);
addSize += addSize / 2;
int ret;
int err = 0;
for (;;) {
char *buf = MakeFreeSpace(addSize);
ret = vsnprintf(buf, base::GetReserve(), format, args);
if (ret >= base::GetReserve()) {
/* Greater return than given count means needed buffer size. */
addSize = ret + 1;
continue;
}
if (ret >= 0) {
/* success */
break;
}
err = errno;
if (err != ERANGE && err != ENOENT && err != 0) {
/* some strange failure */
break;
}
/* small buffer (M$ implementation) */
addSize *= 2;
}
if (ret > 0) {
GrowSizeNC(ret);
} else {
base::FixTail();
}
return ret;
}
/** Add formated string (like sprintf) at the end of existing contents. */
int AddFormat(const char *format, ...)
{
va_list args;
va_start(args, format);
int ret = AddFormatL(format, args);
va_end(args);
return ret;
}
/** Assign formated string (like sprintf). */
int Format(const char *format, ...)
{
base::Free();
va_list args;
va_start(args, format);
int ret = AddFormatL(format, args);
va_end(args);
return ret;
}
};
#endif /* STR_HPP */
|