From c2051d30ae0169f988cb1e7c8e115e2c5fbc2527 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 5 Sep 2015 17:05:46 +0200 Subject: [PATCH] Allow assembly to file handlers directly --- src/code.c | 51 ++++++++++++++++++++++++++++++++++++++------------- src/code.h | 1 + 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/code.c b/src/code.c index 2a6fb92..762702b 100644 --- a/src/code.c +++ b/src/code.c @@ -458,27 +458,52 @@ int asmcode_instruction(AsmCode * code, AsmArchInstructionCall * call) /* asmcode_open */ int asmcode_open(AsmCode * code, char const * filename) { + int ret; + FILE * fp; + if(code->filename != NULL || code->fp != NULL) return -error_set_code(1, "A file is already opened"); - if((code->filename = string_new(filename)) == NULL) - return -1; - if((code->fp = fopen(filename, "w+")) == NULL) + if((fp = fopen(filename, "w+")) == NULL) return -error_set_code(1, "%s: %s", filename, strerror(errno)); - if(arch_init(code->arch, code->filename, code->fp) == 0) + if((ret = asmcode_open_file(code, filename, fp)) == 0) + return 0; + fclose(fp); + unlink(filename); /* XXX may fail */ + return ret; +} + + +/* asmcode_open_file */ +int asmcode_open_file(AsmCode * code, char const * filename, FILE * fp) +{ + String * p; + String const * arch; + String const * format; + + if(code->filename != NULL || code->fp != NULL) + return -error_set_code(1, "A file is already opened"); + if(filename != NULL && (p = string_new(filename)) == NULL) + return -1; + if(arch_init(code->arch, filename, fp) == 0) { + arch = arch_get_name(code->arch); + format = arch_get_format(code->arch); if(code->format == NULL) - code->format = format_new(arch_get_format(code->arch)); - if(code->format != NULL && format_init(code->format, - arch_get_name(code->arch), - code->filename, code->fp) == 0) + code->format = format_new(format); + if(code->format != NULL + && format_init(code->format, arch, filename, + fp) == 0) + { + code->filename = p; + code->fp = fp; return 0; + } + if(code->format != NULL) + format_exit(code->format); + code->format = NULL; arch_exit(code->arch); } - fclose(code->fp); - code->fp = NULL; - unlink(code->filename); /* XXX may fail */ - string_delete(code->filename); - code->filename = NULL; + string_delete(p); return -1; } diff --git a/src/code.h b/src/code.h index 430a280..608b0ea 100644 --- a/src/code.h +++ b/src/code.h @@ -31,6 +31,7 @@ int asmcode_delete(AsmCode * code); /* useful */ /* common */ int asmcode_open(AsmCode * code, char const * filename); +int asmcode_open_file(AsmCode * code, char const * filename, FILE * fp); int asmcode_close(AsmCode * code); /* elements */