#include "convert.h" #include #include #include #include struct mie_ir_converter *mie_ir_converter_create( struct mie_ctx *ctx, enum mie_ir_format src, enum mie_ir_format dest) { if (src == dest) { return NULL; } struct mie_ir_converter *out = malloc(sizeof *out); if (!out) { return NULL; } memset(out, 0x0, sizeof *out); out->c_ctx = ctx; out->c_src_format = src; out->c_dest_format = dest; return out; } void mie_ir_converter_destroy(struct mie_ir_converter *converter) { free(converter); } b_status mie_ir_converter_set_src_value( struct mie_ir_converter *converter, struct mie_value *value) { if (converter->c_src_format != MIE_IR_MEM) { return B_ERR_INVALID_ARGUMENT; } converter->c_src_medium = MIE_IR_CONVERTER_MIE_VALUE; converter->c_src.value = value; return B_SUCCESS; } b_status mie_ir_converter_set_src_bitbuffer( struct mie_ir_converter *converter, b_bitbuffer *bitbuffer) { if (converter->c_src_format != MIE_IR_BITCODE) { return B_ERR_INVALID_ARGUMENT; } converter->c_src_medium = MIE_IR_CONVERTER_BITBUFFER; converter->c_src.bitbuffer = bitbuffer; return B_SUCCESS; } b_status mie_ir_converter_set_src_stringstream( struct mie_ir_converter *converter, b_stringstream *stringstream) { if (converter->c_src_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_src_medium = MIE_IR_CONVERTER_STRINGSTREAM; converter->c_src.stringstream = stringstream; return B_SUCCESS; } b_status mie_ir_converter_set_src_string( struct mie_ir_converter *converter, b_string *string) { if (converter->c_src_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_src_medium = MIE_IR_CONVERTER_STRING; converter->c_src.string = string; return B_SUCCESS; } b_status mie_ir_converter_set_src_file(struct mie_ir_converter *converter, FILE *file) { if (converter->c_src_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_src_medium = MIE_IR_CONVERTER_FILE; converter->c_src.file = file; return B_SUCCESS; } b_status mie_ir_converter_set_dest_value( struct mie_ir_converter *converter, struct mie_value **value) { if (converter->c_dest_format != MIE_IR_MEM) { return B_ERR_INVALID_ARGUMENT; } converter->c_dest_medium = MIE_IR_CONVERTER_MIE_VALUE; converter->c_dest.value = value; return B_SUCCESS; } b_status mie_ir_converter_set_dest_bitbuffer( struct mie_ir_converter *converter, b_bitbuffer *bitbuffer) { if (converter->c_dest_format != MIE_IR_BITCODE) { return B_ERR_INVALID_ARGUMENT; } converter->c_dest_medium = MIE_IR_CONVERTER_BITBUFFER; converter->c_dest.bitbuffer = bitbuffer; return B_SUCCESS; } b_status mie_ir_converter_set_dest_stringstream( struct mie_ir_converter *converter, b_stringstream *stringstream) { if (converter->c_dest_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_dest_medium = MIE_IR_CONVERTER_STRINGSTREAM; converter->c_dest.stringstream = stringstream; return B_SUCCESS; } b_status mie_ir_converter_set_dest_string( struct mie_ir_converter *converter, b_string *string) { if (converter->c_dest_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_dest_medium = MIE_IR_CONVERTER_STRING; converter->c_dest.string = string; return B_SUCCESS; } b_status mie_ir_converter_set_dest_file( struct mie_ir_converter *converter, FILE *file) { if (converter->c_dest_format != MIE_IR_TEXT) { return B_ERR_INVALID_ARGUMENT; } converter->c_dest_medium = MIE_IR_CONVERTER_FILE; converter->c_dest.file = file; return B_SUCCESS; } static b_status read_value_from_medium( struct mie_ir_converter *converter, struct mie_value **value) { switch (converter->c_src_format) { case MIE_IR_MEM: *value = converter->c_src.value; return B_SUCCESS; case MIE_IR_TEXT: return read_value_from_text(converter, value); case MIE_IR_BITCODE: return read_value_from_bitcode(converter, value); default: return B_ERR_NOT_SUPPORTED; } } static b_status write_value_to_medium( struct mie_ir_converter *converter, struct mie_value *value) { switch (converter->c_dest_format) { case MIE_IR_MEM: *converter->c_dest.value = value; return B_SUCCESS; case MIE_IR_TEXT: return write_value_to_text(converter, value); case MIE_IR_BITCODE: return write_value_to_bitcode(converter, value); default: return B_ERR_NOT_SUPPORTED; } } b_status mie_ir_converter_process(struct mie_ir_converter *converter) { b_status status = B_SUCCESS; struct mie_value *value = NULL; status = read_value_from_medium(converter, &value); if (!B_OK(status)) { return status; } if (!value) { return B_ERR_BAD_FORMAT; } status = write_value_to_medium(converter, value); if (converter->c_src_format != MIE_IR_MEM) { mie_value_destroy(value); } return status; }