src/misc/strapi.hpp
author peter1138
Tue, 29 Jan 2008 17:09:00 +0000
changeset 8941 f93c669d3ca6
parent 7901 1af11255e634
child 10429 1b99254f9607
permissions -rw-r--r--
(svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
/* $Id$ */

/** @file strapi.hpp */

#ifndef  STRAPI_HPP
#define  STRAPI_HPP

#include <string.h>

#if defined(HAS_WCHAR)
#include <wchar.h>

#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 <typename Tchar>
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<char>::StrLen(const char *s)
{
	return ::strlen(s);
}

/** ::vsprintf wrapper specialization for char */
template <> /*static*/ inline int CStrApiBaseT<char>::SPrintFL(char *buf, size_t count, const char *fmt, va_list args)
{
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(WINCE) // VC 8.0 and above
	return ::vsnprintf_s(buf, count, count - 1, fmt, args);
#else /* ! VC 8.0 and above */
	return ::vsnprintf(buf, count, fmt, args);
#endif
}

#if defined(HAS_WCHAR)
/** ::strlen wrapper specialization for wchar_t */
template <> /*static*/ inline size_t CStrApiBaseT<wchar_t>::StrLen(const wchar_t *s)
{
	return ::wcslen(s);
}

/** ::vsprintf wrapper specialization for wchar_t */
template <> /*static*/ inline int CStrApiBaseT<wchar_t>::SPrintFL(wchar_t *buf, size_t count, const wchar_t *fmt, va_list args)
{
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(WINCE) // VC 8.0 and above
	return ::_vsnwprintf_s(buf, count, count - 1, fmt, args);
#else /* ! VC 8.0 and above */
# if defined(_WIN32)
	 return ::_vsnwprintf(buf, count, fmt, args);
# else /* !_WIN32 */
	 return ::vswprintf(buf, count, fmt, args);
# endif /* !_WIN32 */
#endif
}
#endif /* HAS_WCHAR */



template <typename Tchar, bool TcaseInsensitive>
class CStrApiT : public CStrApiBaseT<Tchar>
{
public:
	static int StrCmp(const Tchar *s1, const Tchar *s2);
};

template <> /*static*/ inline int CStrApiT<char, false>::StrCmp(const char *s1, const char *s2)
{
	return ::strcmp(s1, s2);
}

template <> /*static*/ inline int CStrApiT<char, true>::StrCmp(const char *s1, const char *s2)
{
	return ::_stricmp(s1, s2);
}

#if defined(HAS_WCHAR)
template <> /*static*/ inline int CStrApiT<wchar_t, false>::StrCmp(const wchar_t *s1, const wchar_t *s2)
{
	return ::wcscmp(s1, s2);
}

template <> /*static*/ inline int CStrApiT<wchar_t, true>::StrCmp(const wchar_t *s1, const wchar_t *s2)
{
	return ::_wcsicmp(s1, s2);
}
#endif /* HAS_WCHAR */

#endif /* STRAPI_HPP */