diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index 60aa9f2dbd..6590524cdb 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -3367,10 +3367,6 @@ RelativePath=".\..\src\misc\str.hpp" > - - - - #include -#include "strapi.hpp" +#include "../string_func.h" -/** Blob based string. */ -template -struct CStrT : public CBlobT +/** Blob based case sensitive ANSI/UTF-8 string */ +struct CStrA : public CBlobT { - typedef CBlobT base; ///< base class - typedef CStrApiT Api; ///< string API abstraction layer - typedef typename base::bsize_t bsize_t; ///< size type inherited from blob - typedef typename base::OnTransfer OnTransfer; ///< temporary 'transfer ownership' object type + typedef CBlobT base; ///< base class - /** Construction from C zero ended string. */ - FORCEINLINE CStrT(const Tchar *str = NULL) + /** Create an empty CStrT */ + FORCEINLINE CStrA() { - AppendStr(str); - } - - /** Construction from C string and given number of characters. */ - FORCEINLINE CStrT(const Tchar *str, bsize_t num_chars) : base(str, num_chars) - { - base::FixTail(); - } - - /** Construction from C string determined by 'begin' and 'end' pointers. */ - FORCEINLINE CStrT(const Tchar *str, const Tchar *end) - : base(str, end - str) - { - base::FixTail(); - } - - /** Construction from blob contents. */ - FORCEINLINE CStrT(const CBlobBaseSimple& src) - : base(src) - { - base::FixTail(); - } - - /** Copy constructor. */ - FORCEINLINE CStrT(const CStrT& src) - : base(src) - { - base::FixTail(); } /** Take over ownership constructor */ - FORCEINLINE CStrT(const OnTransfer& ot) + FORCEINLINE CStrA(const OnTransfer& ot) : base(ot) { } /** Grow the actual buffer and fix the trailing zero at the end. */ - FORCEINLINE Tchar *GrowSizeNC(bsize_t count) + FORCEINLINE char *GrowSizeNC(bsize_t count) { - Tchar *ret = base::GrowSizeNC(count); + char *ret = base::GrowSizeNC(count); base::FixTail(); return ret; } /** Append zero-ended C string. */ - FORCEINLINE void AppendStr(const Tchar *str) + FORCEINLINE void AppendStr(const char *str) { - if (str != NULL && str[0] != '\0') { - base::Append(str, (bsize_t)Api::StrLen(str)); - base::FixTail(); - } - } - - /** Append another CStrT or blob. */ - FORCEINLINE void Append(const CBlobBaseSimple& src) - { - if (src.RawSize() > 0) { - base::AppendRaw(src); + if (!StrEmpty(str)) { + base::Append(str, strlen(str)); base::FixTail(); } } /** Assignment from C string. */ - FORCEINLINE CStrT& operator = (const Tchar *src) + FORCEINLINE CStrA& operator = (const char *src) { base::Clear(); AppendStr(src); return *this; } - /** Assignment from another CStrT or blob. */ - FORCEINLINE CStrT& operator = (const CBlobBaseSimple& src) - { - base::Clear(); - base::AppendRaw(src); - base::FixTail(); - return *this; - } - - /** Assignment from another CStrT or blob. */ - FORCEINLINE CStrT& operator = (const CStrT& src) - { - base::Clear(); - base::AppendRaw(src); - base::FixTail(); - return *this; - } - /** Lower-than operator (to support stl collections) */ - FORCEINLINE bool operator < (const CStrT &other) const + FORCEINLINE bool operator < (const CStrA &other) const { - return (Api::StrCmp(base::Data(), other.Data()) < 0); + return strcmp(base::Data(), other.Data()) < 0; } /** Add formated string (like vsprintf) at the end of existing contents. */ - int AddFormatL(const Tchar *format, va_list args) + int AddFormatL(const char *format, va_list args) { - bsize_t addSize = Api::StrLen(format); - if (addSize < 16) addSize = 16; + bsize_t addSize = max(strlen(format), 16); addSize += addSize / 2; int ret; int err = 0; for (;;) { - Tchar *buf = MakeFreeSpace(addSize); - ret = Api::SPrintFL(buf, base::GetReserve(), format, args); + 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; @@ -152,7 +92,7 @@ struct CStrT : public CBlobT } /** Add formated string (like sprintf) at the end of existing contents. */ - int AddFormat(const Tchar *format, ...) + int AddFormat(const char *format, ...) { va_list args; va_start(args, format); @@ -161,16 +101,8 @@ struct CStrT : public CBlobT return ret; } - /** Assign formated string (like vsprintf). */ - int FormatL(const Tchar *format, va_list args) - { - base::Free(); - int ret = AddFormatL(format, args); - return ret; - } - /** Assign formated string (like sprintf). */ - int Format(const Tchar *format, ...) + int Format(const char *format, ...) { base::Free(); va_list args; @@ -181,11 +113,4 @@ struct CStrT : public CBlobT } }; -typedef CStrT CStrA; ///< Case sensitive ANSI/UTF-8 string -typedef CStrT CStrCiA; ///< Case insensitive ANSI/UTF-8 string -#if defined(HAS_WCHAR) -typedef CStrT CStrW; ///< Case sensitive unicode string -typedef CStrT CStrCiW; ///< Case insensitive unicode string -#endif /* HAS_WCHAR */ - #endif /* STR_HPP */ diff --git a/src/misc/strapi.hpp b/src/misc/strapi.hpp deleted file mode 100644 index 468fac15b5..0000000000 --- a/src/misc/strapi.hpp +++ /dev/null @@ -1,101 +0,0 @@ -/* $Id$ */ - -/** @file strapi.hpp More string formatting? */ - -#ifndef STRAPI_HPP -#define STRAPI_HPP - -#include - -#if defined(HAS_WCHAR) -#include - -#if !defined(_MSC_VER) -#define _stricmp strcmp -#define _wcsicmp wcscmp -#endif /* !defined(_MSC_VER) */ -#endif /* HAS_WCHAR */ - -/** String API mapper base - just mapping by character type, not by case sensitivity yet. - * Class template CStrApiBaseT declaration is general, but following inline method - * definitions are specialized by character type. Class is not used directly, but only - * as a base class for template class CStrApiT */ -template -class CStrApiBaseT -{ -public: - /** ::strlen wrapper */ - static size_t StrLen(const Tchar *s); - static int SPrintFL(Tchar *buf, size_t count, const Tchar *fmt, va_list args); -}; - -/** ::strlen wrapper specialization for char */ -template <> /* static */ inline size_t CStrApiBaseT::StrLen(const char *s) -{ - return ::strlen(s); -} - -/** ::vsprintf wrapper specialization for char */ -template <> /* static */ inline int CStrApiBaseT::SPrintFL(char *buf, size_t count, const char *fmt, va_list args) -{ -#if defined(_MSC_VER) && !defined(WINCE) - return ::vsnprintf_s(buf, count, count - 1, fmt, args); -#else - return ::vsnprintf(buf, count, fmt, args); -#endif /* _MSC_VER && ! WINCE */ -} - -#if defined(HAS_WCHAR) -/** ::strlen wrapper specialization for wchar_t */ -template <> /* static */ inline size_t CStrApiBaseT::StrLen(const wchar_t *s) -{ - return ::wcslen(s); -} - -/** ::vsprintf wrapper specialization for wchar_t */ -template <> /* static */ inline int CStrApiBaseT::SPrintFL(wchar_t *buf, size_t count, const wchar_t *fmt, va_list args) -{ -#if defined(_MSC_VER) && !defined(WINCE) - return ::_vsnwprintf_s(buf, count, count - 1, fmt, args); -#else -# if defined(_WIN32) - return ::_vsnwprintf(buf, count, fmt, args); -# else /* !_WIN32 */ - return ::vswprintf(buf, count, fmt, args); -# endif /* !_WIN32 */ -#endif /* _MSC_VER && ! WINCE */ -} -#endif /* HAS_WCHAR */ - - - -template -class CStrApiT : public CStrApiBaseT -{ -public: - static int StrCmp(const Tchar *s1, const Tchar *s2); -}; - -template <> /* static */ inline int CStrApiT::StrCmp(const char *s1, const char *s2) -{ - return ::strcmp(s1, s2); -} - -template <> /* static */ inline int CStrApiT::StrCmp(const char *s1, const char *s2) -{ - return ::_stricmp(s1, s2); -} - -#if defined(HAS_WCHAR) -template <> /* static */ inline int CStrApiT::StrCmp(const wchar_t *s1, const wchar_t *s2) -{ - return ::wcscmp(s1, s2); -} - -template <> /* static */ inline int CStrApiT::StrCmp(const wchar_t *s1, const wchar_t *s2) -{ - return ::_wcsicmp(s1, s2); -} -#endif /* HAS_WCHAR */ - -#endif /* STRAPI_HPP */ diff --git a/src/stdafx.h b/src/stdafx.h index bbb25639e0..dfe185c7f1 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -365,11 +365,6 @@ void NORETURN CDECL error(const char *str, ...) WARN_FORMAT(1, 2); #define _stricmp strcasecmp #endif -#if !defined(MORPHOS) && !defined(OPENBSD) && !defined(__NDS__) && !defined(__DJGPP__) - /* NDS, MorphOS & OpenBSD don't know wchars, the rest does :( */ - #define HAS_WCHAR -#endif /* !defined(MORPHOS) && !defined(OPENBSD) && !defined(__NDS__) */ - #if !defined(MAX_PATH) #define MAX_PATH 260 #endif diff --git a/src/strings.cpp b/src/strings.cpp index bd1b6abaa3..322b0e569b 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -719,7 +719,7 @@ static char *FormatString(char *buff, const char *str, int64 *argv, uint casei, const char *s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender. int gender = 0; if (s != NULL) { - wchar_t c = Utf8Consume(&s); + WChar c = Utf8Consume(&s); /* Switch case is always put before genders, so remove those bits */ if (c == SCC_SWITCH_CASE) { /* Skip to the last (i.e. default) case */