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 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; }