@@ -19082,8 +19082,9 @@ static const size_t GGUF_TYPE_SIZE[GGUF_TYPE_COUNT] = {
19082
19082
[GGUF_TYPE_INT64] = sizeof(int64_t),
19083
19083
[GGUF_TYPE_FLOAT64] = sizeof(double),
19084
19084
[GGUF_TYPE_ARRAY] = 0, // undefined
19085
+ [GGUF_TYPE_OBJ] = 0, // undefined
19085
19086
};
19086
- static_assert(GGUF_TYPE_COUNT == 13 , "GGUF_TYPE_COUNT != 13 ");
19087
+ static_assert(GGUF_TYPE_COUNT == 14 , "GGUF_TYPE_COUNT != 14 ");
19087
19088
19088
19089
static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
19089
19090
[GGUF_TYPE_UINT8] = "u8",
@@ -19099,8 +19100,9 @@ static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
19099
19100
[GGUF_TYPE_UINT64] = "u64",
19100
19101
[GGUF_TYPE_INT64] = "i64",
19101
19102
[GGUF_TYPE_FLOAT64] = "f64",
19103
+ [GGUF_TYPE_OBJ] = "obj",
19102
19104
};
19103
- static_assert(GGUF_TYPE_COUNT == 13 , "GGUF_TYPE_COUNT != 13 ");
19105
+ static_assert(GGUF_TYPE_COUNT == 14 , "GGUF_TYPE_COUNT != 14 ");
19104
19106
19105
19107
union gguf_value {
19106
19108
uint8_t uint8;
@@ -19289,6 +19291,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
19289
19291
case GGUF_TYPE_FLOAT64: ok = ok && gguf_fread_el (file, &kv->value.float64, sizeof(kv->value.float64), &offset); break;
19290
19292
case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
19291
19293
case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19294
+ case GGUF_TYPE_OBJ:
19292
19295
case GGUF_TYPE_ARRAY:
19293
19296
{
19294
19297
ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
@@ -19317,6 +19320,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
19317
19320
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
19318
19321
}
19319
19322
} break;
19323
+ case GGUF_TYPE_OBJ:
19320
19324
case GGUF_TYPE_ARRAY:
19321
19325
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
19322
19326
}
@@ -19518,7 +19522,7 @@ void gguf_free(struct gguf_context * ctx) {
19518
19522
}
19519
19523
}
19520
19524
19521
- if (kv->type == GGUF_TYPE_ARRAY) {
19525
+ if (kv->type == GGUF_TYPE_ARRAY || kv->type == GGUF_TYPE_OBJ ) {
19522
19526
if (kv->value.arr.data) {
19523
19527
if (kv->value.arr.type == GGUF_TYPE_STRING) {
19524
19528
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
@@ -19615,15 +19619,15 @@ const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id) {
19615
19619
19616
19620
const char * gguf_get_arr_str(const struct gguf_context * ctx, int key_id, int i) {
19617
19621
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19618
- GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19622
+ GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ );
19619
19623
struct gguf_kv * kv = &ctx->kv[key_id];
19620
19624
struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[i];
19621
19625
return str->data;
19622
19626
}
19623
19627
19624
19628
int gguf_get_arr_n(const struct gguf_context * ctx, int key_id) {
19625
19629
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19626
- GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19630
+ GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ );
19627
19631
return ctx->kv[key_id].value.arr.n;
19628
19632
}
19629
19633
@@ -19702,6 +19706,7 @@ const char * gguf_get_val_str(const struct gguf_context * ctx, int key_id) {
19702
19706
const void * gguf_get_val_data(const struct gguf_context * ctx, int key_id) {
19703
19707
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19704
19708
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_ARRAY);
19709
+ GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_OBJ);
19705
19710
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_STRING);
19706
19711
return &ctx->kv[key_id].value;
19707
19712
}
@@ -19864,6 +19869,20 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
19864
19869
}
19865
19870
}
19866
19871
19872
+ void gguf_set_obj_str(struct gguf_context * ctx, const char * key, const char ** data, int n) {
19873
+ const int idx = gguf_get_or_add_key(ctx, key);
19874
+
19875
+ ctx->kv[idx].type = GGUF_TYPE_OBJ;
19876
+ ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
19877
+ ctx->kv[idx].value.arr.n = n;
19878
+ ctx->kv[idx].value.arr.data = malloc(n*sizeof(struct gguf_str));
19879
+ for (int i = 0; i < n; i++) {
19880
+ struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
19881
+ str->n = strlen(data[i]);
19882
+ str->data = strdup(data[i]);
19883
+ }
19884
+ }
19885
+
19867
19886
// set or add KV pairs from another context
19868
19887
void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
19869
19888
for (uint32_t i = 0; i < src->header.n_kv; i++) {
@@ -19880,6 +19899,15 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
19880
19899
case GGUF_TYPE_FLOAT64: gguf_set_val_f64 (ctx, src->kv[i].key.data, src->kv[i].value.float64); break;
19881
19900
case GGUF_TYPE_BOOL: gguf_set_val_bool(ctx, src->kv[i].key.data, src->kv[i].value.bool_); break;
19882
19901
case GGUF_TYPE_STRING: gguf_set_val_str (ctx, src->kv[i].key.data, src->kv[i].value.str.data); break;
19902
+ case GGUF_TYPE_OBJ:
19903
+ {
19904
+ const char ** data = malloc(src->kv[i].value.arr.n*sizeof(char *));
19905
+ for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
19906
+ data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
19907
+ }
19908
+ gguf_set_obj_str(ctx, src->kv[i].key.data, data, src->kv[i].value.arr.n);
19909
+ free((void *)data);
19910
+ } break;
19883
19911
case GGUF_TYPE_ARRAY:
19884
19912
{
19885
19913
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
@@ -20044,6 +20072,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
20044
20072
case GGUF_TYPE_FLOAT64: gguf_bwrite_el (buf, &kv->value.float64, sizeof(kv->value.float64)); break;
20045
20073
case GGUF_TYPE_BOOL: gguf_bwrite_el (buf, &kv->value.bool_, sizeof(kv->value.bool_) ); break;
20046
20074
case GGUF_TYPE_STRING: gguf_bwrite_str(buf, &kv->value.str ); break;
20075
+ case GGUF_TYPE_OBJ:
20047
20076
case GGUF_TYPE_ARRAY:
20048
20077
{
20049
20078
gguf_bwrite_el(buf, &kv->value.arr.type, sizeof(kv->value.arr.type));
@@ -20070,6 +20099,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
20070
20099
gguf_bwrite_str(buf, &((struct gguf_str *) kv->value.arr.data)[j]);
20071
20100
}
20072
20101
} break;
20102
+ case GGUF_TYPE_OBJ:
20073
20103
case GGUF_TYPE_ARRAY:
20074
20104
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
20075
20105
}
0 commit comments