+void Cvar_Del_f (void)
+{
+ int i;
+ cvar_t *cvar, *parent, **link, *prev;
+
+ if(Cmd_Argc() < 2)
+ {
+ Con_Printf("Del: wrong number of parameters, useage: unset <variablename1> [<variablename2> ...]\n");
+ return;
+ }
+ for(i = 1; i < Cmd_Argc(); ++i)
+ {
+ cvar = Cvar_FindVarLink(Cmd_Argv(i), &parent, &link, &prev);
+ if(!cvar)
+ {
+ Con_Printf("Del: %s is not defined\n", Cmd_Argv(i));
+ continue;
+ }
+ if(cvar->flags & CVAR_READONLY)
+ {
+ Con_Printf("Del: %s is read-only\n", cvar->name);
+ continue;
+ }
+ if(!(cvar->flags & CVAR_ALLOCATED))
+ {
+ Con_Printf("Del: %s is static and cannot be deleted\n", cvar->name);
+ continue;
+ }
+ if(cvar == cvar_vars)
+ {
+ cvar_vars = cvar->next;
+ }
+ else
+ {
+ // in this case, prev must be set, otherwise there has been some inconsistensy
+ // elsewhere already... should I still check for prev != NULL?
+ prev->next = cvar->next;
+ }
+
+ if(parent)
+ parent->nextonhashchain = cvar->nextonhashchain;
+ else if(link)
+ *link = cvar->nextonhashchain;
+
+ if(cvar->description != cvar_dummy_description)
+ Z_Free(cvar->description);
+
+ Z_Free(cvar->name);
+ Z_Free(cvar->string);
+ Z_Free(cvar->defstring);
+ Z_Free(cvar);
+ }
+}
+