add PL_RemoveObjectForKey and make PL_D_AddObject take a normal C string for key instead of a pl string.

This commit is contained in:
Bill Currie 2006-12-09 06:00:36 +00:00 committed by Jeff Teunissen
parent c290e9a988
commit 70ec9848e7
11 changed files with 69 additions and 56 deletions

View file

@ -156,6 +156,17 @@ const char *PL_String (plitem_t *string);
*/
plitem_t *PL_ObjectForKey (plitem_t *dict, const char *key);
/** Remove a value from an array object.
The array items will be shuffled to fill the resulting hole.
\param dict The Dictionary to remove the value from
\param key The unique key associated with the value to be removed
\return the value associated with the key, or NULL if not found or dict
isn't a dictionary.
\note You are responsible for freeing the returned object.
*/
plitem_t *PL_RemoveObjectForKey (plitem_t *array, const char *key);
/** Retrieve a value from an array object.
\param array The array to get the value from
@ -191,9 +202,9 @@ int PL_D_NumKeys (plitem_t *dict);
\return true on success, false on failure
\note the dictionary becomes the owner of both the key and the value.
\note the dictionary becomes the owner of the value.
*/
qboolean PL_D_AddObject (plitem_t *dict, plitem_t *key, plitem_t *value);
qboolean PL_D_AddObject (plitem_t *dict, const char *key, plitem_t *value);
/** Add an item to an array.

View file

@ -138,7 +138,7 @@ ED_EntityDict (progs_t *pr, edict_t *ed)
continue;
value = PR_UglyValueString (pr, type, v);
PL_D_AddObject (entity, PL_NewString (name), PL_NewString (value));
PL_D_AddObject (entity, name, PL_NewString (value));
}
}
return entity;
@ -172,7 +172,7 @@ ED_GlobalsDict (progs_t *pr)
name = PR_GetString (pr, def->s_name);
value = PR_UglyValueString (pr, type, &pr->pr_globals[def->ofs]);
PL_D_AddObject (globals, PL_NewString (name), PL_NewString (value));
PL_D_AddObject (globals, name, PL_NewString (value));
}
return globals;
}
@ -326,7 +326,8 @@ ED_ConvertToPlist (progs_t *pr, script_t *script)
value = PL_NewString (va ("0 %s 0", token));
else
value = PL_NewString (token);
PL_D_AddObject (ent, key, value);
PL_D_AddObject (ent, PL_String (key), value);
PL_Free (key);
}
PL_A_AddObject (plist, ent);
}

View file

@ -141,8 +141,7 @@ bi_PL_D_NumKeys (progs_t *pr)
static void
bi_PL_D_AddObject (progs_t *pr)
{
R_INT (pr) = PL_D_AddObject (p_plitem (pr, 0),
remove_plitem (pr, p_plitem (pr, 1)),
R_INT (pr) = PL_D_AddObject (p_plitem (pr, 0), P_GSTRING (pr, 1),
remove_plitem (pr, p_plitem (pr, 2)));
}

View file

@ -83,7 +83,8 @@ dict_free (void *i, void *unused)
{
dictkey_t *item = (dictkey_t *) i;
free (item->key);
PL_Free (item->value); // Make descended stuff get freed
if (item->value) // Make descended stuff get freed
PL_Free (item->value);
free (item);
}
@ -190,6 +191,25 @@ PL_ObjectForKey (plitem_t *dict, const char *key)
return k ? k->value : NULL;
}
plitem_t *
PL_RemoveObjectForKey (plitem_t *dict, const char *key)
{
hashtab_t *table = (hashtab_t *) dict->data;
dictkey_t *k;
plitem_t *value;
if (dict->type != QFDictionary)
return NULL;
k = (dictkey_t *) Hash_Del (table, key);
if (!k)
return NULL;
value = k->value;
k->value = 0;
dict_free (k, 0);
return value;
}
plitem_t *
PL_D_AllKeys (plitem_t *dict)
{
@ -234,17 +254,14 @@ PL_ObjectAtIndex (plitem_t *array, int index)
}
qboolean
PL_D_AddObject (plitem_t *dict, plitem_t *key, plitem_t *value)
PL_D_AddObject (plitem_t *dict, const char *key, plitem_t *value)
{
dictkey_t *k;
if (dict->type != QFDictionary)
return false;
if (key->type != QFString)
return false;
if ((k = Hash_Find ((hashtab_t *)dict->data, key->data))) {
if ((k = Hash_Find ((hashtab_t *)dict->data, key))) {
PL_Free ((plitem_t *) k->value);
k->value = value;
} else {
@ -253,7 +270,7 @@ PL_D_AddObject (plitem_t *dict, plitem_t *key, plitem_t *value)
if (!k)
return false;
k->key = strdup ((char *) key->data);
k->key = strdup (key);
k->value = value;
Hash_Add ((hashtab_t *)dict->data, k);
@ -666,7 +683,7 @@ PL_ParsePropertyListItem (pldata_t *pl)
}
// Add the key/value pair to the dictionary
if (!PL_D_AddObject (item, key, value)) {
if (!PL_D_AddObject (item, PL_String (key), value)) {
PL_Free (key);
PL_Free (value);
PL_Free (item);

View file

@ -457,24 +457,18 @@ game_dict (void)
{
plitem_t *game = PL_NewDictionary ();
PL_D_AddObject (game,
PL_NewString ("comment"),
PL_D_AddObject (game, "comment",
PL_NewString (va ("%-21s kills:%3i/%3i", cl.levelname,
cl.stats[STAT_MONSTERS],
cl.stats[STAT_TOTALMONSTERS])));
PL_D_AddObject (game, PL_NewString ("spawn_parms"), spawn_parms_array ());
PL_D_AddObject (game,
PL_NewString ("current_skill"),
PL_D_AddObject (game, "spawn_parms", spawn_parms_array ());
PL_D_AddObject (game, "current_skill",
PL_NewString (va ("%d", current_skill)));
PL_D_AddObject (game, PL_NewString ("name"), PL_NewString (sv.name));
PL_D_AddObject (game,
PL_NewString ("time"),
PL_NewString (va ("%f", sv.time)));
PL_D_AddObject (game, PL_NewString ("lightstyles"), lightstyles_array ());
PL_D_AddObject (game,
PL_NewString ("globals"),
ED_GlobalsDict (&sv_pr_state));
PL_D_AddObject (game, PL_NewString ("entities"), entities_array ());
PL_D_AddObject (game, "name", PL_NewString (sv.name));
PL_D_AddObject (game, "time", PL_NewString (va ("%f", sv.time)));
PL_D_AddObject (game, "lightstyles", lightstyles_array ());
PL_D_AddObject (game, "globals", ED_GlobalsDict (&sv_pr_state));
PL_D_AddObject (game, "entities", entities_array ());
return game;
}
@ -489,9 +483,7 @@ convert_to_game_dict (script_t *script)
// savegame comment (ignored)
Script_GetToken (script, 1);
PL_D_AddObject (game,
PL_NewString ("comment"),
PL_NewString (script->token->str));
PL_D_AddObject (game, "comment", PL_NewString (script->token->str));
// spawn_parms
item = PL_NewArray ();
@ -499,26 +491,20 @@ convert_to_game_dict (script_t *script)
Script_GetToken (script, 1);
PL_A_AddObject (item, PL_NewString (script->token->str));
}
PL_D_AddObject (game, PL_NewString ("spawn_parms"), item);
PL_D_AddObject (game, "spawn_parms", item);
// this silliness is so we can load 1.06 save files, which have float skill
// values
Script_GetToken (script, 1);
skill = (int) (atof (script->token->str) + 0.1);
PL_D_AddObject (game,
PL_NewString ("current_skill"),
PL_NewString (va ("%d", skill)));
PL_D_AddObject (game, "current_skill", PL_NewString (va ("%d", skill)));
Script_GetToken (script, 1);
PL_D_AddObject (game,
PL_NewString ("name"),
PL_NewString (script->token->str));
PL_D_AddObject (game, "name", PL_NewString (script->token->str));
Script_GetToken (script, 1);
PL_D_AddObject (game,
PL_NewString ("time"),
PL_NewString (script->token->str));
PL_D_AddObject (game, "time", PL_NewString (script->token->str));
// load the light styles
item = PL_NewArray ();
@ -531,13 +517,13 @@ convert_to_game_dict (script_t *script)
//strcpy (s, script->token->str);
//sv.lightstyles[i] = s;
}
PL_D_AddObject (game, PL_NewString ("lightstyles"), item);
PL_D_AddObject (game, "lightstyles", item);
// load the edicts out of the savegame file
list = ED_ConvertToPlist (&sv_pr_state, script);
item = PL_RemoveObjectAtIndex (list, 0);
PL_D_AddObject (game, PL_NewString ("globals"), item);
PL_D_AddObject (game, PL_NewString ("entities"), list);
PL_D_AddObject (game, "globals", item);
PL_D_AddObject (game, "entities", list);
return game;
}

View file

@ -28,7 +28,7 @@
- (integer) numKeys;
- (PLItem) getObjectForKey:(string) key;
- (PLItem) allKeys;
- addKey:(PLItem) key value:(PLItem) value;
- addKey:(string) key value:(PLItem) value;
@end
@interface PLArray: PLItem

View file

@ -14,7 +14,7 @@ typedef enum {QFDictionary, QFArray, QFBinary, QFString} pltype_t; // possible t
@extern plitem_t (plitem_t item, integer index) PL_ObjectAtIndex;
@extern plitem_t (plitem_t item) PL_D_AllKeys;
@extern integer (plitem_t item) PL_D_NumKeys;
@extern integer (plitem_t dict, plitem_t key, plitem_t value) PL_D_AddObject;
@extern integer (plitem_t dict, string key, plitem_t value) PL_D_AddObject;
@extern integer (plitem_t array_item, plitem_t item) PL_A_AddObject;
@extern integer (plitem_t item) PL_A_NumObjects;
@extern integer (plitem_t array_item, plitem_t item, integer index) PL_A_InsertObjectAtIndex;

View file

@ -132,7 +132,8 @@ function PR_FindFunction (string func) = #0;
value = PL_NewString ("0 " + token + " 0");
else
value = PL_NewString (token);
PL_D_AddObject (ent, key, value);
PL_D_AddObject (ent, PL_String (key), value);
PL_Free (key);
}
PL_A_AddObject (plist, ent);
}

View file

@ -119,15 +119,14 @@
return [PLItem itemClass: PL_D_AllKeys (item)];
}
- addKey:(PLItem) key value:(PLItem) value
- addKey:(string) key value:(PLItem) value
{
if (!key.own || !value.own) {
if (!value.own) {
obj_error (self, 0, "add of unowned key/value to PLDictionary");
return self;
}
PL_D_AddObject (item, key.item, value.item);
key.own = value.own = 0;
[key release];
PL_D_AddObject (item, key, value.item);
value.own = 0;
[value release];
return self;
}

View file

@ -8,7 +8,7 @@ plitem_t (plitem_t item, string key) PL_ObjectForKey = #0;
plitem_t (plitem_t item, integer index) PL_ObjectAtIndex = #0;
plitem_t (plitem_t item) PL_D_AllKeys = #0;
integer (plitem_t item) PL_D_NumKeys = #0;
integer (plitem_t dict, plitem_t key, plitem_t value) PL_D_AddObject = #0;
integer (plitem_t dict, string key, plitem_t value) PL_D_AddObject = #0;
integer (plitem_t array_item, plitem_t item) PL_A_AddObject = #0;
integer (plitem_t item) PL_A_NumObjects = #0;
integer (plitem_t array_item, plitem_t item, integer index) PL_A_InsertObjectAtIndex = #0;

View file

@ -229,8 +229,7 @@ LoadEntities (void)
epair->next = entity->epairs;
entity->epairs = epair;
PL_D_AddObject (dict, PL_NewString (key),
PL_NewString (script->token->str));
PL_D_AddObject (dict, key, PL_NewString (script->token->str));
if (!strcmp (key, "classname"))
entity->classname = epair->value;