[Curses] Choose curses so library at startup (4/5)
Peter Berg Larsen
pebl at math.ku.dk
Sat Nov 29 01:29:46 CST 2003
Changelog:
- Try ncursesw, ncurses and curses so library before giving up at startup
-------------- next part --------------
diff -ur wine-20031016/programs/wineconsole/curses.c wine-my/programs/wineconsole/curses.c
--- wine-20031016/programs/wineconsole/curses.c 2003-10-15 23:01:05.000000000 +0200
+++ wine-my/programs/wineconsole/curses.c 2003-11-14 05:20:46.000000000 +0100
@@ -61,14 +61,6 @@
#define PRIVATE(data) ((struct inner_data_curse*)((data)->private))
#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H) || defined(HAVE_NCURSESW_NCURSES_H)
-
-#ifdef HAVE_NCURSESW_NCURSES_H
-# define CURSES_NAME "ncursesw"
-#elif defined(HAVE_NCURSES_H)
-# define CURSES_NAME "ncurses"
-#else
-# define CURSES_NAME "curses"
-#endif
struct inner_data_curse
{
@@ -79,8 +71,29 @@
int allow_scroll;
};
+struct curses_type
+{
+ char *name;
+ char *soname;
+ int sizeof_char;
+};
+
+static const struct curses_type curses_known [] =
+ {
+#ifdef SONAME_LIBCURSES
+ {"curses", SONAME_LIBCURSES , sizeof(chtype)},
+#endif
+#ifdef SONAME_LIBNCURSES
+ {"ncurses", SONAME_LIBNCURSES , sizeof(chtype)},
+#endif
+#ifdef SONAME_LIBNCURSESW
+ {"ncursesw", SONAME_LIBNCURSESW, sizeof(cchar_t)},
+#endif
+ };
+#define NC_MAX_KNOWN (sizeof(curses_known)/sizeof(curses_known[0]))
static void *nc_handle = NULL;
+static const struct curses_type *nc_type = NULL;
#define MAKE_FUNCPTR(f) static typeof(f) * p_##f;
@@ -121,18 +134,26 @@
static BOOL WCCURSES_bind_libcurses(void)
{
-#ifdef HAVE_NCURSES_H
- static const char *ncname = SONAME_LIBNCURSES;
-#else
- static const char *ncname = SONAME_LIBCURSES;
-#endif
+ int nc_no = NC_MAX_KNOWN -1;
+ char err_buf[256];
+
+ retry:
+ while(nc_no >= 0)
+ {
+ nc_type = &curses_known[nc_no];
+ nc_handle = wine_dlopen(nc_type->soname, RTLD_NOW, err_buf, 256);
+ if (nc_handle) break;
+ WINE_TRACE("dlopening %s (%s) failed:\n%s\n",
+ nc_type->name,nc_type->soname,err_buf);
+ nc_no--;
+ }
- nc_handle = wine_dlopen(ncname, RTLD_NOW, NULL, 0);
- if(!nc_handle)
+ if (nc_no < 0)
{
- WINE_MESSAGE("Wine cannot find the " CURSES_NAME " library (%s).\n",
- ncname);
- return FALSE;
+ WINE_WARN("Wine cannot find any suitable variants of the curses library:\n");
+ for (nc_no = NC_MAX_KNOWN - 1; nc_no >= 0; nc_no--)
+ WINE_WARN("%s\n",curses_known[nc_no].soname);
+ return FALSE;
}
#define LOAD_FUNCPTR(f) \
@@ -175,16 +196,18 @@
#undef LOAD_FUNCPTR
+ WINE_TRACE("Using %s (%s) at %p.\n",nc_type->name,nc_type->soname,nc_handle);
return TRUE;
sym_not_found:
WINE_MESSAGE(
- "Wine cannot find certain functions that it needs inside the "
- CURSES_NAME "\nlibrary. To enable Wine to use " CURSES_NAME
- " please upgrade your " CURSES_NAME "\nlibraries\n");
+ "Wine cannot find certain functions that it needs inside the %s\n"
+ "library. To enable Wine to use %s please upgrade your %s\n"
+ "libraries (%s)\n",nc_type->name,nc_type->name,nc_type->name,nc_type->soname);
wine_dlclose(nc_handle, NULL, 0);
nc_handle = NULL;
- return FALSE;
+ nc_no--;
+ goto retry;
}
#define curs_set p_curs_set
@@ -232,10 +255,10 @@
WINE_FIXME("Cannot create pad\n");
if (PRIVATE(data)->line)
PRIVATE(data)->line = HeapReAlloc(GetProcessHeap(), 0, PRIVATE(data)->line,
- sizeof(chtype) * data->curcfg.sb_width);
+ nc_type->sizeof_char * data->curcfg.sb_width);
else
PRIVATE(data)->line = HeapAlloc(GetProcessHeap(), 0,
- sizeof(chtype) * data->curcfg.sb_width);
+ nc_type->sizeof_char * data->curcfg.sb_width);
if (!PRIVATE(data)->line)
WINE_FIXME("Cannot create line\n");
}
More information about the wine-patches
mailing list