diff --git a/src/CBot/CBotDebug.cpp b/src/CBot/CBotDebug.cpp index b108bf61..e5ff8e50 100644 --- a/src/CBot/CBotDebug.cpp +++ b/src/CBot/CBotDebug.cpp @@ -23,6 +23,7 @@ #include "CBot/CBotInstr/CBotFunction.h" #include "CBot/CBotInstr/CBotInstrCall.h" +#include #include #include #include @@ -53,9 +54,9 @@ void CBotDebug::DumpCompiledProgram(CBotProgram* program) instructions[ptr] = instructionsNextId++; } - char buffer[20]; - sprintf(buffer, "instr%d", instructions[ptr]); - return std::string(buffer); + std::array buffer; + snprintf(buffer.data(), buffer.size(), "instr%d", instructions[ptr]); + return std::string(buffer.data()); }; std::function DumpInstr = [&](CBotInstr* instr) { diff --git a/src/common/stringutils.cpp b/src/common/stringutils.cpp index 626c5c39..ed2d6c0c 100644 --- a/src/common/stringutils.cpp +++ b/src/common/stringutils.cpp @@ -20,6 +20,7 @@ #include "common/stringutils.h" +#include #include #include #include @@ -40,12 +41,12 @@ namespace std::string VFormat(const char *fmt, va_list ap) { - std::size_t size = 1024; - char stackbuf[1024]; + std::array stackbuf; std::vector dynamicbuf; - char *buf = &stackbuf[0]; + char *buf = stackbuf.data(); + size_t size = stackbuf.size(); - while (1) + while (true) { int needed = vsnprintf (buf, size, fmt, ap); @@ -56,7 +57,7 @@ std::string VFormat(const char *fmt, va_list ap) size = (needed > 0) ? (needed+1) : (size*2); dynamicbuf.resize(size); - buf = &dynamicbuf[0]; + buf = dynamicbuf.data(); } } diff --git a/src/graphics/model/model_mod.cpp b/src/graphics/model/model_mod.cpp index 839c90af..4053be9e 100644 --- a/src/graphics/model/model_mod.cpp +++ b/src/graphics/model/model_mod.cpp @@ -251,9 +251,9 @@ std::vector ReadOldModelV3(std::istream& stream, int totalTriangl if (!triangle.material.variableDetail && t.texNum2 != 0) { - char tex2Name[20] = { 0 }; - std::sprintf(tex2Name, "dirty%.2d.png", t.texNum2); - triangle.material.detailTexture = tex2Name; + std::array tex2Name = {0}; + std::snprintf(tex2Name.data(), tex2Name.size(), "dirty%.2d.png", t.texNum2); + triangle.material.detailTexture = tex2Name.data(); } triangles.push_back(triangle); diff --git a/src/graphics/opengl33/gl33_object_renderer.cpp b/src/graphics/opengl33/gl33_object_renderer.cpp index 55323104..e24136f5 100644 --- a/src/graphics/opengl33/gl33_object_renderer.cpp +++ b/src/graphics/opengl33/gl33_object_renderer.cpp @@ -108,18 +108,18 @@ CGL33ObjectRenderer::CGL33ObjectRenderer(CGL33Device* device) m_shadowRegions = glGetUniformLocation(m_program, "uni_ShadowRegions"); - GLchar name[64]; + std::array name; for (int i = 0; i < 4; i++) { - sprintf(name, "uni_ShadowParam[%d].transform", i); - m_shadows[i].transform = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].transform", i); + m_shadows[i].transform = glGetUniformLocation(m_program, name.data()); - sprintf(name, "uni_ShadowParam[%d].uv_offset", i); - m_shadows[i].offset = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].uv_offset", i); + m_shadows[i].offset = glGetUniformLocation(m_program, name.data()); - sprintf(name, "uni_ShadowParam[%d].uv_scale", i); - m_shadows[i].scale = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].uv_scale", i); + m_shadows[i].scale = glGetUniformLocation(m_program, name.data()); } // Set texture units @@ -457,7 +457,7 @@ void CGL33ObjectRenderer::DrawObject(const CVertexBuffer* buffer) glBindVertexArray(b->GetVAO()); - glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, b->Size()); + glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, static_cast(b->Size())); } void CGL33ObjectRenderer::DrawPrimitive(PrimitiveType type, int count, const Vertex3D* vertices) diff --git a/src/graphics/opengl33/gl33_terrain_renderer.cpp b/src/graphics/opengl33/gl33_terrain_renderer.cpp index 8820fa0a..9c8ab305 100644 --- a/src/graphics/opengl33/gl33_terrain_renderer.cpp +++ b/src/graphics/opengl33/gl33_terrain_renderer.cpp @@ -102,18 +102,18 @@ CGL33TerrainRenderer::CGL33TerrainRenderer(CGL33Device* device) m_shadowRegions = glGetUniformLocation(m_program, "uni_ShadowRegions"); - GLchar name[64]; + std::array name; for (int i = 0; i < 4; i++) { - sprintf(name, "uni_ShadowParam[%d].transform", i); - m_shadows[i].transform = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].transform", i); + m_shadows[i].transform = glGetUniformLocation(m_program, name.data()); - sprintf(name, "uni_ShadowParam[%d].uv_offset", i); - m_shadows[i].offset = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].uv_offset", i); + m_shadows[i].offset = glGetUniformLocation(m_program, name.data()); - sprintf(name, "uni_ShadowParam[%d].uv_scale", i); - m_shadows[i].scale = glGetUniformLocation(m_program, name); + snprintf(name.data(), name.size(), "uni_ShadowParam[%d].uv_scale", i); + m_shadows[i].scale = glGetUniformLocation(m_program, name.data()); } // Set texture units @@ -373,5 +373,5 @@ void CGL33TerrainRenderer::DrawObject(const glm::mat4& matrix, const CVertexBuff SetModelMatrix(matrix); glBindVertexArray(b->GetVAO()); - glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, b->Size()); + glDrawArrays(TranslateGfxPrimitive(b->GetType()), 0, static_cast(b->Size())); } diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 45ee68b6..7a9782b9 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -3117,9 +3117,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) { if (line->GetParam("rank")->IsDefined()) { - char tex[20] = { 0 }; - sprintf(tex, "dirty%.2d.png", line->GetParam("rank")->AsInt()); - m_engine->SetSecondTexture(tex); + std::array tex = { 0 }; + snprintf(tex.data(), tex.size(), "dirty%.2d.png", line->GetParam("rank")->AsInt()); + m_engine->SetSecondTexture(tex.data()); } else { @@ -4016,8 +4016,8 @@ void CRobotMain::ChangeColor() colorNew2.g = 0.0f; colorNew2.b = 0.0f; - char name[100]; - sprintf(name, "textures/objects/face%.2d.png", face+1); + std::array name; + snprintf(name.data(), name.size(), "textures/objects/face%.2d.png", face+1); exclu[0] = { 105.0f / 256.0f, 47.0f / 166.0f }; exclu[1] = { 153.0f / 256.0f, 79.0f / 166.0f }; // blue canister exclu[2] = { 0.0f, 0.0f }; @@ -5567,9 +5567,9 @@ void CRobotMain::UpdateSpeedLabel() } else { - char text[10]; - sprintf(text, "x%.1f", speed); - pb->SetName(text); + std::array text; + snprintf(text.data(), text.size(), "x%.1f", speed); + pb->SetName(text.data()); pb->SetState(Ui::STATE_VISIBLE); } } diff --git a/src/object/motion/motionhuman.cpp b/src/object/motion/motionhuman.cpp index bbc042e6..f56d40f3 100644 --- a/src/object/motion/motionhuman.cpp +++ b/src/object/motion/motionhuman.cpp @@ -107,7 +107,7 @@ Error CMotionHuman::SetAction(int action, float time) void CMotionHuman::Create(glm::vec3 pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) { - char filename[100]; + std::array filename; int rank, option, face, glasses; m_object->SetType(type); @@ -119,8 +119,8 @@ void CMotionHuman::Create(glm::vec3 pos, float angle, ObjectType type, m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_VEHICLE); // this is a moving object m_object->SetObjectRank(0, rank); face = m_main->GetGamerFace(); - sprintf(filename, "human2h%d", face+1); - modelManager->AddModelReference(filename, false, rank); + snprintf(filename.data(), filename.size(), "human2h%d", face+1); + modelManager->AddModelReference(filename.data(), false, rank); glasses = m_main->GetGamerGlasses(); if ( glasses != 0 ) @@ -129,8 +129,8 @@ void CMotionHuman::Create(glm::vec3 pos, float angle, ObjectType type, m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(1, rank); m_object->SetObjectParent(1, 0); - sprintf(filename, "human2g%d", glasses); - modelManager->AddModelReference(filename, false, rank); + snprintf(filename.data(), filename.size(), "human2g%d", glasses); + modelManager->AddModelReference(filename.data(), false, rank); } CreatePhysics(type); @@ -171,15 +171,15 @@ void CMotionHuman::Create(glm::vec3 pos, float angle, ObjectType type, if (option == 0) // head in helmet? { face = m_main->GetGamerFace(); - sprintf(filename, "human2c%d", face+1); - modelManager->AddModelReference(filename, false, rank); + snprintf(filename.data(), filename.size(), "human2c%d", face+1); + modelManager->AddModelReference(filename.data(), false, rank); } else if (option == 1 || // head without helmet? option == 2) // without a backpack? { face = m_main->GetGamerFace(); - sprintf(filename, "human2h%d", face+1); - modelManager->AddModelReference(filename, false, rank); + snprintf(filename.data(), filename.size(), "human2h%d", face+1); + modelManager->AddModelReference(filename.data(), false, rank); } } else if (type == OBJECT_TECH) @@ -202,8 +202,8 @@ void CMotionHuman::Create(glm::vec3 pos, float angle, ObjectType type, m_engine->SetObjectType(m_glassesRank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(15, m_glassesRank); m_object->SetObjectParent(15, 1); - sprintf(filename, "human2g%d", glasses); - modelManager->AddModelReference(filename, false, m_glassesRank); + snprintf(filename.data(), filename.size(), "human2g%d", glasses); + modelManager->AddModelReference(filename.data(), false, m_glassesRank); } // Creates the right arm. diff --git a/src/object/motion/motionspider.cpp b/src/object/motion/motionspider.cpp index fc6102f6..a9e5504f 100644 --- a/src/object/motion/motionspider.cpp +++ b/src/object/motion/motionspider.cpp @@ -74,7 +74,7 @@ void CMotionSpider::Create(glm::vec3 pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) { int rank, i, j, parent; - char name[50]; + std::array name; float table[] = { @@ -136,7 +136,7 @@ void CMotionSpider::Create(glm::vec3 pos, float angle, ObjectType type, { for ( j=0 ; j<4 ; j++ ) { - sprintf(name, "spider%d", j+3); // 3..6 + snprintf(name.data(), name.size(), "spider%d", j+3); // 3..6 // Creates the right leg. rank = m_engine->CreateObject(); @@ -145,7 +145,7 @@ void CMotionSpider::Create(glm::vec3 pos, float angle, ObjectType type, if ( j == 0 ) parent = 0; else parent = 3+i*4+j-1; m_object->SetObjectParent(3+i*4+j, parent); - modelManager->AddModelReference(name, false, rank); + modelManager->AddModelReference(name.data(), false, rank); pos.x = table[i*12+j*3+0]; pos.y = table[i*12+j*3+1]; pos.z = table[i*12+j*3+2]; @@ -158,7 +158,7 @@ void CMotionSpider::Create(glm::vec3 pos, float angle, ObjectType type, if ( j == 0 ) parent = 0; else parent = 19+i*4+j-1; m_object->SetObjectParent(19+i*4+j, parent); - modelManager->AddModelReference(name, true, rank); + modelManager->AddModelReference(name.data(), true, rank); pos.x = table[i*12+j*3+0]; pos.y = table[i*12+j*3+1]; pos.z = -table[i*12+j*3+2]; diff --git a/src/object/motion/motionvehicle.cpp b/src/object/motion/motionvehicle.cpp index b4e5c566..ecdfea70 100644 --- a/src/object/motion/motionvehicle.cpp +++ b/src/object/motion/motionvehicle.cpp @@ -92,7 +92,7 @@ void CMotionVehicle::Create(glm::vec3 pos, float angle, ObjectType type, { int rank, i, j, parent; Gfx::Color color; - char name[50]; + std::array name; m_object->SetType(type); @@ -684,7 +684,7 @@ void CMotionVehicle::Create(glm::vec3 pos, float angle, ObjectType type, { for ( j=0 ; j<3 ; j++ ) { - sprintf(name, "ant%d", j+4); // 4..6 + snprintf(name.data(), name.size(), "ant%d", j+4); // 4..6 // Creates the right leg. rank = m_engine->CreateObject(); @@ -693,7 +693,7 @@ void CMotionVehicle::Create(glm::vec3 pos, float angle, ObjectType type, if ( j == 0 ) parent = 0; else parent = 6+i*3+j-1; m_object->SetObjectParent(6+i*3+j, parent); - modelManager->AddModelReference(name, false, rank, m_object->GetTeam()); + modelManager->AddModelReference(name.data(), false, rank, m_object->GetTeam()); pos.x = table[i*9+j*3+0]; pos.y = table[i*9+j*3+1]; pos.z = table[i*9+j*3+2]; @@ -706,7 +706,7 @@ void CMotionVehicle::Create(glm::vec3 pos, float angle, ObjectType type, if ( j == 0 ) parent = 0; else parent = 15+i*3+j-1; m_object->SetObjectParent(15+i*3+j, parent); - modelManager->AddModelReference(name, true, rank, m_object->GetTeam()); + modelManager->AddModelReference(name.data(), true, rank, m_object->GetTeam()); pos.x = table[i*9+j*3+0]; pos.y = table[i*9+j*3+1]; pos.z = -table[i*9+j*3+2]; @@ -900,8 +900,8 @@ void CMotionVehicle::Create(glm::vec3 pos, float angle, ObjectType type, m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_object->SetObjectRank(10+i, rank); m_object->SetObjectParent(10+i, 1); - sprintf(name, "drawer%d", 10+i); - modelManager->AddModelReference(name, false, rank, m_object->GetTeam()); + snprintf(name.data(), name.size(), "drawer%d", 10+i); + modelManager->AddModelReference(name.data(), false, rank, m_object->GetTeam()); m_object->SetPartPosition(10+i, glm::vec3(0.0f, 0.0f, 0.0f)); m_object->SetPartRotationY(10+i, 45.0f*Math::PI/180.0f*i); } diff --git a/src/object/subclass/exchange_post.cpp b/src/object/subclass/exchange_post.cpp index 26cbca23..9f5d7c4c 100644 --- a/src/object/subclass/exchange_post.cpp +++ b/src/object/subclass/exchange_post.cpp @@ -626,9 +626,9 @@ void CAutoInfo::UpdateList() for (int i = 0; i < static_cast(infoList.size()); i++) { - char text[100]; - sprintf(text, "%s = %.2f", infoList[i].name.c_str(), infoList[i].value); - pl->SetItemName(i, text); + std::array text; + snprintf(text.data(), text.size(), "%s = %.2f", infoList[i].name.c_str(), infoList[i].value); + pl->SetItemName(i, text.data()); } } diff --git a/src/script/script.cpp b/src/script/script.cpp index 131f9d19..c5d5b4bd 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -873,7 +873,7 @@ void CScript::New(Ui::CEdit* edit, const char* name) { char res[100]; char text[100]; - char script[500]; + std::array script; char buffer[500]; int cursor1, cursor2, len, i, j; @@ -883,8 +883,8 @@ void CScript::New(Ui::CEdit* edit, const char* name) if ( name[0] == 0 ) strcpy(text, res); else strcpy(text, name); - sprintf(script, "extern void object::%s()\n{\n\t\n\t\n\t\n}\n", text); - edit->SetText(script, false); + snprintf(script.data(), script.size(), "extern void object::%s()\n{\n\t\n\t\n\t\n}\n", text); + edit->SetText(script.data(), false); if ( strcmp(text, res) == 0 ) { @@ -946,7 +946,7 @@ void CScript::New(Ui::CEdit* edit, const char* name) if ( buffer[i+0] == '%' && buffer[i+1] == 's' ) { - strcpy(script+j, text); + strcpy(script.data()+j, text); j += strlen(text); i += 2; continue; @@ -962,7 +962,7 @@ void CScript::New(Ui::CEdit* edit, const char* name) script[j++] = buffer[i++]; } script[j] = 0; - edit->SetText(script, false); + edit->SetText(script.data(), false); cursor2 = cursor1; edit->SetCursor(cursor2, cursor1); diff --git a/src/ui/controls/editvalue.cpp b/src/ui/controls/editvalue.cpp index 6dff4a9b..7a4a02e8 100644 --- a/src/ui/controls/editvalue.cpp +++ b/src/ui/controls/editvalue.cpp @@ -264,7 +264,7 @@ EditValueType CEditValue::GetType() void CEditValue::SetValue(float value, bool bSendMessage) { - char text[100]; + std::array text; if ( m_edit == nullptr ) return; @@ -272,20 +272,20 @@ void CEditValue::SetValue(float value, bool bSendMessage) if ( m_type == EVT_INT ) { - sprintf(text, "%d", static_cast(value)); + snprintf(text.data(), text.size(), "%d", static_cast(value)); } if ( m_type == EVT_FLOAT ) { - sprintf(text, "%.2f", value); + snprintf(text.data(), text.size(), "%.2f", value); } if ( m_type == EVT_100 ) { - sprintf(text, "%d%%", static_cast(value*100.0f)); + snprintf(text.data(), text.size(), "%d%%", static_cast(value*100.0f)); } - m_edit->SetText(text); + m_edit->SetText(text.data()); if ( bSendMessage ) { diff --git a/src/ui/object_interface.cpp b/src/ui/object_interface.cpp index dac5fdc1..5db9774b 100644 --- a/src/ui/object_interface.cpp +++ b/src/ui/object_interface.cpp @@ -2116,7 +2116,7 @@ void CObjectInterface::UpdateInterface() void CObjectInterface::UpdateScript(CWindow *pw) { CList* pl; - char name[100]; + std::array name; pl = static_cast< CList* >(pw->SearchControl(EVENT_OBJECT_PROGLIST)); if ( pl == nullptr ) return; @@ -2124,22 +2124,22 @@ void CObjectInterface::UpdateScript(CWindow *pw) pl->Flush(); for ( int i = 0 ; i < m_programStorage->GetProgramCount() ; i++ ) { - sprintf(name, "%d", i+1); + snprintf(name.data(), name.size(), "%d", i+1); std::string title = m_programStorage->GetProgram(i)->script->GetTitle(); if ( !title.empty() ) { if(!m_programStorage->GetProgram(i)->readOnly) { - sprintf(name, "%d: %s", i+1, title.c_str()); + snprintf(name.data(), name.size(), "%d: %s", i+1, title.c_str()); } else { - sprintf(name, "*%d: %s", i+1, title.c_str()); + snprintf(name.data(), name.size(), "*%d: %s", i+1, title.c_str()); } } - pl->SetItemName(i, name); + pl->SetItemName(i, name.data()); } pl->SetSelect(m_selScript); diff --git a/src/ui/screen/screen_level_list.cpp b/src/ui/screen/screen_level_list.cpp index 105b3ccb..5ac84b42 100644 --- a/src/ui/screen/screen_level_list.cpp +++ b/src/ui/screen/screen_level_list.cpp @@ -408,7 +408,7 @@ void CScreenLevelList::UpdateSceneChap(int &chap) CList* pl; std::string fileName; - char line[500] = {0}; + std::array line = { 0 }; bool bPassed; pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); @@ -449,15 +449,15 @@ void CScreenLevelList::UpdateSceneChap(int &chap) try { levelParser.Load(); - sprintf(line, "%d: %s", j+1, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); + snprintf(line.data(), line.size(), "%d: %s", j+1, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); } catch (CLevelParserException& e) { - sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); + snprintf(line.data(), line.size(), "%s", (std::string("[ERROR]: ")+e.what()).c_str()); } bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, j+1, 0); - pl->SetItemName(j, line); + pl->SetItemName(j, line.data()); pl->SetCheck(j, bPassed); pl->SetEnable(j, true); @@ -488,7 +488,7 @@ void CScreenLevelList::UpdateSceneList(int chap, int &sel) CWindow* pw; CList* pl; std::string fileName; - char line[500] = {0}; + std::array line = {0}; int j; bool bPassed; @@ -516,15 +516,15 @@ void CScreenLevelList::UpdateSceneList(int chap, int &sel) try { levelParser.Load(); - sprintf(line, "%d: %s", j+1, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); + snprintf(line.data(), line.size(), "%d: %s", j+1, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); } catch (CLevelParserException& e) { - sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); + snprintf(line.data(), line.size(), "%s", (std::string("[ERROR]: ")+e.what()).c_str()); } bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, chap+1, j+1); - pl->SetItemName(j, line); + pl->SetItemName(j, line.data()); pl->SetCheck(j, bPassed); pl->SetEnable(j, true);