From c4345bd1c2c5f1da83a55be870ee06f19825bcfb Mon Sep 17 00:00:00 2001 From: kotofyt Date: Thu, 21 Aug 2025 19:05:41 +0300 Subject: [PATCH] ini parser completed --- materialsystem/vulkan/rendercontext.cpp | 10 +++ public/tier1/utlvector.h | 10 +-- public/tier2/fileformats/ini.h | 1 + tests/ini/initest | Bin 168848 -> 172032 bytes tests/ini/main.cpp | 2 +- tests/ini/test1.ini | 1 + tier2/fileformats/ini.cpp | 87 +++++++++++++++--------- 7 files changed, 73 insertions(+), 38 deletions(-) diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index c2997dd..19aaa45 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -1,6 +1,7 @@ #include "SDL3/SDL_vulkan.h" #include "materialsystem/materialsystem.h" #include "tier0/platform.h" +#include "tier1/utlstring.h" #include "tier1/utlvector.h" #define VK_NO_PROTOTYPES #include "vulkan/vulkan_core.h" @@ -63,6 +64,7 @@ IIndexBuffer *CVkRenderContext::CreateIndexBuffer( uint32_t nSize ) //----------------------------------------------------------------------------- IBuffer *CreateBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage ) { + } //----------------------------------------------------------------------------- @@ -208,8 +210,16 @@ void CVkRenderContext::Frame( float fDeltaTime ) void CVkRenderContext::CreateSwapchain() { + CUtlVector surfaceFormats; + gamewindow->CreateVulkanSurface(g_vkInstance); + VkSwapchainCreateInfoKHR stSwapchainCreateInfo = {}; + stSwapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; + stSwapchainCreateInfo.surface = (VkSurfaceKHR)gamewindow->GetVulkanSurface(); + + vkCreateSwapchainKHR(g_vkDevice, &stSwapchainCreateInfo, NULL, &g_vkSwapchain); + } void CVkRenderContext::DestroySwapchain() diff --git a/public/tier1/utlvector.h b/public/tier1/utlvector.h index fc6fa45..c8641d9 100644 --- a/public/tier1/utlvector.h +++ b/public/tier1/utlvector.h @@ -127,7 +127,7 @@ void CUtlVector::AppendHead( const T &data ) } template -void CUtlVector::AppendHead( const T *pData, size_t n ) +void CUtlVector::AppendHead( const T *pData, size_t n ) { size_t nOldSize = m_nSize; m_data.Resize(m_nSize+n); @@ -144,13 +144,13 @@ void CUtlVector::AppendHead( const T *pData, size_t n ) } template -void CUtlVector::AppendTail( const T &data ) +void CUtlVector::AppendTail( const T &data ) { AppendTail(&data,1); } template -void CUtlVector::AppendTail( const T *pData, size_t n ) +void CUtlVector::AppendTail( const T *pData, size_t n ) { m_data.Resize(m_data.GetSize()+n); for ( size_t i = 0; i < n; i++ ) @@ -159,13 +159,13 @@ void CUtlVector::AppendTail( const T *pData, size_t n ) } template -void CUtlVector::AppendAt( size_t nIndex, const T &data ) +void CUtlVector::AppendAt( size_t nIndex, const T &data ) { AppendAt(nIndex, &data, 1); } template -void CUtlVector::AppendAt( size_t nIndex, const T *pData, size_t n ) +void CUtlVector::AppendAt( size_t nIndex, const T *pData, size_t n ) { size_t nOldSize = m_nSize; m_data.Resize(m_nSize+n); diff --git a/public/tier2/fileformats/ini.h b/public/tier2/fileformats/ini.h index fe16be0..22ea470 100644 --- a/public/tier2/fileformats/ini.h +++ b/public/tier2/fileformats/ini.h @@ -24,6 +24,7 @@ abstract_class IINIManager { public: virtual IINIFile *ReadString( const char *psz ) = 0; + virtual void ReleaseFile( IINIFile *pFile ) = 0; }; IINIManager *INIManager(); diff --git a/tests/ini/initest b/tests/ini/initest index 01d2d95353a142d6b57cab4e6787483a6710912b..8726a998bb32b83206b0320d63d5138f4ddc1f9b 100644 GIT binary patch delta 45940 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 BSa<*c diff --git a/tests/ini/main.cpp b/tests/ini/main.cpp index 14b74fa..5516b08 100644 --- a/tests/ini/main.cpp +++ b/tests/ini/main.cpp @@ -45,5 +45,5 @@ int main( int argc, char **argv ) if (!pTestValues) return 0; V_printf("%s\n",pTestValues->GetStringValue("abc3d")); - + return 0; }; diff --git a/tests/ini/test1.ini b/tests/ini/test1.ini index f86614a..cf31c5e 100644 --- a/tests/ini/test1.ini +++ b/tests/ini/test1.ini @@ -10,3 +10,4 @@ f = -890 g = .34 abc3d = "Hello world from the funny engine, you can use \" to add quotes" + diff --git a/tier2/fileformats/ini.cpp b/tier2/fileformats/ini.cpp index 03daf55..c5fb6bc 100644 --- a/tier2/fileformats/ini.cpp +++ b/tier2/fileformats/ini.cpp @@ -7,9 +7,9 @@ enum ESectionType { - SECTIONTYPE_String, - SECTIONTYPE_Boolean, - SECTIONTYPE_Float, + SECTIONTYPE_STRING, + SECTIONTYPE_BOOLEAN, + SECTIONTYPE_FLOAT, }; @@ -31,7 +31,7 @@ public: virtual const char *GetStringValue( const char *szKeyName ) override; virtual CUtlString GetUTLStringValue( const char *szKeyName ) override; - CUtlVector m_values; + CUtlVector m_values; CUtlString m_szSectionName; }; @@ -47,6 +47,11 @@ int CINISection::GetIntValue( const char *szKeyName ) const char *CINISection::GetStringValue( const char *szKeyName ) { + for (auto &value: m_values) + { + if (value->m_szKey == szKeyName) + return value->m_szData; + } return 0; } @@ -68,7 +73,7 @@ IINISection *CINIFile::GetSection( const char *szSectionName ) for ( auto §ion: m_sections ) { if ( section->m_szSectionName == szSectionName ) - return (IINISection*)§ion; + return (IINISection*)section; } return 0; } @@ -78,23 +83,24 @@ class CINIManager: public IINIManager { public: virtual IINIFile *ReadString( const char *psz ) override; + virtual void ReleaseFile( IINIFile *pFile ) override; bool IsWordSymbol( char c ); CUtlVector TokenizeString(); }; IINIFile *CINIManager::ReadString( const char *psz ) { - CINIFile *pFile = 0; - CINIFile file = {}; - bool bIsQuoted; - bool bIsSlash; + CINIFile *pFile = new CINIFile; + *pFile = {}; + bool bIsQuoted = false; + bool bIsSlash = false; bool bIsVarName; bool bIsVarValue; bool bIsSectionName; - CINISection currentSection; - SectionData_t currentSectionData; + CINISection *pCurrentSection = 0; + SectionData_t *pCurrentSectionData = 0; size_t i = 0; char c; @@ -183,14 +189,13 @@ IINIFile *CINIManager::ReadString( const char *psz ) } }; - currentSectionData.m_eSectionType = SECTIONTYPE_String; for ( int i = 0; i < tokens.GetSize(); i++ ) { if (tokens[i] == "]") { V_printf("Error: unexpected ]\n"); - return 0; + return pFile; } if (tokens[i] == "[") { @@ -198,32 +203,45 @@ IINIFile *CINIManager::ReadString( const char *psz ) if (i>=tokens.GetSize()) { V_printf("Error: Trailing section start\n"); - return 0; + return pFile; } - currentSection = {}; - currentSection.m_szSectionName = tokens[i]; - V_printf("[%s]\n",currentSection.m_szSectionName.GetString()); + pCurrentSection = (CINISection*)pFile->GetSection(tokens[i]); + if (!pCurrentSection) + { + pCurrentSection = new CINISection; + *pCurrentSection = {}; + pFile->m_sections.AppendTail(pCurrentSection); + } + pCurrentSection->m_szSectionName = tokens[i]; + i++; if (i>=tokens.GetSize()) { V_printf("Error: Trailing section name\n"); - return 0; + return pFile; } if (tokens[i] != "]") { V_printf("Error: expected ]\n"); - return 0; + return pFile; } continue; } + if (!pCurrentSection) + { + V_printf("Error: section wasn't specified\n"); + return pFile; + } if (tokens[i] == "=") { - V_printf("Error: expected key\n"); - return 0; + V_printf("Error: expected key\n"); + return pFile; } - currentSectionData = {}; - currentSectionData.m_szKey = tokens[i]; + + pCurrentSectionData = new SectionData_t; + pCurrentSectionData->m_eSectionType = SECTIONTYPE_STRING; + pCurrentSectionData->m_szKey = tokens[i]; @@ -231,12 +249,14 @@ IINIFile *CINIManager::ReadString( const char *psz ) if (i>=tokens.GetSize()) { V_printf("Error: trailing key\n"); - return 0; + delete pCurrentSectionData; + return pFile; } if (tokens[i] != "=") { V_printf("Error: expected =\n"); - return 0; + delete pCurrentSectionData; + return pFile; } i++; @@ -244,18 +264,21 @@ IINIFile *CINIManager::ReadString( const char *psz ) if (i>=tokens.GetSize()) { V_printf("Error: expected value\n"); - return 0; + delete pCurrentSectionData; + return pFile; } - currentSectionData.m_szData = tokens[i]; - currentSection.m_values.AppendTail(currentSectionData); + pCurrentSectionData->m_szData = tokens[i]; + pCurrentSection->m_values.AppendTail(pCurrentSectionData); } - - pFile = new CINIFile; - *pFile = file; - return (IINIFile*)pFile; } + +void CINIManager::ReleaseFile( IINIFile *pFile ) +{ + +} + bool CINIManager::IsWordSymbol( char c ) { if (V_isalnum(c))