if (name) fprintf(h, "%s%s", needs_space_after(t) ? " " : "", name );
if (type_get_type_detect_alias(pt) == TYPE_FUNCTION) {
+ const var_list_t *args = type_function_get_args(pt);
+
if (ptr_level) fputc(')', h);
fputc('(', h);
- write_args(h, type_function_get_args(pt), NULL, 0, FALSE);
+ if (args)
+ write_args(h, args, NULL, 0, FALSE);
+ else
+ fprintf(h, "void");
fputc(')', h);
} else
write_type_right(h, t, is_field);
}
}
+static inline unsigned int clamp_align(unsigned int align)
+{
+ unsigned int packing = (pointer_size == 4) ? win32_packing : win64_packing;
+ if(align > packing) align = packing;
+ return align;
+}
+
unsigned char get_pointer_fc(const type_t *type, const attr_list_t *attrs, int toplevel_param)
{
const type_t *t;
unsigned int falign = 0;
unsigned int fsize = type_memsize(v->type, &falign);
if (*align < falign) *align = falign;
- if (falign > packing) falign = packing;
+ falign = clamp_align(falign);
size = ROUND_SIZE(size, falign);
size += fsize;
}
- max_align = *align;
- if(max_align > packing) max_align = packing;
+ max_align = clamp_align(*align);
size = ROUND_SIZE(size, max_align);
return size;
type_t *ft = f->type;
unsigned int align = 0;
unsigned int size = type_memsize(ft, &align);
- if (align > packing) align = packing;
+ align = clamp_align(align);
if (align > salign) salign = align;
offset = ROUND_SIZE(offset, align);
offset += size;
type_t *ft = field->type;
unsigned int align = 0;
unsigned int size = type_memsize(ft, &align);
- if(align > packing) align = packing;
+ align = clamp_align(align);
if (salign < align) salign = align;
if (!is_conformant_array(ft) || type_array_is_decl_as_ptr(ft))
static const char usage[] =
"Usage: widl [options...] infile.idl\n"
" or: widl [options...] --dlldata-only name1 [name2...]\n"
-" -a n Set structure alignment to 'n'\n"
" -b arch Set the target architecture\n"
" -c Generate client stub\n"
" -C file Name of client stub file (default is infile_c.c)\n"
" -W Enable pedantic warnings\n"
" --win32 Only generate 32-bit code\n"
" --win64 Only generate 64-bit code\n"
+" --win32-align n Set win32 structure alignment to 'n'\n"
+" --win64-align n Set win64 structure alignment to 'n'\n"
"Debug level 'n' is a bitmask with following meaning:\n"
" * 0x01 Tell which resource is parsed (verbose mode)\n"
" * 0x02 Dump internal structures\n"
int old_names = 0;
int do_win32 = 1;
int do_win64 = 1;
-int packing = 8;
+int win32_packing = 8;
+int win64_packing = 8;
char *input_name;
char *header_name;
PREFIX_CLIENT_OPTION,
PREFIX_SERVER_OPTION,
WIN32_OPTION,
- WIN64_OPTION
+ WIN64_OPTION,
+ WIN32_ALIGN_OPTION,
+ WIN64_ALIGN_OPTION
};
static const char short_options[] =
- "a:b:cC:d:D:EhH:I:m:NpP:sS:tT:uU:VW";
+ "b:cC:d:D:EhH:I:m:NpP:sS:tT:uU:VW";
static const struct option long_options[] = {
{ "dlldata", 1, 0, DLLDATA_OPTION },
{ "dlldata-only", 0, 0, DLLDATA_ONLY_OPTION },
{ "prefix-server", 1, 0, PREFIX_SERVER_OPTION },
{ "win32", 0, 0, WIN32_OPTION },
{ "win64", 0, 0, WIN64_OPTION },
+ { "win32-align", 1, 0, WIN32_ALIGN_OPTION },
+ { "win64-align", 1, 0, WIN64_ALIGN_OPTION },
{ 0, 0, 0, 0 }
};
{ "x86_64", SYS_WIN64 },
{ "sparc", SYS_WIN32 },
{ "alpha", SYS_WIN32 },
- { "powerpc", SYS_WIN32 }
+ { "powerpc", SYS_WIN32 },
+ { "arm", SYS_WIN32 }
};
unsigned int i;
do_win32 = 0;
do_win64 = 1;
break;
- case 'a':
- packing = strtol(optarg, NULL, 0);
- if(packing != 2 && packing != 4 && packing != 8)
+ case WIN32_ALIGN_OPTION:
+ win32_packing = strtol(optarg, NULL, 0);
+ if(win32_packing != 2 && win32_packing != 4 && win32_packing != 8)
+ error("Packing must be one of 2, 4 or 8\n");
+ break;
+ case WIN64_ALIGN_OPTION:
+ win64_packing = strtol(optarg, NULL, 0);
+ if(win64_packing != 2 && win64_packing != 4 && win64_packing != 8)
error("Packing must be one of 2, 4 or 8\n");
break;
case 'b':