Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r44053:2e36d562269a
Date: 2011-05-10 13:52 +0200
http://bitbucket.org/pypy/pypy/changeset/2e36d562269a/

Log:    Initial test about accessing the codecs from pypy.

diff --git a/pypy/module/_multibytecodec/__init__.py 
b/pypy/module/_multibytecodec/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/__init__.py
@@ -0,0 +1,10 @@
+from pypy.interpreter.mixedmodule import MixedModule 
+
+
+class Module(MixedModule):
+
+    interpleveldefs = {
+    }
+
+    appleveldefs = {
+    }
diff --git a/pypy/module/_multibytecodec/c_codecs.py 
b/pypy/module/_multibytecodec/c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/c_codecs.py
@@ -0,0 +1,58 @@
+import py
+from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+from pypy.tool.autopath import pypydir
+
+
+srcdir = py.path.local(pypydir).join('module', '_multibytecodec', 'cjkcodecs')
+
+eci = ExternalCompilationInfo(
+    separate_module_files = [
+        srcdir.join('_codecs_cn.c'),
+        srcdir.join('_codecs_hk.c'),
+        srcdir.join('_codecs_iso2022.c'),
+        srcdir.join('_codecs_jp.c'),
+        srcdir.join('_codecs_kr.c'),
+        srcdir.join('_codecs_tw.c'),
+    ],
+)
+
+
+MULTIBYTECODEC_PTR = rffi.VOIDP
+
+codecs = [
+    # _codecs_cn
+    'gb2312', 'gbk', 'gb18030', 'hz',
+
+    # _codecs_hk
+    'big5hkscs',
+
+    # _codecs_iso2022
+    'iso2022_kr', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+    'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext',
+
+    # _codecs_jp
+    'shift_jis', 'cp932', 'euc_jp', 'shift_jis_2004',
+    'euc_jis_2004', 'euc_jisx0213', 'shift_jisx0213',
+
+    # _codecs_kr
+    'euc_kr', 'cp949', 'johab',
+
+    # _codecs_tw
+    'big5', 'cp950',
+    ]
+
+def getter_for(name):
+    return rffi.llexternal('pypy_cjkcodec_%s' % name, [], MULTIBYTECODEC_PTR,
+                           compilation_info=eci, sandboxsafe=True,
+                           _nowrapper=True)
+
+_codecs_getters = dict([(name, getter_for(name)) for name in codecs])
+
+def getcodec(name):
+    try:
+        getter = _codecs_getters[name]
+    except KeyError:
+        return lltype.nullptr(MULTIBYTECODEC_PTR.TO)
+    else:
+        return getter()
diff --git a/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c 
b/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
--- a/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
+++ b/pypy/module/_multibytecodec/cjkcodecs/_codecs_iso2022.c
@@ -1094,12 +1094,10 @@
   /* no mapping table here */
 END_MAPPINGS_LIST
 
-#define ISO2022_CODEC(variation) {              \
-    "iso2022_" #variation,                      \
-    &iso2022_##variation##_config,              \
-    iso2022_codec_init,                         \
-    _STATEFUL_METHODS(iso2022)                  \
-},
+#define ISO2022_CODEC(variation)                        \
+  CODEC_STATEFUL_CONFIG(iso2022,                        \
+                        variation,                      \
+                        &iso2022_##variation##_config)
 
 BEGIN_CODECS_LIST
   ISO2022_CODEC(kr)
diff --git a/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c 
b/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
--- a/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
+++ b/pypy/module/_multibytecodec/cjkcodecs/_codecs_jp.c
@@ -724,8 +724,8 @@
   CODEC_STATELESS(euc_jp)
   CODEC_STATELESS(shift_jis_2004)
   CODEC_STATELESS(euc_jis_2004)
-  { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
-  { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
+  CODEC_STATELESS_CONFIG(euc_jisx0213,   (void *)2000, euc_jis_2004)
+  CODEC_STATELESS_CONFIG(shift_jisx0213, (void *)2000, shift_jis_2004)
 END_CODECS_LIST
 
 I_AM_A_MODULE_FOR(jp)
diff --git a/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h 
b/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
--- a/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
+++ b/pypy/module/_multibytecodec/cjkcodecs/cjkcodecs.h
@@ -200,15 +200,21 @@
 
 #define BEGIN_MAPPINGS_LIST /* empty */
 #define MAPPING_ENCONLY(enc)                                            \
-  const struct dbcs_map _pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, NULL};
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, NULL};
 #define MAPPING_DECONLY(enc)                                            \
-  const struct dbcs_map _pypy_cjkmap_##enc = {#enc, NULL, (void*)enc##_decmap};
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, NULL, (void*)enc##_decmap};
 #define MAPPING_ENCDEC(enc)                                             \
-  const struct dbcs_map _pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, \
-                                              (void*)enc##_decmap};
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, \
+                                             (void*)enc##_decmap};
 #define END_MAPPINGS_LIST /* empty */
 
-#define BEGIN_CODECS_LIST static const MultibyteCodec _codec_list[] = {
+#define BEGIN_CODECS_LIST /* empty */
+#define _CODEC(name)                            \
+  const MultibyteCodec _pypy_cjkcodec_##name;   \
+  void *pypy_cjkcodec_##name(void) {            \
+    return (void *)&_pypy_cjkcodec_##name;      \
+  }                                             \
+  const MultibyteCodec _pypy_cjkcodec_##name
 #define _STATEFUL_METHODS(enc)          \
     enc##_encode,                       \
     enc##_encode_init,                  \
