struct sol_str_slice sol_file_reader_get_all(const struct sol_file_reader *fr) { return (struct sol_str_slice) { .len = fr->st.st_size, .data = fr->contents, }; } const struct stat * sol_file_reader_get_stat(const struct sol_file_reader *fr) { return &fr->st; } struct sol_blob_file_reader { struct sol_blob base; struct sol_file_reader *fr; }; static void _sol_blob_type_file_reader_close(struct sol_blob *blob) { struct sol_blob_file_reader *b = (struct sol_blob_file_reader *)blob; sol_file_reader_close(b->fr); free(blob); } static const struct sol_blob_type _SOL_BLOB_TYPE_FILE_READER = { #ifndef SOL_NO_API_VERSION .api_version = SOL_BLOB_TYPE_API_VERSION, .sub_api = 1, #endif .free = _sol_blob_type_file_reader_close }; SOL_API struct sol_blob * sol_file_reader_to_blob(struct sol_file_reader *fr) { struct sol_blob_file_reader *b; struct sol_str_slice c = sol_file_reader_get_all(fr); b = calloc(1, sizeof(struct sol_blob_file_reader)); SOL_NULL_CHECK_GOTO(b, error); sol_blob_setup(&b->base, &_SOL_BLOB_TYPE_FILE_READER, c.data, c.len); b->fr = fr; return &b->base; error: sol_file_reader_close(fr); return NULL; }
SOL_API struct sol_blob * sol_blob_new(const struct sol_blob_type *type, struct sol_blob *parent, const void *mem, size_t size) { struct sol_blob *blob; SOL_NULL_CHECK(type, NULL); #ifndef SOL_NO_API_VERSION SOL_INT_CHECK(type->api_version, != SOL_BLOB_TYPE_API_VERSION, NULL); #endif blob = calloc(1, sizeof(struct sol_blob)); SOL_NULL_CHECK(blob, NULL); if (sol_blob_setup(blob, type, mem, size) < 0) { free(blob); return NULL; } if (parent) sol_blob_set_parent(blob, parent); return blob; }