1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
%module hangul
%{
#include "hangul.h"
#include <iconv.h>
/* FIXME - to avoid undifined symbol error */
ucschar hangul_choseong_to_jamo(ucschar ch) { return 0; }
ucschar hangul_jungseong_to_jamo(ucschar ch) { return 0; }
ucschar hangul_jongseong_to_jamo(ucschar ch) { return 0; }
int hanja_table_txt_to_bin(const char* txtfilename, const char* binfilename)
{ return 0; }
#ifdef WORDS_BIGENDIAN
#define UCS4 "UCS-4BE"
#else
#define UCS4 "UCS-4LE"
#endif
void ucs4_to_utf8(char *buf, const ucschar *ucs4, size_t bufsize)
{
size_t n;
char* inbuf;
size_t inbytesleft;
char* outbuf;
size_t outbytesleft;
size_t ret;
iconv_t cd;
for (n = 0; ucs4[n] != 0; n++)
continue;
if (n == 0) {
buf[0] = '\0';
return;
}
cd = iconv_open("UTF-8", UCS4);
if (cd == (iconv_t)(-1))
return;
inbuf = (char*)ucs4;
inbytesleft = n * 4;
outbuf = buf;
outbytesleft = bufsize;
ret = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
iconv_close(cd);
if (outbytesleft > 0)
*outbuf = '\0';
else
buf[bufsize - 1] = '\0';
}
%}
%typemap(out) const ucschar* {
char commit[32] = { '\0', };
ucs4_to_utf8(commit, $1, sizeof(commit));
$result = PyString_FromString(commit);
}
%typemap(out) ucschar {
$result = Py_BuildValue("I", $1);
}
%typemap(in) ucschar {
if(!PyInt_Check($input)) {
PyErr_SetString(PyExc_ValueError, "Expected a int");
return NULL;
}
$1 = (ucschar)PyInt_AS_LONG($input);
}
%include "hangul.h"
|