diff options
author | Andrey Nazarov <skuller@skuller.net> | 2009-04-22 23:40:03 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2009-04-22 23:40:03 +0000 |
commit | 275f310df767a57b8cf409acdcbd14c63cb90df9 (patch) | |
tree | 3b59e2751c32b2f15fcfabb1af8b03e702cd5230 /source/sv_ac.c | |
parent | 385ccd0e9a518933019a8c6f1fecad2ae660b766 (diff) |
Don't execute ‘cl_beginmapcmd’, ‘cl_changemapcmd’ and ‘cl_disconnectcmd’ triggers when playing back demos.
Fixed automatic restart of sound subsystem after cvar change not working randomly.
Don't crash in CL_Disconnect() on dedicated server exit.
Added ‘sv_redirect_address’ variable.
Fixed ‘\r’ char not stripped properly from filename when processing ‘\include’ directive in AC config files.
Made AC config parser compliant with reference format as defined by R1Q2 implementation.
Updated documentation.
Diffstat (limited to 'source/sv_ac.c')
-rw-r--r-- | source/sv_ac.c | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/source/sv_ac.c b/source/sv_ac.c index 8f60243..cfdae8b 100644 --- a/source/sv_ac.c +++ b/source/sv_ac.c @@ -176,7 +176,7 @@ FILE PARSING #define AC_MAX_INCLUDES 16 -typedef void (*ac_parse_t)( const char *, int, const char * ); +typedef void (*ac_parse_t)( char *, int, const char * ); typedef struct { char str[4]; @@ -198,10 +198,35 @@ static const ac_cvarop_t ac_cvarops[] = { { "" } }; +static char *AC_SimpleParse( char **data_p, size_t *len_p ) { + char *data, *p; -static void AC_ParseHash( const char *data, int linenum, const char *path ) { + data = *data_p; + if( !data ) { + if( len_p ) { + *len_p = 0; + } + return NULL; + } + + p = Q_strchrnul( data, '\t' ); + if( *p ) { + *p = 0; + *data_p = p + 1; + } else { + *data_p = NULL; + } + + if( len_p ) { + *len_p = p - data; + } + + return data; +} + +static void AC_ParseHash( char *data, int linenum, const char *path ) { char *pstr, *hstr; - int pathlen, hashlen; + size_t pathlen, hashlen; int flags; byte hash[20]; ac_file_t *file; @@ -212,11 +237,11 @@ static void AC_ParseHash( const char *data, int linenum, const char *path ) { return; } - pstr = COM_SimpleParse( &data, &pathlen ); + pstr = AC_SimpleParse( &data, &pathlen ); if( !pstr[0] ) { return; } - hstr = COM_SimpleParse( &data, &hashlen ); + hstr = AC_SimpleParse( &data, &hashlen ); if( !hstr[0] ) { Com_WPrintf( "ANTICHEAT: Incomplete line %d in %s\n", linenum, path ); return; @@ -266,23 +291,22 @@ badhash: acs.num_files++; } -static void AC_ParseCvar( const char *data, int linenum, const char *path ) { +static void AC_ParseCvar( char *data, int linenum, const char *path ) { char *values[256], *p; byte lengths[256]; char *name, *opstr, *val, *def; - int num_values, namelen, vallen, deflen; + size_t len, namelen, vallen, deflen; ac_cvar_t *cvar; const ac_cvarop_t *op; - int i; - size_t len; + int i, num_values; - name = COM_SimpleParse( &data, &namelen ); + name = AC_SimpleParse( &data, &namelen ); if( !name[0] ) { return; } - opstr = COM_SimpleParse( &data, NULL ); - val = COM_SimpleParse( &data, &vallen ); - def = COM_SimpleParse( &data, &deflen ); + opstr = AC_SimpleParse( &data, NULL ); + val = AC_SimpleParse( &data, &vallen ); + def = AC_SimpleParse( &data, &deflen ); if( !opstr[0] || !val[0] || !def[0] ) { Com_WPrintf( "ANTICHEAT: Incomplete line %d in %s\n", linenum, path ); return; @@ -353,7 +377,7 @@ static void AC_ParseCvar( const char *data, int linenum, const char *path ) { acs.num_cvars++; } -static void AC_ParseToken( const char *data, int linenum, const char *path ) { +static void AC_ParseToken( char *data, int linenum, const char *path ) { string_entry_t *tok; size_t len = strlen( data ); @@ -376,6 +400,9 @@ static qboolean AC_ParseFile( const char *path, ac_parse_t parse, int depth ) { while( *data ) { p = strchr( data, '\n' ); if( p ) { + if( p > data && *( p - 1 ) == '\r' ) { + *( p - 1 ) = 0; + } *p = 0; } |