+/** escape the string to make it safe for consoles */
+string MakeConsoleSafe(string input)
+{
+ input = strreplace("\n", "", input);
+ input = strreplace("\\", "\\\\", input);
+ input = strreplace("$", "$$", input);
+ input = strreplace("\"", "\\\"", input);
+ return input;
+}
+
+void cvar_describe(string name, string desc)
+{
+ localcmd(sprintf("\nset %1$s \"$%1$s\" \"%2$s\"\n", name, MakeConsoleSafe(desc)));
+}
+
+void cvar_archive(string name)
+{
+ localcmd(sprintf("\nseta %1$s \"$%1$s\"\n", name));
+}
+
+void RegisterCvars_Set(string name, string def, string desc, bool archive, string file)
+{
+ cvar_describe(name, desc);
+ if (archive) cvar_archive(name);
+}
+
+int RegisterCvars_Save_fd;
+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;
+const noref float default_float = 0;
+const noref string default_string = "";
+const noref vector default_vector = '0 0 0';