#include #include #include "scriptstdstring.h" #include // strstr using namespace std; BEGIN_AS_NAMESPACE static void StringFactoryGeneric(asIScriptGeneric *gen) { asUINT length = gen->GetArgDWord(0); const char *s = (const char*)gen->GetArgAddress(1); string str(s, length); gen->SetReturnObject(&str); } static void ConstructStringGeneric(asIScriptGeneric * gen) { new (gen->GetObject()) string(); } static void CopyConstructStringGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetArgObject(0)); new (gen->GetObject()) string(*a); } static void DestructStringGeneric(asIScriptGeneric * gen) { string * ptr = static_cast(gen->GetObject()); ptr->~string(); } static void AssignStringGeneric(asIScriptGeneric *gen) { string * a = static_cast(gen->GetArgObject(0)); string * self = static_cast(gen->GetObject()); *self = *a; gen->SetReturnAddress(self); } static void AddAssignStringGeneric(asIScriptGeneric *gen) { string * a = static_cast(gen->GetArgObject(0)); string * self = static_cast(gen->GetObject()); *self += *a; gen->SetReturnAddress(self); } static void StringEqualsGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); string * b = static_cast(gen->GetArgAddress(0)); *(bool*)gen->GetAddressOfReturnLocation() = (*a == *b); } static void StringCmpGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); string * b = static_cast(gen->GetArgAddress(0)); int cmp = 0; if( *a < *b ) cmp = -1; else if( *a > *b ) cmp = 1; *(int*)gen->GetAddressOfReturnLocation() = cmp; } static void StringAddGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); string * b = static_cast(gen->GetArgAddress(0)); string ret_val = *a + *b; gen->SetReturnObject(&ret_val); } static void StringLengthGeneric(asIScriptGeneric * gen) { string * self = static_cast(gen->GetObject()); *static_cast(gen->GetAddressOfReturnLocation()) = (asUINT)self->length(); } static void StringResizeGeneric(asIScriptGeneric * gen) { string * self = static_cast(gen->GetObject()); self->resize(*static_cast(gen->GetAddressOfArg(0))); } static void StringCharAtGeneric(asIScriptGeneric * gen) { unsigned int index = gen->GetArgDWord(0); string * self = static_cast(gen->GetObject()); if (index >= self->size()) { // Set a script exception asIScriptContext *ctx = asGetActiveContext(); ctx->SetException("Out of range"); gen->SetReturnAddress(0); } else { gen->SetReturnAddress(&(self->operator [](index))); } } static void AssignInt2StringGeneric(asIScriptGeneric *gen) { int *a = static_cast(gen->GetAddressOfArg(0)); string *self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self = sstr.str(); gen->SetReturnAddress(self); } static void AssignUInt2StringGeneric(asIScriptGeneric *gen) { unsigned int *a = static_cast(gen->GetAddressOfArg(0)); string *self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self = sstr.str(); gen->SetReturnAddress(self); } static void AssignDouble2StringGeneric(asIScriptGeneric *gen) { double *a = static_cast(gen->GetAddressOfArg(0)); string *self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self = sstr.str(); gen->SetReturnAddress(self); } static void AssignBool2StringGeneric(asIScriptGeneric *gen) { bool *a = static_cast(gen->GetAddressOfArg(0)); string *self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << (*a ? "true" : "false"); *self = sstr.str(); gen->SetReturnAddress(self); } static void AddAssignDouble2StringGeneric(asIScriptGeneric * gen) { double * a = static_cast(gen->GetAddressOfArg(0)); string * self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self += sstr.str(); gen->SetReturnAddress(self); } static void AddAssignInt2StringGeneric(asIScriptGeneric * gen) { int * a = static_cast(gen->GetAddressOfArg(0)); string * self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self += sstr.str(); gen->SetReturnAddress(self); } static void AddAssignUInt2StringGeneric(asIScriptGeneric * gen) { unsigned int * a = static_cast(gen->GetAddressOfArg(0)); string * self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a; *self += sstr.str(); gen->SetReturnAddress(self); } static void AddAssignBool2StringGeneric(asIScriptGeneric * gen) { bool * a = static_cast(gen->GetAddressOfArg(0)); string * self = static_cast(gen->GetObject()); std::stringstream sstr; sstr << (*a ? "true" : "false"); *self += sstr.str(); gen->SetReturnAddress(self); } static void AddString2DoubleGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); double * b = static_cast(gen->GetAddressOfArg(0)); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddString2IntGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); int * b = static_cast(gen->GetAddressOfArg(0)); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddString2UIntGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); unsigned int * b = static_cast(gen->GetAddressOfArg(0)); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddString2BoolGeneric(asIScriptGeneric * gen) { string * a = static_cast(gen->GetObject()); bool * b = static_cast(gen->GetAddressOfArg(0)); std::stringstream sstr; sstr << *a << (*b ? "true" : "false"); std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddDouble2StringGeneric(asIScriptGeneric * gen) { double* a = static_cast(gen->GetAddressOfArg(0)); string * b = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddInt2StringGeneric(asIScriptGeneric * gen) { int* a = static_cast(gen->GetAddressOfArg(0)); string * b = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddUInt2StringGeneric(asIScriptGeneric * gen) { unsigned int* a = static_cast(gen->GetAddressOfArg(0)); string * b = static_cast(gen->GetObject()); std::stringstream sstr; sstr << *a << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } static void AddBool2StringGeneric(asIScriptGeneric * gen) { bool* a = static_cast(gen->GetAddressOfArg(0)); string * b = static_cast(gen->GetObject()); std::stringstream sstr; sstr << (*a ? "true" : "false") << *b; std::string ret_val = sstr.str(); gen->SetReturnObject(&ret_val); } // This function returns a string containing the substring of the input string // determined by the starting index and count of characters. // // AngelScript signature: // string string::substr(uint start = 0, int count = -1) const static void StringSubString_Generic(asIScriptGeneric *gen) { // Get the arguments string *str = (string*)gen->GetObject(); asUINT start = *(int*)gen->GetAddressOfArg(0); int count = *(int*)gen->GetAddressOfArg(1); // Check for out-of-bounds string ret; if( start < str->length() && count != 0 ) ret = str->substr(start, count); // Return the substring new(gen->GetAddressOfReturnLocation()) string(ret); } void RegisterStdString_Generic(asIScriptEngine *engine) { int r; // Register the string type r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); assert( r >= 0 ); // Register the string factory r = engine->RegisterStringFactory("string", asFUNCTION(StringFactoryGeneric), asCALL_GENERIC); assert( r >= 0 ); // Register the object operator overloads r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructStringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f(const string &in)", asFUNCTION(CopyConstructStringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructStringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asFUNCTION(AssignStringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asFUNCTION(AddAssignStringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEqualsGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmpGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTION(StringAddGeneric), asCALL_GENERIC); assert( r >= 0 ); // Register the object methods r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLengthGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResizeGeneric), asCALL_GENERIC); assert( r >= 0 ); // Register the index operator, both as a mutator and as an inspector r = engine->RegisterObjectMethod("string", "uint8 &opIndex(uint)", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "const uint8 &opIndex(uint) const", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 ); // Automatic conversion from values r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddString2DoubleGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(int) const", asFUNCTION(AddString2IntGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(int) const", asFUNCTION(AddInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(uint) const", asFUNCTION(AddString2UIntGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(uint) const", asFUNCTION(AddUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(bool)", asFUNCTION(AssignBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(bool)", asFUNCTION(AddAssignBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(bool) const", asFUNCTION(AddString2BoolGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(bool) const", asFUNCTION(AddBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string substr(uint start = 0, int count = -1) const", asFUNCTION(StringSubString_Generic), asCALL_GENERIC); assert( r >= 0 ); } static string StringFactory(asUINT length, const char *s) { return string(s, length); } static void ConstructString(string *thisPointer) { new(thisPointer) string(); } static void CopyConstructString(const string &other, string *thisPointer) { new(thisPointer) string(other); } static void DestructString(string *thisPointer) { thisPointer->~string(); } static string &AssignUIntToString(unsigned int i, string &dest) { ostringstream stream; stream << i; dest = stream.str(); return dest; } static string &AddAssignUIntToString(unsigned int i, string &dest) { ostringstream stream; stream << i; dest += stream.str(); return dest; } static string AddStringUInt(const string &str, unsigned int i) { ostringstream stream; stream << i; return str + stream.str(); } static string AddStringUInt64(const string &str, unsigned long long i) { ostringstream stream; stream << i; return str + stream.str(); } static string AddIntString(int i, const string &str) { ostringstream stream; stream << i; return stream.str() + str; } static string AddInt64String(long long i, const string &str) { ostringstream stream; stream << i; return stream.str() + str; } static string &AssignIntToString(int i, string &dest) { ostringstream stream; stream << i; dest = stream.str(); return dest; } static string &AddAssignIntToString(int i, string &dest) { ostringstream stream; stream << i; dest += stream.str(); return dest; } static string AddStringInt(const string &str, int i) { ostringstream stream; stream << i; return str + stream.str(); } static string AddStringInt64(const string &str, long long i) { ostringstream stream; stream << i; return str + stream.str(); } static string AddUIntString(unsigned int i, const string &str) { ostringstream stream; stream << i; return stream.str() + str; } static string AddUInt64String(unsigned long long i, const string &str) { ostringstream stream; stream << i; return stream.str() + str; } static string &AssignDoubleToString(double f, string &dest) { ostringstream stream; stream << f; dest = stream.str(); return dest; } static string &AddAssignDoubleToString(double f, string &dest) { ostringstream stream; stream << f; dest += stream.str(); return dest; } static string &AssignBoolToString(bool b, string &dest) { ostringstream stream; stream << (b ? "true" : "false"); dest = stream.str(); return dest; } static string &AddAssignBoolToString(bool b, string &dest) { ostringstream stream; stream << (b ? "true" : "false"); dest += stream.str(); return dest; } static string AddStringDouble(const string &str, double f) { ostringstream stream; stream << f; return str + stream.str(); } static string AddDoubleString(double f, const string &str) { ostringstream stream; stream << f; return stream.str() + str; } static string AddStringBool(const string &str, bool b) { ostringstream stream; stream << (b ? "true" : "false"); return str + stream.str(); } static string AddBoolString(bool b, const string &str) { ostringstream stream; stream << (b ? "true" : "false"); return stream.str() + str; } static char *StringCharAt(unsigned int i, string &str) { if( i >= str.size() ) { // Set a script exception asIScriptContext *ctx = asGetActiveContext(); ctx->SetException("Out of range"); // Return a null pointer return 0; } return &str[i]; } // AngelScript signature: // int string::opCmp(const string &in) const static int StringCmp(const string &a, const string &b) { int cmp = 0; if( a < b ) cmp = -1; else if( a > b ) cmp = 1; return cmp; } static bool StringEq(const string &a, const string &b) { return a == b; } // This function returns the index of the first position where the substring // exists in the input string. If the substring doesn't exist in the input // string -1 is returned. // // AngelScript signature: // int string::findFirst(const string &in sub, uint start = 0) const static int StringFindFirst(const string &sub, asUINT start, const string &str) { // We don't register the method directly because the argument types change between 32bit and 64bit platforms return (int)str.find(sub, start); } // This function returns the index of the last position where the substring // exists in the input string. If the substring doesn't exist in the input // string -1 is returned. // // AngelScript signature: // int string::findLast(const string &in sub, int start = -1) const static int StringFindLast(const string &sub, int start, const string &str) { // We don't register the method directly because the argument types change between 32bit and 64bit platforms return (int)str.rfind(sub, (size_t)start); } // AngelScript signature: // uint string::length() const static asUINT StringLength(const string &str) { // We don't register the method directly because the return type changes between 32bit and 64bit platforms return (asUINT)str.length(); } // AngelScript signature: // void string::resize(uint l) static void StringResize(asUINT l, string &str) { // We don't register the method directly because the argument types change between 32bit and 64bit platforms str.resize(l); } void RegisterStdString_Native(asIScriptEngine *engine) { int r; // Register the string type r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); assert( r >= 0 ); // Register the string factory r = engine->RegisterStringFactory("string", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 ); // Register the object operator overloads r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f(const string &in)", asFUNCTION(CopyConstructString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(string, operator =, (const string&), string&), asCALL_THISCALL); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asMETHODPR(string, operator+=, (const string&), string&), asCALL_THISCALL); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEq), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTIONPR(operator +, (const string &, const string &), string), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); // Register the object methods r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLength), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "uint get_length() const", asFUNCTION(StringLength), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResize), asCALL_CDECL_OBJLAST); assert( r >= 0 ); // Register the index operator, both as a mutator and as an inspector // Note that we don't register the operator[] directory, as it doesn't do bounds checking r = engine->RegisterObjectMethod("string", "uint8 &opIndex(uint)", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "const uint8 &opIndex(uint) const", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 ); // Automatic conversion from values r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddStringDouble), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDoubleString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(int64) const", asFUNCTION(AddStringInt64), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(int64) const", asFUNCTION(AddInt64String), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(uint64) const", asFUNCTION(AddStringUInt64), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(uint64) const", asFUNCTION(AddUInt64String), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAssign(bool)", asFUNCTION(AssignBoolToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string &opAddAssign(bool)", asFUNCTION(AddAssignBoolToString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd(bool) const", asFUNCTION(AddStringBool), asCALL_CDECL_OBJFIRST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string opAdd_r(bool) const", asFUNCTION(AddBoolString), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "string substr(uint start = 0, int count = -1) const", asFUNCTION(StringSubString_Generic), asCALL_GENERIC); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "int findFirst(const string &in, uint start = 0) const", asFUNCTION(StringFindFirst), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectMethod("string", "int findLast(const string &in, int start = -1) const", asFUNCTION(StringFindLast), asCALL_CDECL_OBJLAST); assert( r >= 0 ); // TODO: Implement the following // findFirstOf // findLastOf // findFirstNotOf // findLastNotOf // parseInt // parseFloat // formatInt - maybe as string::string(int64 value, const string &in format) // formatFloat // replace - replaces a text found in the string // replaceRange - replaces a range of bytes in the string // trim // multiply/times - takes the string and multiplies it n times, e.g. "-".multiply(5) returns "-----" } void RegisterStdString(asIScriptEngine * engine) { if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY")) RegisterStdString_Generic(engine); else RegisterStdString_Native(engine); } END_AS_NAMESPACE