From: konn Date: Sat, 2 Feb 2008 10:07:03 +0000 (+0000) Subject: * for DoCoMo X-Git-Tag: v0.14.1~336 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=669a9ff9fe046a14e1b1982b9688ee9bdfd4b83f;p=modchxj%2Fmod_chxj.git * for DoCoMo git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/trunk@1801 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- diff --git a/include/chxj_emoji.h b/include/chxj_emoji.h index dcda0531..775fcb4d 100644 --- a/include/chxj_emoji.h +++ b/include/chxj_emoji.h @@ -175,4 +175,10 @@ chxj_postdata_meta_emoji_to_emoji( const char *src, device_table *spec); +extern char * +chxj_postdata_imode_emoji_to_meta_emoji( + request_rec *r, + const char *encoding, + const char *src, + apr_size_t *iolen); #endif diff --git a/src/chxj_emoji.c b/src/chxj_emoji.c index 4043c659..ba167819 100644 --- a/src/chxj_emoji.c +++ b/src/chxj_emoji.c @@ -131,6 +131,22 @@ static int cmp_as_softbank2imode_utf8_bin(const char *, softbank2imode_t *); static int cmp_as_softbank2imode_sjis_bin(const char *, softbank2imode_t *); static int cmp_as_softbank2imode_webcode_bin(const char *, softbank2imode_t *); +/*============================================================================*/ +/* for POSTDATA (i-MODE) */ +/*============================================================================*/ +static emoji_t *chxj_bsearch_imode2imode_emoji( + request_rec *r, + const char *src, + int (*cmp)(const char *, emoji_t *)); +static emoji_t *is_emoji_imode2imode_bin( + request_rec *r, + const char *src, + int (*cmp)(const char *, emoji_t *)); +static emoji_t *is_emoji_as_imode2imode_sjis_bin(request_rec *r, const char *src); +static emoji_t *is_emoji_as_imode2imode_utf8_bin(request_rec *r, const char *src); +static int cmp_as_imode2imode_utf8_bin(const char *, emoji_t *); +static int cmp_as_imode2imode_sjis_bin(const char *, emoji_t *); + void chxj_emoji_init( @@ -426,27 +442,26 @@ dbg_r = r; emoji_t *tmp; switch (enc) { case EUCJP: - DBG(r, "mb src[%d]=[\\x%x][\\x%x][\\x%x]", i, (unsigned char)src[i], (unsigned char)src[i+1], (unsigned char)src[i+2]); DBG(r, "DETECT EUCJP BIN"); - tmp = is_emoji_as_eucjp_bin(r, &src[i]); - if (tmp) { - char *meta_emoji = apr_psprintf(r->pool, - "%s%d;", - META_EMOJI_PREFIX, - tmp->no); - DBG(r, "FOUND EMOJI :[%s]", meta_emoji); - outbuf = apr_pstrcat(r->pool, - outbuf, - apr_psprintf(r->pool, - "%s", - meta_emoji), - NULL); - i += 2; - continue; - } - DBG(r, "NOT FOUND EMOJI"); if ((unsigned char)src[i] == 0x8F) { /* 3byte charactor */ + tmp = is_emoji_as_eucjp_bin(r, &src[i]); + if (tmp) { + char *meta_emoji = apr_psprintf(r->pool, + "%s%d;", + META_EMOJI_PREFIX, + tmp->no); + DBG(r, "FOUND EMOJI :[%s]", meta_emoji); + outbuf = apr_pstrcat(r->pool, + outbuf, + apr_psprintf(r->pool, + "%s", + meta_emoji), + NULL); + i += 2; + continue; + } + DBG(r, "NOT FOUND EMOJI"); mb[0] = src[i+0]; mb[1] = src[i+1]; mb[2] = src[i+2]; @@ -462,7 +477,6 @@ dbg_r = r; break; case UTF8: - DBG(r, "mb src[%d]=[\\x%x][\\x%x][\\x%x]", i, (unsigned char)src[i], (unsigned char)src[i+1], (unsigned char)src[i+2]); DBG(r, "DETECT UTF8 BIN"); if ((0xe0 & src[i]) == 0xc0) { /* 2byte charactor */ @@ -514,25 +528,26 @@ dbg_r = r; case SJIS: default: - DBG(r, "mb src[%d]=[\\x%x][\\x%x]", i, (unsigned char)src[i], (unsigned char)src[i+1]); DBG(r, "DETECT SJIS BIN"); - tmp = is_emoji_as_sjis_bin(r, &src[i]); - if (tmp) { - char *meta_emoji = apr_psprintf(r->pool, - "%s%d;", - META_EMOJI_PREFIX, - tmp->no); - DBG(r, "FOUND EMOJI :[%s]", meta_emoji); - outbuf = apr_pstrcat(r->pool, - outbuf, - apr_psprintf(r->pool, - "%s", - meta_emoji), - NULL); - i++; - continue; + if ((0xff & src[i]) == 0xf8 || (0xff & src[i]) == 0xf9) { + tmp = is_emoji_as_sjis_bin(r, &src[i]); + if (tmp) { + char *meta_emoji = apr_psprintf(r->pool, + "%s%d;", + META_EMOJI_PREFIX, + tmp->no); + DBG(r, "FOUND EMOJI :[%s]", meta_emoji); + outbuf = apr_pstrcat(r->pool, + outbuf, + apr_psprintf(r->pool, + "%s", + meta_emoji), + NULL); + i++; + continue; + } + DBG(r, "NOT FOUND EMOJI"); } - DBG(r, "NOT FOUND EMOJI"); if ( ((0x81 <= (unsigned char)src[i]) && (0x9f >= (unsigned char)src[i]) && (0x40 <= (unsigned char)src[i+1]) @@ -2274,3 +2289,268 @@ dbg_r = r; DBG(r, "end convert EMOJI to META EMOJI. [%s]", outbuf); return outbuf; } + + + + +/*===========================================================================*/ +/* I-Mode POSTDATA Converter */ +/*===========================================================================*/ + +/** + * Emoji Convert to Meta Emoji for POSTDATA. + * + * @param r [i] The request_rec + * @param encoding [i] client encoding + */ +char * +chxj_postdata_imode_emoji_to_meta_emoji( + request_rec *r, + const char *encoding, + const char *src, + apr_size_t *iolen) +{ + apr_size_t ilen = *iolen; + char *outbuf; + apr_size_t i; + int enc; +dbg_r = r; + DBG(r, "start convert EMOJI to META EMOJI"); + enc = SJIS; + if (STRCASEEQ('n','N',"none",encoding)) { + return apr_pstrdup(r->pool, src); + } else if (IS_SJIS_STRING(encoding)) { + enc = SJIS; + } else if (IS_UTF8_STRING(encoding)) { + enc = UTF8; + } + + /* + * Now because the character-code was decided + * seeing one character. + */ + outbuf = apr_palloc(r->pool, 1); + outbuf[0] = 0; + + for (i = 0; i < ilen; i++) { + if (isascii(src[i])) { + outbuf = apr_pstrcat(r->pool, + outbuf, + apr_psprintf(r->pool, + "%c", + src[i]), + NULL); + } + else { + /* + * multibyte charactor + */ + char mb[8]; + emoji_t *tmp; + + switch (enc) { + case UTF8: + if ((0xe0 & src[i]) == 0xc0) { + /* 2byte charactor */ + mb[0] = src[i+0]; + mb[1] = src[i+1]; + mb[2] = 0; + i++; + } + else if ((0xf0 & src[i]) == 0xe0) { + DBG(r, "DETECT UTF8 BIN"); + if ((0xff & src[i]) == 0xee) { + tmp = is_emoji_as_imode2imode_utf8_bin(r, &src[i]); + if (tmp) { + char *meta_emoji; + meta_emoji = apr_psprintf(r->pool, + "%s%d;", + META_EMOJI_PREFIX, + tmp->no); + DBG(r, "FOUND EMOJI :[%s]", meta_emoji); + outbuf = apr_pstrcat(r->pool, + outbuf, + apr_psprintf(r->pool, + "%s", + meta_emoji), + NULL); + i+=2; + continue; + } + } + DBG(r, "NOT FOUND EMOJI"); + /* 3byte charactor */ + mb[0] = src[i+0]; + mb[1] = src[i+1]; + mb[2] = src[i+2]; + mb[3] = 0; + i+=2; + } + else if ((0xf8 & src[i]) == 0xf0) { + /* 4byte charactor */ + mb[0] = src[i+0]; + mb[1] = src[i+1]; + mb[2] = src[i+2]; + mb[3] = src[i+3]; + mb[4] = 0; + i+=3; + } + else if ((0xc0 & src[i]) == 0x80) { + /* unknown charactor */ + mb[0] = src[i+0]; + mb[1] = 0; + } + break; + + case SJIS: + default: + DBG(r, "DETECT SJIS BIN"); + if ((src[i] & 0xff) == 0xf8 || (src[i] & 0xff) == 0xf9) { + tmp = is_emoji_as_imode2imode_sjis_bin(r, &src[i]); + if (tmp) { + char *meta_emoji; + meta_emoji = apr_psprintf(r->pool, + "%s%d;", + META_EMOJI_PREFIX, + tmp->no); + DBG(r, "FOUND EMOJI :[%s]", meta_emoji); + outbuf = apr_pstrcat(r->pool, + outbuf, + apr_psprintf(r->pool, + "%s", + meta_emoji), + NULL); + i++; + continue; + } + } + DBG(r, "NOT FOUND EMOJI"); + mb[0] = src[i++]; + mb[1] = src[i]; + mb[2] = 0; + break; + } + outbuf = apr_pstrcat(r->pool, outbuf, mb, NULL); + } + } + *iolen = strlen(outbuf); + DBG(r, "end convert EMOJI to META EMOJI. [%s]", outbuf); + return outbuf; +} + + +static emoji_t * +is_emoji_as_imode2imode_utf8_bin( + request_rec *r, + const char *src) +{ + return is_emoji_imode2imode_bin(r, src, cmp_as_imode2imode_utf8_bin); +} + + +static emoji_t * +is_emoji_imode2imode_bin( + request_rec *r, + const char *src, + int (*cmp)(const char *, emoji_t *)) +{ + char test[EMOJI_BINCODE_MAX_LEN]; + emoji_t *rtn; + + memset(test, 0, EMOJI_BINCODE_MAX_LEN); + strncpy(test, src, EMOJI_BINCODE_MAX_LEN); + rtn = chxj_bsearch_imode2imode_emoji(r, test, cmp); + if (rtn) { + return rtn; + } + return NULL; +} + + +static emoji_t * +chxj_bsearch_imode2imode_emoji( + request_rec *r, + const char *src, + int (*cmp)(const char *, emoji_t *)) +{ + int left = 0; + int right = EMOJI_EZWEB2IMODE_COUNT - 1; + int mid; + int ret; + mod_chxj_config *dconf; + + dconf = ap_get_module_config(r->per_dir_config, &chxj_module); + while(left <= right) { + mid = (left + right) / 2; + if (cmp == cmp_as_imode2imode_sjis_bin) { + ret = cmp(src, dconf->emoji_index_sjis[mid]); + if (! ret) { + return dconf->emoji_index_sjis[mid]; + } + } + else { + ret = cmp(src, dconf->emoji_index_utf8[mid]); + if (! ret) { + return dconf->emoji_index_utf8[mid]; + } + } + if (ret > 0) { + left = mid + 1; + } else { + right = mid - 1; + } + } + return NULL; +} + + +static int +cmp_as_imode2imode_utf8_bin( + const char *src, + emoji_t *target) +{ + long src_value = 0; + long target_value = 0; + + src_value = (long)(0xff & src[0]); + src_value <<= 8; + src_value |= (long)(0xff & src[1]); + src_value <<= 8; + src_value |= (long)(0xff & src[2]); + + target_value = (long)(0xff & target->imode.utf8.hex[0]); + target_value <<= 8; + target_value |= (long)(0xff & target->imode.utf8.hex[1]); + target_value <<= 8; + target_value |= (long)(0xff & target->imode.utf8.hex[2]); + + return src_value - target_value; +} + + +static emoji_t * +is_emoji_as_imode2imode_sjis_bin( + request_rec *r, + const char *src) +{ + return is_emoji_imode2imode_bin(r, src, cmp_as_imode2imode_sjis_bin); +} + + +static int +cmp_as_imode2imode_sjis_bin( + const char *src, + emoji_t *target) +{ + long src_value = 0; + long target_value = 0; + src_value = (long)(0xff & src[0]); + src_value <<= 8; + src_value |= (long)(0xff & src[1]); + + target_value = (long)(0xff & target->imode.sjis.hex[0]); + target_value <<= 8; + target_value |= (long)(0xff & target->imode.sjis.hex[1]); + + return src_value - target_value; +} diff --git a/src/mod_chxj.c b/src/mod_chxj.c index c44cc662..040d543b 100644 --- a/src/mod_chxj.c +++ b/src/mod_chxj.c @@ -506,12 +506,7 @@ chxj_input_convert( case CHXJ_SPEC_Chtml_6_0: case CHXJ_SPEC_Chtml_7_0: default: -#if 0 func_emoji_to_meta_emoji = chxj_postdata_imode_emoji_to_meta_emoji; -#else - /* XXX とりあえず */ - func_emoji_to_meta_emoji = chxj_postdata_softbank_emoji_to_meta_emoji; -#endif break; }