EngineAPI: Expose strings as UTF8 instead of UTF16

This commit is contained in:
Lukas Joergensen 2019-08-03 15:03:20 +02:00 committed by Lukas Aldershaab
parent 0b5fd8db6e
commit 68b6884665
2 changed files with 18 additions and 10 deletions

View file

@ -34,6 +34,7 @@ IMPLEMENT_PRIMITIVE( U32, uint,, "32bit unsigned integer." );
IMPLEMENT_PRIMITIVE( F32, float,, "32bit single-precision floating-point." ); IMPLEMENT_PRIMITIVE( F32, float,, "32bit single-precision floating-point." );
IMPLEMENT_PRIMITIVE( F64, double,, "64bit double-precision floating-point." ); IMPLEMENT_PRIMITIVE( F64, double,, "64bit double-precision floating-point." );
IMPLEMENT_PRIMITIVE( String, string,, "Null-terminated UTF-16 Unicode string." ); IMPLEMENT_PRIMITIVE( String, string,, "Null-terminated UTF-16 Unicode string." );
IMPLEMENT_PRIMITIVE( const UTF8*, cstring,, "Null-terminated UTF-8 Unicode string.");
IMPLEMENT_PRIMITIVE( void*, ptr,, "Opaque pointer." ); IMPLEMENT_PRIMITIVE( void*, ptr,, "Opaque pointer." );
// Define pointer types for vectors. // Define pointer types for vectors.

View file

@ -62,7 +62,7 @@ DECLARE_PRIMITIVE_R(const char**);
//FIXME: this allows String to be used as a struct field type //FIXME: this allows String to be used as a struct field type
// String is special in the way its data is exchanged through the API. Through // String is special in the way its data is exchanged through the API. Through
// calls, strings are passed as plain, null-terminated UTF-16 character strings. // calls, strings are passed as plain, null-terminated UTF-8 character strings.
// In addition, strings passed back as return values from engine API functions // In addition, strings passed back as return values from engine API functions
// are considered to be owned by the API layer itself. The rule here is that such // are considered to be owned by the API layer itself. The rule here is that such
// a string is only valid until the next API call is made. Usually, control layers // a string is only valid until the next API call is made. Usually, control layers
@ -71,21 +71,20 @@ _DECLARE_TYPE_R(String);
template<> template<>
struct EngineTypeTraits< String > : public _EnginePrimitiveTypeTraits< String > struct EngineTypeTraits< String > : public _EnginePrimitiveTypeTraits< String >
{ {
typedef const UTF16* ArgumentValueType; typedef const UTF8* ArgumentValueType;
typedef const UTF16* ReturnValueType; typedef const UTF8* ReturnValueType;
//FIXME: this needs to be sorted out; for now, we store default value literals in ASCII //FIXME: this needs to be sorted out; for now, we store default value literals in ASCII
typedef const char* DefaultArgumentValueStoreType; typedef const char* DefaultArgumentValueStoreType;
static const UTF16* ReturnValue( const String& str ) static const UTF8* ReturnValue( const String& str )
{ {
static String sTemp; static String sTemp;
sTemp = str; sTemp = str;
return sTemp.utf16(); return sTemp.utf8();
} }
}; };
// For struct fields, String cannot be used directly but "const UTF16*" must be used // For struct fields, String cannot be used directly but "const UTF16*" must be used
// instead. Make sure this works with the template machinery by redirecting the type // instead. Make sure this works with the template machinery by redirecting the type
// back to String. // back to String.
@ -93,12 +92,20 @@ template<> struct EngineTypeTraits< const UTF16* > : public EngineTypeTraits< St
template<> inline const EngineTypeInfo* TYPE< const UTF16* >() { return TYPE< String >(); } template<> inline const EngineTypeInfo* TYPE< const UTF16* >() { return TYPE< String >(); }
inline const EngineTypeInfo* TYPE( const UTF16*& ) { return TYPE< String >(); } inline const EngineTypeInfo* TYPE( const UTF16*& ) { return TYPE< String >(); }
//FIXME: this allows const char* to be used as a struct field type
// Temp support for allowing const char* to remain in the API functions as long as we // Temp support for allowing const char* to remain in the API functions as long as we
// still have the console system around. When that is purged, these definitions should // still have the console system around. When that is purged, these definitions should
// be deleted and all const char* uses be replaced with String. // be deleted and all const char* uses be replaced with String.
template<> struct EngineTypeTraits< const char* > : public EngineTypeTraits< String > {}; _DECLARE_TYPE_R(const UTF8*);
template<> inline const EngineTypeInfo* TYPE< const char* >() { return TYPE< String >(); } template<>
struct EngineTypeTraits< const UTF8* > : public _EnginePrimitiveTypeTraits< const UTF8* >
{
static const UTF8* ReturnValue(const String& str)
{
static String sTemp;
sTemp = str;
return sTemp.utf8();
}
};
#endif // !_ENGINEPRIMITIVES_H_ #endif // !_ENGINEPRIMITIVES_H_