From a51500ba2be28592c49f601b79a7030143232c11 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 17 Jun 2024 13:12:54 +0200 Subject: [PATCH] Draft: Update init of aiString (#5623) * Draft: Update init of aiString - closes https://github.com/assimp/assimp/issues/5622 * Update types.h * Fix typo * Fix another typo * Adapt usage of AI_MAXLEN * Fix compare operator * Add missing renames --- code/AssetLib/3DS/3DSConverter.cpp | 2 +- code/AssetLib/AC/ACLoader.cpp | 10 ++-- code/AssetLib/Blender/BlenderLoader.cpp | 4 +- code/AssetLib/FBX/FBXConverter.cpp | 6 +- code/AssetLib/FBX/FBXParser.h | 2 +- code/AssetLib/Irr/IRRLoader.cpp | 4 +- code/AssetLib/LWS/LWSLoader.cpp | 8 +-- code/AssetLib/MD5/MD5Loader.cpp | 2 +- code/AssetLib/MDL/MDLLoader.cpp | 4 +- code/AssetLib/MDL/MDLMaterialLoader.cpp | 2 +- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 4 +- code/AssetLib/Q3D/Q3DLoader.cpp | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 4 +- code/AssetLib/STL/STLLoader.cpp | 2 +- code/AssetLib/Unreal/UnrealLoader.cpp | 4 +- code/AssetLib/glTF/glTFImporter.cpp | 4 +- code/AssetLib/glTF2/glTF2Importer.cpp | 4 +- code/Common/SceneCombiner.cpp | 4 +- code/Material/MaterialSystem.cpp | 2 +- code/PostProcessing/OptimizeGraph.cpp | 2 +- code/PostProcessing/PretransformVertices.cpp | 4 +- .../RemoveRedundantMaterials.cpp | 2 +- code/PostProcessing/ValidateDataStructure.cpp | 6 +- include/assimp/StringUtils.h | 22 +++++-- include/assimp/types.h | 58 ++++++++++--------- test/unit/utPretransformVertices.cpp | 2 +- tools/assimp_view/Display.cpp | 19 +++--- tools/assimp_view/Material.cpp | 6 +- tools/assimp_view/MessageProc.cpp | 2 +- 29 files changed, 104 insertions(+), 93 deletions(-) diff --git a/code/AssetLib/3DS/3DSConverter.cpp b/code/AssetLib/3DS/3DSConverter.cpp index 7ae756668..7d1c24cd6 100644 --- a/code/AssetLib/3DS/3DSConverter.cpp +++ b/code/AssetLib/3DS/3DSConverter.cpp @@ -709,7 +709,7 @@ void Discreet3DSImporter::GenerateNodeGraph(aiScene *pcOut) { pcNode->mNumMeshes = 1; // Build a name for the node - pcNode->mName.length = ai_snprintf(pcNode->mName.data, MAXLEN, "3DSMesh_%u", i); + pcNode->mName.length = ai_snprintf(pcNode->mName.data, AI_MAXLEN, "3DSMesh_%u", i); } // Build dummy nodes for all cameras diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index dbcb39b30..242364150 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -193,7 +193,7 @@ bool AC3DImporter::LoadObjectSection(std::vector &objects) { // Generate a default name for both the light source and the node // FIXME - what's the right way to print a size_t? Is 'zu' universally available? stick with the safe version. - light->mName.length = ::ai_snprintf(light->mName.data, MAXLEN, "ACLight_%i", static_cast(mLights->size()) - 1); + light->mName.length = ::ai_snprintf(light->mName.data, AI_MAXLEN, "ACLight_%i", static_cast(mLights->size()) - 1); obj.name = std::string(light->mName.data); ASSIMP_LOG_VERBOSE_DEBUG("AC3D: Light source encountered"); @@ -696,18 +696,18 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, // generate a name depending on the type of the node switch (object.type) { case Object::Group: - node->mName.length = ::ai_snprintf(node->mName.data, MAXLEN, "ACGroup_%i", mGroupsCounter++); + node->mName.length = ::ai_snprintf(node->mName.data, AI_MAXLEN, "ACGroup_%i", mGroupsCounter++); break; case Object::Poly: - node->mName.length = ::ai_snprintf(node->mName.data, MAXLEN, "ACPoly_%i", mPolysCounter++); + node->mName.length = ::ai_snprintf(node->mName.data, AI_MAXLEN, "ACPoly_%i", mPolysCounter++); break; case Object::Light: - node->mName.length = ::ai_snprintf(node->mName.data, MAXLEN, "ACLight_%i", mLightsCounter++); + node->mName.length = ::ai_snprintf(node->mName.data, AI_MAXLEN, "ACLight_%i", mLightsCounter++); break; // there shouldn't be more than one world, but we don't care case Object::World: - node->mName.length = ::ai_snprintf(node->mName.data, MAXLEN, "ACWorld_%i", mWorldsCounter++); + node->mName.length = ::ai_snprintf(node->mName.data, AI_MAXLEN, "ACWorld_%i", mWorldsCounter++); break; } } diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index 1a40a2fe5..923eb5959 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -359,7 +359,7 @@ void BlenderImporter::ResolveImage(aiMaterial *out, const Material *mat, const M // check if the file contents are bundled with the BLEND file if (img->packedfile) { name.data[0] = '*'; - name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(MAXLEN - 1), static_cast(conv_data.textures->size())); + name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(AI_MAXLEN - 1), static_cast(conv_data.textures->size())); conv_data.textures->push_back(new aiTexture()); aiTexture *curTex = conv_data.textures->back(); @@ -433,7 +433,7 @@ void BlenderImporter::AddSentinelTexture(aiMaterial *out, const Material *mat, c (void)conv_data; aiString name; - name.length = ai_snprintf(name.data, MAXLEN, "Procedural,num=%i,type=%s", conv_data.sentinel_cnt++, + name.length = ai_snprintf(name.data, AI_MAXLEN, "Procedural,num=%i,type=%s", conv_data.sentinel_cnt++, GetTextureTypeDisplayString(tex->tex->type)); out->AddProperty(&name, AI_MATKEY_TEXTURE_DIFFUSE( conv_data.next_texture[aiTextureType_DIFFUSE]++)); diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index cc73756fb..234931cbe 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -1860,7 +1860,7 @@ aiString FBXConverter::GetTexturePath(const Texture *tex) { // We need to load all textures before referencing them, as FBX file format order may reference a texture before loading it // This may occur on this case too, it has to be studied path.data[0] = '*'; - path.length = 1 + ASSIMP_itoa10(path.data + 1, MAXLEN - 1, index); + path.length = 1 + ASSIMP_itoa10(path.data + 1, AI_MAXLEN - 1, index); } } } @@ -2440,7 +2440,7 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial *out_mat, const PropertyTa // setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture) path.data[0] = '*'; - path.length = 1 + ASSIMP_itoa10(path.data + 1, MAXLEN - 1, index); + path.length = 1 + ASSIMP_itoa10(path.data + 1, AI_MAXLEN - 1, index); } out_mat->AddProperty(&path, (name + "|file").c_str(), aiTextureType_UNKNOWN, 0); @@ -2806,7 +2806,7 @@ void FBXConverter::ProcessMorphAnimDatas(std::map auto geoIt = std::find(model->GetGeometry().begin(), model->GetGeometry().end(), geo); auto geoIndex = static_cast(std::distance(model->GetGeometry().begin(), geoIt)); auto name = aiString(FixNodeName(model->Name() + "*")); - name.length = 1 + ASSIMP_itoa10(name.data + name.length, MAXLEN - 1, geoIndex); + name.length = 1 + ASSIMP_itoa10(name.data + name.length, AI_MAXLEN - 1, geoIndex); morphAnimData *animData; auto animIt = morphAnimDatas->find(name.C_Str()); if (animIt == morphAnimDatas->end()) { diff --git a/code/AssetLib/FBX/FBXParser.h b/code/AssetLib/FBX/FBXParser.h index 97f74b914..2ca216d8c 100644 --- a/code/AssetLib/FBX/FBXParser.h +++ b/code/AssetLib/FBX/FBXParser.h @@ -134,7 +134,7 @@ public: const char* elementNameCStr = elementName.c_str(); for (auto element = elements.begin(); element != elements.end(); ++element) { - if (!ASSIMP_strincmp(element->first.c_str(), elementNameCStr, MAXLEN)) { + if (!ASSIMP_strincmp(element->first.c_str(), elementNameCStr, AI_MAXLEN)) { return element->second; } } diff --git a/code/AssetLib/Irr/IRRLoader.cpp b/code/AssetLib/Irr/IRRLoader.cpp index f41a2543d..12ce86260 100644 --- a/code/AssetLib/Irr/IRRLoader.cpp +++ b/code/AssetLib/Irr/IRRLoader.cpp @@ -168,7 +168,7 @@ void IRRImporter::BuildSkybox(std::vector &meshes, std::vectorAddProperty(&s, AI_MATKEY_NAME); int shading = aiShadingMode_NoShading; @@ -316,7 +316,7 @@ void IRRImporter::ComputeAnimations(Node *root, aiNode *real, std::vectormNodeName.length = ::ai_snprintf(anim->mNodeName.data, MAXLEN, + anim->mNodeName.length = ::ai_snprintf(anim->mNodeName.data, AI_MAXLEN, "$INST_DUMMY_%i_%s", total - 1, (root->name.length() ? root->name.c_str() : "")); diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp index 4c3a44785..047ab0cc9 100644 --- a/code/AssetLib/LWS/LWSLoader.cpp +++ b/code/AssetLib/LWS/LWSLoader.cpp @@ -305,14 +305,14 @@ void LWSImporter::SetupNodeName(aiNode *nd, LWS::NodeDesc &src) { } std::string::size_type t = src.path.substr(s).find_last_of('.'); - nd->mName.length = ::ai_snprintf(nd->mName.data, MAXLEN, "%s_(%08X)", src.path.substr(s).substr(0, t).c_str(), combined); - if (nd->mName.length > MAXLEN) { - nd->mName.length = MAXLEN; + nd->mName.length = ::ai_snprintf(nd->mName.data, AI_MAXLEN, "%s_(%08X)", src.path.substr(s).substr(0, t).c_str(), combined); + if (nd->mName.length > AI_MAXLEN) { + nd->mName.length = AI_MAXLEN; } return; } } - nd->mName.length = ::ai_snprintf(nd->mName.data, MAXLEN, "%s_(%08X)", src.name, combined); + nd->mName.length = ::ai_snprintf(nd->mName.data, AI_MAXLEN, "%s_(%08X)", src.name, combined); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/MD5/MD5Loader.cpp b/code/AssetLib/MD5/MD5Loader.cpp index 0976484a4..02f08d3ea 100644 --- a/code/AssetLib/MD5/MD5Loader.cpp +++ b/code/AssetLib/MD5/MD5Loader.cpp @@ -707,7 +707,7 @@ void MD5Importer::LoadMD5CameraFile() { for (std::vector::const_iterator it = cuts.begin(); it != cuts.end() - 1; ++it) { aiAnimation *anim = *tmp++ = new aiAnimation(); - anim->mName.length = ::ai_snprintf(anim->mName.data, MAXLEN, "anim%u_from_%u_to_%u", (unsigned int)(it - cuts.begin()), (*it), *(it + 1)); + anim->mName.length = ::ai_snprintf(anim->mName.data, AI_MAXLEN, "anim%u_from_%u_to_%u", (unsigned int)(it - cuts.begin()), (*it), *(it + 1)); anim->mTicksPerSecond = cameraParser.fFrameRate; anim->mChannels = new aiNodeAnim *[anim->mNumChannels = 1]; diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index 99b0145af..498e40b34 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -962,7 +962,7 @@ void MDLImporter::CalcAbsBoneMatrices_3DGS_MDL7(MDL::IntBone_MDL7 **apcOutBones) if (AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_NOT_THERE == pcHeader->bone_stc_size) { // no real name for our poor bone is specified :-( - pcOutBone->mName.length = ai_snprintf(pcOutBone->mName.data, MAXLEN, + pcOutBone->mName.length = ai_snprintf(pcOutBone->mName.data, AI_MAXLEN, "UnnamedBone_%i", iBone); } else { // Make sure we won't run over the buffer's end if there is no @@ -1567,7 +1567,7 @@ void MDLImporter::InternReadFile_3DGS_MDL7() { } else { pcNode->mName.length = (ai_uint32)::strlen(szBuffer); } - ::strncpy(pcNode->mName.data, szBuffer, MAXLEN - 1); + ::strncpy(pcNode->mName.data, szBuffer, AI_MAXLEN - 1); ++p; } } diff --git a/code/AssetLib/MDL/MDLMaterialLoader.cpp b/code/AssetLib/MDL/MDLMaterialLoader.cpp index a966f5920..f68f8e23e 100644 --- a/code/AssetLib/MDL/MDLMaterialLoader.cpp +++ b/code/AssetLib/MDL/MDLMaterialLoader.cpp @@ -494,7 +494,7 @@ void MDLImporter::ParseSkinLump_3DGS_MDL7( aiString szFile; const size_t iLen = strlen((const char *)szCurrent); - size_t iLen2 = iLen > (MAXLEN - 1) ? (MAXLEN - 1) : iLen; + size_t iLen2 = iLen > (AI_MAXLEN - 1) ? (AI_MAXLEN - 1) : iLen; memcpy(szFile.data, (const char *)szCurrent, iLen2); szFile.data[iLen2] = '\0'; szFile.length = static_cast(iLen2); diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index d2ab59eb4..920279fce 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -588,7 +588,7 @@ bool Q3BSPFileImporter::importTextureFromArchive(const Q3BSP::Q3BSPModel *model, aiString name; name.data[0] = '*'; - name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(MAXLEN - 1), static_cast(mTextures.size())); + name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(AI_MAXLEN - 1), static_cast(mTextures.size())); archive->Close(pTextureStream); @@ -641,7 +641,7 @@ bool Q3BSPFileImporter::importLightmap(const Q3BSP::Q3BSPModel *pModel, aiScene aiString name; name.data[0] = '*'; - name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(MAXLEN - 1), static_cast(mTextures.size())); + name.length = 1 + ASSIMP_itoa10(name.data + 1, static_cast(AI_MAXLEN - 1), static_cast(mTextures.size())); pMatHelper->AddProperty(&name, AI_MATKEY_TEXTURE_LIGHTMAP(1)); mTextures.push_back(pTexture); diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index ac6b17ec6..84a508979 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -250,7 +250,7 @@ void Q3DImporter::InternReadFile(const std::string &pFile, c = stream.GetI1(); while (c) { mat.name.data[mat.name.length++] = c; - if (mat.name.length == MAXLEN) { + if (mat.name.length == AI_MAXLEN) { ASSIMP_LOG_ERROR("String ouverflow detected, skipped material name parsing."); break; } diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index df598e5c7..1eac5d934 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -589,12 +589,12 @@ void SMDImporter::CreateOutputMaterials() { pScene->mMaterials[iMat] = pcMat; aiString szName; - szName.length = static_cast(ai_snprintf(szName.data,MAXLEN,"Texture_%u",iMat)); + szName.length = static_cast(ai_snprintf(szName.data, AI_MAXLEN, "Texture_%u", iMat)); pcMat->AddProperty(&szName,AI_MATKEY_NAME); if (aszTextures[iMat].length()) { - ::strncpy(szName.data, aszTextures[iMat].c_str(),MAXLEN-1); + ::strncpy(szName.data, aszTextures[iMat].c_str(), AI_MAXLEN - 1); szName.length = static_cast( aszTextures[iMat].length() ); pcMat->AddProperty(&szName,AI_MATKEY_TEXTURE_DIFFUSE(0)); } diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp index 38cd2a0b8..3a9fc1b12 100644 --- a/code/AssetLib/STL/STLLoader.cpp +++ b/code/AssetLib/STL/STLLoader.cpp @@ -257,7 +257,7 @@ void STLImporter::LoadASCIIFile(aiNode *root) { size_t temp = (size_t)(sz - szMe); // setup the name of the node if (temp) { - if (temp >= MAXLEN) { + if (temp >= AI_MAXLEN) { throw DeadlyImportError("STL: Node name too long"); } std::string name(szMe, temp); diff --git a/code/AssetLib/Unreal/UnrealLoader.cpp b/code/AssetLib/Unreal/UnrealLoader.cpp index 3810e5bf4..85b68b508 100644 --- a/code/AssetLib/Unreal/UnrealLoader.cpp +++ b/code/AssetLib/Unreal/UnrealLoader.cpp @@ -452,7 +452,7 @@ void UnrealImporter::InternReadFile(const std::string &pFile, aiColor3D color(1.f, 1.f, 1.f); aiString s; - ::ai_snprintf(s.data, MAXLEN, "mat%u_tx%u_", i, materials[i].tex); + ::ai_snprintf(s.data, AI_MAXLEN, "mat%u_tx%u_", i, materials[i].tex); // set the two-sided flag if (materials[i].type == Unreal::MF_NORMAL_TS) { @@ -472,7 +472,7 @@ void UnrealImporter::InternReadFile(const std::string &pFile, // a special name for the weapon attachment point if (materials[i].type == Unreal::MF_WEAPON_PLACEHOLDER) { - s.length = ::ai_snprintf(s.data, MAXLEN, "$WeaponTag$"); + s.length = ::ai_snprintf(s.data, AI_MAXLEN, "$WeaponTag$"); color = aiColor3D(0.f, 0.f, 0.f); } diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index 1d718fd20..2443205f3 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -109,7 +109,7 @@ inline void SetMaterialColorProperty(std::vector &embeddedTexIdxs, Asset & if (texIdx != -1) { // embedded // setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture) uri.data[0] = '*'; - uri.length = 1 + ASSIMP_itoa10(uri.data + 1, MAXLEN - 1, texIdx); + uri.length = 1 + ASSIMP_itoa10(uri.data + 1, AI_MAXLEN - 1, texIdx); } mat->AddProperty(&uri, _AI_MATKEY_TEXTURE_BASE, texType, 0); @@ -242,7 +242,7 @@ void glTFImporter::ImportMeshes(glTF::Asset &r) { if (mesh.primitives.size() > 1) { ai_uint32 &len = aim->mName.length; aim->mName.data[len] = '-'; - len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(MAXLEN - len - 1), p); + len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(AI_MAXLEN - len - 1), p); } switch (prim.mode) { diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 50421d2a0..eb158ce4f 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -161,7 +161,7 @@ static void SetMaterialTextureProperty(std::vector &embeddedTexIdxs, Asset if (texIdx != -1) { // embedded // setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture) uri.data[0] = '*'; - uri.length = 1 + ASSIMP_itoa10(uri.data + 1, MAXLEN - 1, texIdx); + uri.length = 1 + ASSIMP_itoa10(uri.data + 1, AI_MAXLEN - 1, texIdx); } mat->AddProperty(&uri, AI_MATKEY_TEXTURE(texType, texSlot)); @@ -539,7 +539,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { if (mesh.primitives.size() > 1) { ai_uint32 &len = aim->mName.length; aim->mName.data[len] = '-'; - len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(MAXLEN - len - 1), p); + len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(AI_MAXLEN - len - 1), p); } switch (prim.mode) { diff --git a/code/Common/SceneCombiner.cpp b/code/Common/SceneCombiner.cpp index 44897a40b..7954d4d01 100644 --- a/code/Common/SceneCombiner.cpp +++ b/code/Common/SceneCombiner.cpp @@ -78,7 +78,7 @@ inline void PrefixString(aiString &string, const char *prefix, unsigned int len) if (string.length >= 1 && string.data[0] == '$') return; - if (len + string.length >= MAXLEN - 1) { + if (len + string.length >= AI_MAXLEN - 1) { ASSIMP_LOG_VERBOSE_DEBUG("Can't add an unique prefix because the string is too long"); ai_assert(false); return; @@ -408,7 +408,7 @@ void SceneCombiner::MergeScenes(aiScene **_dest, aiScene *master, std::vectormData. The size of mData is not guaranteed to be - // MAXLEN in size. + // AI_MAXLEN in size. aiString s(*(aiString *)prop->mData); if ('*' == s.data[0]) { // Offset the index and write it back .. diff --git a/code/Material/MaterialSystem.cpp b/code/Material/MaterialSystem.cpp index dbae4b7e4..7e2fb51b9 100644 --- a/code/Material/MaterialSystem.cpp +++ b/code/Material/MaterialSystem.cpp @@ -486,7 +486,7 @@ aiReturn aiMaterial::AddBinaryProperty(const void *pInput, memcpy(pcNew->mData, pInput, pSizeInBytes); pcNew->mKey.length = static_cast(::strlen(pKey)); - ai_assert(MAXLEN > pcNew->mKey.length); + ai_assert(AI_MAXLEN > pcNew->mKey.length); strcpy(pcNew->mKey.data, pKey); if (UINT_MAX != iOutIndex) { diff --git a/code/PostProcessing/OptimizeGraph.cpp b/code/PostProcessing/OptimizeGraph.cpp index 3be5ff514..01f6fca14 100644 --- a/code/PostProcessing/OptimizeGraph.cpp +++ b/code/PostProcessing/OptimizeGraph.cpp @@ -164,7 +164,7 @@ void OptimizeGraphProcess::CollectNewChildren(aiNode *nd, std::list &n ++it; } if (join_master && !join.empty()) { - join_master->mName.length = ::ai_snprintf(join_master->mName.data, MAXLEN, "$MergedNode_%u", count_merged++); + join_master->mName.length = ::ai_snprintf(join_master->mName.data, AI_MAXLEN, "$MergedNode_%u", count_merged++); unsigned int out_meshes = 0; for (std::list::const_iterator it = join.cbegin(); it != join.cend(); ++it) { diff --git a/code/PostProcessing/PretransformVertices.cpp b/code/PostProcessing/PretransformVertices.cpp index 37727c968..0203ac211 100644 --- a/code/PostProcessing/PretransformVertices.cpp +++ b/code/PostProcessing/PretransformVertices.cpp @@ -635,7 +635,7 @@ void PretransformVertices::Execute(aiScene *pScene) { aiNode *pcNode = new aiNode(); *nodes = pcNode; pcNode->mParent = pScene->mRootNode; - pcNode->mName.length = ai_snprintf(pcNode->mName.data, MAXLEN, "light_%u", i); + pcNode->mName.length = ai_snprintf(pcNode->mName.data, AI_MAXLEN, "light_%u", i); pScene->mLights[i]->mName = pcNode->mName; } // generate camera nodes @@ -643,7 +643,7 @@ void PretransformVertices::Execute(aiScene *pScene) { aiNode *pcNode = new aiNode(); *nodes = pcNode; pcNode->mParent = pScene->mRootNode; - pcNode->mName.length = ::ai_snprintf(pcNode->mName.data, MAXLEN, "cam_%u", i); + pcNode->mName.length = ::ai_snprintf(pcNode->mName.data, AI_MAXLEN, "cam_%u", i); pScene->mCameras[i]->mName = pcNode->mName; } } diff --git a/code/PostProcessing/RemoveRedundantMaterials.cpp b/code/PostProcessing/RemoveRedundantMaterials.cpp index 828fcd0ac..111c233b1 100644 --- a/code/PostProcessing/RemoveRedundantMaterials.cpp +++ b/code/PostProcessing/RemoveRedundantMaterials.cpp @@ -176,7 +176,7 @@ void RemoveRedundantMatsProcess::Execute( aiScene* pScene) { if (ppcMaterials[idx]) { aiString sz; if( ppcMaterials[idx]->Get(AI_MATKEY_NAME, sz) != AI_SUCCESS ) { - sz.length = ::ai_snprintf(sz.data,MAXLEN,"JoinedMaterial_#%u",p); + sz.length = ::ai_snprintf(sz.data, AI_MAXLEN,"JoinedMaterial_#%u",p); ((aiMaterial*)ppcMaterials[idx])->AddProperty(&sz,AI_MATKEY_NAME); } } else { diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index a0a73e200..1dd5d436a 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -909,9 +909,9 @@ void ValidateDSProcess::Validate(const aiNode *pNode) { // ------------------------------------------------------------------------------------------------ void ValidateDSProcess::Validate(const aiString *pString) { - if (pString->length > MAXLEN) { + if (pString->length > AI_MAXLEN) { ReportError("aiString::length is too large (%u, maximum is %lu)", - pString->length, MAXLEN); + pString->length, AI_MAXLEN); } const char *sz = pString->data; while (true) { @@ -920,7 +920,7 @@ void ValidateDSProcess::Validate(const aiString *pString) { ReportError("aiString::data is invalid: the terminal zero is at a wrong offset"); } break; - } else if (sz >= &pString->data[MAXLEN]) { + } else if (sz >= &pString->data[AI_MAXLEN]) { ReportError("aiString::data is invalid. There is no terminal character"); } ++sz; diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 0af923902..4002d2daf 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -57,9 +57,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #if defined(_MSC_VER) && !defined(__clang__) -#define AI_SIZEFMT "%Iu" +# define AI_SIZEFMT "%Iu" #else -#define AI_SIZEFMT "%zu" +# define AI_SIZEFMT "%zu" #endif // --------------------------------------------------------------------------------- @@ -99,9 +99,9 @@ inline int ai_snprintf(char *outBuf, size_t size, const char *format, ...) { } #elif defined(__MINGW32__) -#define ai_snprintf __mingw_snprintf +# define ai_snprintf __mingw_snprintf #else -#define ai_snprintf snprintf +# define ai_snprintf snprintf #endif // --------------------------------------------------------------------------------- @@ -185,6 +185,7 @@ AI_FORCE_INLINE std::string ai_rgba2hex(int r, int g, int b, int a, bool with_he // --------------------------------------------------------------------------------- /// @brief Performs a trim from start (in place) /// @param s string to trim. +// --------------------------------------------------------------------------------- AI_FORCE_INLINE void ai_trim_left(std::string &s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); @@ -195,7 +196,6 @@ AI_FORCE_INLINE void ai_trim_left(std::string &s) { /// @brief Performs a trim from end (in place). /// @param s string to trim. // --------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------- AI_FORCE_INLINE void ai_trim_right(std::string &s) { s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); @@ -214,6 +214,10 @@ AI_FORCE_INLINE std::string ai_trim(std::string &s) { return out; } +// --------------------------------------------------------------------------------- +/// @brief Performs a to lower operation onto on single character. +/// @param in The character +/// @return the character as lower-case. // --------------------------------------------------------------------------------- template AI_FORCE_INLINE char_t ai_tolower(char_t in) { @@ -233,6 +237,10 @@ AI_FORCE_INLINE std::string ai_tolower(const std::string &in) { return out; } +// --------------------------------------------------------------------------------- +/// @brief Performs a to upper operation onto on single character. +/// @param in The character +/// @return the character as upper-case. // --------------------------------------------------------------------------------- template AI_FORCE_INLINE char_t ai_toupper(char_t in) { @@ -243,6 +251,7 @@ AI_FORCE_INLINE char_t ai_toupper(char_t in) { /// @brief Performs a ToLower-operation and return the upper-case string. /// @param in The incoming string. /// @return The string as uppercase. +// --------------------------------------------------------------------------------- AI_FORCE_INLINE std::string ai_str_toupper(const std::string &in) { std::string out(in); std::transform(out.begin(), out.end(), out.begin(), [](char c) { return ai_toupper(c); }); @@ -255,6 +264,7 @@ AI_FORCE_INLINE std::string ai_str_toupper(const std::string &in) { /// @param in The incoming string. /// @param placeholder Placeholder character, default is a question mark. /// @return The string, with all non-printable characters replaced. +// --------------------------------------------------------------------------------- AI_FORCE_INLINE std::string ai_str_toprintable(const std::string &in, char placeholder = '?') { std::string out(in); std::transform(out.begin(), out.end(), out.begin(), [placeholder] (unsigned char c) { @@ -271,9 +281,9 @@ AI_FORCE_INLINE std::string ai_str_toprintable(const std::string &in, char place /// @param placeholder Placeholder character, default is a question mark. /// @return The string, with all non-printable characters replaced. Will return an /// empty string if in is null or len is <= 0. +// --------------------------------------------------------------------------------- AI_FORCE_INLINE std::string ai_str_toprintable(const char *in, int len, char placeholder = '?') { return (in && len > 0) ? ai_str_toprintable(std::string(in, len), placeholder) : std::string(); } - #endif // INCLUDED_AI_STRINGUTILS_H diff --git a/include/assimp/types.h b/include/assimp/types.h index ea72dd996..84981d483 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -118,9 +118,9 @@ extern "C" { /** Maximum dimension for strings, ASSIMP strings are zero terminated. */ #ifdef __cplusplus -static const size_t MAXLEN = 1024; +static const size_t AI_MAXLEN = 1024; #else -#define MAXLEN 1024 +#define AI_MAXLEN 1024 #endif // ---------------------------------------------------------------------------------- @@ -243,7 +243,8 @@ struct aiColor3D { }; // !struct aiColor3D // ---------------------------------------------------------------------------------- -/** Represents an UTF-8 string, zero byte terminated. +/** + * @brief Represents an UTF-8 string, zero byte terminated. * * The character set of an aiString is explicitly defined to be UTF-8. This Unicode * transformation was chosen in the belief that most strings in 3d files are limited @@ -260,42 +261,40 @@ struct aiColor3D { * UTF-8 strings to their working character set (i.e. MBCS, WideChar). * * We use this representation instead of std::string to be C-compatible. The - * (binary) length of such a string is limited to MAXLEN characters (including the + * (binary) length of such a string is limited to AI_MAXLEN characters (including the * the terminating zero). -*/ + */ struct aiString { #ifdef __cplusplus /** Default constructor, the string is set to have zero length */ - aiString() AI_NO_EXCEPT - : length(0) { - data[0] = '\0'; - + aiString() AI_NO_EXCEPT : + length(0), data{'\0'} { #ifdef ASSIMP_BUILD_DEBUG // Debug build: overwrite the string on its full length with ESC (27) - memset(data + 1, 27, MAXLEN - 1); + memset(data + 1, 27, AI_MAXLEN - 1); #endif } /** Copy constructor */ aiString(const aiString &rOther) : - length(rOther.length) { + length(rOther.length), data{'\0'} { // Crop the string to the maximum length - length = length >= MAXLEN ? MAXLEN - 1 : length; + length = length >= AI_MAXLEN ? AI_MAXLEN - 1 : length; memcpy(data, rOther.data, length); data[length] = '\0'; } - + /** Constructor from std::string */ explicit aiString(const std::string &pString) : - length((ai_uint32)pString.length()) { - length = length >= MAXLEN ? MAXLEN - 1 : length; + length((ai_uint32)pString.length()), data{'\0'} { + length = length >= AI_MAXLEN ? AI_MAXLEN - 1 : length; memcpy(data, pString.c_str(), length); data[length] = '\0'; } /** Copy a std::string to the aiString */ void Set(const std::string &pString) { - if (pString.length() > MAXLEN - 1) { + if (pString.length() > AI_MAXLEN - 1) { return; } length = (ai_uint32)pString.length(); @@ -306,8 +305,8 @@ struct aiString { /** Copy a const char* to the aiString */ void Set(const char *sz) { ai_int32 len = (ai_uint32)::strlen(sz); - if (len > (ai_int32)MAXLEN - 1) { - len = (ai_int32) MAXLEN - 1; + if (len > static_cast(AI_MAXLEN - 1)) { + len = static_cast(AI_MAXLEN - 1); } length = len; memcpy(data, sz, len); @@ -321,8 +320,8 @@ struct aiString { } length = rOther.length; - if (length >(MAXLEN - 1)) { - length = (ai_int32) MAXLEN - 1; + if (length > (AI_MAXLEN - 1)) { + length = static_cast(AI_MAXLEN - 1); } memcpy(data, rOther.data, length); @@ -344,21 +343,24 @@ struct aiString { /** Comparison operator */ bool operator==(const aiString &other) const { - return (length == other.length && 0 == memcmp(data, other.data, length)); + if (length == other.length) { + return memcmp(data, other.data, length) == 0; + } + return false; } /** Inverse comparison operator */ bool operator!=(const aiString &other) const { - return (length != other.length || 0 != memcmp(data, other.data, length)); + return !(*this == other); } /** Append a string to the string */ void Append(const char *app) { - const ai_uint32 len = (ai_uint32)::strlen(app); + const ai_uint32 len = static_cast(::strlen(app)); if (!len) { return; } - if (length + len >= MAXLEN) { + if (length + len >= AI_MAXLEN) { return; } @@ -373,7 +375,7 @@ struct aiString { #ifdef ASSIMP_BUILD_DEBUG // Debug build: overwrite the string on its full length with ESC (27) - memset(data + 1, 27, MAXLEN - 1); + memset(data + 1, 27, AI_MAXLEN - 1); #endif } @@ -389,8 +391,8 @@ struct aiString { * the number of bytes from the beginning of the string to its end.*/ ai_uint32 length; - /** String buffer. Size limit is MAXLEN */ - char data[MAXLEN]; + /** String buffer. Size limit is AI_MAXLEN */ + char data[AI_MAXLEN]; }; // !struct aiString // ---------------------------------------------------------------------------------- @@ -528,7 +530,7 @@ struct aiMemoryInfo { */ struct aiBuffer { const char *data; ///< Begin poiner - const char *end; ///< End pointer + const char *end; ///< End pointer #ifdef __cplusplus /// @brief The class constructor. diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp index 9652ec611..a7b21c893 100644 --- a/test/unit/utPretransformVertices.cpp +++ b/test/unit/utPretransformVertices.cpp @@ -68,7 +68,7 @@ void AddNodes(unsigned int num, aiNode *father, unsigned int depth) { for (unsigned int i = 0; i < 5; ++i) { aiNode *nd = father->mChildren[i] = new aiNode(); - nd->mName.length = snprintf(nd->mName.data, MAXLEN, "%i%i", depth, i); + nd->mName.length = snprintf(nd->mName.data, AI_MAXLEN, "%i%i", depth, i); // spawn two meshes nd->mMeshes = new unsigned int[nd->mNumMeshes = 2]; diff --git a/tools/assimp_view/Display.cpp b/tools/assimp_view/Display.cpp index 7e740549c..a542cddac 100644 --- a/tools/assimp_view/Display.cpp +++ b/tools/assimp_view/Display.cpp @@ -174,7 +174,7 @@ int CDisplay::AddNodeToDisplayList( ai_assert(nullptr != pcNode); ai_assert(nullptr != hRoot); - char chTemp[MAXLEN]; + char chTemp[AI_MAXLEN]; if(0 == pcNode->mName.length) { if (iIndex >= 100) { @@ -186,12 +186,12 @@ int CDisplay::AddNodeToDisplayList( } else iIndex += iDepth * 10; - ai_snprintf(chTemp, MAXLEN,"Node %u",iIndex); + ai_snprintf(chTemp,AI_MAXLEN,"Node %u",iIndex); } else { - ai_snprintf(chTemp, MAXLEN,"%s",pcNode->mName.data); + ai_snprintf(chTemp, AI_MAXLEN, "%s", pcNode->mName.data); } - ai_snprintf(chTemp+strlen(chTemp), MAXLEN- strlen(chTemp), iIndex ? " (%i)" : " (%i meshes)",pcNode->mNumMeshes); + ai_snprintf(chTemp + strlen(chTemp), AI_MAXLEN - strlen(chTemp), iIndex ? " (%i)" : " (%i meshes)", pcNode->mNumMeshes); TVITEMEXW tvi; TVINSERTSTRUCTW sNew; @@ -236,15 +236,15 @@ int CDisplay::AddMeshToDisplayList(unsigned int iIndex, HTREEITEM hRoot) { aiMesh* pcMesh = g_pcAsset->pcScene->mMeshes[iIndex]; - char chTemp[MAXLEN]; + char chTemp[AI_MAXLEN]; if(0 == pcMesh->mName.length) { - ai_snprintf(chTemp,MAXLEN,"Mesh %u",iIndex); + ai_snprintf(chTemp, AI_MAXLEN, "Mesh %u", iIndex); } else { - ai_snprintf(chTemp,MAXLEN,"%s",pcMesh->mName.data); + ai_snprintf(chTemp, AI_MAXLEN, "%s", pcMesh->mName.data); } - ai_snprintf(chTemp+strlen(chTemp),MAXLEN-strlen(chTemp), iIndex ? " (%i)" : " (%i faces)",pcMesh->mNumFaces); + ai_snprintf(chTemp + strlen(chTemp), AI_MAXLEN - strlen(chTemp), iIndex ? " (%i)" : " (%i faces)", pcMesh->mNumFaces); TVITEMEXW tvi; TVINSERTSTRUCTW sNew; @@ -280,8 +280,7 @@ int CDisplay::AddMeshToDisplayList(unsigned int iIndex, HTREEITEM hRoot) //------------------------------------------------------------------------------- // Replace the currently selected texture by another one -int CDisplay::ReplaceCurrentTexture(const char* szPath) -{ +int CDisplay::ReplaceCurrentTexture(const char* szPath) { ai_assert(nullptr != szPath); // well ... try to load it diff --git a/tools/assimp_view/Material.cpp b/tools/assimp_view/Material.cpp index 2337f13fa..f5cfce8c6 100644 --- a/tools/assimp_view/Material.cpp +++ b/tools/assimp_view/Material.cpp @@ -281,7 +281,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString) // copy the result string back to the aiString const size_t iLen = strlen(szTempB); size_t iLen2 = iLen+1; - iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2; + iLen2 = iLen2 > AI_MAXLEN ? AI_MAXLEN : iLen2; memcpy(p_szString->data,szTempB,iLen2); p_szString->length = static_cast(iLen); return true; @@ -295,7 +295,7 @@ bool CMaterialManager::TryLongerPath(char* szTemp,aiString* p_szString) // copy the result string back to the aiString const size_t iLen = strlen(szTempB); size_t iLen2 = iLen+1; - iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2; + iLen2 = iLen2 > AI_MAXLEN ? AI_MAXLEN : iLen2; memcpy(p_szString->data,szTempB,iLen2); p_szString->length = static_cast(iLen); return true; @@ -402,7 +402,7 @@ int CMaterialManager::FindValidPath(aiString* p_szString) // copy the result string back to the aiStr const size_t len = strlen(szTemp); size_t len2 = len+1; - len2 = len2 > MAXLEN ? MAXLEN : len2; + len2 = len2 > AI_MAXLEN ? AI_MAXLEN : len2; memcpy(p_szString->data, szTemp, len2); p_szString->length = static_cast(len); } diff --git a/tools/assimp_view/MessageProc.cpp b/tools/assimp_view/MessageProc.cpp index 230d295fc..a21b559dd 100644 --- a/tools/assimp_view/MessageProc.cpp +++ b/tools/assimp_view/MessageProc.cpp @@ -842,7 +842,7 @@ void OpenAsset() { aiString sz; aiGetExtensionList(&sz); - char szList[MAXLEN + 100]; + char szList[AI_MAXLEN + 100]; strcpy(szList,"ASSIMP assets"); char* szCur = szList + 14; strcpy(szCur,sz.data);