summaryrefslogtreecommitdiff
path: root/utils/vproject/sys_utils.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/vproject/sys_utils.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'utils/vproject/sys_utils.cpp')
-rw-r--r--utils/vproject/sys_utils.cpp436
1 files changed, 436 insertions, 0 deletions
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<srcLen; i++ )
+ {
+ if ( path[i] == '/' )
+ path[i] = '\\';
+ else if ( forceToLower && ( path[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';
+ }
+}
+
+