From fbdf119e2c8ac4233c4323835ff82fe3ad3de3d7 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 16 Jun 2017 15:25:48 +0200 Subject: [PATCH] widl: Try to find imported typelib using .tlb extension if it wasn't specified. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- tools/widl/typelib.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c index 6ac748f4041..e8dfcb1ee8a 100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c @@ -326,22 +326,42 @@ static void read_msft_importlib(importlib_t *importlib, int fd) free(typeinfo_offs); } +static int open_typelib(const char *name) +{ + char *file_name; + int fd; + + file_name = wpp_find_include(name, NULL); + if(!file_name) + return open(name, O_RDONLY | O_BINARY ); + + fd = open(file_name, O_RDONLY | O_BINARY ); + free(file_name); + return fd; +} + static void read_importlib(importlib_t *importlib) { int fd; INT magic; - char *file_name; - file_name = wpp_find_include(importlib->name, NULL); - if(file_name) { - fd = open(file_name, O_RDONLY | O_BINARY ); - free(file_name); - }else { - fd = open(importlib->name, O_RDONLY | O_BINARY ); + fd = open_typelib(importlib->name); + + /* widl extension: if importlib name has no .tlb extension, try using .tlb */ + if(fd < 0) { + const char *p = strrchr(importlib->name, '.'); + size_t len = p ? p - importlib->name : strlen(importlib->name); + if(strcmp(importlib->name + len, ".tlb")) { + char *tlb_name = xmalloc(len + 5); + memcpy(tlb_name, importlib->name, len); + strcpy(tlb_name + len, ".tlb"); + fd = open_typelib(tlb_name); + free(tlb_name); + } } if(fd < 0) - error("Could not open importlib %s.\n", importlib->name); + error("Could not find importlib %s.\n", importlib->name); tlb_read(fd, &magic, sizeof(magic));