]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.767 v7.3.767
authorBram Moolenaar <Bram@vim.org>
Thu, 17 Jan 2013 13:39:47 +0000 (14:39 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 17 Jan 2013 13:39:47 +0000 (14:39 +0100)
Problem:    (Win32) The _errno used for iconv may be the wrong one.
Solution:   Use the _errno from iconv.dll. (Ken Takata)

src/mbyte.c
src/version.c

index 33e894e88c7df4eb96833c5922b7fe475a57f54a..5f82edf8d68e0aba2491c92d7f4c047ef7a909b0 100644 (file)
@@ -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
@@ -4293,6 +4293,44 @@ static HINSTANCE hMsvcrtDLL = 0;
 #   define DYNAMIC_MSVCRT_DLL "msvcrt.dll"
 #  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.
  */
@@ -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)
     {
index 444a3d92ac6391d4a9edebabed74c9d75a235e1b..321740010998f6801ac25c745a302a6c5af7e808 100644 (file)
@@ -725,6 +725,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    767,
 /**/
     766,
 /**/