@@ -20550,6 +20550,32 @@ static bool gguf_fread_str(FILE * file, struct gguf_str * p, size_t * offset) {
20550
20550
return ok;
20551
20551
}
20552
20552
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
+
20553
20579
struct gguf_context * gguf_init_empty(void) {
20554
20580
struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
20555
20581
@@ -20899,31 +20925,7 @@ void gguf_free(struct gguf_context * ctx) {
20899
20925
if (ctx->kv) {
20900
20926
// free string memory - not great..
20901
20927
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]);
20927
20929
}
20928
20930
20929
20931
GGML_FREE(ctx->kv);
@@ -21148,6 +21150,19 @@ static int gguf_get_or_add_key(struct gguf_context * ctx, const char * key) {
21148
21150
return n_kv;
21149
21151
}
21150
21152
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
+
21151
21166
void gguf_set_val_u8(struct gguf_context * ctx, const char * key, uint8_t val) {
21152
21167
const int idx = gguf_get_or_add_key(ctx, key);
21153
21168
0 commit comments