@@ -1349,6 +1349,46 @@ static void gguf_write_out(const struct gguf_context * ctx, Writer & gw, bool on
1349
1349
}
1350
1350
}
1351
1351
1352
+ // file based writer
1353
+ struct gguf_writer_file final : public gguf_writer_base {
1354
+ FILE * file;
1355
+ bool ok {true };
1356
+
1357
+ gguf_writer_file (FILE* file) : file(file) {}
1358
+
1359
+ using gguf_writer_base::write;
1360
+
1361
+ void write (const int8_t val) override {
1362
+ const auto ret = fputc (val, file);
1363
+ written_bytes++;
1364
+ ok = ok && ret == val;
1365
+ }
1366
+
1367
+ void write (const std::vector<int8_t > & val) override {
1368
+ const auto ret = fwrite (val.data (), 1 , val.size (), file);
1369
+ written_bytes += val.size ();
1370
+ ok = ok && ret == val.size ();
1371
+ }
1372
+
1373
+ void write_tensor_data (const struct gguf_tensor_info & info, const size_t offset_data, const size_t alignment) override {
1374
+ GGML_ASSERT (written_bytes - offset_data == info.offset );
1375
+
1376
+ GGML_ASSERT (ggml_is_contiguous (&info.t ));
1377
+ const size_t nbytes = ggml_nbytes (&info.t );
1378
+
1379
+ std::vector<int8_t > buf (nbytes);
1380
+ if (info.t .buffer ) {
1381
+ ggml_backend_tensor_get (&info.t , buf.data (), 0 , nbytes);
1382
+ } else {
1383
+ GGML_ASSERT (info.t .data );
1384
+ memcpy (buf.data (), info.t .data , nbytes);
1385
+ }
1386
+ write (buf);
1387
+
1388
+ pad (alignment);
1389
+ }
1390
+ };
1391
+
1352
1392
void gguf_write_to_buf (const struct gguf_context * ctx, std::vector<int8_t > & buf, bool only_meta) {
1353
1393
gguf_writer_buf gw (buf);
1354
1394
gguf_write_out (ctx, gw, only_meta);
@@ -1362,11 +1402,11 @@ bool gguf_write_to_file(const struct gguf_context * ctx, const char * fname, boo
1362
1402
return false ;
1363
1403
}
1364
1404
1365
- std::vector< int8_t > buf ;
1366
- gguf_write_to_buf (ctx, buf , only_meta);
1367
- const bool ok = fwrite (buf. data (), 1 , buf. size (), file) == buf. size ();
1405
+ gguf_writer_file gw (file) ;
1406
+ gguf_write_out (ctx, gw , only_meta);
1407
+
1368
1408
fclose (file);
1369
- return ok;
1409
+ return gw. ok ;
1370
1410
}
1371
1411
1372
1412
size_t gguf_get_meta_size (const struct gguf_context * ctx) {
0 commit comments