changeset 4025:be1cffa1e477 v7.3.767

updated for version 7.3.767 Problem: (Win32) The _errno used for iconv may be the wrong one. Solution: Use the _errno from iconv.dll. (Ken Takata)
author Bram Moolenaar <bram@vim.org>
date Thu, 17 Jan 2013 14:39:47 +0100
parents 3db63a248b16
children d7b049beee14
files src/mbyte.c src/version.c
diffstat 2 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -3242,7 +3242,7 @@ utf_strnicmp(s1, s2, n1, n2)
 
 /*
  * Version of strnicmp() that handles multi-byte characters.
- * Needed for Big5, Sjift-JIS and UTF-8 encoding.  Other DBCS encodings can
+ * Needed for Big5, Shift-JIS and UTF-8 encoding.  Other DBCS encodings can
  * probably use strnicmp(), because there are no ASCII characters in the
  * second byte.
  * Returns zero if s1 and s2 are equal (ignoring case), the difference between
@@ -4294,6 +4294,44 @@ static HINSTANCE hMsvcrtDLL = 0;
 #  endif
 
 /*
+ * Get the address of 'funcname' which is imported by 'hInst' DLL.
+ */
+    static void *
+get_iconv_import_func(HINSTANCE hInst, const char *funcname)
+{
+    PBYTE			pImage = (PBYTE)hInst;
+    PIMAGE_DOS_HEADER		pDOS = (PIMAGE_DOS_HEADER)hInst;
+    PIMAGE_NT_HEADERS		pPE;
+    PIMAGE_IMPORT_DESCRIPTOR	pImpDesc;
+    PIMAGE_THUNK_DATA		pIAT;	    /* Import Address Table */
+    PIMAGE_THUNK_DATA		pINT;	    /* Import Name Table */
+    PIMAGE_IMPORT_BY_NAME	pImpName;
+
+    if (pDOS->e_magic != IMAGE_DOS_SIGNATURE)
+	return NULL;
+    pPE = (PIMAGE_NT_HEADERS)(pImage + pDOS->e_lfanew);
+    if (pPE->Signature != IMAGE_NT_SIGNATURE)
+	return NULL;
+    pImpDesc = (PIMAGE_IMPORT_DESCRIPTOR)(pImage
+	    + pPE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
+							    .VirtualAddress);
+    for (; pImpDesc->FirstThunk; ++pImpDesc)
+    {
+	pIAT = (PIMAGE_THUNK_DATA)(pImage + pImpDesc->FirstThunk);
+	pINT = (PIMAGE_THUNK_DATA)(pImage + pImpDesc->OriginalFirstThunk);
+	for (; pIAT->u1.Function; ++pIAT, ++pINT)
+	{
+	    if (IMAGE_SNAP_BY_ORDINAL(pINT->u1.Ordinal))
+		continue;
+	    pImpName = (PIMAGE_IMPORT_BY_NAME)(pImage + pINT->u1.AddressOfData);
+	    if (strcmp(pImpName->Name, funcname) == 0)
+		return (void *)pIAT->u1.Function;
+	}
+    }
+    return NULL;
+}
+
+/*
  * Try opening the iconv.dll and return TRUE if iconv() can be used.
  */
     int
@@ -4326,7 +4364,9 @@ iconv_enabled(verbose)
     iconv_open	= (void *)GetProcAddress(hIconvDLL, "libiconv_open");
     iconv_close	= (void *)GetProcAddress(hIconvDLL, "libiconv_close");
     iconvctl	= (void *)GetProcAddress(hIconvDLL, "libiconvctl");
-    iconv_errno	= (void *)GetProcAddress(hMsvcrtDLL, "_errno");
+    iconv_errno	= get_iconv_import_func(hIconvDLL, "_errno");
+    if (iconv_errno == NULL)
+	iconv_errno = (void *)GetProcAddress(hMsvcrtDLL, "_errno");
     if (iconv == NULL || iconv_open == NULL || iconv_close == NULL
 	    || iconvctl == NULL || iconv_errno == NULL)
     {
--- a/src/version.c
+++ b/src/version.c
@@ -726,6 +726,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    767,
+/**/
     766,
 /**/
     765,