X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=wrappergen%2Fwrite_jna.c;h=09ef6aa85f2c6a250771bd7ebfe21b7defd41f2a;hb=ac1cd4a72f73f7906ab1b38bc85cd1758a2f3ab3;hp=6210b012a56075b49e443b0dc1ee935070f8f9d2;hpb=6729ad230928578311c10a1be77a63caf3743bd9;p=cparser diff --git a/wrappergen/write_jna.c b/wrappergen/write_jna.c index 6210b01..09ef6aa 100644 --- a/wrappergen/write_jna.c +++ b/wrappergen/write_jna.c @@ -22,6 +22,7 @@ #include #include +#include "adt/strutil.h" #include "write_jna.h" #include "symbol_t.h" #include "ast_t.h" @@ -30,17 +31,23 @@ #include "type.h" #include "printer.h" #include "adt/error.h" +#include "adt/xmalloc.h" #include +typedef struct output_limit { + const char *filename; + struct output_limit *next; +} output_limit; + static const scope_t *global_scope; static FILE *out; static pset_new_t avoid_symbols; - -static void write_type(type_t *type); +static output_limit *output_limits; +static const char *libname; static bool is_system_header(const char *fname) { - if (strncmp(fname, "/usr/include", 12) == 0) + if (strstart(fname, "/usr/include")) return true; if (fname == builtin_source_position.input_name) return true; @@ -49,17 +56,17 @@ static bool is_system_header(const char *fname) static const char *fix_builtin_names(const char *name) { - if (strcmp(name, "class") == 0) { + if (streq(name, "class")) { return "_class"; - } else if(strcmp(name, "this") == 0) { + } else if (streq(name, "this")) { return "_this"; - } else if(strcmp(name, "public") == 0) { + } else if (streq(name, "public")) { return "_public"; - } else if(strcmp(name, "protected") == 0) { + } else if (streq(name, "protected")) { return "_protected"; - } else if(strcmp(name, "private") == 0) { + } else if (streq(name, "private")) { return "_private"; - } else if(strcmp(name, "final") == 0) { + } else if (streq(name, "final")) { return "_final"; } /* TODO put all reserved names here */ @@ -73,7 +80,7 @@ static const char *get_atomic_type_string(const atomic_type_kind_t type) case ATOMIC_TYPE_CHAR: return "byte"; case ATOMIC_TYPE_SCHAR: return "byte"; case ATOMIC_TYPE_UCHAR: return "byte"; - case ATOMIC_TYPE_SHORT: return "short"; + case ATOMIC_TYPE_SHORT: return "short"; case ATOMIC_TYPE_USHORT: return "short"; case ATOMIC_TYPE_INT: return "int"; case ATOMIC_TYPE_UINT: return "int"; @@ -216,16 +223,11 @@ static void write_type(type_t *type) case TYPE_ENUM: write_enum_type(&type->enumt); return; - case TYPE_BUILTIN: - write_type(type->builtin.real_type); - return; case TYPE_ERROR: - case TYPE_INVALID: case TYPE_TYPEOF: case TYPE_TYPEDEF: panic("invalid type found"); case TYPE_ARRAY: - case TYPE_BITFIELD: case TYPE_REFERENCE: case TYPE_FUNCTION: case TYPE_COMPLEX: @@ -269,7 +271,7 @@ static void write_unary_expression(const unary_expression_t *expression) case EXPR_UNARY_NOT: fputc('!', out); break; - case EXPR_UNARY_CAST_IMPLICIT: + case EXPR_UNARY_CAST: write_expression(expression->value); return; default: @@ -319,10 +321,10 @@ static void write_expression(const expression_t *expression) fprintf(out, ".%s.val", entity->base.symbol->string); break; } - EXPR_UNARY_CASES + case EXPR_UNARY_CASES: write_unary_expression(&expression->unary); break; - EXPR_BINARY_CASES + case EXPR_BINARY_CASES: write_binary_expression(&expression->binary); break; default: @@ -442,6 +444,19 @@ static void write_function(const entity_t *entity) fprintf(out, ");\n"); } +void jna_limit_output(const char *filename) +{ + output_limit *limit = xmalloc(sizeof(limit[0])); + limit->filename = filename; + + limit->next = output_limits; + output_limits = limit; +} + +void jna_set_libname(const char *new_libname) +{ + libname = new_libname; +} void write_jna_decls(FILE *output, const translation_unit_t *unit) { @@ -456,10 +471,14 @@ void write_jna_decls(FILE *output, const translation_unit_t *unit) fputs("import com.sun.jna.Pointer;\n", out); fputs("\n", out); + const char *register_libname = libname; + if (register_libname == NULL) + register_libname = "library"; + /* TODO: where to get the name from? */ fputs("public class binding {\n", out); fputs("\tstatic {\n", out); - fputs("\t\tNative.register(\"firm\");\n", out); + fprintf(out, "\t\tNative.register(\"%s\");\n", register_libname); fputs("\t}\n", out); fputs("\n", out); @@ -513,8 +532,23 @@ void write_jna_decls(FILE *output, const translation_unit_t *unit) for ( ; entity != NULL; entity = entity->base.next) { if (entity->kind != ENTITY_FUNCTION) continue; - if (is_system_header(entity->base.source_position.input_name)) + const char *input_name = entity->base.source_position.input_name; + if (is_system_header(input_name)) + continue; + if (entity->function.elf_visibility != ELF_VISIBILITY_DEFAULT) continue; + if (output_limits != NULL) { + bool in_limits = false; + for (output_limit *limit = output_limits; limit != NULL; + limit = limit->next) { + if (streq(limit->filename, input_name)) { + in_limits = true; + break; + } + } + if (!in_limits) + continue; + } if (pset_new_contains(&avoid_symbols, entity->base.symbol)) continue;