tDrop non-Unicode Windows code path - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit f2e240bee60a4e6ae9f6e50630f6979d6f06740c
 (DIR) parent a3c8385f36c8dd6818f88166fd70b10c605bb7b5
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 28 Dec 2020 22:38:27 -0800
       
       Drop non-Unicode Windows code path
       
       All supported Windows versions should now support
       Unicode - we don't support building on Windows 98
       any more - so we no longer need both a Unicode and
       an ANSI code path.
       
       Diffstat:
         M src/gtkport/gtkport.c               |      16 +---------------
         M src/gtkport/gtkport.h               |       1 -
         M src/gtkport/unicodewrap.c           |     297 +++++++++----------------------
         M src/gtkport/unicodewrap.h           |       2 --
         M src/gui_client/gtk_client.c         |      15 +++++++--------
         M src/serverside.c                    |      16 +++++++---------
       
       6 files changed, 101 insertions(+), 246 deletions(-)
       ---
 (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
       t@@ -72,7 +72,7 @@ const gchar *GTK_STOCK_HELP = N_("_Help");
        HICON mainIcon = NULL;
        static WNDPROC customWndProc = NULL;
        static gboolean HaveRichEdit = FALSE;
       -static gchar *RichEditClass = NULL;
       +static const gchar *RichEditClass = "RichEdit20W";
        static gboolean HaveXPControls = FALSE;
        
        static guint RecurseLevel = 0;
       t@@ -1181,7 +1181,6 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          WNDCLASS wc;
        
          hInst = hInstance;
       -  InitUnicodeSupport();
          defFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
          urlFont = CreateFont(14, 0, 0, 0, FW_SEMIBOLD, FALSE, TRUE, FALSE,
                               ANSI_CHARSET, OUT_DEFAULT_PRECIS,
       t@@ -1198,14 +1197,6 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
          InitCommonControls();
          LoadLibrary("RICHED20.DLL");
       -
       -  /* Rich Edit controls have two different class names, depending on whether
       -   * we want ANSI or Unicode - argh! */
       -  if (HaveUnicodeSupport()) {
       -    RichEditClass = "RichEdit20W";
       -  } else {
       -    RichEditClass = "RichEdit20A";
       -  }
          HaveRichEdit = GetClassInfo(hInstance, RichEditClass, &wc);
        
          HaveXPControls = CheckForXPControls();
       t@@ -5514,11 +5505,6 @@ gchar *GtkGetFile(const GtkWidget *parent, const gchar *oldname,
          return ret;
        }
        
       -gboolean HaveUnicodeSupport(void)
       -{
       -  return TRUE;
       -}
       -
        #endif /* CYGWIN */
        
        #if CYGWIN
 (DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h
       t@@ -647,7 +647,6 @@ GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group);
        gchar *GtkGetFile(const GtkWidget *parent, const gchar *oldname,
                          const gchar *title);
        void DisplayHTML(GtkWidget *parent, const gchar *bin, const gchar *target);
       -gboolean HaveUnicodeSupport(void);
        GtkWidget *gtk_scrolled_tree_view_new(GtkWidget **pack_widg);
        
        #endif /* __GTKPORT_H__ */
 (DIR) diff --git a/src/gtkport/unicodewrap.c b/src/gtkport/unicodewrap.c
       t@@ -31,30 +31,6 @@
        
        #include "unicodewrap.h"
        
       -static gboolean unicode_support = FALSE;
       -
       -/*
       - * Sets the global variable unicode_support to reflect whether this version
       - * of Windows understands Unicode. (WinNT/2000/XP do, 95/98/ME do not.)
       - * This is done by calling the Unicode version of GetVersionEx, which should
       - * have no undesirable side effects. On non-Unicode systems, this is just
       - * a stub function that returns an error.
       - */
       -void InitUnicodeSupport(void)
       -{
       -  OSVERSIONINFOW verinfo;
       -
       -  verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
       -
       -  unicode_support =
       -    (GetVersionExW(&verinfo) || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED);
       -}
       -
       -gboolean HaveUnicodeSupport(void)
       -{
       -  return unicode_support;
       -}
       -
        /*
         * Converts a string from our internal representation (UTF-8) to a form
         * suitable for Windows Unicode-aware functions (i.e. UTF-16). This
       t@@ -89,16 +65,10 @@ gchar *w32tostr(const gunichar2 *instr, int len)
        BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString)
        {
          BOOL retval;
       -
       -  if (unicode_support) {
       -    gunichar2 *text;
       -    text = strtow32(lpString, -1);
       -    retval = SetWindowTextW(hWnd, text);
       -    g_free(text);
       -  } else {
       -    retval = SetWindowTextA(hWnd, lpString);
       -  }
       -
       +  gunichar2 *text;
       +  text = strtow32(lpString, -1);
       +  retval = SetWindowTextW(hWnd, text);
       +  g_free(text);
          return retval;
        }
        
       t@@ -117,63 +87,42 @@ HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName,
                              HANDLE hInstance, LPVOID lpParam)
        {
          HWND retval;
       -
       -  if (unicode_support) {
       -    gunichar2 *classname, *winname;
       -    classname = strtow32(lpClassName, -1);
       -    winname = strtow32(lpWindowName, -1);
       -    retval = CreateWindowExW(dwExStyle, classname, winname, dwStyle, x, y,
       -                             nWidth, nHeight, hwndParent, hMenu, hInstance,
       -                             lpParam);
       -    g_free(classname);
       -    g_free(winname);
       -  } else {
       -    retval = CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle,
       -                             x, y, nWidth, nHeight, hwndParent, hMenu,
       -                             hInstance, lpParam);
       -  }
       +  gunichar2 *classname, *winname;
       +  classname = strtow32(lpClassName, -1);
       +  winname = strtow32(lpWindowName, -1);
       +  retval = CreateWindowExW(dwExStyle, classname, winname, dwStyle, x, y,
       +                           nWidth, nHeight, hwndParent, hMenu, hInstance,
       +                           lpParam);
       +  g_free(classname);
       +  g_free(winname);
          return retval;
        }
        
        gchar *myGetWindowText(HWND hWnd)
        {
          gint textlen;
       +  gunichar2 *buffer;
       +  gchar *retstr;
        
          textlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
       -  if (unicode_support) {
       -    gunichar2 *buffer;
       -    gchar *retstr;
       -
       -    buffer = g_new0(gunichar2, textlen + 1);
       -    GetWindowTextW(hWnd, buffer, textlen + 1);
       -    buffer[textlen] = '\0';
       -    retstr = w32tostr(buffer, textlen);
       -    g_free(buffer);
       -    return retstr;
       -  } else {
       -    gchar *buffer;
        
       -    buffer = g_new0(gchar, textlen + 1);
       -    GetWindowTextA(hWnd, buffer, textlen + 1);
       -    buffer[textlen] = '\0';
       -    return buffer;
       -  }
       +  buffer = g_new0(gunichar2, textlen + 1);
       +  GetWindowTextW(hWnd, buffer, textlen + 1);
       +  buffer[textlen] = '\0';
       +  retstr = w32tostr(buffer, textlen);
       +  g_free(buffer);
       +  return retstr;
        }
        
        int myDrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect,
                       UINT uFormat)
        {
          int retval;
       +  gunichar2 *text;
        
       -  if (unicode_support) {
       -    gunichar2 *text;
       -
       -    text = strtow32(lpString, nCount);
       -    retval = DrawTextW(hDC, text, -1, lpRect, uFormat);
       -    g_free(text);
       -  } else {
       -    retval = DrawTextA(hDC, lpString, nCount, lpRect, uFormat);
       -  }
       +  text = strtow32(lpString, nCount);
       +  retval = DrawTextW(hDC, text, -1, lpRect, uFormat);
       +  g_free(text);
          return retval;
        }
        
       t@@ -202,18 +151,13 @@ BOOL WINAPI mySetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition,
                                      LPMENUITEMINFO lpmii)
        {
          BOOL retval;
       +  MENUITEMINFOW miiw;
       +  BOOL strdata;
        
       -  if (unicode_support) {
       -    MENUITEMINFOW miiw;
       -    BOOL strdata;
       -
       -    strdata = makeMenuItemInfoW(&miiw, lpmii);
       -    retval = SetMenuItemInfoW(hMenu, uItem, fByPosition, &miiw);
       -    if (strdata) {
       -      g_free(miiw.dwTypeData);
       -    }
       -  } else {
       -    retval = SetMenuItemInfoA(hMenu, uItem, fByPosition, lpmii);
       +  strdata = makeMenuItemInfoW(&miiw, lpmii);
       +  retval = SetMenuItemInfoW(hMenu, uItem, fByPosition, &miiw);
       +  if (strdata) {
       +    g_free(miiw.dwTypeData);
          }
          return retval;
        }
       t@@ -222,18 +166,13 @@ BOOL WINAPI myInsertMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition,
                                     LPMENUITEMINFO lpmii)
        {
          BOOL retval;
       +  MENUITEMINFOW miiw;
       +  BOOL strdata;
        
       -  if (unicode_support) {
       -    MENUITEMINFOW miiw;
       -    BOOL strdata;
       -
       -    strdata = makeMenuItemInfoW(&miiw, lpmii);
       -    retval = InsertMenuItemW(hMenu, uItem, fByPosition, &miiw);
       -    if (strdata) {
       -      g_free(miiw.dwTypeData);
       -    }
       -  } else {
       -    retval = InsertMenuItemA(hMenu, uItem, fByPosition, lpmii);
       +  strdata = makeMenuItemInfoW(&miiw, lpmii);
       +  retval = InsertMenuItemW(hMenu, uItem, fByPosition, &miiw);
       +  if (strdata) {
       +    g_free(miiw.dwTypeData);
          }
          return retval;
        }
       t@@ -272,7 +211,7 @@ static BOOL makeTabItemW(TC_ITEMW *tiew, const TC_ITEM *tie)
        int myHeader_InsertItem(HWND hWnd, int index, const HD_ITEM *phdi)
        {
          int retval;
       -  if (unicode_support && IsWindowUnicode(hWnd)) {
       +  if (IsWindowUnicode(hWnd)) {
            HD_ITEMW hdiw;
            BOOL strdata;
        
       t@@ -292,18 +231,13 @@ int myHeader_InsertItem(HWND hWnd, int index, const HD_ITEM *phdi)
        int myTabCtrl_InsertItem(HWND hWnd, int index, const TC_ITEM *pitem)
        {
          int retval;
       -  if (unicode_support) {
       -    TC_ITEMW tiew;
       -    BOOL strdata;
       -    strdata = makeTabItemW(&tiew, pitem);
       -    retval = (int)SendMessageW(hWnd, TCM_INSERTITEMW, (WPARAM)index,
       -                               (LPARAM)&tiew);
       -    if (strdata) {
       -      g_free(tiew.pszText);
       -    }
       -  } else {
       -    retval = (int)SendMessageA(hWnd, TCM_INSERTITEMA, (WPARAM)index,
       -                               (LPARAM)pitem);
       +  TC_ITEMW tiew;
       +  BOOL strdata;
       +  strdata = makeTabItemW(&tiew, pitem);
       +  retval = (int)SendMessageW(hWnd, TCM_INSERTITEMW, (WPARAM)index,
       +                             (LPARAM)&tiew);
       +  if (strdata) {
       +    g_free(tiew.pszText);
          }
          return retval;
        }
       t@@ -311,26 +245,21 @@ int myTabCtrl_InsertItem(HWND hWnd, int index, const TC_ITEM *pitem)
        ATOM myRegisterClass(CONST WNDCLASS *lpWndClass)
        {
          ATOM retval;
       -
       -  if (unicode_support) {
       -    WNDCLASSW wcw;
       -
       -    wcw.style = lpWndClass->style;
       -    wcw.lpfnWndProc = lpWndClass->lpfnWndProc;
       -    wcw.cbClsExtra = lpWndClass->cbClsExtra;
       -    wcw.cbWndExtra = lpWndClass->cbWndExtra;
       -    wcw.hInstance = lpWndClass->hInstance;
       -    wcw.hIcon = lpWndClass->hIcon;
       -    wcw.hCursor = lpWndClass->hCursor;
       -    wcw.hbrBackground = lpWndClass->hbrBackground;
       -    wcw.lpszMenuName = strtow32(lpWndClass->lpszMenuName, -1);
       -    wcw.lpszClassName = strtow32(lpWndClass->lpszClassName, -1);
       -    retval = RegisterClassW(&wcw);
       -    g_free((LPWSTR)wcw.lpszMenuName);
       -    g_free((LPWSTR)wcw.lpszClassName);
       -  } else {
       -    retval = RegisterClassA(lpWndClass);
       -  }
       +  WNDCLASSW wcw;
       +
       +  wcw.style = lpWndClass->style;
       +  wcw.lpfnWndProc = lpWndClass->lpfnWndProc;
       +  wcw.cbClsExtra = lpWndClass->cbClsExtra;
       +  wcw.cbWndExtra = lpWndClass->cbWndExtra;
       +  wcw.hInstance = lpWndClass->hInstance;
       +  wcw.hIcon = lpWndClass->hIcon;
       +  wcw.hCursor = lpWndClass->hCursor;
       +  wcw.hbrBackground = lpWndClass->hbrBackground;
       +  wcw.lpszMenuName = strtow32(lpWndClass->lpszMenuName, -1);
       +  wcw.lpszClassName = strtow32(lpWndClass->lpszClassName, -1);
       +  retval = RegisterClassW(&wcw);
       +  g_free((LPWSTR)wcw.lpszMenuName);
       +  g_free((LPWSTR)wcw.lpszClassName);
          return retval;
        }
        
       t@@ -338,141 +267,87 @@ HWND myCreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent,
                            DLGPROC lpDialogFunc)
        {
          HWND retval;
       -
       -  if (unicode_support) {
       -    gunichar2 *text;
       -    text = strtow32(lpTemplate, -1);
       -    retval = CreateDialogW(hInstance, text, hWndParent, lpDialogFunc);
       -    g_free(text);
       -  } else {
       -    retval = CreateDialogA(hInstance, lpTemplate, hWndParent, lpDialogFunc);
       -  }
       +  gunichar2 *text;
       +  text = strtow32(lpTemplate, -1);
       +  retval = CreateDialogW(hInstance, text, hWndParent, lpDialogFunc);
       +  g_free(text);
          return retval;
        }
        
        LRESULT mySendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
        {
       -  if (unicode_support) {
       -    return SendMessageW(hWnd, Msg, wParam, lParam);
       -  } else {
       -    return SendMessageA(hWnd, Msg, wParam, lParam);
       -  }
       +  return SendMessageW(hWnd, Msg, wParam, lParam);
        }
        
        void myEditReplaceSel(HWND hWnd, BOOL fCanUndo, LPCSTR lParam)
        {
       -  if (unicode_support) {
       -    gunichar2 *text;
       -    text = strtow32(lParam, -1);
       -    SendMessageW(hWnd, EM_REPLACESEL, (WPARAM)fCanUndo, (LPARAM)text);
       -    g_free(text);
       -  } else {
       -    SendMessageA(hWnd, EM_REPLACESEL, (WPARAM)fCanUndo, (LPARAM)lParam);
       -  }
       +  gunichar2 *text;
       +  text = strtow32(lParam, -1);
       +  SendMessageW(hWnd, EM_REPLACESEL, (WPARAM)fCanUndo, (LPARAM)text);
       +  g_free(text);
        }
        
        LONG_PTR mySetWindowLong(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
        {
       -  if (unicode_support) {
       -    return SetWindowLongPtrW(hWnd, nIndex, dwNewLong);
       -  } else {
       -    return SetWindowLongPtrA(hWnd, nIndex, dwNewLong);
       -  }
       +  return SetWindowLongPtrW(hWnd, nIndex, dwNewLong);
        }
        
        LONG_PTR myGetWindowLong(HWND hWnd, int nIndex)
        {
       -  if (unicode_support) {
       -    return GetWindowLongPtrW(hWnd, nIndex);
       -  } else {
       -    return GetWindowLongPtrA(hWnd, nIndex);
       -  }
       +  return GetWindowLongPtrW(hWnd, nIndex);
        }
        
        LRESULT myCallWindowProc(WNDPROC lpPrevWndProc, HWND hWnd, UINT Msg,
                                 WPARAM wParam, LPARAM lParam)
        {
       -  if (unicode_support) {
       -    return CallWindowProcW(lpPrevWndProc, hWnd, Msg, wParam, lParam);
       -  } else {
       -    return CallWindowProcA(lpPrevWndProc, hWnd, Msg, wParam, lParam);
       -  }
       +  return CallWindowProcW(lpPrevWndProc, hWnd, Msg, wParam, lParam);
        }
        
        LRESULT myDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
        {
       -  if (unicode_support) {
       -    return DefWindowProcW(hWnd, Msg, wParam, lParam);
       -  } else {
       -    return DefWindowProcA(hWnd, Msg, wParam, lParam);
       -  }
       +  return DefWindowProcW(hWnd, Msg, wParam, lParam);
        }
        
        int myMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
        {
          int retval;
       -
       -  if (unicode_support) {
       -    gunichar2 *text, *caption;
       -    text = strtow32(lpText, -1);
       -    caption = strtow32(lpCaption, -1);
       -    retval = MessageBoxW(hWnd, text, caption, uType);
       -    g_free(text);
       -    g_free(caption);
       -  } else {
       -    retval = MessageBoxA(hWnd, lpText, lpCaption, uType);
       -  }
       +  gunichar2 *text, *caption;
       +  text = strtow32(lpText, -1);
       +  caption = strtow32(lpCaption, -1);
       +  retval = MessageBoxW(hWnd, text, caption, uType);
       +  g_free(text);
       +  g_free(caption);
          return retval;
        }
        
        BOOL myGetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
                          UINT wMsgFilterMax)
        {
       -  if (unicode_support) {
       -    return GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
       -  } else {
       -    return GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
       -  }
       +  return GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
        }
        
        LONG myDispatchMessage(CONST MSG *lpmsg)
        {
       -  if (unicode_support) {
       -    return DispatchMessageW(lpmsg);
       -  } else {
       -    return DispatchMessageA(lpmsg);
       -  }
       +  return DispatchMessageW(lpmsg);
        }
        
        BOOL myIsDialogMessage(HWND hDlg, LPMSG lpMsg)
        {
       -  if (unicode_support) {
       -    return IsDialogMessageW(hDlg, lpMsg);
       -  } else {
       -    return IsDialogMessageA(hDlg, lpMsg);
       -  }
       +  return IsDialogMessageW(hDlg, lpMsg);
        }
        
        size_t myw32strlen(const char *str)
        {
       -  if (unicode_support) {
       -    return g_utf8_strlen(str, -1);
       -  } else {
       -    return strlen(str);
       -  }
       +  return g_utf8_strlen(str, -1);
        }
        
        LRESULT myComboBox_AddString(HWND hWnd, LPCTSTR text)
        {
          LRESULT retval;
       -  if (unicode_support) {
       -    gunichar2 *w32text;
       -    w32text = strtow32(text, -1);
       -    retval = SendMessageW(hWnd, CB_ADDSTRING, 0, (LPARAM)w32text);
       -    g_free(w32text);
       -  } else {
       -    retval = SendMessageA(hWnd, CB_ADDSTRING, 0, (LPARAM)text);
       -  }
       +  gunichar2 *w32text;
       +  w32text = strtow32(text, -1);
       +  retval = SendMessageW(hWnd, CB_ADDSTRING, 0, (LPARAM)w32text);
       +  g_free(w32text);
          return retval;
        }
        
 (DIR) diff --git a/src/gtkport/unicodewrap.h b/src/gtkport/unicodewrap.h
       t@@ -32,8 +32,6 @@
        #include <windows.h>
        #include <commctrl.h>
        
       -void InitUnicodeSupport(void);
       -
        BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString);
        HWND myCreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
                            int x, int y, int nWidth, int nHeight, HWND hwndParent,
 (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -2222,15 +2222,14 @@ gboolean GtkLoop(int *argc, char **argv[],
            gtk_init(argc, argv);
        #endif
        
       -  if (HaveUnicodeSupport()) {
       -    /* GTK+2 (and the GTK emulation code on WinNT systems) expects all
       -     * strings to be UTF-8, so we force gettext to return all translations
       -     * in this encoding here. */
       -    bind_textdomain_codeset(PACKAGE, "UTF-8");
       +  /* GTK+2 (and the GTK emulation code on WinNT systems) expects all
       +   * strings to be UTF-8, so we force gettext to return all translations
       +   * in this encoding here. */
       +  bind_textdomain_codeset(PACKAGE, "UTF-8");
       +
       +  Conv_SetInternalCodeset("UTF-8");
       +  WantUTF8Errors(TRUE);
        
       -    Conv_SetInternalCodeset("UTF-8");
       -    WantUTF8Errors(TRUE);
       -  }
          InitConfiguration(cmdline);
          ClientData.cmdline = cmdline;
        
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -1445,7 +1445,7 @@ static void GuiDoCommand(GtkWidget *widget, gpointer data)
        
          text = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
          gtk_editable_delete_text(GTK_EDITABLE(widget), 0, -1);
       -  HandleServerCommand(text, NULL, HaveUnicodeSupport());
       +  HandleServerCommand(text, NULL, TRUE);
          g_free(text);
          if (IsServerShutdown())
            GuiQuitServer();
       t@@ -1649,15 +1649,13 @@ void GuiServerLoop(struct CMDLINE *cmdline, gboolean is_service)
          GtkWidget *window, *text, *hbox, *vbox, *entry, *label;
          GIOChannel *listench;
        
       -  if (HaveUnicodeSupport()) {
       -    /* GTK+2 (and the GTK emulation code on WinNT systems) expects all
       -     * strings to be UTF-8, so we force gettext to return all translations
       -     * in this encoding here. */
       -    bind_textdomain_codeset(PACKAGE, "UTF-8");
       +  /* GTK+2 (and the GTK emulation code on WinNT systems) expects all
       +   * strings to be UTF-8, so we force gettext to return all translations
       +   * in this encoding here. */
       +  bind_textdomain_codeset(PACKAGE, "UTF-8");
        
       -    Conv_SetInternalCodeset("UTF-8");
       -    WantUTF8Errors(TRUE);
       -  }
       +  Conv_SetInternalCodeset("UTF-8");
       +  WantUTF8Errors(TRUE);
        
          if (cmdline) {
            InitConfiguration(cmdline);