[Pkg-gnupg-commit] [libgpg-error] 22/35: w32: Add iconv functions.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Mon Apr 25 21:47:12 UTC 2016
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch master
in repository libgpg-error.
commit 1cd1ddb4ac2c13223a073f6d77696bcd6253e2ff
Author: Werner Koch <wk at gnupg.org>
Date: Thu Apr 21 09:51:45 2016 +0200
w32: Add iconv functions.
* src/w32-add.h (gpgrt_w32_iconv_t): New.
(gpgrt_w32_iconv_open, gpgrt_w32_iconv_close, gpgrt_w32_iconv): New.
( GPGRT_ENABLE_W32_ICONV_MACROS): New
* src/w32-iconv.c: Change license to LGPLv2.1+. Dispable mlang
feature. Remove external DLL loading. Simplify iconv functions. Use
cleaner context struct pattern. Use gpgrt namespace.
* src/gpg-error.def.in: Add new functions.
Signed-off-by: Werner Koch <wk at gnupg.org>
---
NEWS | 4 +
src/Makefile.am | 2 +-
src/gpg-error.def.in | 6 +
src/w32-add.h | 18 ++
src/w32-iconv.c | 503 +++++++++++----------------------------------------
5 files changed, 134 insertions(+), 399 deletions(-)
diff --git a/NEWS b/NEWS
index d1d21fa..b736ad2 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,10 @@ Noteworthy changes in version 1.22 (unreleased) [C17/A17/R_)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPG_ERR_DB_CORRUPTED NEW.
gpgrt_annotate_leaked_object NEW inline func.
+ GPGRT_ENABLE_W32_ICONV_MACROS NEW.
+ gpgrt_w32_iconv_open NEW.
+ gpgrt_w32_iconv_close NEW.
+ gpgrt_w32_iconv NEW.
Noteworthy changes in version 1.21 (2015-12-12) [C17/A17/R0]
diff --git a/src/Makefile.am b/src/Makefile.am
index 2458431..1d88608 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -105,7 +105,7 @@ CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
# {{{ Begin Windows part
#
if HAVE_W32_SYSTEM
-arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c
+arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c w32-iconv.c
RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS) $(CPPFLAGS)
LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
diff --git a/src/gpg-error.def.in b/src/gpg-error.def.in
index f8b9ebc..1fa8866 100644
--- a/src/gpg-error.def.in
+++ b/src/gpg-error.def.in
@@ -144,4 +144,10 @@ EXPORTS
gpgrt_get_nonblock @107
gpgrt_poll @108
+#ifdef HAVE_W32_SYSTEM
+ gpgrt_w32_iconv_open @109
+ gpgrt_w32_iconv_close @110
+ gpgrt_w32_iconv @111
+#endif
+
;; end of file with public symbols for Windows.
diff --git a/src/w32-add.h b/src/w32-add.h
index 02848ac..5db6500 100644
--- a/src/w32-add.h
+++ b/src/w32-add.h
@@ -38,3 +38,21 @@ int _gpg_w32_gettext_use_utf8 (int value);
#endif /*GPG_ERR_ENABLE_GETTEXT_MACROS*/
+/* A simple iconv implementation w/o the need for an extra DLL. */
+struct _gpgrt_w32_iconv_s;
+typedef struct _gpgrt_w32_iconv_s *gpgrt_w32_iconv_t;
+
+gpgrt_w32_iconv_t gpgrt_w32_iconv_open (const char *tocode,
+ const char *fromcode);
+int gpgrt_w32_iconv_close (gpgrt_w32_iconv_t cd);
+size_t gpgrt_w32_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft);
+
+#ifdef GPGRT_ENABLE_W32_ICONV_MACROS
+# define ICONV_CONST const
+# define iconv_t gpgrt_w32_iconv_t
+# define iconv_open(a,b) gpgrt_w32_iconv_open ((a), (b))
+# define iconv_close(a) gpgrt_w32_iconv_close ((a))
+# define iconv(a,b,c,d,e) gpgrt_w32_iconv ((a),(b),(c),(d),(e))
+#endif /*GPGRT_ENABLE_W32_ICONV_MACROS*/
diff --git a/src/w32-iconv.c b/src/w32-iconv.c
index 20aa8e1..47a06b2 100644
--- a/src/w32-iconv.c
+++ b/src/w32-iconv.c
@@ -1,4 +1,21 @@
/* w32-iconv.c - iconv implementation for Windows.
+ * Copyright (C) 2016 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ *
**************************************************************
* This code code is based on the file win_iconv.c as found
* at https://github.com/win-iconv/win-iconv with the commit id
@@ -12,37 +29,26 @@
*---------------------------------------------------
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+#if !defined (_WIN32) && !defined (__CYGWIN32__)
+# error This module may only be build for Windows or Cygwin32
+#endif
+
/* for WC_NO_BEST_FIT_CHARS */
#ifndef WINVER
# define WINVER 0x0500
#endif
-#define STRICT
#include <windows.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
-#ifdef __GNUC__
-#define UNUSED __attribute__((unused))
-#else
-#define UNUSED
-#endif
+#include "gpgrt-int.h"
-/* WORKAROUND: */
-#ifndef UNDER_CE
-#define GetProcAddressA GetProcAddress
-#endif
-
-#if 0
-# define MAKE_EXE
-# define MAKE_DLL
-# define USE_LIBICONV_DLL
-#endif
-
-#if !defined(DEFAULT_LIBICONV_DLL)
-# define DEFAULT_LIBICONV_DLL ""
-#endif
+#undef USE_MLANG_DLL
#define MB_CHAR_MAX 16
@@ -57,29 +63,9 @@ typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
-typedef void* iconv_t;
-
-iconv_t iconv_open(const char *tocode, const char *fromcode);
-int iconv_close(iconv_t cd);
-size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
-
-/* libiconv interface for vim */
-#if defined(MAKE_DLL)
-int
-iconvctl (iconv_t cd, int request, void* argument)
-{
- /* not supported */
- return 0;
-}
-#endif
-
typedef struct compat_t compat_t;
typedef struct csconv_t csconv_t;
-typedef struct rec_iconv_t rec_iconv_t;
-typedef iconv_t (*f_iconv_open)(const char *tocode, const char *fromcode);
-typedef int (*f_iconv_close)(iconv_t cd);
-typedef size_t (*f_iconv)(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
typedef int* (*f_errno)(void);
typedef int (*f_mbtowc)(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
typedef int (*f_wctomb)(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
@@ -107,23 +93,16 @@ struct csconv_t {
compat_t *compat;
};
-struct rec_iconv_t {
- iconv_t cd;
- f_iconv_close iconv_close;
- f_iconv iconv;
+struct _gpgrt_w32_iconv_s {
f_errno _errno;
csconv_t from;
csconv_t to;
-#if defined(USE_LIBICONV_DLL)
- HMODULE hlibiconv;
-#endif
};
-static int win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode);
-static int win_iconv_close(iconv_t cd);
-static size_t win_iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
-
+#if USE_MLANG_DLL
static int load_mlang(void);
+#endif /*USE_MLANG_DLL*/
+
static int make_csconv(const char *name, csconv_t *cv);
static int name_to_codepage(const char *name);
static uint utf16_to_ucs4(const ushort *wbuf);
@@ -134,31 +113,32 @@ static char *strrstr(const char *str, const char *token);
static char *xstrndup(const char *s, size_t n);
static int seterror(int err);
-#if defined(USE_LIBICONV_DLL)
-static int libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode);
-static PVOID MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size);
-static FARPROC find_imported_function(HMODULE hModule, const char *funcname);
-
-static HMODULE hwiniconv;
-#endif
-
static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+#if USE_MLANG_DLL
static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+
+#if USE_MLANG_DLL
static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
+
static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+
+#if USE_MLANG_DLL
static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
static struct {
int codepage;
@@ -194,7 +174,6 @@ static struct {
{12001, "UCS4BE"},
{12001, "UCS-4BE"},
-#ifndef GLIB_COMPILATION
/*
* Default is big endian.
* See rfc2781 4.3 Interpreting text labelled as UTF-16.
@@ -207,17 +186,6 @@ static struct {
{12001, "UTF-32"},
{12001, "UCS-4"},
{12001, "UCS4"},
-#else
- /* Default is little endian, because the platform is */
- {1200, "UTF16"},
- {1200, "UTF-16"},
- {1200, "UCS2"},
- {1200, "UCS-2"},
- {12000, "UTF32"},
- {12000, "UTF-32"},
- {12000, "UCS4"},
- {12000, "UCS-4"},
-#endif
/* copy from libiconv `iconv -l` */
/* !IsValidCodePage(367) */
@@ -663,6 +631,7 @@ static compat_t *cp51932_compat = cp932_compat;
/* cp20932_compat for kernel. cp932_compat for mlang. */
static compat_t *cp5022x_compat = cp932_compat;
+#if USE_MLANG_DLL
typedef HRESULT (WINAPI *CONVERTINETSTRING)(
LPDWORD lpdwMode,
DWORD dwSrcEncoding,
@@ -716,7 +685,9 @@ static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte;
static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable;
static LCIDTORFC1766A LcidToRfc1766A;
static RFC1766TOLCIDA Rfc1766ToLcidA;
+#endif /*USE_MLANG_DLL*/
+#if USE_MLANG_DLL
static int
load_mlang(void)
{
@@ -734,79 +705,23 @@ load_mlang(void)
Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddressA(h, "Rfc1766ToLcidA");
return TRUE;
}
-
-iconv_t
-iconv_open(const char *tocode, const char *fromcode)
-{
- rec_iconv_t *cd;
-
- cd = (rec_iconv_t *)calloc(1, sizeof(rec_iconv_t));
- if (cd == NULL)
- return (iconv_t)(-1);
-
-#if defined(USE_LIBICONV_DLL)
- errno = 0;
- if (libiconv_iconv_open(cd, tocode, fromcode))
- return (iconv_t)cd;
#endif
- /* reset the errno to prevent reporting wrong error code.
- * 0 for unsorted error. */
- errno = 0;
- if (win_iconv_open(cd, tocode, fromcode))
- return (iconv_t)cd;
-
- free(cd);
-
- return (iconv_t)(-1);
-}
-
-int
-iconv_close(iconv_t _cd)
-{
- rec_iconv_t *cd = (rec_iconv_t *)_cd;
- int r = cd->iconv_close(cd->cd);
- int e = *(cd->_errno());
-#if defined(USE_LIBICONV_DLL)
- if (cd->hlibiconv != NULL)
- FreeLibrary(cd->hlibiconv);
-#endif
- free(cd);
- errno = e;
- return r;
-}
-
-size_t
-iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
-{
- rec_iconv_t *cd = (rec_iconv_t *)_cd;
- size_t r = cd->iconv(cd->cd, inbuf, inbytesleft, outbuf, outbytesleft);
- errno = *(cd->_errno());
- return r;
-}
static int
-win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode)
+win_iconv_open(gpgrt_w32_iconv_t cd, const char *tocode, const char *fromcode)
{
if (!make_csconv(fromcode, &cd->from) || !make_csconv(tocode, &cd->to))
return FALSE;
- cd->iconv_close = win_iconv_close;
- cd->iconv = win_iconv;
cd->_errno = _errno;
- cd->cd = (iconv_t)cd;
return TRUE;
}
-static int
-win_iconv_close(iconv_t cd UNUSED)
-{
- return 0;
-}
-
static size_t
-win_iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
+win_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
{
- rec_iconv_t *cd = (rec_iconv_t *)_cd;
ushort wbuf[MB_CHAR_MAX]; /* enough room for one character */
int insize;
int outsize;
@@ -979,6 +894,7 @@ make_csconv(const char *_name, csconv_t *cv)
cv->wctomb = kernel_wctomb;
cv->mblen = utf8_mblen;
}
+#if USE_MLANG_DLL
else if ((cv->codepage == 50220 || cv->codepage == 50221 || cv->codepage == 50222) && load_mlang())
{
cv->mbtowc = iso2022jp_mbtowc;
@@ -991,6 +907,7 @@ make_csconv(const char *_name, csconv_t *cv)
cv->wctomb = mlang_wctomb;
cv->mblen = eucjp_mblen;
}
+#endif /*USE_MLANG_DLL*/
else if (IsValidCodePage(cv->codepage)
&& GetCPInfo(cv->codepage, &cpinfo) != 0)
{
@@ -1148,150 +1065,18 @@ xstrndup(const char *s, size_t n)
static int
seterror(int err)
{
- errno = err;
+ _gpg_err_set_errno (err);
return -1;
}
-#if defined(USE_LIBICONV_DLL)
-static int
-libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode)
-{
- HMODULE hlibiconv = NULL;
- char *dllname;
- const char *p;
- const char *e;
- f_iconv_open _iconv_open;
-
- /*
- * always try to load dll, so that we can switch dll in runtime.
- */
-
- /* XXX: getenv() can't get variable set by SetEnvironmentVariable() */
- p = getenv("WINICONV_LIBICONV_DLL");
- if (p == NULL)
- p = DEFAULT_LIBICONV_DLL;
- /* parse comma separated value */
- for ( ; *p != 0; p = (*e == ',') ? e + 1 : e)
- {
- e = strchr(p, ',');
- if (p == e)
- continue;
- else if (e == NULL)
- e = p + strlen(p);
- dllname = xstrndup(p, e - p);
- if (dllname == NULL)
- return FALSE;
- hlibiconv = LoadLibraryA(dllname);
- free(dllname);
- if (hlibiconv != NULL)
- {
- if (hlibiconv == hwiniconv)
- {
- FreeLibrary(hlibiconv);
- hlibiconv = NULL;
- continue;
- }
- break;
- }
- }
-
- if (hlibiconv == NULL)
- goto failed;
-
- _iconv_open = (f_iconv_open)GetProcAddressA(hlibiconv, "libiconv_open");
- if (_iconv_open == NULL)
- _iconv_open = (f_iconv_open)GetProcAddressA(hlibiconv, "iconv_open");
- cd->iconv_close = (f_iconv_close)GetProcAddressA(hlibiconv, "libiconv_close");
- if (cd->iconv_close == NULL)
- cd->iconv_close = (f_iconv_close)GetProcAddressA(hlibiconv, "iconv_close");
- cd->iconv = (f_iconv)GetProcAddressA(hlibiconv, "libiconv");
- if (cd->iconv == NULL)
- cd->iconv = (f_iconv)GetProcAddressA(hlibiconv, "iconv");
- cd->_errno = (f_errno)find_imported_function(hlibiconv, "_errno");
- if (_iconv_open == NULL || cd->iconv_close == NULL
- || cd->iconv == NULL || cd->_errno == NULL)
- goto failed;
-
- cd->cd = _iconv_open(tocode, fromcode);
- if (cd->cd == (iconv_t)(-1))
- goto failed;
-
- cd->hlibiconv = hlibiconv;
- return TRUE;
-
-failed:
- if (hlibiconv != NULL)
- FreeLibrary(hlibiconv);
- return FALSE;
-}
-
-/*
- * Reference:
- * http://forums.belution.com/ja/vc/000/234/78s.shtml
- * http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html
- *
- * The formal way is
- * imagehlp.h or dbghelp.h
- * imagehlp.lib or dbghelp.lib
- * ImageDirectoryEntryToData()
- */
-#define TO_DOS_HEADER(base) ((PIMAGE_DOS_HEADER)(base))
-#define TO_NT_HEADERS(base) ((PIMAGE_NT_HEADERS)((LPBYTE)(base) + TO_DOS_HEADER(base)->e_lfanew))
-static PVOID
-MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
-{
- /* TODO: MappedAsImage? */
- PIMAGE_DATA_DIRECTORY p;
- p = TO_NT_HEADERS(Base)->OptionalHeader.DataDirectory + DirectoryEntry;
- if (p->VirtualAddress == 0) {
- *Size = 0;
- return NULL;
- }
- *Size = p->Size;
- return (PVOID)((LPBYTE)Base + p->VirtualAddress);
-}
-
-static FARPROC
-find_imported_function(HMODULE hModule, const char *funcname)
-{
- DWORD_PTR Base;
- ULONG Size;
- PIMAGE_IMPORT_DESCRIPTOR Imp;
- PIMAGE_THUNK_DATA Address; /* Import Address Table */
- PIMAGE_THUNK_DATA Name; /* Import Name Table */
- PIMAGE_IMPORT_BY_NAME ImpName;
-
- Base = (DWORD_PTR)hModule;
- Imp = (PIMAGE_IMPORT_DESCRIPTOR)MyImageDirectoryEntryToData(
- (LPVOID)Base,
- TRUE,
- IMAGE_DIRECTORY_ENTRY_IMPORT,
- &Size);
- if (Imp == NULL)
- return NULL;
- for ( ; Imp->OriginalFirstThunk != 0; ++Imp)
- {
- Address = (PIMAGE_THUNK_DATA)(Base + Imp->FirstThunk);
- Name = (PIMAGE_THUNK_DATA)(Base + Imp->OriginalFirstThunk);
- for ( ; Name->u1.Ordinal != 0; ++Name, ++Address)
- {
- if (!IMAGE_SNAP_BY_ORDINAL(Name->u1.Ordinal))
- {
- ImpName = (PIMAGE_IMPORT_BY_NAME)
- (Base + (DWORD_PTR)Name->u1.AddressOfData);
- if (strcmp((char *)ImpName->Name, funcname) == 0)
- return (FARPROC)Address->u1.Function;
- }
- }
- }
- return NULL;
-}
-#endif
static int
-sbcs_mblen(csconv_t *cv UNUSED, const uchar *buf UNUSED, int bufsize UNUSED)
+sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize)
{
- return 1;
+ (void)cv;
+ (void)buf;
+ (void)bufsize;
+ return 1;
}
static int
@@ -1326,10 +1111,12 @@ mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize)
}
static int
-utf8_mblen(csconv_t *cv UNUSED, const uchar *buf, int bufsize)
+utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize)
{
int len = 0;
+ (void) cv;
+
if (buf[0] < 0x80) len = 1;
else if ((buf[0] & 0xE0) == 0xC0) len = 2;
else if ((buf[0] & 0xF0) == 0xE0) len = 3;
@@ -1344,9 +1131,12 @@ utf8_mblen(csconv_t *cv UNUSED, const uchar *buf, int bufsize)
return len;
}
+#if USE_MLANG_DLL
static int
-eucjp_mblen(csconv_t *cv UNUSED, const uchar *buf, int bufsize)
+eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize)
{
+ (void) cv;
+
if (buf[0] < 0x80) /* ASCII */
return 1;
else if (buf[0] == 0x8E) /* JIS X 0201 */
@@ -1376,6 +1166,7 @@ eucjp_mblen(csconv_t *cv UNUSED, const uchar *buf, int bufsize)
return 2;
}
}
+#endif /*USE_MLANG_DLL*/
static int
kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
@@ -1439,6 +1230,7 @@ kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
* "C42C" is same for each convert session.
* It should be: ((codepage-1)<<16)|state
*/
+#if USE_MLANG_DLL
static int
mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
{
@@ -1476,6 +1268,7 @@ mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
memcpy(buf, tmpbuf, tmpsize);
return tmpsize;
}
+#endif /*USE_MLANG_DLL*/
static int
utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
@@ -1702,6 +1495,7 @@ struct iso2022_esc_t {
#define ISO2022JP_CS_JISX0208_1983 4
#define ISO2022JP_CS_JISX0212 5
+#if USE_MLANG_DLL
static iso2022_esc_t iso2022jp_esc[] = {
{"\x1B\x28\x42", 3, 1, ISO2022JP_CS_ASCII},
{"\x1B\x28\x4A", 3, 1, ISO2022JP_CS_JISX0201_ROMAN},
@@ -1711,9 +1505,12 @@ static iso2022_esc_t iso2022jp_esc[] = {
{"\x1B\x24\x28\x44", 4, 2, ISO2022JP_CS_JISX0212},
{NULL, 0, 0, 0}
};
+#endif /*USE_MLANG_DLL*/
+#if USE_MLANG_DLL
static int
-iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
+iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize,
+ ushort *wbuf, int *wbufsize)
{
iso2022_esc_t *iesc = iso2022jp_esc;
char tmp[MB_CHAR_MAX];
@@ -1815,7 +1612,10 @@ iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int
return len;
}
+#endif /*USE_MLANG_DLL*/
+
+#if USE_MLANG_DLL
static int
iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
{
@@ -1911,7 +1711,9 @@ iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsi
cv->mode = ISO2022_MODE(cs, shift);
return len + esc_len;
}
+#endif /*USE_MLANG_DLL*/
+#if USE_MLANG_DLL
static int
iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize)
{
@@ -1944,143 +1746,48 @@ iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize)
}
return 0;
}
+#endif /*USE_MLANG_DLL*/
-#if defined(MAKE_DLL) && defined(USE_LIBICONV_DLL)
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
-{
- switch( fdwReason )
- {
- case DLL_PROCESS_ATTACH:
- hwiniconv = (HMODULE)hinstDLL;
- break;
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
-}
-#endif
-#if defined(MAKE_EXE)
-#include <stdio.h>
-#include <fcntl.h>
-#include <io.h>
-int
-main(int argc, char **argv)
+gpgrt_w32_iconv_t
+gpgrt_w32_iconv_open (const char *tocode, const char *fromcode)
{
- char *fromcode = NULL;
- char *tocode = NULL;
- int i;
- char inbuf[BUFSIZ];
- char outbuf[BUFSIZ];
- const char *pin;
- char *pout;
- size_t inbytesleft;
- size_t outbytesleft;
- size_t rest = 0;
- iconv_t cd;
- size_t r;
- FILE *in = stdin;
- FILE *out = stdout;
- int ignore = 0;
- char *p;
+ gpgrt_w32_iconv_t cd;
- _setmode(_fileno(stdin), _O_BINARY);
- _setmode(_fileno(stdout), _O_BINARY);
+ cd = calloc(1, sizeof *cd);
+ if (!cd)
+ return (gpgrt_w32_iconv_t)(-1);
- for (i = 1; i < argc; ++i)
- {
- if (strcmp(argv[i], "-l") == 0)
- {
- for (i = 0; codepage_alias[i].name != NULL; ++i)
- printf("%s\n", codepage_alias[i].name);
- return 0;
- }
-
- if (strcmp(argv[i], "-f") == 0)
- fromcode = argv[++i];
- else if (strcmp(argv[i], "-t") == 0)
- tocode = argv[++i];
- else if (strcmp(argv[i], "-c") == 0)
- ignore = 1;
- else if (strcmp(argv[i], "--output") == 0)
- {
- out = fopen(argv[++i], "wb");
- if(out == NULL)
- {
- fprintf(stderr, "cannot open %s\n", argv[i]);
- return 1;
- }
- }
- else
- {
- in = fopen(argv[i], "rb");
- if (in == NULL)
- {
- fprintf(stderr, "cannot open %s\n", argv[i]);
- return 1;
- }
- break;
- }
- }
+ /* reset the errno to prevent reporting wrong error code.
+ * 0 for unsorted error. */
+ _gpg_err_set_errno (0);
+ if (win_iconv_open(cd, tocode, fromcode))
+ return cd;
- if (fromcode == NULL || tocode == NULL)
- {
- printf("usage: %s [-c] -f from-enc -t to-enc [file]\n", argv[0]);
- return 0;
- }
+ free(cd);
- if (ignore)
- {
- p = tocode;
- tocode = (char *)malloc(strlen(p) + strlen("//IGNORE") + 1);
- if (tocode == NULL)
- {
- perror("fatal error");
- return 1;
- }
- strcpy(tocode, p);
- strcat(tocode, "//IGNORE");
- }
+ return (gpgrt_w32_iconv_t)(-1);
+}
- cd = iconv_open(tocode, fromcode);
- if (cd == (iconv_t)(-1))
+int
+gpgrt_w32_iconv_close (gpgrt_w32_iconv_t cd)
+{
+ if (cd)
{
- perror("iconv_open error");
- return 1;
+ free (cd);
}
- while ((inbytesleft = fread(inbuf + rest, 1, sizeof(inbuf) - rest, in)) != 0
- || rest != 0)
- {
- inbytesleft += rest;
- pin = inbuf;
- pout = outbuf;
- outbytesleft = sizeof(outbuf);
- r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft);
- fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out);
- if (r == (size_t)(-1) && errno != E2BIG && (errno != EINVAL || feof(in)))
- {
- perror("conversion error");
- return 1;
- }
- memmove(inbuf, pin, inbytesleft);
- rest = inbytesleft;
- }
- pout = outbuf;
- outbytesleft = sizeof(outbuf);
- r = iconv(cd, NULL, NULL, &pout, &outbytesleft);
- fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out);
- if (r == (size_t)(-1))
- {
- perror("conversion error");
- return 1;
- }
+ return 0;
+}
- iconv_close(cd);
+size_t
+gpgrt_w32_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ size_t r;
- return 0;
+ r = win_iconv (cd, inbuf, inbytesleft, outbuf, outbytesleft);
+ _gpg_err_set_errno (*(cd->_errno()));
+ return r;
}
-#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libgpg-error.git
More information about the Pkg-gnupg-commit
mailing list