From 3bf9df6b2785fa6d951086978a3e66f49427166a Mon Sep 17 00:00:00 2001 From: FluorescentCIAAfricanAmerican <0934gj3049fk@protonmail.com> Date: Wed, 22 Apr 2020 12:56:21 -0400 Subject: 1 --- utils/vproject/sys_utils.cpp | 436 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 436 insertions(+) create mode 100644 utils/vproject/sys_utils.cpp (limited to 'utils/vproject/sys_utils.cpp') diff --git a/utils/vproject/sys_utils.cpp b/utils/vproject/sys_utils.cpp new file mode 100644 index 0000000..4e8de68 --- /dev/null +++ b/utils/vproject/sys_utils.cpp @@ -0,0 +1,436 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// SYS_UTILS.C +// +//=====================================================================================// +#include "sys_utils.h" + +//----------------------------------------------------------------------------- +// Sys_SplitRegistryKey +// +//----------------------------------------------------------------------------- +static BOOL Sys_SplitRegistryKey( const CHAR *key, CHAR *key0, int key0Len, CHAR *key1, int key1Len ) +{ + if ( !key ) + return false; + + int len = (int)strlen( key ); + if ( !len ) + return false; + + int Start = -1; + for ( int i = len-1; i >= 0; i-- ) + { + if ( key[i] == '\\' ) + break; + else + Start=i; + } + + if ( Start == -1 ) + return false; + + _snprintf( key0, Start, key ); + key0[Start] = '\0'; + + _snprintf( key1, ( len-Start )+1, key+Start ); + key1[( len-Start )+1] = '\0'; + + return true; +} + +//----------------------------------------------------------------------------- +// Sys_SetRegistryString +// +//----------------------------------------------------------------------------- +BOOL Sys_SetRegistryString( const CHAR *key, const CHAR *value ) +{ + HKEY hKey; + CHAR key0[256]; + CHAR key1[256]; + + HKEY hSlot = HKEY_CURRENT_USER; + if ( !strncmp( key, "HKEY_LOCAL_MACHINE", 18 ) ) + { + hSlot = HKEY_LOCAL_MACHINE; + key += 19; + } + else if ( !strncmp( key, "HKEY_CURRENT_USER", 17 ) ) + { + hSlot = HKEY_CURRENT_USER; + key += 18; + } + + if ( !Sys_SplitRegistryKey( key, key0, sizeof( key0 ), key1, sizeof( key1 ) ) ) + return false; + + if ( RegCreateKeyEx( hSlot,key0,NULL,NULL,REG_OPTION_NON_VOLATILE, value ? KEY_WRITE : KEY_ALL_ACCESS,NULL,&hKey,NULL )!=ERROR_SUCCESS ) + return false; + + if ( RegSetValueEx( hKey, key1, NULL, REG_SZ, ( UCHAR* )value, (int)strlen( value ) + 1 ) != ERROR_SUCCESS ) + { + RegCloseKey( hKey ); + return false; + } + + // success + RegCloseKey( hKey ); + return true; +} + +//----------------------------------------------------------------------------- +// Sys_GetRegistryString +// +//----------------------------------------------------------------------------- +BOOL Sys_GetRegistryString( const CHAR *key, CHAR *value, const CHAR* defValue, int valueLen ) +{ + HKEY hKey; + CHAR key0[256]; + CHAR key1[256]; + + if ( defValue ) + _snprintf( value, valueLen, defValue ); + + HKEY hSlot = HKEY_CURRENT_USER; + if ( !strncmp( key, "HKEY_LOCAL_MACHINE", 18 ) ) + { + hSlot = HKEY_LOCAL_MACHINE; + key += 19; + } + else if ( !strncmp( key, "HKEY_CURRENT_USER", 17 ) ) + { + hSlot = HKEY_CURRENT_USER; + key += 18; + } + + if ( !Sys_SplitRegistryKey( key,key0,256,key1,256 ) ) + return false; + + if ( RegOpenKeyEx( hSlot,key0,NULL,KEY_READ,&hKey )!=ERROR_SUCCESS ) + return false; + + unsigned long len=valueLen; + if ( RegQueryValueEx( hKey,key1,NULL,NULL,( UCHAR* )value,&len )!=ERROR_SUCCESS ) + { + RegCloseKey( hKey ); + return false; + } + + // success + RegCloseKey( hKey ); + return true; +} + +//----------------------------------------------------------------------------- +// Sys_SetRegistryInteger +// +//----------------------------------------------------------------------------- +BOOL Sys_SetRegistryInteger( const CHAR *key, int value ) +{ + HKEY hKey; + CHAR key0[256]; + CHAR key1[256]; + + HKEY hSlot = HKEY_CURRENT_USER; + if ( !strncmp( key, "HKEY_LOCAL_MACHINE", 18 ) ) + { + hSlot = HKEY_LOCAL_MACHINE; + key += 19; + } + else if ( !strncmp( key, "HKEY_CURRENT_USER", 17 ) ) + { + hSlot = HKEY_CURRENT_USER; + key += 18; + } + + if ( !Sys_SplitRegistryKey( key,key0,256,key1,256 ) ) + return false; + + if ( RegCreateKeyEx( hSlot, key0, NULL, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL )!=ERROR_SUCCESS ) + return false; + + if ( RegSetValueEx( hKey, key1, NULL, REG_DWORD, ( UCHAR* )&value, 4 )!=ERROR_SUCCESS ) + { + RegCloseKey( hKey ); + return false; + } + + // success + RegCloseKey( hKey ); + return true; +} + +//----------------------------------------------------------------------------- +// Sys_GetRegistryInteger +// +//----------------------------------------------------------------------------- +BOOL Sys_GetRegistryInteger( const CHAR *key, int defValue, int &value ) +{ + HKEY hKey; + CHAR key0[256]; + CHAR key1[256]; + + value = defValue; + + HKEY hSlot = HKEY_CURRENT_USER; + if ( !strncmp( key, "HKEY_LOCAL_MACHINE", 18 ) ) + { + hSlot = HKEY_LOCAL_MACHINE; + key += 19; + } + else if ( !strncmp( key, "HKEY_CURRENT_USER", 17 ) ) + { + hSlot = HKEY_CURRENT_USER; + key += 18; + } + + if ( !Sys_SplitRegistryKey( key, key0, 256, key1, 256 ) ) + return false; + + if ( RegOpenKeyEx( hSlot, key0, NULL, KEY_READ, &hKey ) != ERROR_SUCCESS ) + return false; + + unsigned long len=4; + if ( RegQueryValueEx( hKey, key1, NULL, NULL, ( UCHAR* )&value, &len ) != ERROR_SUCCESS ) + { + RegCloseKey( hKey ); + return false; + } + + // success + RegCloseKey( hKey ); + return true; +} + +//----------------------------------------------------------------------------- +// Sys_NormalizePath +// +//----------------------------------------------------------------------------- +void Sys_NormalizePath( CHAR* path, bool forceToLower ) +{ + int srcLen = (int)strlen( path ); + for ( int i=0; i= 'A' && path[i] <= 'Z' ) ) + path[i] = path[i] - 'A' + 'a'; + } +} + +//----------------------------------------------------------------------------- +// Sys_SkipWhitespace +// +//----------------------------------------------------------------------------- +CHAR* Sys_SkipWhitespace( CHAR *data, BOOL *hasNewLines, int* pNumLines ) +{ + int c; + + while( ( c = *data ) <= ' ' ) + { + if ( c == '\n' ) + { + if ( pNumLines ) + (*pNumLines)++; + + if ( hasNewLines ) + *hasNewLines = true; + } + else if ( !c ) + return ( NULL ); + + data++; + } + + return ( data ); +} + +//----------------------------------------------------------------------------- +// Sys_PeekToken +// +//----------------------------------------------------------------------------- +CHAR* Sys_PeekToken( CHAR *dataptr, BOOL bAllowLineBreaks ) +{ + CHAR *saved; + CHAR *pToken; + + saved = dataptr; + pToken = Sys_GetToken( &saved, bAllowLineBreaks, NULL ); + + return pToken; +} + +//----------------------------------------------------------------------------- +// Sys_GetToken +// +//----------------------------------------------------------------------------- +CHAR* Sys_GetToken( CHAR** dataptr, BOOL allowLineBreaks, int* pNumLines ) +{ + CHAR c; + int len; + BOOL hasNewLines; + CHAR* data; + static CHAR token[MAX_SYSTOKENCHARS]; + + c = 0; + data = *dataptr; + len = 0; + token[0] = 0; + hasNewLines = false; + + // make sure incoming data is valid + if ( !data ) + { + *dataptr = NULL; + return ( token ); + } + + for ( ;; ) + { + // skip whitespace + data = Sys_SkipWhitespace( data, &hasNewLines, pNumLines ); + if ( !data ) + { + *dataptr = NULL; + return ( token ); + } + + if ( hasNewLines && !allowLineBreaks ) + { + *dataptr = data; + return ( token ); + } + + c = *data; + + if ( c == '/' && data[1] == '/' ) + { + // skip double slash comments + data += 2; + while ( *data && *data != '\n' ) + data++; + if ( *data && *data == '\n' ) + { + data++; + if ( pNumLines ) + (*pNumLines)++; + } + } + else if ( c =='/' && data[1] == '*' ) + { + // skip /* */ comments + data += 2; + while ( *data && ( *data != '*' || data[1] != '/' ) ) + { + if ( *data == '\n' && pNumLines ) + (*pNumLines)++; + data++; + } + + if ( *data ) + data += 2; + } + else + break; + } + + // handle quoted strings + if ( c == '\"' || c == '<' ) + { + data++; + for ( ;; ) + { + c = *data++; + if ( c == '\"' || c == '>' || !c ) + { + token[len] = 0; + *dataptr = ( CHAR* )data; + return ( token ); + } + if ( len < MAX_SYSTOKENCHARS ) + token[len++] = c; + } + } + + // parse a regular word + do + { + if ( len < MAX_SYSTOKENCHARS ) + token[len++] = c; + + data++; + c = *data; + } + while ( c > ' ' ); + + if ( len >= MAX_SYSTOKENCHARS ) + len = 0; + + token[len] = '\0'; + *dataptr = (CHAR*)data; + + return token; +} + +//----------------------------------------------------------------------------- +// Sys_SkipBracedSection +// +// The next token should be an open brace. +// Skips until a matching close brace is found. +// Internal brace depths are properly skipped. +//----------------------------------------------------------------------------- +void Sys_SkipBracedSection( CHAR** dataptr, int* numlines ) +{ + CHAR* token; + int depth; + + depth = 0; + do + { + token = Sys_GetToken( dataptr, true, numlines ); + if ( token[1] == '\0' ) + { + if ( token[0] == '{' ) + depth++; + else if ( token[0] == '}' ) + depth--; + } + } + while( depth && *dataptr ); +} + +//----------------------------------------------------------------------------- +// Sys_SkipRestOfLine +// +//----------------------------------------------------------------------------- +void Sys_SkipRestOfLine( CHAR** dataptr, int* numlines ) +{ + CHAR* p; + int c; + + p = *dataptr; + while ( ( c = *p++ ) != '\0' ) + { + if ( c == '\n' ) + { + if ( numlines ) + ( *numlines )++; + break; + } + } + *dataptr = p; +} + +void Sys_StripQuotesFromToken( CHAR *pToken ) +{ + int len; + + len = (int)strlen( pToken ); + if ( len >= 2 && pToken[0] == '\"' ) + { + memcpy( pToken, pToken+1, len-1 ); + pToken[len-2] = '\0'; + } +} + + -- cgit v1.2.3