]> granicus.if.org Git - php/commitdiff
- MFH: Sync with the latest codebase (fixes bug #28220).
authorMoriyoshi Koizumi <moriyoshi@php.net>
Fri, 8 Oct 2004 14:45:47 +0000 (14:45 +0000)
committerMoriyoshi Koizumi <moriyoshi@php.net>
Fri, 8 Oct 2004 14:45:47 +0000 (14:45 +0000)
ext/mbstring/libmbfl/configure.in
ext/mbstring/libmbfl/mbfl/Makefile.am
ext/mbstring/libmbfl/mbfl/mbfilter.c

index b6e5ab581a464cec9668f67d3092fa142ec91743..25d2e59373c998062f56c90698cbbaaf71724283 100644 (file)
@@ -28,5 +28,11 @@ AC_FUNC_MALLOC
 AC_FUNC_REALLOC
 AC_CHECK_FUNCS([strcasecmp strchr])
 
+AC_CHECK_PROGS([FETCH_VIA_FTP], [wget curl ncftpget])
+
+if test "$FETCH_VIA_FTP" = "curl"; then
+  FETCH_VIA_FTP="curl -O"
+fi
+
 AC_CONFIG_FILES([Makefile mbfl/Makefile filters/Makefile nls/Makefile])
 AC_OUTPUT
index 6f817feba2482affbf8e226f379e67c8f0f679c6..25d67345416806c0c6e3b63397db498e738f51f9 100644 (file)
@@ -1,6 +1,6 @@
-EXTRA_DIST=Makefile.bcc32
+EXTRA_DIST=Makefile.bcc32 mk_eaw_tbl.awk
 lib_LTLIBRARIES=libmbfl.la
-libmbfl_la_SOURCES=mbfilter.c mbfl_string.c mbfl_language.c mbfl_encoding.c mbfl_convert.c mbfl_ident.c mbfl_memory_device.c mbfl_allocators.c mbfl_filter_output.c mbfilter_pass.c mbfilter_wchar.c mbfilter_8bit.c
+libmbfl_la_SOURCES=mbfilter.c mbfl_string.c mbfl_language.c mbfl_encoding.c mbfl_convert.c mbfl_ident.c mbfl_memory_device.c mbfl_allocators.c mbfl_filter_output.c mbfilter_pass.c mbfilter_wchar.c mbfilter_8bit.c eaw_table.h
 libmbfl_filters_la=../filters/libmbfl_filters.la
 libmbfl_nls_la=../nls/libmbfl_nls.la
 libmbfl_la_LIBADD=$(libmbfl_filters_la) $(libmbfl_nls_la)
@@ -8,6 +8,14 @@ libmbfl_la_LDFLAGS=-version-info $(SHLIB_VERSION)
 libmbfl_includedir=$(includedir)/mbfl
 libmbfl_include_HEADERS=mbfilter.h mbfl_consts.h mbfl_encoding.h mbfl_language.h mbfl_string.h mbfl_convert.h mbfl_ident.h mbfl_memory_device.h mbfl_allocators.h mbfl_defs.h mbfl_filter_output.h mbfilter_pass.h mbfilter_wchar.h mbfilter_8bit.h 
 
+mbfilter.c: eaw_table.h
+
+eaw_table.h: mk_eaw_tbl.awk
+       $(AWK) -v TABLE_NAME=mbfl_eaw_table -f mk_eaw_tbl.awk EastAsianWidth.txt > $@
+
+EastAsianWidth.txt:
+       $(FETCH_VIA_FTP) ftp://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt
+
 $(libmbfl_filters_la):
        $(MAKE) -C `dirname $(libmbfl_filters_la)`
 
index 7984f30931e33be17d200359bca52d53a4f0efd6..01e4787a96290db9f75611741e34d83f05f03e86 100644 (file)
 #include "mbfl_filter_output.h"
 #include "mbfilter_pass.h"
 
+#include "eaw_table.h"
+
 /* hex character table "0123456789ABCDEF" */
 static char mbfl_hexchar_table[] = {
        0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
@@ -1343,20 +1345,31 @@ mbfl_strcut(
 }
 
 
+#include <stdio.h>
 /*
  *  strwidth
  */
-static int
-filter_count_width(int c, void* data)
+static int is_fullwidth(int c)
 {
-       if (c >= 0x20) {
-               if (c < 0x2000 || (c > 0xff60 && c < 0xffa0)) {
-                       (*(int *)data)++;
-               } else {
-                       (*(int *)data) += 2;
+       int i;
+
+       if (c < mbfl_eaw_table[0].begin) {
+               return 0;
+       }
+
+       for (i = 0; i < sizeof(mbfl_eaw_table) / sizeof(mbfl_eaw_table[0]); i++) {
+               if (mbfl_eaw_table[i].begin <= c && c <= mbfl_eaw_table[i].end) {
+                       return 1;
                }
        }
 
+       return 0;
+}
+
+static int
+filter_count_width(int c, void* data)
+{
+       (*(int *)data) += (is_fullwidth(c) ? 2: 1);
        return c;
 }
 
@@ -1421,13 +1434,7 @@ collector_strimwidth(int c, void* data)
                break;
        default:
                if (pc->outchar >= pc->from) {
-                       if (c >= 0x20) {
-                               if (c < 0x2000 || (c > 0xff60 && c < 0xffa0)) {
-                                       pc->outwidth++;
-                               } else {
-                                       pc->outwidth += 2;
-                               }
-                       }
+                       pc->outwidth += (is_fullwidth(c) ? 2: 1);
                        if (pc->outwidth > pc->width) {
                                if (pc->status == 0) {
                                        pc->endpos = pc->device.pos;