Module: wine Branch: refs/heads/master Commit: 1550938a5042f9847eab45d13e2077aa40b8a08f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=1550938a5042f9847eab45d1...
Author: Eric Kohl eric.kohl@t-online.de Date: Thu Mar 23 10:33:08 2006 +0100
widl: Fix format string size calculation.
- Move proc format string size calculation from client.c and server.c to typegen.c. - Implement type format string size calculation.
---
tools/widl/client.c | 34 ++++----------------------- tools/widl/server.c | 34 ++++----------------------- tools/widl/typegen.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++- tools/widl/typegen.h | 4 ++- 4 files changed, 76 insertions(+), 60 deletions(-)
diff --git a/tools/widl/client.c b/tools/widl/client.c index 3197b73..db8ce7f 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -1,7 +1,7 @@ /* * IDL Compiler * - * Copyright 2005 Eric Kohl + * Copyright 2005-2006 Eric Kohl * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -384,35 +384,11 @@ static void write_formatdesc( const char
static void write_formatstringsdecl(type_t *iface) { - int byte_count = 1; + print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", + get_size_typeformatstring(iface));
- print_client("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */ - - /* determine the proc format string size */ - if (iface->funcs) - { - func_t *func = iface->funcs; - while (NEXT_LINK(func)) func = NEXT_LINK(func); - while (func) - { - /* argument list size */ - if (func->args) - { - var_t *var = func->args; - while (NEXT_LINK(var)) var = NEXT_LINK(var); - while (var) - { - byte_count += 2; /* FIXME: determine real size */ - var = PREV_LINK(var); - } - } - - /* return value size */ - byte_count += 2; /* FIXME: determine real size */ - func = PREV_LINK(func); - } - } - print_client("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count); + print_client("#define PROC_FORMAT_STRING_SIZE %d\n", + get_size_procformatstring(iface));
fprintf(client, "\n"); write_formatdesc("TYPE"); diff --git a/tools/widl/server.c b/tools/widl/server.c index 3f7b976..1b134f3 100644 --- a/tools/widl/server.c +++ b/tools/widl/server.c @@ -1,7 +1,7 @@ /* * IDL Compiler * - * Copyright 2005 Eric Kohl + * Copyright 2005-2006 Eric Kohl * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -472,35 +472,11 @@ static void write_formatdesc( const char
static void write_formatstringsdecl(type_t *iface) { - int byte_count = 1; + print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", + get_size_typeformatstring(iface));
- print_server("#define TYPE_FORMAT_STRING_SIZE %d\n", 3); /* FIXME */ - - /* determine the proc format string size */ - if (iface->funcs) - { - func_t *func = iface->funcs; - while (NEXT_LINK(func)) func = NEXT_LINK(func); - while (func) - { - /* argument list size */ - if (func->args) - { - var_t *var = func->args; - while (NEXT_LINK(var)) var = NEXT_LINK(var); - while (var) - { - byte_count += 2; /* FIXME: determine real size */ - var = PREV_LINK(var); - } - } - - /* return value size */ - byte_count += 2; /* FIXME: determine real size */ - func = PREV_LINK(func); - } - } - print_server("#define PROC_FORMAT_STRING_SIZE %d\n", byte_count); + print_server("#define PROC_FORMAT_STRING_SIZE %d\n", + get_size_procformatstring(iface));
fprintf(server, "\n"); write_formatdesc("TYPE"); diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index d9b722c..fd2d040 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -1,7 +1,7 @@ /* * Format String Generator for IDL Compiler * - * Copyright 2005 Eric Kohl + * Copyright 2005-2006 Eric Kohl * Copyright 2005-2006 Robert Shearman * * This library is free software; you can redistribute it and/or @@ -1591,6 +1591,68 @@ size_t get_size_typeformatstring_var(con return type_offset; }
+size_t get_size_procformatstring(const type_t *iface) +{ + size_t size = 1; + func_t *func; + var_t *var; + + if (iface->funcs) + { + func = iface->funcs; + while (NEXT_LINK(func)) func = NEXT_LINK(func); + while (func) + { + /* argument list size */ + if (func->args) + { + var = func->args; + while (NEXT_LINK(var)) var = NEXT_LINK(var); + while (var) + { + size += get_size_procformatstring_var(var); + var = PREV_LINK(var); + } + } + + /* return value size */ + size += 2; /* FIXME: determine real size */ + func = PREV_LINK(func); + } + } + return size; +} + +size_t get_size_typeformatstring(const type_t *iface) +{ + size_t size = 3; + func_t *func; + var_t *var; + + if (iface->funcs) + { + func = iface->funcs; + while (NEXT_LINK(func)) func = NEXT_LINK(func); + while (func) + { + /* argument list size */ + if (func->args) + { + var = func->args; + while (NEXT_LINK(var)) var = NEXT_LINK(var); + while (var) + { + size += get_size_typeformatstring_var(var); + var = PREV_LINK(var); + } + } + + func = PREV_LINK(func); + } + } + return size; +} + static void write_struct_expr(FILE *h, const expr_t *e, int brackets, const var_t *fields, const char *structvar) { diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h index 0150429..080bdaf 100644 --- a/tools/widl/typegen.h +++ b/tools/widl/typegen.h @@ -1,7 +1,7 @@ /* * Format String Generator for IDL Compiler * - * Copyright 2005 Eric Kohl + * Copyright 2005-2006 Eric Kohl * Copyright 2005 Robert Shearman * * This library is free software; you can redistribute it and/or @@ -41,5 +41,7 @@ unsigned int get_required_buffer_size(co void write_remoting_arguments(FILE *file, int indent, const func_t *func, unsigned int *type_offset, enum pass pass, enum remoting_phase phase); size_t get_size_procformatstring_var(const var_t *var); size_t get_size_typeformatstring_var(const var_t *var); +size_t get_size_procformatstring(const type_t *iface); +size_t get_size_typeformatstring(const type_t *iface); int write_expr_eval_routines(FILE *file, const char *iface); void write_expr_eval_routine_list(FILE *file, const char *iface);