@@ -19071,8 +19071,9 @@ static const size_t GGUF_TYPE_SIZE[GGUF_TYPE_COUNT] = {
19071
19071
[GGUF_TYPE_INT64] = sizeof(int64_t),
19072
19072
[GGUF_TYPE_FLOAT64] = sizeof(double),
19073
19073
[GGUF_TYPE_ARRAY] = 0, // undefined
19074
+ [GGUF_TYPE_OBJ] = 0, // undefined
19074
19075
};
19075
- static_assert(GGUF_TYPE_COUNT == 13 , "GGUF_TYPE_COUNT != 13 ");
19076
+ static_assert(GGUF_TYPE_COUNT == 14 , "GGUF_TYPE_COUNT != 14 ");
19076
19077
19077
19078
static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
19078
19079
[GGUF_TYPE_UINT8] = "u8",
@@ -19088,8 +19089,9 @@ static const char * GGUF_TYPE_NAME[GGUF_TYPE_COUNT] = {
19088
19089
[GGUF_TYPE_UINT64] = "u64",
19089
19090
[GGUF_TYPE_INT64] = "i64",
19090
19091
[GGUF_TYPE_FLOAT64] = "f64",
19092
+ [GGUF_TYPE_OBJ] = "obj",
19091
19093
};
19092
- static_assert(GGUF_TYPE_COUNT == 13 , "GGUF_TYPE_COUNT != 13 ");
19094
+ static_assert(GGUF_TYPE_COUNT == 14 , "GGUF_TYPE_COUNT != 14 ");
19093
19095
19094
19096
union gguf_value {
19095
19097
uint8_t uint8;
@@ -19278,6 +19280,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
19278
19280
case GGUF_TYPE_FLOAT64: ok = ok && gguf_fread_el (file, &kv->value.float64, sizeof(kv->value.float64), &offset); break;
19279
19281
case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
19280
19282
case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19283
+ case GGUF_TYPE_OBJ:
19281
19284
case GGUF_TYPE_ARRAY:
19282
19285
{
19283
19286
ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
@@ -19306,6 +19309,7 @@ struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_p
19306
19309
ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
19307
19310
}
19308
19311
} break;
19312
+ case GGUF_TYPE_OBJ:
19309
19313
case GGUF_TYPE_ARRAY:
19310
19314
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
19311
19315
}
@@ -19507,7 +19511,7 @@ void gguf_free(struct gguf_context * ctx) {
19507
19511
}
19508
19512
}
19509
19513
19510
- if (kv->type == GGUF_TYPE_ARRAY) {
19514
+ if (kv->type == GGUF_TYPE_ARRAY || kv->type == GGUF_TYPE_OBJ ) {
19511
19515
if (kv->value.arr.data) {
19512
19516
if (kv->value.arr.type == GGUF_TYPE_STRING) {
19513
19517
for (uint64_t j = 0; j < kv->value.arr.n; ++j) {
@@ -19604,15 +19608,15 @@ const void * gguf_get_arr_data(const struct gguf_context * ctx, int key_id) {
19604
19608
19605
19609
const char * gguf_get_arr_str(const struct gguf_context * ctx, int key_id, int i) {
19606
19610
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19607
- GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19611
+ GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ );
19608
19612
struct gguf_kv * kv = &ctx->kv[key_id];
19609
19613
struct gguf_str * str = &((struct gguf_str *) kv->value.arr.data)[i];
19610
19614
return str->data;
19611
19615
}
19612
19616
19613
19617
int gguf_get_arr_n(const struct gguf_context * ctx, int key_id) {
19614
19618
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19615
- GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY);
19619
+ GGML_ASSERT(ctx->kv[key_id].type == GGUF_TYPE_ARRAY || ctx->kv[key_id].type == GGUF_TYPE_OBJ );
19616
19620
return ctx->kv[key_id].value.arr.n;
19617
19621
}
19618
19622
@@ -19691,6 +19695,7 @@ const char * gguf_get_val_str(const struct gguf_context * ctx, int key_id) {
19691
19695
const void * gguf_get_val_data(const struct gguf_context * ctx, int key_id) {
19692
19696
GGML_ASSERT(key_id >= 0 && key_id < gguf_get_n_kv(ctx));
19693
19697
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_ARRAY);
19698
+ GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_OBJ);
19694
19699
GGML_ASSERT(ctx->kv[key_id].type != GGUF_TYPE_STRING);
19695
19700
return &ctx->kv[key_id].value;
19696
19701
}
@@ -19853,6 +19858,20 @@ void gguf_set_arr_str(struct gguf_context * ctx, const char * key, const char **
19853
19858
}
19854
19859
}
19855
19860
19861
+ void gguf_set_obj_str(struct gguf_context * ctx, const char * key, const char ** data, int n) {
19862
+ const int idx = gguf_get_or_add_key(ctx, key);
19863
+
19864
+ ctx->kv[idx].type = GGUF_TYPE_OBJ;
19865
+ ctx->kv[idx].value.arr.type = GGUF_TYPE_STRING;
19866
+ ctx->kv[idx].value.arr.n = n;
19867
+ ctx->kv[idx].value.arr.data = malloc(n*sizeof(struct gguf_str));
19868
+ for (int i = 0; i < n; i++) {
19869
+ struct gguf_str * str = &((struct gguf_str *)ctx->kv[idx].value.arr.data)[i];
19870
+ str->n = strlen(data[i]);
19871
+ str->data = strdup(data[i]);
19872
+ }
19873
+ }
19874
+
19856
19875
// set or add KV pairs from another context
19857
19876
void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
19858
19877
for (uint32_t i = 0; i < src->header.n_kv; i++) {
@@ -19869,6 +19888,15 @@ void gguf_set_kv(struct gguf_context * ctx, struct gguf_context * src) {
19869
19888
case GGUF_TYPE_FLOAT64: gguf_set_val_f64 (ctx, src->kv[i].key.data, src->kv[i].value.float64); break;
19870
19889
case GGUF_TYPE_BOOL: gguf_set_val_bool(ctx, src->kv[i].key.data, src->kv[i].value.bool_); break;
19871
19890
case GGUF_TYPE_STRING: gguf_set_val_str (ctx, src->kv[i].key.data, src->kv[i].value.str.data); break;
19891
+ case GGUF_TYPE_OBJ:
19892
+ {
19893
+ const char ** data = malloc(src->kv[i].value.arr.n*sizeof(char *));
19894
+ for (uint32_t j = 0; j < src->kv[i].value.arr.n; j++) {
19895
+ data[j] = ((struct gguf_str *)src->kv[i].value.arr.data)[j].data;
19896
+ }
19897
+ gguf_set_obj_str(ctx, src->kv[i].key.data, data, src->kv[i].value.arr.n);
19898
+ free((void *)data);
19899
+ } break;
19872
19900
case GGUF_TYPE_ARRAY:
19873
19901
{
19874
19902
if (src->kv[i].value.arr.type == GGUF_TYPE_STRING) {
@@ -20033,6 +20061,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
20033
20061
case GGUF_TYPE_FLOAT64: gguf_bwrite_el (buf, &kv->value.float64, sizeof(kv->value.float64)); break;
20034
20062
case GGUF_TYPE_BOOL: gguf_bwrite_el (buf, &kv->value.bool_, sizeof(kv->value.bool_) ); break;
20035
20063
case GGUF_TYPE_STRING: gguf_bwrite_str(buf, &kv->value.str ); break;
20064
+ case GGUF_TYPE_OBJ:
20036
20065
case GGUF_TYPE_ARRAY:
20037
20066
{
20038
20067
gguf_bwrite_el(buf, &kv->value.arr.type, sizeof(kv->value.arr.type));
@@ -20059,6 +20088,7 @@ static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf *
20059
20088
gguf_bwrite_str(buf, &((struct gguf_str *) kv->value.arr.data)[j]);
20060
20089
}
20061
20090
} break;
20091
+ case GGUF_TYPE_OBJ:
20062
20092
case GGUF_TYPE_ARRAY:
20063
20093
case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
20064
20094
}
0 commit comments