X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=wrappergen%2Fwrite_jna.c;h=0960578c25e680d76be8e49481dc4748d7c40009;hb=3f3175b653a9a02b08a50a23199b5451ade318bc;hp=09ef6aa85f2c6a250771bd7ebfe21b7defd41f2a;hpb=911636db3ac676ff861f72277f68e0e2e0d2c3d6;p=cparser diff --git a/wrappergen/write_jna.c b/wrappergen/write_jna.c index 09ef6aa..0960578 100644 --- a/wrappergen/write_jna.c +++ b/wrappergen/write_jna.c @@ -32,7 +32,8 @@ #include "printer.h" #include "adt/error.h" #include "adt/xmalloc.h" -#include +#include "adt/pset_new.h" +#include "separator_t.h" typedef struct output_limit { const char *filename; @@ -49,7 +50,7 @@ static bool is_system_header(const char *fname) { if (strstart(fname, "/usr/include")) return true; - if (fname == builtin_source_position.input_name) + if (fname == builtin_position.input_name) return true; return false; } @@ -226,7 +227,7 @@ static void write_type(type_t *type) case TYPE_ERROR: case TYPE_TYPEOF: case TYPE_TYPEDEF: - panic("invalid type found"); + panic("invalid type"); case TYPE_ARRAY: case TYPE_REFERENCE: case TYPE_FUNCTION: @@ -275,7 +276,7 @@ static void write_unary_expression(const unary_expression_t *expression) write_expression(expression->value); return; default: - panic("unimeplemented unary expression found"); + panic("unimplemented unary expression"); } write_expression(expression->value); } @@ -303,18 +304,22 @@ static void write_binary_expression(const binary_expression_t *expression) fputs(")", out); } +static void write_integer(const literal_expression_t *literal) +{ + for (const char *c = literal->value.begin; c != literal->suffix; ++c) { + fputc(*c, out); + } +} + static void write_expression(const expression_t *expression) { /* TODO */ switch(expression->kind) { case EXPR_LITERAL_INTEGER: - case EXPR_LITERAL_INTEGER_OCTAL: - fprintf(out, "%s", expression->literal.value.begin); - break; - case EXPR_LITERAL_INTEGER_HEXADECIMAL: - fprintf(out, "0x%s", expression->literal.value.begin); + write_integer(&expression->literal); break; - case EXPR_REFERENCE_ENUM_VALUE: { + + case EXPR_ENUM_CONSTANT: { /* UHOH... hacking */ entity_t *entity = expression->reference.entity; write_enum_name(& entity->enum_value.enum_type->enumt); @@ -400,7 +405,7 @@ static void write_variable(const entity_t *entity) static void write_function(const entity_t *entity) { - if (entity->function.statement != NULL) { + if (entity->function.body != NULL) { fprintf(stderr, "Warning: can't convert function bodies (at %s)\n", entity->base.symbol->string); return; @@ -416,16 +421,12 @@ static void write_function(const entity_t *entity) write_type(return_type); fprintf(out, " %s(", entity->base.symbol->string); - entity_t *parameter = entity->function.parameters.entities; - int first = 1; - int n = 0; + entity_t *parameter = entity->function.parameters.entities; + separator_t sep = { "", ", " }; + int n = 0; for ( ; parameter != NULL; parameter = parameter->base.next) { assert(parameter->kind == ENTITY_PARAMETER); - if(!first) { - fprintf(out, ", "); - } else { - first = 0; - } + fputs(sep_next(&sep), out); write_type(parameter->declaration.type); if(parameter->base.symbol != NULL) { fprintf(out, " %s", fix_builtin_names(parameter->base.symbol->string)); @@ -434,11 +435,7 @@ static void write_function(const entity_t *entity) } } if(function_type->variadic) { - if(!first) { - fprintf(out, ", "); - } else { - first = 0; - } + fputs(sep_next(&sep), out); fputs("Object ... args", out); } fprintf(out, ");\n"); @@ -520,8 +517,7 @@ void write_jna_decls(FILE *output, const translation_unit_t *unit) } #if 0 - if(type->kind == TYPE_COMPOUND_STRUCT - || type->kind == TYPE_COMPOUND_UNION) { + if (is_type_compound(type)) { write_compound(entity->base.symbol, &type->compound); } #endif @@ -532,7 +528,7 @@ void write_jna_decls(FILE *output, const translation_unit_t *unit) for ( ; entity != NULL; entity = entity->base.next) { if (entity->kind != ENTITY_FUNCTION) continue; - const char *input_name = entity->base.source_position.input_name; + const char *input_name = entity->base.pos.input_name; if (is_system_header(input_name)) continue; if (entity->function.elf_visibility != ELF_VISIBILITY_DEFAULT)