+ variable->integer = (int) variable->value;
+
+// link the variable in
+// alphanumerical order
+ for( current = NULL, next = cvar_vars ; next && strcmp( next->name, variable->name ) < 0 ; current = next, next = next->next )
+ ;
+ if( current ) {
+ current->next = variable;
+ } else {
+ cvar_vars = variable;
+ }
+ variable->next = next;
+
+ // link to head of list in this hash table index
+ hashindex = CRC_Block((const unsigned char *)variable->name, strlen(variable->name));
+ variable->nextonhashchain = cvar_hashtable[hashindex];
+ cvar_hashtable[hashindex] = variable;
+}
+
+/*
+============
+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, const char *newdescription)
+{
+ int hashindex;
+ cvar_t *current, *next, *cvar;
+ size_t alloclen;
+
+ if (developer.integer >= 100)
+ 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);
+ if(newdescription && (cvar->flags & CVAR_ALLOCATED))
+ {
+ if(cvar->description != cvar_dummy_description)
+ Z_Free(cvar->description);
+
+ if(*newdescription)
+ {
+ alloclen = strlen(newdescription) + 1;
+ cvar->description = (char *)Z_Malloc(alloclen);
+ memcpy(cvar->description, newdescription, alloclen);
+ }
+ else
+ cvar->description = cvar_dummy_description;
+ }
+ return cvar;
+ }
+
+// check for pure evil
+ if (!*name)
+ {
+ Con_Printf("Cvar_Get: invalid variable name\n");
+ return NULL;
+ }
+
+// 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
+// TODO: factorize the following code with the one at the end of Cvar_RegisterVariable()
+// FIXME: these never get Z_Free'd
+ cvar = (cvar_t *)Z_Malloc(sizeof(cvar_t));
+ cvar->flags = flags | CVAR_ALLOCATED;
+ alloclen = strlen(name) + 1;
+ cvar->name = (char *)Z_Malloc(alloclen);
+ memcpy(cvar->name, name, alloclen);
+ alloclen = strlen(value) + 1;
+ cvar->string = (char *)Z_Malloc(alloclen);
+ memcpy(cvar->string, value, alloclen);
+ cvar->defstring = (char *)Z_Malloc(alloclen);
+ memcpy(cvar->defstring, value, alloclen);
+ cvar->value = atof (cvar->string);
+ cvar->integer = (int) cvar->value;
+
+ if(newdescription && *newdescription)
+ {
+ alloclen = strlen(newdescription) + 1;
+ cvar->description = (char *)Z_Malloc(alloclen);
+ memcpy(cvar->description, newdescription, alloclen);
+ }
+ else
+ cvar->description = cvar_dummy_description; // actually checked by VM_cvar_type
+