cleanup: Add and use macro MAX().
[cparser] / wrappergen / write_jna.c
index 5e16edb..aa9ed36 100644 (file)
@@ -1,25 +1,9 @@
 /*
  * This file is part of cparser.
- * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * Copyright (C) 2012 Matthias Braun <matze@braunis.de>
  */
 #include <config.h>
 
-#include <errno.h>
 #include <string.h>
 
 #include "adt/strutil.h"
@@ -33,6 +17,8 @@
 #include "adt/error.h"
 #include "adt/xmalloc.h"
 #include "adt/pset_new.h"
+#include "separator_t.h"
+#include "symbol_table.h"
 
 typedef struct output_limit {
        const char          *filename;
@@ -45,31 +31,17 @@ static pset_new_t     avoid_symbols;
 static output_limit  *output_limits;
 static const char    *libname;
 
-static bool is_system_header(const char *fname)
-{
-       if (strstart(fname, "/usr/include"))
-               return true;
-       if (fname == builtin_source_position.input_name)
-               return true;
-       return false;
-}
-
 static const char *fix_builtin_names(const char *name)
 {
-       if (streq(name, "class")) {
-               return "_class";
-       } else if (streq(name, "this")) {
-               return "_this";
-       } else if (streq(name, "public")) {
-               return "_public";
-       } else if (streq(name, "protected")) {
-               return "_protected";
-       } else if (streq(name, "private")) {
-               return "_private";
-       } else if (streq(name, "final")) {
-               return "_final";
-       }
+#define FIX(x) if (streq(name, x)) return "_" x
+       FIX("class");
+       FIX("final");
+       FIX("private");
+       FIX("protected");
+       FIX("public");
+       FIX("this");
        /* TODO put all reserved names here */
+#undef FIX
        return name;
 }
 
@@ -226,7 +198,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 +247,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);
 }
@@ -420,16 +392,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));
@@ -438,11 +406,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");
@@ -489,7 +453,7 @@ void write_jna_decls(FILE *output, const translation_unit_t *unit)
        /* read the avoid list */
        FILE *avoid = fopen("avoid.config", "r");
        if (avoid != NULL) {
-               while (!feof(avoid)) {
+               for (;;) {
                        char buf[1024];
                        char *res = fgets(buf, sizeof(buf), avoid);
                        if (res == NULL)
@@ -535,13 +499,13 @@ 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;
-               if (is_system_header(input_name))
+               if (entity->base.pos.is_system_header)
                        continue;
                if (entity->function.elf_visibility != ELF_VISIBILITY_DEFAULT)
                        continue;
                if (output_limits != NULL) {
-                       bool in_limits = false;
+                       bool              in_limits  = false;
+                       char const *const input_name = entity->base.pos.input_name;
                        for (output_limit *limit = output_limits; limit != NULL;
                             limit = limit->next) {
                            if (streq(limit->filename, input_name)) {