Annotation of quake2/qcommon/cvar.c, revision 1.1.1.1

1.1       root        1: // cvar.c -- dynamic variable tracking
                      2: #include "qcommon.h"
                      3: cvar_t *cvar_vars;
                      4: /*
                      5: ============
                      6: Cvar_InfoValidate
                      7: ============
                      8: */
                      9: static qboolean Cvar_InfoValidate (char *s)
                     10: {
                     11:        if (strstr (s, "\\"))
                     12:                return false;
                     13:        if (strstr (s, "\""))
                     14:                return false;
                     15:        if (strstr (s, ";"))
                     16:                return false;
                     17:        return true;
                     18: }
                     19: 
                     20: /*
                     21: ============
                     22: Cvar_FindVar
                     23: ============
                     24: */
                     25: static cvar_t *Cvar_FindVar (char *var_name)
                     26: {
                     27:        cvar_t  *var;
                     28:        
                     29:        for (var=cvar_vars ; var ; var=var->next)
                     30:                if (!strcmp (var_name, var->name))
                     31:                        return var;
                     32:        return NULL;
                     33: }
                     34: /*
                     35: ============
                     36: Cvar_VariableValue
                     37: ============
                     38: */
                     39: float Cvar_VariableValue (char *var_name)
                     40: {
                     41:        cvar_t  *var;
                     42:        
                     43:        var = Cvar_FindVar (var_name);
                     44:        if (!var)
                     45:                return 0;
                     46:        return atof (var->string);
                     47: }
                     48: /*
                     49: ============
                     50: Cvar_VariableString
                     51: ============
                     52: */
                     53: char *Cvar_VariableString (char *var_name)
                     54: {
                     55:        cvar_t *var;
                     56:        
                     57:        var = Cvar_FindVar (var_name);
                     58:        if (!var)
                     59:                return "";
                     60:        return var->string;
                     61: }
                     62: /*
                     63: ============
                     64: Cvar_CompleteVariable
                     65: ============
                     66: */
                     67: char *Cvar_CompleteVariable (char *partial)
                     68: {
                     69:        cvar_t          *cvar;
                     70:        int                     len;
                     71:        
                     72:        len = strlen(partial);
                     73:        
                     74:        if (!len)
                     75:                return NULL;
                     76:                
                     77:        // check exact match
                     78:        for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
                     79:                if (!strcmp (partial,cvar->name))
                     80:                        return cvar->name;
                     81:        // check partial match
                     82:        for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
                     83:                if (!strncmp (partial,cvar->name, len))
                     84:                        return cvar->name;
                     85:        return NULL;
                     86: }
                     87: /*
                     88: ============
                     89: Cvar_Get
                     90: If the variable already exists, the value will not be set
                     91: The flags will be or'ed in if the variable exists.
                     92: ============
                     93: */
                     94: cvar_t *Cvar_Get (char *var_name, char *var_value, int flags)
                     95: {
                     96:        cvar_t  *var;
                     97:        
                     98:        if (flags & (CVAR_USERINFO | CVAR_SERVERINFO))
                     99:        {
                    100:                if (!Cvar_InfoValidate (var_name))
                    101:                {
                    102:                        Com_Printf("invalid info cvar name\n");
                    103:                        return NULL;
                    104:                }
                    105:        }
                    106: 
                    107:        var = Cvar_FindVar (var_name);
                    108:        if (var)
                    109:        {
                    110:                var->flags |= flags;
                    111:                return var;
                    112:        }
                    113:        if (!var_value)
                    114:                return NULL;
                    115: 
                    116:        if (flags & (CVAR_USERINFO | CVAR_SERVERINFO))
                    117:        {
                    118:                if (!Cvar_InfoValidate (var_value))
                    119:                {
                    120:                        Com_Printf("invalid info cvar value\n");
                    121:                        return NULL;
                    122:                }
                    123:        }
                    124: 
                    125:        var = Z_Malloc (sizeof(*var));
                    126:        var->name = CopyString (var_name);
                    127:        var->string = CopyString (var_value);
                    128:        var->modified = true;
                    129:        var->value = atof (var->string);
                    130:        // link the variable in
                    131:        var->next = cvar_vars;
                    132:        cvar_vars = var;
                    133:        var->flags = flags;
                    134:        return var;
                    135: }
                    136: /*
                    137: ============
                    138: Cvar_Set2
                    139: ============
                    140: */
                    141: cvar_t *Cvar_Set2 (char *var_name, char *value, qboolean force)
                    142: {
                    143:        cvar_t  *var;
                    144: 
                    145:        var = Cvar_FindVar (var_name);
                    146:        if (!var)
                    147:        {       // create it
                    148:                return Cvar_Get (var_name, value, 0);
                    149:        }
                    150:        if (var->flags & (CVAR_USERINFO | CVAR_SERVERINFO))
                    151:        {
                    152:                if (!Cvar_InfoValidate (value))
                    153:                {
                    154:                        Com_Printf("invalid info cvar value\n");
                    155:                        return var;
                    156:                }
                    157:        }
                    158: 
                    159:        if (!force)
                    160:        {
                    161:                if (var->flags & CVAR_NOSET)
                    162:                {
                    163:                        Com_Printf ("%s is write protected.\n", var_name);
                    164:                        return var;
                    165:                }
                    166:                if (var->flags & CVAR_LATCH)
                    167:                {
                    168:                        if (var->latched_string)
                    169:                        {
                    170:                                if (strcmp(value, var->latched_string) == 0)
                    171:                                        return var;
                    172:                                Z_Free (var->latched_string);
                    173:                        }
                    174:                        else
                    175:                        {
                    176:                                if (strcmp(value, var->string) == 0)
                    177:                                        return var;
                    178:                        }
                    179: 
                    180:                        if (Com_ServerState())
                    181:                        {
                    182:                                Com_Printf ("%s will be changed for next game.\n", var_name);
                    183:                                var->latched_string = CopyString(value);
                    184:                        }
                    185:                        else
                    186:                        {
                    187:                                var->string = CopyString(value);
                    188:                                var->value = atof (var->string);
                    189:                                if (!strcmp(var->name, "game"))
                    190:                                {
                    191:                                        FS_SetGamedir (var->string);
                    192:                                        FS_ExecAutoexec ();
                    193:                                }
                    194:                        }
                    195:                        return var;
                    196:                }
                    197:        }
                    198:        else
                    199:        {
                    200:                if (var->latched_string)
                    201:                {
                    202:                        Z_Free (var->latched_string);
                    203:                        var->latched_string = NULL;
                    204:                }
                    205:        }
                    206:        if (!strcmp(value, var->string))
                    207:                return var;             // not changed
                    208:        var->modified = true;
                    209:        if (var->flags & CVAR_USERINFO)
                    210:                userinfo_modified = true;       // transmit at next oportunity
                    211:        
                    212:        Z_Free (var->string);   // free the old value string
                    213:        
                    214:        var->string = CopyString(value);
                    215:        var->value = atof (var->string);
                    216:        return var;
                    217: }
                    218: /*
                    219: ============
                    220: Cvar_ForceSet
                    221: ============
                    222: */
                    223: cvar_t *Cvar_ForceSet (char *var_name, char *value)
                    224: {
                    225:        return Cvar_Set2 (var_name, value, true);
                    226: }
                    227: /*
                    228: ============
                    229: Cvar_Set
                    230: ============
                    231: */
                    232: cvar_t *Cvar_Set (char *var_name, char *value)
                    233: {
                    234:        return Cvar_Set2 (var_name, value, false);
                    235: }
                    236: /*
                    237: ============
                    238: Cvar_FullSet
                    239: ============
                    240: */
                    241: cvar_t *Cvar_FullSet (char *var_name, char *value, int flags)
                    242: {
                    243:        cvar_t  *var;
                    244:        
                    245:        var = Cvar_FindVar (var_name);
                    246:        if (!var)
                    247:        {       // create it
                    248:                return Cvar_Get (var_name, value, flags);
                    249:        }
                    250:        var->modified = true;
                    251:        if (var->flags & CVAR_USERINFO)
                    252:                userinfo_modified = true;       // transmit at next oportunity
                    253:        
                    254:        Z_Free (var->string);   // free the old value string
                    255:        
                    256:        var->string = CopyString(value);
                    257:        var->value = atof (var->string);
                    258:        var->flags = flags;
                    259:        return var;
                    260: }
                    261: /*
                    262: ============
                    263: Cvar_SetValue
                    264: ============
                    265: */
                    266: void Cvar_SetValue (char *var_name, float value)
                    267: {
                    268:        char    val[32];
                    269: 
                    270:        if (value == (int)value)
                    271:                Com_sprintf (val, sizeof(val), "%i",(int)value);
                    272:        else
                    273:                Com_sprintf (val, sizeof(val), "%f",value);
                    274:        Cvar_Set (var_name, val);
                    275: }
                    276: /*
                    277: ============
                    278: Cvar_GetLatchedVars
                    279: Any variables with latched values will now be updated
                    280: ============
                    281: */
                    282: void Cvar_GetLatchedVars (void)
                    283: {
                    284:        cvar_t  *var;
                    285:        for (var = cvar_vars ; var ; var = var->next)
                    286:        {
                    287:                if (!var->latched_string)
                    288:                        continue;
                    289:                Z_Free (var->string);
                    290:                var->string = var->latched_string;
                    291:                var->latched_string = NULL;
                    292:                var->value = atof(var->string);
                    293:                if (!strcmp(var->name, "game"))
                    294:                {
                    295:                        FS_SetGamedir (var->string);
                    296:                        FS_ExecAutoexec ();
                    297:                }
                    298:        }
                    299: }
                    300: /*
                    301: ============
                    302: Cvar_Command
                    303: Handles variable inspection and changing from the console
                    304: ============
                    305: */
                    306: qboolean Cvar_Command (void)
                    307: {
                    308:        cvar_t                  *v;
                    309: // check variables
                    310:        v = Cvar_FindVar (Cmd_Argv(0));
                    311:        if (!v)
                    312:                return false;
                    313:                
                    314: // perform a variable print or set
                    315:        if (Cmd_Argc() == 1)
                    316:        {
                    317:                Com_Printf ("\"%s\" is \"%s\"\n", v->name, v->string);
                    318:                return true;
                    319:        }
                    320:        Cvar_Set (v->name, Cmd_Argv(1));
                    321:        return true;
                    322: }
                    323: /*
                    324: ============
                    325: Cvar_Set_f
                    326: Allows setting and defining of arbitrary cvars from console
                    327: ============
                    328: */
                    329: void Cvar_Set_f (void)
                    330: {
                    331:        int             c;
                    332:        int             flags;
                    333:        c = Cmd_Argc();
                    334:        if (c != 3 && c != 4)
                    335:        {
                    336:                Com_Printf ("usage: set <variable> <value> [u / s]\n");
                    337:                return;
                    338:        }
                    339:        if (c == 4)
                    340:        {
                    341:                if (!strcmp(Cmd_Argv(3), "u"))
                    342:                        flags = CVAR_USERINFO;
                    343:                else if (!strcmp(Cmd_Argv(3), "s"))
                    344:                        flags = CVAR_SERVERINFO;
                    345:                else
                    346:                {
                    347:                        Com_Printf ("flags can only be 'u' or 's'\n");
                    348:                        return;
                    349:                }
                    350:                Cvar_FullSet (Cmd_Argv(1), Cmd_Argv(2), flags);
                    351:        }
                    352:        else
                    353:                Cvar_Set (Cmd_Argv(1), Cmd_Argv(2));
                    354: }
                    355: /*
                    356: ============
                    357: Cvar_WriteVariables
                    358: Appends lines containing "set variable value" for all variables
                    359: with the archive flag set to true.
                    360: ============
                    361: */
                    362: void Cvar_WriteVariables (char *path)
                    363: {
                    364:        cvar_t  *var;
                    365:        char    buffer[1024];
                    366:        FILE    *f;
                    367:        f = fopen (path, "a");
                    368:        for (var = cvar_vars ; var ; var = var->next)
                    369:        {
                    370:                if (var->flags & CVAR_ARCHIVE)
                    371:                {
                    372:                        Com_sprintf (buffer, sizeof(buffer), "set %s \"%s\"\n", var->name, var->string);
                    373:                        fprintf (f, "%s", buffer);
                    374:                }
                    375:        }
                    376:        fclose (f);
                    377: }
                    378: /*
                    379: ============
                    380: Cvar_List_f
                    381: ============
                    382: */
                    383: void Cvar_List_f (void)
                    384: {
                    385:        cvar_t  *var;
                    386:        int             i;
                    387:        i = 0;
                    388:        for (var = cvar_vars ; var ; var = var->next, i++)
                    389:        {
                    390:                if (var->flags & CVAR_ARCHIVE)
                    391:                        Com_Printf ("*");
                    392:                else
                    393:                        Com_Printf (" ");
                    394:                if (var->flags & CVAR_USERINFO)
                    395:                        Com_Printf ("U");
                    396:                else
                    397:                        Com_Printf (" ");
                    398:                if (var->flags & CVAR_SERVERINFO)
                    399:                        Com_Printf ("S");
                    400:                else
                    401:                        Com_Printf (" ");
                    402:                if (var->flags & CVAR_NOSET)
                    403:                        Com_Printf ("-");
                    404:                else if (var->flags & CVAR_LATCH)
                    405:                        Com_Printf ("L");
                    406:                else
                    407:                        Com_Printf (" ");
                    408:                Com_Printf (" %s \"%s\"\n", var->name, var->string);
                    409:        }
                    410:        Com_Printf ("%i cvars\n", i);
                    411: }
                    412: qboolean userinfo_modified;
                    413: char   *Cvar_BitInfo (int bit)
                    414: {
                    415:        static char     info[MAX_INFO_STRING];
                    416:        cvar_t  *var;
                    417:        info[0] = 0;
                    418:        for (var = cvar_vars ; var ; var = var->next)
                    419:        {
                    420:                if (var->flags & bit)
                    421:                        Info_SetValueForKey (info, var->name, var->string);
                    422:        }
                    423:        return info;
                    424: }
                    425: // returns an info string containing all the CVAR_USERINFO cvars
                    426: char   *Cvar_Userinfo (void)
                    427: {
                    428:        return Cvar_BitInfo (CVAR_USERINFO);
                    429: }
                    430: // returns an info string containing all the CVAR_SERVERINFO cvars
                    431: char   *Cvar_Serverinfo (void)
                    432: {
                    433:        return Cvar_BitInfo (CVAR_SERVERINFO);
                    434: }
                    435: /*
                    436: ============
                    437: Cvar_Init
                    438: Reads in all archived cvars
                    439: ============
                    440: */
                    441: void Cvar_Init (void)
                    442: {
                    443:        Cmd_AddCommand ("set", Cvar_Set_f);
                    444:        Cmd_AddCommand ("cvarlist", Cvar_List_f);
                    445: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.