@@ -20550,6 +20550,32 @@ static bool gguf_fread_str(FILE * file, struct gguf_str * p, size_t * offset) {
2055020550 return ok;
2055120551}
2055220552
20553+ static void gguf_free_kv(struct gguf_kv * kv) {
20554+ if (kv->key.data) {
20555+ GGML_FREE(kv->key.data);
20556+ }
20557+
20558+ if (kv->type == GGUF_TYPE_STRING) {
20559+ if (kv->value.str.data) {
20560+ GGML_FREE(kv->value.str.data);
20561+ }
20562+ }
20563+
20564+ if (kv->type == GGUF_TYPE_ARRAY) {
20565+ if (kv->value.arr.data) {
20566+ if (kv->value.arr.type == GGUF_TYPE_STRING) {
20567+ for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
20568+ struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[j];
20569+ if (str->data) {
20570+ GGML_FREE(str->data);
20571+ }
20572+ }
20573+ }
20574+ GGML_FREE(kv->value.arr.data);
20575+ }
20576+ }
20577+ }
20578+
2055320579struct gguf_context * gguf_init_empty(void) {
2055420580 struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
2055520581
@@ -20899,31 +20925,7 @@ void gguf_free(struct gguf_context * ctx) {
2089920925 if (ctx->kv) {
2090020926 // free string memory - not great..
2090120927 for (uint64_t i = 0; i < ctx->header.n_kv; ++i) {
20902- struct gguf_kv * kv = &ctx->kv[i];
20903-
20904- if (kv->key.data) {
20905- GGML_FREE(kv->key.data);
20906- }
20907-
20908- if (kv->type == GGUF_TYPE_STRING) {
20909- if (kv->value.str.data) {
20910- GGML_FREE(kv->value.str.data);
20911- }
20912- }
20913-
20914- if (kv->type == GGUF_TYPE_ARRAY) {
20915- if (kv->value.arr.data) {
20916- if (kv->value.arr.type == GGUF_TYPE_STRING) {
20917- for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
20918- struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[j];
20919- if (str->data) {
20920- GGML_FREE(str->data);
20921- }
20922- }
20923- }
20924- GGML_FREE(kv->value.arr.data);
20925- }
20926- }
20928+ gguf_free_kv(&ctx->kv[i]);
2092720929 }
2092820930
2092920931 GGML_FREE(ctx->kv);
@@ -21148,6 +21150,19 @@ static int gguf_get_or_add_key(struct gguf_context * ctx, const char * key) {
2114821150 return n_kv;
2114921151}
2115021152
21153+ void gguf_remove_key(struct gguf_context * ctx, const char * key) {
21154+ const int idx = gguf_find_key(ctx, key);
21155+ if (idx >= 0) {
21156+ const int n_kv = gguf_get_n_kv(ctx);
21157+ gguf_free_kv(&ctx->kv[idx]);
21158+ for (int i = idx; i < n_kv-1; ++i) {
21159+ ctx->kv[i] = ctx->kv[i+1];
21160+ }
21161+ ctx->kv = realloc(ctx->kv, (n_kv - 1) * sizeof(struct gguf_kv));
21162+ ctx->header.n_kv--;
21163+ }
21164+ }
21165+
2115121166void gguf_set_val_u8(struct gguf_context * ctx, const char * key, uint8_t val) {
2115221167 const int idx = gguf_get_or_add_key(ctx, key);
2115321168
0 commit comments