~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Modules/cjkcodecs/multibytecodec.h

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * multibytecodec.h: Common Multibyte Codec Implementation
 
3
 *
 
4
 * Written by Hye-Shik Chang <perky@FreeBSD.org>
 
5
 */
 
6
 
 
7
#ifndef _PYTHON_MULTIBYTECODEC_H_
 
8
#define _PYTHON_MULTIBYTECODEC_H_
 
9
#ifdef __cplusplus
 
10
extern "C" {
 
11
#endif
 
12
 
 
13
#ifdef uint32_t
 
14
typedef uint32_t ucs4_t;
 
15
#else
 
16
typedef unsigned int ucs4_t;
 
17
#endif
 
18
 
 
19
#ifdef uint16_t
 
20
typedef uint16_t ucs2_t, DBCHAR;
 
21
#else
 
22
typedef unsigned short ucs2_t, DBCHAR;
 
23
#endif
 
24
 
 
25
typedef union {
 
26
        void *p;
 
27
        int i;
 
28
        unsigned char c[8];
 
29
        ucs2_t u2[4];
 
30
        ucs4_t u4[2];
 
31
} MultibyteCodec_State;
 
32
 
 
33
typedef int (*mbcodec_init)(const void *config);
 
34
typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,
 
35
                        const void *config,
 
36
                        const Py_UNICODE **inbuf, Py_ssize_t inleft,
 
37
                        unsigned char **outbuf, Py_ssize_t outleft,
 
38
                        int flags);
 
39
typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,
 
40
                                 const void *config);
 
41
typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,
 
42
                        const void *config,
 
43
                        unsigned char **outbuf, Py_ssize_t outleft);
 
44
typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,
 
45
                        const void *config,
 
46
                        const unsigned char **inbuf, Py_ssize_t inleft,
 
47
                        Py_UNICODE **outbuf, Py_ssize_t outleft);
 
48
typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,
 
49
                                 const void *config);
 
50
typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,
 
51
                                         const void *config);
 
52
 
 
53
typedef struct {
 
54
        const char *encoding;
 
55
        const void *config;
 
56
        mbcodec_init codecinit;
 
57
        mbencode_func encode;
 
58
        mbencodeinit_func encinit;
 
59
        mbencodereset_func encreset;
 
60
        mbdecode_func decode;
 
61
        mbdecodeinit_func decinit;
 
62
        mbdecodereset_func decreset;
 
63
} MultibyteCodec;
 
64
 
 
65
typedef struct {
 
66
        PyObject_HEAD
 
67
        MultibyteCodec *codec;
 
68
} MultibyteCodecObject;
 
69
 
 
70
#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)
 
71
 
 
72
#define _MultibyteStatefulCodec_HEAD            \
 
73
        PyObject_HEAD                           \
 
74
        MultibyteCodec *codec;                  \
 
75
        MultibyteCodec_State state;             \
 
76
        PyObject *errors;
 
77
typedef struct {
 
78
        _MultibyteStatefulCodec_HEAD
 
79
} MultibyteStatefulCodecContext;
 
80
 
 
81
#define MAXENCPENDING   2
 
82
#define _MultibyteStatefulEncoder_HEAD          \
 
83
        _MultibyteStatefulCodec_HEAD            \
 
84
        Py_UNICODE pending[MAXENCPENDING];      \
 
85
        Py_ssize_t pendingsize;
 
86
typedef struct {
 
87
        _MultibyteStatefulEncoder_HEAD
 
88
} MultibyteStatefulEncoderContext;
 
89
 
 
90
#define MAXDECPENDING   8
 
91
#define _MultibyteStatefulDecoder_HEAD          \
 
92
        _MultibyteStatefulCodec_HEAD            \
 
93
        unsigned char pending[MAXDECPENDING];   \
 
94
        Py_ssize_t pendingsize;
 
95
typedef struct {
 
96
        _MultibyteStatefulDecoder_HEAD
 
97
} MultibyteStatefulDecoderContext;
 
98
 
 
99
typedef struct {
 
100
        _MultibyteStatefulEncoder_HEAD
 
101
} MultibyteIncrementalEncoderObject;
 
102
 
 
103
typedef struct {
 
104
        _MultibyteStatefulDecoder_HEAD
 
105
} MultibyteIncrementalDecoderObject;
 
106
 
 
107
typedef struct {
 
108
        _MultibyteStatefulDecoder_HEAD
 
109
        PyObject *stream;
 
110
} MultibyteStreamReaderObject;
 
111
 
 
112
typedef struct {
 
113
        _MultibyteStatefulEncoder_HEAD
 
114
        PyObject *stream;
 
115
} MultibyteStreamWriterObject;
 
116
 
 
117
/* positive values for illegal sequences */
 
118
#define MBERR_TOOSMALL          (-1) /* insufficient output buffer space */
 
119
#define MBERR_TOOFEW            (-2) /* incomplete input buffer */
 
120
#define MBERR_INTERNAL          (-3) /* internal runtime error */
 
121
 
 
122
#define ERROR_STRICT            (PyObject *)(1)
 
123
#define ERROR_IGNORE            (PyObject *)(2)
 
124
#define ERROR_REPLACE           (PyObject *)(3)
 
125
#define ERROR_ISCUSTOM(p)       ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
 
126
#define ERROR_DECREF(p) do {                    \
 
127
        if (p != NULL && ERROR_ISCUSTOM(p)) {   \
 
128
                Py_DECREF(p);                   \
 
129
        }                                       \
 
130
} while (0);
 
131
 
 
132
#define MBENC_FLUSH             0x0001 /* encode all characters encodable */
 
133
#define MBENC_MAX               MBENC_FLUSH
 
134
 
 
135
#ifdef __cplusplus
 
136
}
 
137
#endif
 
138
#endif