std::string ArrayToString(void *obj, bool /*expandMembers*/, CDebugger *dbg) { CScriptArray *arr = reinterpret_cast<CScriptArray*>(obj); std::stringstream s; s << "(len=" << arr->GetSize() << ") ["; for( asUINT n = 0; n < arr->GetSize(); n++ ) { s << dbg->ToString(arr->At(n), arr->GetElementTypeId(), false, arr->GetArrayObjectType()->GetEngine()); if( n < arr->GetSize()-1 ) s << ", "; } s << "]"; return s.str(); }
BEGIN_AS_NAMESPACE // This function takes an input string and splits it into parts by looking // for a specified delimiter. Example: // // string str = "A|B||D"; // array<string>@ array = str.split("|"); // // The resulting array has the following elements: // // {"A", "B", "", "D"} // // AngelScript signature: // array<string>@ string::split(const string &in delim) const static CScriptArray *StringSplit(const string &delim, const string &str) { // Obtain a pointer to the engine asIScriptContext *ctx = asGetActiveContext(); asIScriptEngine *engine = ctx->GetEngine(); // TODO: This should only be done once // TODO: This assumes that CScriptArray was already registered asIObjectType *arrayType = engine->GetObjectTypeByDecl("array<string>"); // Create the array object CScriptArray *array = CScriptArray::Create(arrayType); // Find the existence of the delimiter in the input string int pos = 0, prev = 0, count = 0; while( (pos = (int)str.find(delim, prev)) != (int)string::npos ) { // Add the part to the array array->Resize(array->GetSize()+1); ((string*)array->At(count))->assign(&str[prev], pos-prev); // Find the next part count++; prev = pos + (int)delim.length(); } // Add the remaining part array->Resize(array->GetSize()+1); ((string*)array->At(count))->assign(&str[prev]); return array; }
// This function takes as input an array of string handles as well as a // delimiter and concatenates the array elements into one delimited string. // Example: // // array<string> array = {"A", "B", "", "D"}; // string str = join(array, "|"); // // The resulting string is: // // "A|B||D" // // AngelScript signature: // string join(const array<string> &in array, const string &in delim) static string StringJoin(const CScriptArray &array, const string &delim) { // Create the new string string str = ""; if( array.GetSize() ) { int n; for( n = 0; n < (int)array.GetSize() - 1; n++ ) { str += *(string*)array.At(n); str += delim; } // Add the last part str += *(string*)array.At(n); } return str; }
// This function takes an input string and splits it into parts by looking // for a specified delimiter. Example: // // string str = "A|B||D"; // array<string@>@ array = split(str, "|"); // // The resulting array has the following elements: // // {"A", "B", "", "D"} // // AngelScript signature: // array<string@>@ split(const string &in str, const string &in delim) void StringSplit_Generic(asIScriptGeneric *gen) { // Obtain a pointer to the engine asIScriptContext *ctx = asGetActiveContext(); asIScriptEngine *engine = ctx->GetEngine(); // TODO: This should only be done once // TODO: This assumes that CScriptArray was already registered asIObjectType *arrayType = engine->GetObjectTypeById(engine->GetTypeIdByDecl("array<string@>")); // Create the array object CScriptArray *array = new CScriptArray(0, arrayType); // Get the arguments CScriptString *str = *(CScriptString**)gen->GetAddressOfArg(0); CScriptString *delim = *(CScriptString**)gen->GetAddressOfArg(1); // Find the existence of the delimiter in the input string int pos = 0, prev = 0, count = 0; while( (pos = (int)str->buffer.find(delim->buffer, prev)) != (int)std::string::npos ) { // Add the part to the array CScriptString *part = new CScriptString(); part->buffer.assign(&str->buffer[prev], pos-prev); array->Resize(array->GetSize()+1); *(CScriptString**)array->At(count) = part; // Find the next part count++; prev = pos + (int)delim->buffer.length(); } // Add the remaining part CScriptString *part = new CScriptString(); part->buffer.assign(&str->buffer[prev]); array->Resize(array->GetSize()+1); *(CScriptString**)array->At(count) = part; // Return the array by handle *(CScriptArray**)gen->GetAddressOfReturnLocation() = array; }
CScriptArray *CreateArrayOfStrings() { asIScriptContext *ctx = asGetActiveContext(); if( ctx ) { asIScriptEngine* engine = ctx->GetEngine(); asIObjectType* t = engine->GetObjectTypeById(engine->GetTypeIdByDecl("array<string@>")); CScriptArray* arr = new CScriptArray(3, t); for( asUINT i = 0; i < arr->GetSize(); i++ ) { CScriptString** p = static_cast<CScriptString**>(arr->At(i)); *p = new CScriptString("test"); } return arr; } return 0; }
// This function takes as input an array of string handles as well as a // delimiter and concatenates the array elements into one delimited string. // Example: // // array<string@> array = {"A", "B", "", "D"}; // string str = join(array, "|"); // // The resulting string is: // // "A|B||D" // // AngelScript signature: // string@ join(const array<string@> &in array, const string &in delim) void StringJoin_Generic(asIScriptGeneric *gen) { // Get the arguments CScriptArray *array = *(CScriptArray**)gen->GetAddressOfArg(0); CScriptString *delim = *(CScriptString**)gen->GetAddressOfArg(1); // Create the new string CScriptString *str = new CScriptString(); int n; for( n = 0; n < (int)array->GetSize() - 1; n++ ) { CScriptString *part = *(CScriptString**)array->At(n); str->buffer += part->buffer; str->buffer += delim->buffer; } // Add the last part CScriptString *part = *(CScriptString**)array->At(n); str->buffer += part->buffer; // Return the string *(CScriptString**)gen->GetAddressOfReturnLocation() = str; }