1 /* Console variables */
18 #define CVAR_MAX_LENGTH 1024
19 #define CVAR_MAX_CVARS 1024
21 /* The list of cvars */
23 cvar_t *cvar_list[CVAR_MAX_CVARS];
30 d_free(cvar_list[Num_cvars]->string);
32 hashtable_free(&cvar_hash);
36 void cvar_cmd_set(int argc, char **argv)
38 char buf[CVAR_MAX_LENGTH];
44 if ((ptr = cvar_find(argv[1])))
45 con_printf(CON_NORMAL, "%s: %s\n", ptr->name, ptr->string);
47 con_printf(CON_NORMAL, "set: variable %s not found\n", argv[1]);
52 for (i = 0; i < Num_cvars; i++)
53 con_printf(CON_NORMAL, "%s: %s\n", cvar_list[i]->name, cvar_list[i]->string);
57 ret = snprintf(buf, sizeof(buf), "%s", argv[2]);
58 if (ret >= CVAR_MAX_LENGTH) {
59 con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
63 for (i = 3; i < argc; i++) {
64 ret = snprintf(buf, CVAR_MAX_LENGTH, "%s %s", buf, argv[i]);
65 if (ret >= CVAR_MAX_LENGTH) {
66 con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
70 cvar_set(argv[1], buf);
76 hashtable_init( &cvar_hash, CVAR_MAX_CVARS );
78 cmd_addcommand("set", cvar_cmd_set, "set <name> <value>\n" " set variable <name> equal to <value>\n"
79 "set <name>\n" " show value of <name>\n"
80 "set\n" " show value of all variables");
86 cvar_t *cvar_find(const char *cvar_name)
90 i = hashtable_search( &cvar_hash, cvar_name );
99 const char *cvar_complete(char *text)
102 size_t len = strlen(text);
107 for (i = 0; i < Num_cvars; i++)
108 if (!strnicmp(text, cvar_list[i]->name, len))
109 return cvar_list[i]->name;
115 /* Register a cvar */
116 void cvar_registervariable(cvar_t *cvar)
120 Assert(cvar != NULL);
122 stringval = cvar->string;
124 cvar->string = d_strdup(stringval);
125 cvar->fixval = fl2f(strtod(cvar->string, NULL));
126 cvar->intval = (int)strtol(cvar->string, NULL, 10);
128 if (cvar_find(cvar->name))
131 con_printf(CON_URGENT, "cvar %s already exists!\n", cvar->name);
135 /* insert at end of list */
136 hashtable_insert(&cvar_hash, cvar->name, Num_cvars);
137 cvar_list[Num_cvars++] = cvar;
141 /* Set a CVar's value */
142 void cvar_set_cvar(cvar_t *cvar, char *value)
147 d_free(cvar->string);
148 cvar->string = d_strdup(value);
149 cvar->fixval = fl2f(strtod(cvar->string, NULL));
150 cvar->intval = (int)strtol(cvar->string, NULL, 10);
151 con_printf(CON_VERBOSE, "%s: %s\n", cvar->name, cvar->string);
155 void cvar_set_cvarf(cvar_t *cvar, const char *fmt, ...)
158 char buf[CVAR_MAX_LENGTH];
161 va_start (arglist, fmt);
162 n = vsnprintf(buf, sizeof(buf), fmt, arglist);
165 Assert(!(n < 0 || n > CVAR_MAX_LENGTH));
167 cvar_set_cvar(cvar, buf);
171 void cvar_set(const char *cvar_name, char *value)
174 extern cvar_t Cheats_enabled;
176 cvar = cvar_find(cvar_name);
179 con_printf(CON_NORMAL, "cvar %s not found\n", cvar_name);
183 if (cvar->flags & CVAR_CHEAT && !Cheats_enabled.intval)
185 con_printf(CON_NORMAL, "cvar %s is cheat protected.\n", cvar_name);
189 cvar_set_cvar(cvar, value);
193 /* Write archive cvars to file */
194 void cvar_write(CFILE *file)
198 for (i = 0; i < Num_cvars; i++)
199 if (cvar_list[i]->flags & CVAR_ARCHIVE)
200 PHYSFSX_printf(file, "%s=%s\n", cvar_list[i]->name, cvar_list[i]->string);