예제 #1
0
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;
}
예제 #2
0
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;
}