static bool Cmd_SetStringIniSetting_Execute(COMMAND_ARGS) { char stringArg[kMaxMessageLength] = { 0 }; if (ExtractFormatStringArgs(0, stringArg, paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, SIZEOF_FMT_STRING_PARAMS)) { char* strtokContext = NULL; char* settingName = strtok_s(stringArg, GetSeparatorChars(scriptObj), &strtokContext); char* settingVal = strtok_s(NULL, GetSeparatorChars(scriptObj), &strtokContext); if (settingName && settingVal) { INISettingEntry* entry = GetIniSetting(settingName); if (entry && (entry->data->name[0] == 'S' || entry->data->name[0] == 's')) { UInt32 valLen = strlen(settingVal) + 1; entry->data->s = new char[valLen]; // this leaks. INI string alloc'd where? strcpy_s(entry->data->s, valLen, settingVal); } } } return true; }
static bool GetSetMenuValue_Execute(COMMAND_ARGS, UInt32 mode) { const char* separatorChar = GetSeparatorChars(scriptObj); char stringArg[kMaxMessageLength] = { 0 }; UInt32 menuType = 0; float newFloatVal = 0; char* newStringVal = NULL; char* componentPath = stringArg; bool bExtracted = false; switch (mode) { case kGetFloat: case kGetString: case kExists: bExtracted = ExtractFormatStringArgs(0, stringArg, paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, kCommandInfo_GetMenuFloatValue.numParams, &menuType); break; case kSetFloat: bExtracted = ExtractFormatStringArgs(0, stringArg, paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, kCommandInfo_SetMenuFloatValue.numParams, &menuType, &newFloatVal); break; case kSetString: { bExtracted = ExtractFormatStringArgs(0, stringArg, paramInfo, arg1, opcodeOffsetPtr, scriptObj, eventList, kCommandInfo_GetMenuFloatValue.numParams, &menuType); // extract new value from format string char* context = NULL; componentPath = strtok_s(stringArg, separatorChar, &context); newStringVal = strtok_s(NULL, separatorChar, &context); bExtracted = (bExtracted && componentPath && newStringVal); } break; } char* strToAssign = ""; if (bExtracted) { Menu* menu = GetMenuByType(menuType); if (menu && menu->tile) { Tile::Value* val = menu->tile->GetValueByName(componentPath); if (val) { #if _DEBUG && 0 val->DumpExpressionList(); #endif switch (mode) { case kExists: *result = 1; break; case kGetFloat: if (val->IsNum()) *result = val->num; break; case kSetFloat: val->bIsNum = 1; val->parentTile->UpdateFloat(val->id, newFloatVal); break; case kGetString: if (val->IsString()) strToAssign = val->str.m_data; break; case kSetString: val->bIsNum = 0; val->parentTile->UpdateString(val->id, newStringVal); val->parentTile->SetStringValue(val->id, newStringVal); val->parentTile->UpdateField(val->id, 0, newStringVal); break; } } } } if (mode == kGetString) // need to assign even if errors occur during arg extraction/value retrieval AssignToStringVar(PASS_COMMAND_ARGS, strToAssign); return true; }