+/*
+============
+Cvar_Get
+
+Adds a newly allocated variable to the variable list or sets its value.
+============
+*/
+cvar_t *Cvar_Get (const char *name, const char *value, int flags)
+{
+ cvar_t *cvar;
+
+ if (developer.integer)
+ Con_Printf("Cvar_Get(\"%s\", \"%s\", %i);\n", name, value, flags);
+
+// first check to see if it has already been defined
+ cvar = Cvar_FindVar (name);
+ if (cvar)
+ {
+ cvar->flags |= flags;
+ Cvar_SetQuick_Internal (cvar, value);
+ // also set the default value (but only once)
+ if (~cvar->flags & CVAR_DEFAULTSET)
+ {
+ cvar->flags |= CVAR_DEFAULTSET;
+
+ Z_Free(cvar->defstring);
+ cvar->defstring = (char *)Z_Malloc(strlen(value) + 1);
+ strcpy(cvar->defstring, value);
+ }
+ return cvar;
+ }
+
+// check for overlap with a command
+ if (Cmd_Exists (name))
+ {
+ Con_Printf("Cvar_Get: %s is a command\n", name);
+ return NULL;
+ }
+
+// allocate a new cvar, cvar name, and cvar string
+// FIXME: these never get Z_Free'd
+ cvar = (cvar_t *)Z_Malloc(sizeof(cvar_t));
+ cvar->flags = flags | CVAR_ALLOCATED | CVAR_DEFAULTSET;
+ cvar->name = (char *)Z_Malloc(strlen(name)+1);
+ strcpy(cvar->name, name);
+ cvar->string = (char *)Z_Malloc(strlen(value)+1);
+ strcpy(cvar->string, value);
+ cvar->defstring = (char *)Z_Malloc(strlen(value)+1);
+ strcpy(cvar->defstring, value);
+ cvar->value = atof (cvar->string);
+ cvar->integer = (int) cvar->value;
+
+// link the variable in
+ cvar->next = cvar_vars;
+ cvar_vars = cvar;
+ return cvar;
+}
+
+