Beispiel #1
0
_RIBS_INLINE_ int file_writer_write(struct file_writer *fw, const void *buf, size_t size) {
    for (;;) {
        size_t wav = file_writer_wavail(fw);
        size_t n = wav >= size ? size : wav;
        memcpy(file_writer_wloc(fw), buf, n);
        file_writer_wseek(fw, n);
        size -= n;
        if (0 == size) break;
        buf += n;
    }
    return 0;
}
Beispiel #2
0
int ds_var_field_writer_close(struct ds_var_field_writer *dsvfw) {
    if (0 > ds_var_field_writer_new_row(dsvfw) ||
        0 > file_writer_align(&dsvfw->data))
        return -1;
    size_t ofs_table = file_writer_wlocpos(&dsvfw->data);
    if (0 > file_writer_write(&dsvfw->data, vmbuf_data(&dsvfw->ofs_table), vmbuf_wlocpos(&dsvfw->ofs_table)))
        return -1;

    size_t ofs_last = file_writer_wlocpos(&dsvfw->data);
    if (0 > file_writer_lseek(&dsvfw->data, 0, SEEK_SET))
        return -1;

    struct ds_var_field_header *header = (struct ds_var_field_header *)file_writer_wloc(&dsvfw->data);
    header->type = -header->type;
    header->ofs_table = ofs_table;
    if (0 > file_writer_lseek(&dsvfw->data, ofs_last, SEEK_SET) ||
        0 > file_writer_close(&dsvfw->data))
        return -1;
    vmbuf_free(&dsvfw->ofs_table);
    return 0;
}