X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fcvar.qh;h=a17f2bad72397d55a470fc32bb64851cfcbe5152;hb=83e2013a3aa40f8e5cfeac82e83c9abdd7a038b8;hp=a02ec0f00e56288b312e4312b2d3316e0933e1d8;hpb=267433aa7d5dd80399b808f692b8bc1ef75f0851;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/cvar.qh b/qcsrc/lib/cvar.qh index a02ec0f00..a17f2bad7 100644 --- a/qcsrc/lib/cvar.qh +++ b/qcsrc/lib/cvar.qh @@ -1,28 +1,72 @@ -#ifndef CVAR_H -#define CVAR_H +#pragma once #include "nil.qh" +#include "progname.qh" #include "static.qh" -void RegisterCvars(void(string name, string def, string desc, bool archive, string file) f) { } +ERASEABLE +void RegisterCvars(void(string name, string def, string desc, bool archive, string file) f) {} +ERASEABLE +bool cvar_value_issafe(string s) +{ + if (strstrofs(s, "\"", 0) >= 0) return false; + if (strstrofs(s, "\\", 0) >= 0) return false; + if (strstrofs(s, ";", 0) >= 0) return false; + if (strstrofs(s, "$", 0) >= 0) return false; + if (strstrofs(s, "\r", 0) >= 0) return false; + if (strstrofs(s, "\n", 0) >= 0) return false; + return true; +} + +/** escape the string to make it safe for consoles */ +ERASEABLE +string MakeConsoleSafe(string input) +{ + input = strreplace("\n", "", input); + input = strreplace("\\", "\\\\", input); + input = strreplace("$", "$$", input); + input = strreplace("\"", "\\\"", input); + return input; +} + +ERASEABLE +void cvar_describe(string name, string desc) +{ + localcmd(sprintf("\nset %1$s \"$%1$s\" \"%2$s\"\n", name, MakeConsoleSafe(desc))); +} + +ERASEABLE +void cvar_archive(string name) +{ + localcmd(sprintf("\nseta %1$s \"$%1$s\"\n", name)); +} + +ERASEABLE void RegisterCvars_Set(string name, string def, string desc, bool archive, string file) { - string val = string_null; - if (cvar_type(name) & CVAR_TYPEFLAG_EXISTS) { - val = cvar_string(name); - // Need to unset first to change the default - localcmd(sprintf("\nunset %s\n", name)); - } - localcmd(sprintf("\n%s %s \"%s\" \"%s\"\n", (archive ? "seta" : "set"), name, def, desc)); - if (val) { - localcmd(sprintf("\n%s \"%s\"\n", name, val)); - } + cvar_describe(name, desc); + if (archive) cvar_archive(name); } -#ifndef SVQC -STATIC_INIT_LATE(Cvars) { RegisterCvars(RegisterCvars_Set); } -#endif +int RegisterCvars_Save_fd; +ERASEABLE +void RegisterCvars_Save(string name, string def, string desc, bool archive, string file) +{ + if (!archive) return; + fputs(RegisterCvars_Save_fd, sprintf("seta %s \"%s\"\n", name, def)); +} + +STATIC_INIT_LATE(Cvars) +{ + RegisterCvars(RegisterCvars_Set); + RegisterCvars_Save_fd = fopen(sprintf("default%s.cfg", PROGNAME), FILE_WRITE); + if (RegisterCvars_Save_fd >= 0) + { + RegisterCvars(RegisterCvars_Save); + fclose(RegisterCvars_Save_fd); + } +} const noref bool default_bool = false; const noref int default_int = 0; @@ -30,21 +74,29 @@ const noref float default_float = 0; const noref string default_string = ""; const noref vector default_vector = '0 0 0'; -#define repr_cvar_bool(x) ((x) ? "1" : "0") -#define repr_cvar_int(x) (ftos(x)) -#define repr_cvar_float(x) (ftos(x)) +#define repr_cvar_bool(x) ((x) ? "1" : "0") +#define repr_cvar_int(x) (ftos(x)) +#define repr_cvar_float(x) (ftos(x)) #define repr_cvar_string(x) (x) #define repr_cvar_vector(x) (sprintf("%v", x)) +//pseudo prototypes: +// void AUTOCVAR(, , default_cvar_value, string desc) +// void AUTOCVAR_SAVE(, , default_cvar_value, string desc) +// where default_cvar_value has type +// e.g.: AUTOCVAR(mycvar, float, 2.5, "cvar description") + #define __AUTOCVAR(file, archive, var, type, desc, default) \ - [[accumulate]] void RegisterCvars(void(string, string, string, bool, string) f) { f(#var, repr_cvar_##type(default), desc, archive, file); } \ - type autocvar_##var = default + [[accumulate]] void RegisterCvars(void(string, string, string, bool, string) f) \ + { \ + f( #var, repr_cvar_##type(default), desc, archive, file); \ + } \ + type autocvar_##var = default #define AUTOCVAR_5(file, archive, var, type, desc) \ - __AUTOCVAR(file, archive, var, type, desc, default_##type) + __AUTOCVAR(file, archive, var, type, desc, default_##type) #define AUTOCVAR_6(file, archive, var, type, default, desc) \ - __AUTOCVAR(file, archive, var, type, desc, default) -#define _AUTOCVAR(...) EVAL(OVERLOAD(AUTOCVAR, __FILE__, __VA_ARGS__)) + __AUTOCVAR(file, archive, var, type, desc, default) +#define _AUTOCVAR(...) EVAL__AUTOCVAR(OVERLOAD(AUTOCVAR, __FILE__, __VA_ARGS__)) +#define EVAL__AUTOCVAR(...) __VA_ARGS__ #define AUTOCVAR_SAVE(...) _AUTOCVAR(true, __VA_ARGS__) #define AUTOCVAR(...) _AUTOCVAR(false, __VA_ARGS__) - -#endif