// q3app (list of variables kept on q3config.cfg)
char*   var_list[] = {
"g_filterBan",
"g_banIPs",
"g_logSync",
"g_log",
"g_doWarmup",
"g_warmup",
"g_teamForceBalance",
"g_teamAutoJoin",
"g_friendlyFire",
"capturelimit",
"g_maxGameClients",
"cm_playerCurveClip",
"server16",
"server15",
"server14",
"server13",
"server12",
"server11",
"server10",
"server9",
"server8",
"server7",
"server6",
"server5",
"server4",
"server3",
"server2",
"server1",
"cg_marks",
"cg_drawCrosshairNames",
"cg_drawCrosshair",
"cg_brassTime",
"ui_browserShowEmpty",
"ui_browserShowFull",
"ui_browserSortKey",
"ui_browserGameType",
"ui_browserMaster",
"g_spSkill",
"g_spVideos",
"g_spAwards",
"g_spScores5",
"g_spScores4",
"g_spScores3",
"g_spScores2",
"g_spScores1",
"ui_ctf_friendly",
"ui_ctf_timelimit",
"ui_ctf_capturelimit",
"ui_team_friendly",
"ui_team_timelimit",
"ui_team_fraglimit",
"ui_tourney_timelimit",
"ui_tourney_fraglimit",
"ui_ffa_timelimit",
"ui_ffa_fraglimit",
"s_occ_eq",
"s_occfactor",
"s_bloat",
"s_numpolys",
"s_polyreflectsize",
"s_polysize",
"s_polykeep",
"s_refdelay",
"s_refgain",
"s_leafnum",
"s_max_distance",
"s_min_distance",
"s_distance",
"s_doppler",
"s_rolloff",
"s_mixPreStep",
"s_mixahead",
"s_compression",
"s_khz",
"s_separation",
"s_musicvolume",
"s_volume",
"vid_ypos",
"vid_xpos",
"r_lastValidRenderer",
"r_primitives",
"r_railSegmentLength",
"r_railCoreWidth",
"r_railWidth",
"r_facePlaneCull",
"r_gamma",
"r_swapInterval",
"r_textureMode",
"r_finish",
"r_dlightBacks",
"r_dynamiclight",
"r_drawSun",
"r_fastsky",
"r_ignoreGLErrors",
"r_flares",
"r_lodbias",
"r_lodCurveError",
"r_ignoreFastPath",
"r_smp",
"r_subdivisions",
"r_vertexLight",
"r_simpleMipMaps",
"r_customaspect",
"r_customheight",
"r_customwidth",
"r_fullscreen",
"r_mode",
"r_ignorehwgamma",
"r_overBrightBits",
"r_depthbits",
"r_stencilbits",
"r_stereo",
"r_colorbits",
"r_texturebits",
"r_detailtextures",
"r_roundImagesDown",
"r_picmip",
"r_ext_texture_env_add",
"r_ext_compiled_vertex_array",
"r_ext_multitexture",
"r_ext_gamma_control",
"r_ext_compress_textures",
"r_allowExtensions",
"r_glDriver",
"net_socksPassword",
"net_socksUsername",
"net_socksPort",
"net_socksServer",
"net_socksEnabled",
"net_noipx",
"net_noudp",
"cg_viewsize",
"cg_predictItems",
"sex",
"handicap",
"color",
"model",
"snaps",
"rate",
"name",
"cl_maxPing",
"m_filter",
"m_side",
"m_forward",
"m_yaw",
"m_pitch",
"cg_autoswitch",
"cl_allowDownload",
"cl_freelook",
"cl_mouseAccel",
"sensitivity",
"cl_run",
"cl_packetdup",
"cl_maxpackets",
"cl_pitchspeed",
"cl_yawspeed",
"sv_master5",
"sv_master4",
"sv_master3",
"sv_master2",
"sv_floodProtect",
"sv_maxPing",
"sv_minPing",
"sv_maxRate",
"sv_maxclients",
"sv_hostname",
"timelimit",
"fraglimit",
"dmflags",
"vm_ui",
"vm_game",
"vm_cgame",
"joy_threshold",
"in_joyBallScale",
"in_joystick",
"in_mouse",
"in_mididevice",
"in_midichannel",
"in_midiport",
"in_midi",
"com_introplayed",
"com_blood",
"com_maxfps",
"com_hunkMegs"
};
// --

/* q3app
=================
FindStringInBuffer
=================
*/
int FindStringInBuffer( char *buf, char *str ) {
        int     m, j, l;
        char    *b, *s;

        l = strlen(str);

        b = &buf;
        s = &str;
        m = j = 0;

        while ( s != "\0") {
                if ( *b == *s ) { // matched char
                        m++;
                        if ( m == l ) { // whole string found
                                return (j - m);
                        }
                } else {
                        m = 0;
                }

                s++; j++;
        }
        return 0;
}

/* q3app
=================
AddVarToBuffer
=================
*/
void AddVarToBuffer( char *buf, char *varname ) {
        char    var_value[MAX_INFO_STRING];
        char    *b, *s;
        int     i, l;

        trap_Cvar_VariableStringBuffer( varname, var_value, sizeof( var_value ) );
        l = strlen( varname );
        s = &var_value;
        b = &buf;

        *b++ = 's';
        *b++ = 'e';
        *b++ = 't';
        *b++ = 'a';
        *b++ = ' ';

        for ( i = 0; i < l; i++ ) {
                *b++ = *varname++;
        }

        *b++ = ' ';
        *b++ = '"';

        while( s ) {
                *b++ = *s++;
        }

        *b++ = '"';
        *b++ = '\10';
}

/* q3app
=================
UI_ConfigCleanser

1. Reads q3config.cfg into a temporary buffer
2. discards all "seta" var definitions and rewrites them according to var_list
3. Overwrites q3config.cfg with the "clean" version
4. Issues a cvar_restart followed by an "exec q3config.cfg"
=================
*/
#define MAX_CFG_TEXT 16384
void UI_ConfigCleanser( void ) {
{
        char            q3cfg[MAX_CFG_TEXT];
        char            *s;
        fileHandle_t    f;
        int     len, i, j;

// step 1

        len = trap_FS_FOpenFile( "q3config.cfg", &f, FS_READ );
        if ( !f || len >= MAX_CFG_TEXT ) {
                return;
        }

        trap_FS_Read( q3cfg, len, f );
        q3cfg[len] = 0;
        trap_FS_FCloseFile( f );

// step 2

        len = FindStringInBuffer( &q3cfg, "\10seta" );

        s = &q3cfg[0];

        j = sizeof( var_list ) / sizeof( var_list[0] );
        for ( i = 0; i < j; i++ ) {
                AddVarToBuffer( s, var_list[i] );
        }

        *s = '\0';
        len = strlen( q3cfg[0] );

// step 3

        trap_FS_FOpenFile( "q3config.cfg", &f, FS_WRITE );
        trap_FS_Write( q3cfg, len, f );
        trap_FS_FCloseFile( f );
// step 4
//        trap_Cmd_ExecuteText( EXEC_APPEND, "cvar_restart\n");
//        trap_Cmd_ExecuteText( EXEC_APPEND, "exec q3config.cfg\n");

}

// q3app (cleanse q3config.cfg and cvarlist)
        UI_ConfigCleanser();
