@@ -19530,6 +19530,103 @@ struct gguf_context * gguf_init_empty(void) {
19530
19530
return ctx;
19531
19531
}
19532
19532
19533
+
19534
+ struct gguf_context * gguf_read_headers(const char * fname)
19535
+ {
19536
+ FILE * file = fopen(fname, "rb");
19537
+ if (!file) {
19538
+ return NULL;
19539
+ }
19540
+
19541
+ // offset from start of file
19542
+ size_t offset = 0;
19543
+ uint32_t magic = 0;
19544
+ gguf_fread_el(file, &magic, sizeof(magic), &offset); bool ok = true;
19545
+ struct gguf_context * ctx = GGML_ALIGNED_MALLOC(sizeof(struct gguf_context));
19546
+ // read the header
19547
+ {
19548
+ ctx->header.magic = magic;
19549
+ ctx->kv = NULL;
19550
+ ctx->infos = NULL;
19551
+ ctx->data = NULL;
19552
+ ok = ok && gguf_fread_el(file, &ctx->header.version, sizeof(ctx->header.version), &offset);
19553
+ ok = ok && gguf_fread_el(file, &ctx->header.n_tensors, sizeof(ctx->header.n_tensors), &offset);
19554
+ ok = ok && gguf_fread_el(file, &ctx->header.n_kv, sizeof(ctx->header.n_kv), &offset);
19555
+
19556
+ if (!ok) {
19557
+ fprintf(stderr, "%s: failed to read header\n", __func__);
19558
+ fclose(file);
19559
+ gguf_free(ctx);
19560
+ return NULL;
19561
+ }
19562
+ }
19563
+
19564
+ // read the kv pairs
19565
+ {
19566
+ ctx->kv = GGML_ALIGNED_MALLOC(ctx->header.n_kv * sizeof(struct gguf_kv));
19567
+ for (uint32_t i = 0; i < ctx->header.n_kv; ++i) {
19568
+ struct gguf_kv * kv = &ctx->kv[i];
19569
+ ok = ok && gguf_fread_str(file, &kv->key, &offset);
19570
+ ok = ok && gguf_fread_el (file, &kv->type, sizeof(kv->type), &offset);
19571
+ switch (kv->type) {
19572
+ case GGUF_TYPE_UINT8: ok = ok && gguf_fread_el (file, &kv->value.uint8, sizeof(kv->value.uint8), &offset); break;
19573
+ case GGUF_TYPE_INT8: ok = ok && gguf_fread_el (file, &kv->value.int8, sizeof(kv->value.int8), &offset); break;
19574
+ case GGUF_TYPE_UINT16: ok = ok && gguf_fread_el (file, &kv->value.uint16, sizeof(kv->value.uint16), &offset); break;
19575
+ case GGUF_TYPE_INT16: ok = ok && gguf_fread_el (file, &kv->value.int16, sizeof(kv->value.int16), &offset); break;
19576
+ case GGUF_TYPE_UINT32: ok = ok && gguf_fread_el (file, &kv->value.uint32, sizeof(kv->value.uint32), &offset); break;
19577
+ case GGUF_TYPE_INT32: ok = ok && gguf_fread_el (file, &kv->value.int32, sizeof(kv->value.int32), &offset); break;
19578
+ case GGUF_TYPE_FLOAT32: ok = ok && gguf_fread_el (file, &kv->value.float32, sizeof(kv->value.float32), &offset); break;
19579
+ case GGUF_TYPE_BOOL: ok = ok && gguf_fread_el (file, &kv->value.bool_, sizeof(kv->value.bool_), &offset); break;
19580
+ case GGUF_TYPE_STRING: ok = ok && gguf_fread_str(file, &kv->value.str, &offset); break;
19581
+ case GGUF_TYPE_ARRAY:
19582
+ {
19583
+ ok = ok && gguf_fread_el(file, &kv->value.arr.type, sizeof(kv->value.arr.type), &offset);
19584
+ ok = ok && gguf_fread_el(file, &kv->value.arr.n, sizeof(kv->value.arr.n), &offset);
19585
+
19586
+ switch (kv->value.arr.type) {
19587
+ case GGUF_TYPE_UINT8:
19588
+ case GGUF_TYPE_INT8:
19589
+ case GGUF_TYPE_UINT16:
19590
+ case GGUF_TYPE_INT16:
19591
+ case GGUF_TYPE_UINT32:
19592
+ case GGUF_TYPE_INT32:
19593
+ case GGUF_TYPE_FLOAT32:
19594
+ case GGUF_TYPE_BOOL:
19595
+ {
19596
+ kv->value.arr.data = malloc(kv->value.arr.n * GGUF_TYPE_SIZE[kv->value.arr.type]);
19597
+ ok = ok && gguf_fread_el(file, kv->value.arr.data, kv->value.arr.n * GGUF_TYPE_SIZE[kv->value.arr.type], &offset);
19598
+ } break;
19599
+ case GGUF_TYPE_STRING:
19600
+ {
19601
+ kv->value.arr.data = malloc(kv->value.arr.n * sizeof(struct gguf_str));
19602
+ for (uint32_t j = 0; j < kv->value.arr.n; ++j) {
19603
+ ok = ok && gguf_fread_str(file, &((struct gguf_str *) kv->value.arr.data)[j], &offset);
19604
+ }
19605
+ } break;
19606
+ case GGUF_TYPE_ARRAY:
19607
+ case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break;
19608
+ };
19609
+ } break;
19610
+ case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type");
19611
+ };
19612
+
19613
+ if (!ok) {
19614
+ break;
19615
+ }
19616
+ }
19617
+
19618
+ if (!ok) {
19619
+ fprintf(stderr, "%s: failed to read key-value pairs\n", __func__);
19620
+ fclose(file);
19621
+ gguf_free(ctx);
19622
+ return NULL;
19623
+ }
19624
+ }
19625
+
19626
+ fclose(file);
19627
+ return ctx;
19628
+ }
19629
+
19533
19630
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
19534
19631
FILE * file = fopen(fname, "rb");
19535
19632
if (!file) {
0 commit comments