Skip to content

Commit 7b5d5a4

Browse files
committed
WIP
1 parent 37a8f44 commit 7b5d5a4

File tree

2 files changed

+175
-90
lines changed

2 files changed

+175
-90
lines changed

c/subprojects/kastore/kastore.c

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ kas_strerror(int err)
3434
ret = "Bad open mode; must be \"r\", \"w\", or \"a\"";
3535
break;
3636
case KAS_ERR_BAD_FLAGS:
37-
ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP, "
38-
"KAS_READ_ALL or ) or 0 can be specified "
37+
ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP and/or"
38+
"KAS_READ_ALL) or 0 can be specified "
3939
"for open, and KAS_BORROWS_ARRAY or 0 for put";
4040
break;
4141
case KAS_ERR_NO_MEMORY:
@@ -683,14 +683,39 @@ kastore_close(kastore_t *self)
683683
return ret;
684684
}
685685

686+
static int
687+
kastore_find_item(kastore_t *self, const char *key, size_t key_len, kaitem_t **item)
688+
{
689+
int ret = KAS_ERR_KEY_NOT_FOUND;
690+
kaitem_t search;
691+
search.key = (char *) malloc(key_len);
692+
search.key_len = key_len;
693+
694+
if (self->mode != KAS_READ) {
695+
ret = KAS_ERR_ILLEGAL_OPERATION;
696+
goto out;
697+
}
698+
if (search.key == NULL) {
699+
ret = KAS_ERR_NO_MEMORY;
700+
goto out;
701+
}
702+
memcpy(search.key, key, key_len);
703+
*item = bsearch(
704+
&search, self->items, self->num_items, sizeof(kaitem_t), compare_items);
705+
if (*item == NULL) {
706+
goto out;
707+
}
708+
ret = 0;
709+
out:
710+
kas_safe_free(search.key);
711+
return ret;
712+
}
713+
686714
int KAS_WARN_UNUSED
687715
kastore_contains(kastore_t *self, const char *key, size_t key_len)
688716
{
689-
void *array;
690-
size_t array_len;
691-
int type;
692-
int ret = kastore_get(self, key, key_len, &array, &array_len, &type);
693-
717+
kaitem_t *item;
718+
int ret = kastore_find_item(self, key, key_len, &item);
694719
if (ret == 0) {
695720
ret = 1;
696721
} else if (ret == KAS_ERR_KEY_NOT_FOUND) {
@@ -709,24 +734,9 @@ int KAS_WARN_UNUSED
709734
kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
710735
size_t *array_len, int *type)
711736
{
712-
int ret = KAS_ERR_KEY_NOT_FOUND;
713-
kaitem_t search;
714737
kaitem_t *item;
715-
search.key = (char *) malloc(key_len);
716-
search.key_len = key_len;
717-
718-
if (self->mode != KAS_READ) {
719-
ret = KAS_ERR_ILLEGAL_OPERATION;
720-
goto out;
721-
}
722-
if (search.key == NULL) {
723-
ret = KAS_ERR_NO_MEMORY;
724-
goto out;
725-
}
726-
memcpy(search.key, key, key_len);
727-
item = bsearch(
728-
&search, self->items, self->num_items, sizeof(kaitem_t), compare_items);
729-
if (item == NULL) {
738+
int ret = kastore_find_item(self, key, key_len, &item);
739+
if (ret != 0) {
730740
goto out;
731741
}
732742
if (item->array == NULL) {
@@ -743,7 +753,6 @@ kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
743753
}
744754
ret = 0;
745755
out:
746-
kas_safe_free(search.key);
747756
return ret;
748757
}
749758

@@ -908,6 +917,12 @@ kastore_bput(kastore_t *self, const char *key, size_t key_len, const void *array
908917
if (ret != 0) {
909918
goto out;
910919
}
920+
if (array == NULL) {
921+
/* Both can't be null, so assign a dummy array */
922+
item->array = malloc(1);
923+
} else {
924+
item->borrowed_array = array;
925+
}
911926
item->borrowed_array = array;
912927
item->array_len = array_len;
913928
out:

0 commit comments

Comments
 (0)