@@ -219,21 +225,31 @@
 #define _STATELESS_METHODS(enc)         \
     enc##_encode, NULL, NULL,           \
     enc##_decode, NULL, NULL,
-#define CODEC_STATEFUL(enc) {           \
-    #enc, NULL, NULL,                   \
-    _STATEFUL_METHODS(enc)              \
-},
-#define CODEC_STATELESS(enc) {          \
-    #enc, NULL, NULL,                   \
-    _STATELESS_METHODS(enc)             \
-},
-#define CODEC_STATELESS_WINIT(enc) {    \
-    #enc, NULL,                         \
-    enc##_codec_init,                   \
-    _STATELESS_METHODS(enc)             \
-},
-#define END_CODECS_LIST                                 \
-    {"", NULL,} };
+#define CODEC_STATEFUL(enc) _CODEC(enc) = {     \
+    #enc, NULL, NULL,                           \
+    _STATEFUL_METHODS(enc)                      \
+  };
+#define CODEC_STATELESS(enc) _CODEC(enc) = {    \
+    #enc, NULL, NULL,                           \
+    _STATELESS_METHODS(enc)                     \
+  };
+#define CODEC_STATELESS_WINIT(enc) _CODEC(enc) = {      \
+    #enc, NULL,                                         \
+    enc##_codec_init,                                   \
+    _STATELESS_METHODS(enc)                             \
+  };
+#define CODEC_STATELESS_CONFIG(enc, config, baseenc) _CODEC(enc) = {    \
+    #enc, config, NULL,                                                 \
+    _STATELESS_METHODS(baseenc)                                         \
+  };
+#define CODEC_STATEFUL_CONFIG(enc, variation, config)   \
+  _CODEC(enc##_##variation) = {                         \
+    #enc "_" #variation,                                \
+    config,                                             \
+    enc##_codec_init,                                   \
+    _STATEFUL_METHODS(enc)                              \
+  };
+#define END_CODECS_LIST /* empty */
 
 
 #ifdef USING_BINARY_PAIR_SEARCH
@@ -269,10 +285,10 @@
 
 #ifdef USING_IMPORTED_MAPS
 #define USING_IMPORTED_MAP(charset) \
-  extern const struct dbcs_map _pypy_cjkmap_##charset;
+  extern const struct dbcs_map pypy_cjkmap_##charset;
 
 #define IMPORT_MAP(locale, charset, encmap, decmap)                     \
-  importmap(&_pypy_cjkmap_##charset, encmap, decmap)
+  importmap(&pypy_cjkmap_##charset, encmap, decmap)
 
 static void importmap(const struct dbcs_map *src, void *encmp,
                       void *decmp)
@@ -283,8 +299,7 @@
 #endif
 
 
-#define I_AM_A_MODULE_FOR(loc)                                  \
-    const MultibyteCodec *pypy_codec_list_##loc = _codec_list;
+#define I_AM_A_MODULE_FOR(loc) /* empty */
 
 
 #endif
diff --git a/pypy/module/_multibytecodec/test/__init__.py 
b/pypy/module/_multibytecodec/test/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/__init__.py
@@ -0,0 +1,1 @@
+#
diff --git a/pypy/module/_multibytecodec/test/test_c_codecs.py 
b/pypy/module/_multibytecodec/test/test_c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/test_c_codecs.py
@@ -0,0 +1,9 @@
+from pypy.module._multibytecodec.c_codecs import getcodec, codecs
+
+
+def test_codecs_existence():
+    for name in codecs:
+        c = getcodec(name)
+        assert c
+    c = getcodec("foobar")
+    assert not c
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to