Begin the great StrDuplicate() refactor.

This commit is contained in:
Jordan Bancino 2023-02-23 23:19:23 +00:00
parent 41421557e0
commit 8c96fd8d7d
9 changed files with 19 additions and 75 deletions

View file

@ -33,11 +33,13 @@ Milestone: v0.2.0
[ ] Document new User functions
[ ] Document new JSON functions
[ ] Refactor usage of StrDuplicate()
[~] Refactor usage of StrDuplicate()
- Functions that keep strings do the duplication,
NOT their callers; callers free strings when they are
done with them.
[ ] Remove HashMapGetKey() function
[x] Remove HashMapGetKey() function
[x] HashMap
[ ] JsonValueString()
Milestone: v0.3.0
-----------------

View file

@ -293,7 +293,6 @@ DbCacheEvict(Db * db)
pthread_mutex_destroy(&ref->lock);
hash = DbHashKey(ref->name);
Free(HashMapGetKey(db->cache, hash));
HashMapDelete(db->cache, hash);
Free(hash);
@ -366,7 +365,6 @@ DbClose(Db * db)
while (HashMapIterate(db->cache, &key, (void **) &val))
{
Free(key);
JsonFree(val->json);
StringArrayFree(val->name);
pthread_mutex_destroy(&val->lock);
@ -509,7 +507,7 @@ DbLockFromArr(Db * db, Array * args)
}
ref->name = name;
HashMapSet(db->cache, StrDuplicate(hash), ref);
HashMapSet(db->cache, hash, ref);
db->cacheSize += ref->size;
ref->next = NULL;
@ -622,7 +620,6 @@ DbDelete(Db * db, size_t nArgs,...)
{
pthread_mutex_lock(&ref->lock);
Free(HashMapGetKey(db->cache, hash));
HashMapDelete(db->cache, hash);
JsonFree(ref->json);
StringArrayFree(ref->name);

View file

@ -24,6 +24,7 @@
#include <HashMap.h>
#include <Memory.h>
#include <Str.h>
#include <stddef.h>
#include <string.h>
@ -202,6 +203,7 @@ HashMapFree(HashMap * map)
{
if (map->entries[i])
{
Free(map->entries[i]->key);
Free(map->entries[i]);
}
}
@ -244,40 +246,6 @@ HashMapGet(HashMap * map, const char *key)
return NULL;
}
void *
HashMapGetKey(HashMap * map, const char *key)
{
unsigned long hash;
size_t index;
if (!map || !key)
{
return NULL;
}
hash = map->hashFunc(key);
index = hash % map->capacity;
for (;;)
{
HashMapBucket *bucket = map->entries[index];
if (!bucket)
{
break;
}
if (bucket->hash == hash)
{
return bucket->key;
}
index = (index + 1) % map->capacity;
}
return NULL;
}
int
HashMapIterate(HashMap * map, char **key, void **value)
{
@ -340,6 +308,8 @@ HashMapSet(HashMap * map, char *key, void *value)
unsigned long hash;
size_t index;
key = StrDuplicate(key);
if (!map || !key || !value)
{
return NULL;
@ -376,6 +346,7 @@ HashMapSet(HashMap * map, char *key, void *value)
if (!bucket->hash)
{
bucket->hash = hash;
Free(bucket->key);
bucket->key = key;
bucket->value = value;
break;
@ -385,6 +356,9 @@ HashMapSet(HashMap * map, char *key, void *value)
{
void *oldValue = bucket->value;
Free(bucket->key);
bucket->key = key;
bucket->value = value;
return oldValue;
}

View file

@ -479,8 +479,8 @@ HttpParamDecode(char *in)
if (buf)
{
Free(buf);
Free(decKey);
}
Free(decKey);
if (*in == '&')
{

View file

@ -133,11 +133,6 @@ HttpServerContextFree(HttpServerContext * c)
while (HashMapIterate(c->requestHeaders, &key, &val))
{
/*
* These are always parsed from the request, so they should
* always be on the heap.
*/
Free(key);
Free(val);
}
HashMapFree(c->requestHeaders);
@ -154,11 +149,6 @@ HttpServerContextFree(HttpServerContext * c)
* freeing it because it's probably a stack pointer.
*/
if (MemoryInfoGet(key))
{
Free(key);
}
if (MemoryInfoGet(val))
{
Free(val);
@ -169,7 +159,6 @@ HttpServerContextFree(HttpServerContext * c)
while (HashMapIterate(c->requestParams, &key, &val))
{
Free(key);
Free(val);
}
@ -600,6 +589,7 @@ HttpServerWorkerThread(void *args)
strcpy(headerValue, headerPtr);
HashMapSet(context->requestHeaders, headerKey, headerValue);
Free(headerKey);
}
server->requestHandler(context, server->handlerArgs);

View file

@ -659,19 +659,6 @@ JsonFree(HashMap * object)
while (HashMapIterate(object, &key, (void **) &value))
{
/*
* The key might not always be on the heap. In cases
* where the JSON object is built programmatically instead
* of with the parser, stack strings will probably have been
* used as the key.
*/
MemoryInfo *i = MemoryInfoGet(key);
if (i)
{
Free(key);
}
JsonValueFree(value);
}
@ -989,6 +976,7 @@ JsonDecodeObject(JsonParserState * state)
/* If there's an existing value at this key, discard it. */
JsonValueFree(HashMapSet(obj, key, value));
Free(key);
JsonTokenSeek(state);
if (JsonExpect(state, TOKEN_OBJECT_CLOSE))

View file

@ -92,7 +92,7 @@ BuildFlows(Array * flows)
ArrayAdd(responseStages, JsonValueString(StrDuplicate(stage->type)));
if (stage->params)
{
JsonValueFree(HashMapSet(responseParams, StrDuplicate(stage->type), JsonValueObject(stage->params)));
JsonValueFree(HashMapSet(responseParams, stage->type, JsonValueObject(stage->params)));
}
}
}

View file

@ -295,8 +295,6 @@ UserLogin(User * user, char *password, char *deviceId, char *deviceDisplayName,
{
JsonValue *val;
Free(deviceId);
val = HashMapDelete(device, "accessToken");
if (val)
{
@ -324,6 +322,8 @@ UserLogin(User * user, char *password, char *deviceId, char *deviceDisplayName,
}
Free(deviceId);
if (result->refreshToken)
{
HashMapSet(device, "refreshToken",
@ -556,17 +556,13 @@ UserDeleteToken(User * user, char *token)
devicejson = HashMapGet(userjson, "devices");
if (JsonValueType(devicejson) == JSON_OBJECT)
{
char *key;
/* Delete our object */
deviceobject = JsonValueAsObject(devicejson);
key = HashMapGetKey(deviceobject, deviceid);
deletedval = HashMapDelete(deviceobject, deviceid);
if (!deletedval)
{
return 0;
}
Free(key);
JsonValueFree(deletedval);
}

View file

@ -42,9 +42,6 @@ extern void *
extern void *
HashMapGet(HashMap *, const char *);
extern void *
HashMapGetKey(HashMap *, const char *);
extern void *
HashMapDelete(HashMap *, const char *);