@@ -1349,6 +1349,46 @@ static void gguf_write_out(const struct gguf_context * ctx, Writer & gw, bool on
13491349    }
13501350}
13511351
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+ 
13521392void  gguf_write_to_buf (const  struct  gguf_context  * ctx, std::vector<int8_t > & buf, bool  only_meta) {
13531393    gguf_writer_buf gw (buf);
13541394    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
13621402        return  false ;
13631403    }
13641404
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+ 
13681408    fclose (file);
1369-     return  ok;
1409+     return  gw. ok ;
13701410}
13711411
13721412size_t  gguf_get_meta_size (const  struct  gguf_context  * ctx) {
0 commit comments