legatt 32f4597c4d Base frontend module
- Naming style migrated to camel-case
- P7lib logger sources added
- Vcpkg manifest, CMake presets and build moved to root
- SDL2, Vulkan and RmlUi dependencies added
- Logger LOG macro added
- Logger  configuration
- SDL2 window configuration
- Vulkan configuration
- RmlUi configuration
- SDL event loop
2025-08-08 00:07:32 +03:00

313 lines
9.0 KiB
C++

////////////////////////////////////////////////////////////////////////////////
// /
// 2012-2020 (c) Baical /
// /
// This library is free software; you can redistribute it and/or /
// modify it under the terms of the GNU Lesser General Public /
// License as published by the Free Software Foundation; either /
// version 3.0 of the License, or (at your option) any later version. /
// /
// This library is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /
// Lesser General Public License for more details. /
// /
// You should have received a copy of the GNU Lesser General Public /
// License along with this library. /
// /
////////////////////////////////////////////////////////////////////////////////
#pragma once
class CProc
{
public:
///////////////////////////////////////////////////////////////////////////////
//Get_ArgV
static tXCHAR **Get_ArgV(tINT32 *o_pCount)
{
return Get_ArgV(GetCommandLineW(), o_pCount);
}//Get_ArgV
///////////////////////////////////////////////////////////////////////////////
//Get_ArgV
static tXCHAR **Get_ArgV(const tXCHAR *i_pCmdLine, tINT32 *o_pCount)
{
tINT32 l_iLen = 0;//strlen(i_pCmdLine);
tXCHAR *l_pBuffer = NULL;//new tXCHAR[l_iLen];
tXCHAR **l_pReturn = NULL;
tBOOL l_bNew = TRUE;
tBOOL l_bStr = FALSE;
tINT32 l_iIDX = 0;
if ( (NULL == i_pCmdLine)
|| (NULL == o_pCount)
)
{
goto l_lblExit;
}
l_iLen = (tINT32)wcslen(i_pCmdLine) + 1;
l_pBuffer = new tXCHAR[l_iLen];
if (NULL == l_pBuffer)
{
goto l_lblExit;
}
for (tINT32 l_iI = 0; l_iI < l_iLen; l_iI++)
{
if (TM('\"') == i_pCmdLine[l_iI])
{
l_bStr = ! l_bStr;
}
else
{
if ( (TM(' ') == i_pCmdLine[l_iI])
&& (!l_bStr)
)
{
l_pBuffer[l_iIDX++] = 0;
}
else
{
l_pBuffer[l_iIDX++] = i_pCmdLine[l_iI];
}
}
}
l_iLen = l_iIDX;
//calculate count of items//////////////////////////////////////////////////
*o_pCount = 0;
for (tINT32 l_iI = 0; l_iI < l_iLen; l_iI++)
{
if ( (0 == l_pBuffer[l_iI])
|| ((l_iI + 1) == l_iLen)
)
{
(*o_pCount) ++;
}
}
if (0 >= *o_pCount)
{
goto l_lblExit;
}
//allocate result///////////////////////////////////////////////////////////
l_pReturn = new tXCHAR*[*o_pCount];
if (NULL == l_pReturn)
{
goto l_lblExit;
}
//fill result///////////////////////////////////////////////////////////////
l_bNew = TRUE;
l_iIDX = 0;
for (tINT32 l_iI = 0; l_iI < l_iLen; l_iI++)
{
if (l_bNew)
{
l_pReturn[l_iIDX++] = &l_pBuffer[l_iI];
l_bNew = FALSE;
}
if (0 == l_pBuffer[l_iI])
{
l_bNew = TRUE;
}
}
l_lblExit:
return l_pReturn;
// return = CommandLineToArgvW(i_pCmdLine, o_pCount);
}//Get_ArgV
///////////////////////////////////////////////////////////////////////////////
//Free_ArgV
static void Free_ArgV(tXCHAR **i_pArgV)
{
if (NULL == i_pArgV)
{
return;
}
if (i_pArgV[0])
{
delete [] i_pArgV[0];
}
delete [] i_pArgV;
//LocalFree(i_pArgV);
}//Free_ArgV
////////////////////////////////////////////////////////////////////////////////
//Get_Process_Time()
//return a 64-bit value divided into 2 parts representing the number of
//100-nanosecond intervals since January 1, 1601 (UTC).
static tBOOL Get_Process_Time(tUINT32 *o_pHTime, tUINT32 *o_pLTime)
{
FILETIME l_tProcess_Time = {0};
FILETIME l_tStub_01 = {0};
FILETIME l_tStub_02 = {0};
FILETIME l_tStub_03 = {0};
GetProcessTimes(GetCurrentProcess(),
&l_tProcess_Time,
&l_tStub_01,
&l_tStub_02,
&l_tStub_03
);
*o_pHTime = l_tProcess_Time.dwHighDateTime;
*o_pLTime = l_tProcess_Time.dwLowDateTime;
return TRUE;
}//Get_Process_Time()
////////////////////////////////////////////////////////////////////////////////
//Get_Process_Name
static tBOOL Get_Process_Name(tWCHAR *o_pName, tINT32 i_iMax_Len)
{
BOOL l_bReturn = FALSE;
const tUINT32 l_dwMax_Len = 32768;
wchar_t *l_pProcess_Path = NULL;
wchar_t *l_pProcess_Name = NULL;
if ( (NULL == o_pName)
|| (64 >= i_iMax_Len)
)
{
return FALSE;
}
l_pProcess_Path = new wchar_t[l_dwMax_Len];
if (NULL == l_pProcess_Path)
{
return FALSE;
}
if (GetModuleFileNameW(GetModuleHandleW(NULL),
l_pProcess_Path,
l_dwMax_Len
)
)
{
if ( (l_pProcess_Name = wcsrchr(l_pProcess_Path, L'\\'))
|| (l_pProcess_Name = wcsrchr(l_pProcess_Path, L'/'))
)
{
l_pProcess_Name ++;
l_bReturn = TRUE;
}
}
if (l_bReturn)
{
wcscpy_s((wchar_t*)o_pName, i_iMax_Len, l_pProcess_Name);
}
delete [] l_pProcess_Path;
return l_bReturn;
}//Get_Process_Name
////////////////////////////////////////////////////////////////////////////////
//Get_Process_Name
static tBOOL Get_Process_Name(tACHAR *o_pName, tINT32 i_iMax_Len)
{
const tINT32 l_iSize = 128;
tWCHAR l_pName[l_iSize];
if (Get_Process_Name(l_pName, l_iSize))
{
Convert_UTF16_To_UTF8(l_pName, o_pName, (tUINT32)i_iMax_Len);
}
else
{
strcpy_s(o_pName, (rsize_t)i_iMax_Len, "Unknown:Error");
}
return true;
}//Get_Process_Name
////////////////////////////////////////////////////////////////////////////////
//Get_Process_Path
static tBOOL Get_Process_Path(tXCHAR *o_pPath, size_t i_szName)
{
BOOL l_bReturn = FALSE;
wchar_t *l_pName = NULL;
if ( (NULL == o_pPath)
|| (256 >= i_szName)
)
{
return FALSE;
}
if (GetModuleFileNameW(GetModuleHandleW(NULL),
o_pPath,
(DWORD)i_szName
)
)
{
if ( (l_pName = wcsrchr(o_pPath, L'\\'))
|| (l_pName = wcsrchr(o_pPath, L'/'))
)
{
l_pName ++;
l_pName[0] = 0;
l_bReturn = TRUE;
}
}
return l_bReturn;
}//Get_Process_Path
////////////////////////////////////////////////////////////////////////////////
//Get_Process_ID
static tUINT32 Get_Process_ID()
{
return GetCurrentProcessId();
}//Get_Process_ID
////////////////////////////////////////////////////////////////////////////////
//Get_Thread_Id
static tUINT32 Get_Thread_Id()
{
return GetCurrentThreadId();
}//Get_Thread_Id
////////////////////////////////////////////////////////////////////////////////
//Get_Processor
static __forceinline tUINT32 Get_Processor()
{
#if defined(GTX64) || !defined(_MSC_VER)
//return 0xFFFF; //don't know how to get processor number ... yet.
return GetCurrentProcessorNumber();
#else
_asm
{
mov eax, 1
cpuid
shr ebx, 24
mov eax, ebx
}
#endif
}//Get_Processor
};