[pypy-commit] pypy default: Fixed up multibytecodec on windows. With much help from armin and amaury.
alex_gaynor
noreply at buildbot.pypy.org
Thu May 12 21:20:37 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r44108:99f7b410912d
Date: 2011-05-12 15:27 -0400
http://bitbucket.org/pypy/pypy/changeset/99f7b410912d/
Log: Fixed up multibytecodec on windows. With much help from armin and
amaury.
diff --git a/pypy/module/_multibytecodec/c_codecs.py b/pypy/module/_multibytecodec/c_codecs.py
--- a/pypy/module/_multibytecodec/c_codecs.py
+++ b/pypy/module/_multibytecodec/c_codecs.py
@@ -18,28 +18,6 @@
srcdir = py.path.local(pypydir).join('translator', 'c')
-eci = ExternalCompilationInfo(
- separate_module_files = [
- srcdir.join('src', 'cjkcodecs', '_codecs_cn.c'),
- srcdir.join('src', 'cjkcodecs', '_codecs_hk.c'),
- srcdir.join('src', 'cjkcodecs', '_codecs_iso2022.c'),
- srcdir.join('src', 'cjkcodecs', '_codecs_jp.c'),
- srcdir.join('src', 'cjkcodecs', '_codecs_kr.c'),
- srcdir.join('src', 'cjkcodecs', '_codecs_tw.c'),
- srcdir.join('src', 'cjkcodecs', 'multibytecodec.c'),
- ],
- includes = ['src/cjkcodecs/multibytecodec.h'],
- include_dirs = [str(srcdir)],
-)
-
-MBERR_TOOSMALL = -1 # insufficient output buffer space
-MBERR_TOOFEW = -2 # incomplete input buffer
-MBERR_INTERNAL = -3 # internal runtime error
-MBERR_NOMEMORY = -4 # out of memory
-
-MULTIBYTECODEC_P = rffi.COpaquePtr('struct MultibyteCodec_s',
- compilation_info=eci)
-
codecs = [
# _codecs_cn
'gb2312', 'gbk', 'gb18030', 'hz',
@@ -60,7 +38,38 @@
# _codecs_tw
'big5', 'cp950',
- ]
+]
+
+eci = ExternalCompilationInfo(
+ separate_module_files = [
+ srcdir.join('src', 'cjkcodecs', '_codecs_cn.c'),
+ srcdir.join('src', 'cjkcodecs', '_codecs_hk.c'),
+ srcdir.join('src', 'cjkcodecs', '_codecs_iso2022.c'),
+ srcdir.join('src', 'cjkcodecs', '_codecs_jp.c'),
+ srcdir.join('src', 'cjkcodecs', '_codecs_kr.c'),
+ srcdir.join('src', 'cjkcodecs', '_codecs_tw.c'),
+ srcdir.join('src', 'cjkcodecs', 'multibytecodec.c'),
+ ],
+ includes = ['src/cjkcodecs/multibytecodec.h'],
+ include_dirs = [str(srcdir)],
+ export_symbols = [
+ "pypy_cjk_dec_init", "pypy_cjk_dec_free", "pypy_cjk_dec_chunk",
+ "pypy_cjk_dec_outbuf", "pypy_cjk_dec_outlen",
+ "pypy_cjk_dec_inbuf_remaining", "pypy_cjk_dec_inbuf_consumed",
+
+ "pypy_cjk_enc_init", "pypy_cjk_enc_free", "pypy_cjk_enc_chunk",
+ "pypy_cjk_enc_reset", "pypy_cjk_enc_outbuf", "pypy_cjk_enc_outlen",
+ "pypy_cjk_enc_inbuf_remaining", "pypy_cjk_enc_inbuf_consumed",
+ ] + ["pypy_cjkcodec_%s" % codec for codec in codecs],
+)
+
+MBERR_TOOSMALL = -1 # insufficient output buffer space
+MBERR_TOOFEW = -2 # incomplete input buffer
+MBERR_INTERNAL = -3 # internal runtime error
+MBERR_NOMEMORY = -4 # out of memory
+
+MULTIBYTECODEC_P = rffi.COpaquePtr('struct MultibyteCodec_s',
+ compilation_info=eci)
def llexternal(*args, **kwds):
kwds.setdefault('compilation_info', eci)
@@ -156,7 +165,6 @@
# ____________________________________________________________
# Encoding
-
ENCODEBUF_P = rffi.COpaquePtr('struct pypy_cjk_enc_s', compilation_info=eci)
pypy_cjk_enc_init = llexternal('pypy_cjk_enc_init',
[MULTIBYTECODEC_P, rffi.CWCHARP, rffi.SSIZE_T],
@@ -194,7 +202,7 @@
assert False
src = pypy_cjk_enc_outbuf(encodebuf)
length = pypy_cjk_enc_outlen(encodebuf)
- return string_from_raw(src, length)
+ return rffi.charpsize2str(src, length)
#
finally:
pypy_cjk_enc_free(encodebuf)
@@ -220,18 +228,3 @@
end = start + esize
if 1: # errors == ERROR_STRICT:
raise EncodeDecodeError(start, end, reason)
-
-def string_from_raw(src, length):
- result = lltype.malloc(STR, length)
- try:
- str_chars_offset = (rffi.offsetof(STR, 'chars') + \
- rffi.itemoffsetof(STR.chars, 0))
- dest = rffi.cast_ptr_to_adr(result) + str_chars_offset
- src = rffi.cast_ptr_to_adr(src) + rffi.itemoffsetof(rffi.CCHARP.TO)
- rffi.raw_memcopy(src, dest,
- llmemory.sizeof(lltype.Char) * length)
- got = hlstr(result)
- finally:
- keepalive_until_here(result)
- assert got is not None
- return got
diff --git a/pypy/translator/c/src/cjkcodecs/multibytecodec.h b/pypy/translator/c/src/cjkcodecs/multibytecodec.h
--- a/pypy/translator/c/src/cjkcodecs/multibytecodec.h
+++ b/pypy/translator/c/src/cjkcodecs/multibytecodec.h
@@ -5,12 +5,27 @@
#include <stddef.h>
#include <stdint.h>
-#include <unistd.h>
#include <assert.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#ifdef _WIN64
+typedef __int64 ssize_t
+#else
+#ifdef _WIN32
+typedef int ssize_t;
+#endif
+#endif
+
#ifndef Py_UNICODE_SIZE
-#define Py_UNICODE_SIZE 4
-typedef uint32_t Py_UNICODE;
+#ifdef _WIN32
+#define Py_UNICODE_SIZE 2
+#else
+#define Py_UNICODE_SIZE 4
+#endif
+typedef wchar_t Py_UNICODE;
typedef ssize_t Py_ssize_t;
#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t) -1) >> 1))
#endif
More information about the pypy-commit
mailing list