217 lines
4.7 KiB
C
217 lines
4.7 KiB
C
#include "convert.h"
|
|
|
|
#include <mie/convert.h>
|
|
#include <mie/value.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
struct mie_ir_converter *mie_ir_converter_create(
|
|
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_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;
|
|
}
|