00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _QORE_CHARSET_H
00024
00025 #define _QORE_CHARSET_H
00026
00032 #include <qore/common.h>
00033 #include <qore/QoreThreadLock.h>
00034
00035 #include <strings.h>
00036 #include <string.h>
00037
00038 #include <map>
00039
00040 #include <string>
00041
00043 typedef qore_size_t (*mbcs_length_t)(const char *str, const char *end, bool &invalid);
00044
00046 typedef qore_size_t (*mbcs_end_t)(const char *str, const char *end, qore_size_t num_chars, bool &invalid);
00047
00049 typedef qore_size_t (*mbcs_pos_t)(const char *str, const char *ptr, bool &invalid);
00050
00052
00056 typedef qore_size_t (*mbcs_charlen_t)(const char *str, qore_size_t valid_len);
00057
00058 class ExceptionSink;
00059
00061
00071 class QoreEncoding {
00072 private:
00073 std::string code;
00074 std::string desc;
00075 mbcs_length_t flength;
00076 mbcs_end_t fend;
00077 mbcs_pos_t fpos;
00078 mbcs_charlen_t fcharlen;
00079 unsigned char maxwidth;
00080
00081 public:
00082 DLLLOCAL QoreEncoding(const char *n_code, const char *n_desc = 0, unsigned char n_maxwidth = 1, mbcs_length_t l = 0, mbcs_end_t e = 0, mbcs_pos_t p = 0, mbcs_charlen_t c = 0) : code(n_code), desc(n_desc ? n_desc : ""), flength(l), fend(e), fpos(p), fcharlen(c), maxwidth(n_maxwidth) {
00083 }
00084
00085 DLLLOCAL ~QoreEncoding() {
00086 }
00087
00089
00094 DLLLOCAL qore_size_t getLength(const char *p, const char *end, bool &invalid) const {
00095 return flength ? flength(p, end, invalid) : strlen(p);
00096 }
00097
00099
00104 DLLLOCAL qore_size_t getLength(const char *p, const char *end, ExceptionSink *xsink) const;
00105
00107
00113 DLLLOCAL qore_size_t getByteLen(const char *p, const char *end, qore_size_t c, bool &invalid) const {
00114 return fend ? fend(p, end, c, invalid) : c;
00115 }
00116
00118
00124 DLLLOCAL qore_size_t getByteLen(const char *p, const char *end, qore_size_t c, ExceptionSink *xsink) const;
00125
00127
00132 DLLLOCAL qore_size_t getCharPos(const char *p, const char *end, bool &invalid) const {
00133 return fpos ? fpos(p, end, invalid) : end - p;
00134 }
00135
00137
00142 DLLLOCAL qore_size_t getCharPos(const char *p, const char *end, ExceptionSink *xsink) const;
00143
00145
00150 DLLLOCAL qore_size_t getCharLen(const char *p, qore_size_t valid_len) const {
00151 return fcharlen ? fcharlen(p, valid_len) : 1;
00152 }
00153
00155 DLLEXPORT bool isMultiByte() const {
00156 return (bool)flength;
00157 }
00158
00160 DLLEXPORT const char *getCode() const {
00161 return code.c_str();
00162 }
00163
00165 DLLEXPORT const char *getDesc() const {
00166 return desc.empty() ? "<no description available>" : desc.c_str();
00167 }
00168
00170 DLLEXPORT int getMaxCharWidth() const {
00171 return maxwidth;
00172 }
00173 };
00174
00175
00176 typedef std::map<const char *, QoreEncoding *, class ltcstrcase> encoding_map_t;
00177 typedef std::map<const char *, const QoreEncoding *, class ltcstrcase> const_encoding_map_t;
00178
00179 class QoreString;
00180
00182
00184 class QoreEncodingManager
00185 {
00186 private:
00187 DLLLOCAL static encoding_map_t emap;
00188 DLLLOCAL static const_encoding_map_t amap;
00189 DLLLOCAL static class QoreThreadLock mutex;
00190
00191 DLLLOCAL static const QoreEncoding *addUnlocked(const char *code, const char *desc, unsigned char maxwidth = 1, mbcs_length_t l = 0, mbcs_end_t e = 0, mbcs_pos_t p = 0, mbcs_charlen_t = 0);
00192 DLLLOCAL static const QoreEncoding *findUnlocked(const char *name);
00193
00194 public:
00196 DLLEXPORT static void addAlias(const QoreEncoding *qcs, const char *alias);
00197
00199 DLLEXPORT static const QoreEncoding *findCreate(const char *name);
00200
00202 DLLEXPORT static const QoreEncoding *findCreate(const QoreString *str);
00203
00205 DLLEXPORT static void showEncodings();
00206
00208 DLLEXPORT static void showAliases();
00209
00211 DLLEXPORT static const QoreEncoding *add(const char *code, const char *desc = 0, unsigned char maxwidth = 1, mbcs_length_t l = 0, mbcs_end_t e = 0, mbcs_pos_t p = 0, mbcs_charlen_t = 0);
00212
00213 DLLLOCAL static void init(const char *def);
00214 DLLLOCAL QoreEncodingManager();
00215 DLLLOCAL ~QoreEncodingManager();
00216 };
00217
00219 DLLEXPORT extern QoreEncodingManager QEM;
00220
00221
00222 DLLEXPORT extern const QoreEncoding *QCS_DEFAULT,
00223 *QCS_USASCII,
00224 *QCS_UTF8,
00225 *QCS_ISO_8859_1,
00226 *QCS_ISO_8859_2,
00227 *QCS_ISO_8859_3,
00228 *QCS_ISO_8859_4,
00229 *QCS_ISO_8859_5,
00230 *QCS_ISO_8859_6,
00231 *QCS_ISO_8859_7,
00232 *QCS_ISO_8859_8,
00233 *QCS_ISO_8859_9,
00234 *QCS_ISO_8859_10,
00235 *QCS_ISO_8859_11,
00236 *QCS_ISO_8859_13,
00237 *QCS_ISO_8859_14,
00238 *QCS_ISO_8859_15,
00239 *QCS_ISO_8859_16,
00240 *QCS_KOI8_R,
00241 *QCS_KOI8_U,
00242 *QCS_KOI7;
00243
00244 #endif // _QORE_CHARSET_H