Re: svn: /php/php-src/branches/PHP_5_4/ext/mbstring/ libmbfl/mbfl/mbfilter.c mbstring.c

From: Date: Mon, 18 Jul 2011 08:41:06 +0000
Subject: Re: svn: /php/php-src/branches/PHP_5_4/ext/mbstring/ libmbfl/mbfl/mbfilter.c mbstring.c
References: 1  Groups: php.cvs 
Request: Send a blank email to php-cvs+get-65520@lists.php.net to get a copy of this message
hi Rui! It would rock if you could use a sparse checkout and commits :) Thanks, On Mon, Jul 18, 2011 at 10:21 AM, Rui Hirokawa <hirokawa@php.net> wrote: > hirokawa                                 Mon, 18 Jul 2011 08:21:48 +0000 > > Revision: > http://svn.php.net/viewvc?view=revision&revision=313365 > > Log: > added numeric entities encode/decode in hex format. > > Changed paths: >    U   php/php-src/branches/PHP_5_4/ext/mbstring/libmbfl/mbfl/mbfilter.c >    U   php/php-src/branches/PHP_5_4/ext/mbstring/mbstring.c > > Modified: php/php-src/branches/PHP_5_4/ext/mbstring/libmbfl/mbfl/mbfilter.c > =================================================================== > --- php/php-src/branches/PHP_5_4/ext/mbstring/libmbfl/mbfl/mbfilter.c   2011-07-18 07:55:03 > UTC (rev 313364) > +++ php/php-src/branches/PHP_5_4/ext/mbstring/libmbfl/mbfl/mbfilter.c   2011-07-18 08:21:48 > UTC (rev 313365) > @@ -2746,7 +2746,9 @@ >                } >                break; >        case 2: > -               if (c >= 0x30 && c <= 0x39) {   /* '0' - > '9' */ > +               if (c == 0x78) {        /* 'x' */ > +                       pc->status = 4; > +               } else if (c >= 0x30 && c <= 0x39) { /* '0' - > '9' */ >                        pc->cache = c - 0x30; >                        pc->status = 3; >                        pc->digit = 1; > @@ -2810,6 +2812,89 @@ >                        (*pc->decoder->filter_function)(c, pc->decoder); >                } >                break; > +       case 4: > +               if (c >= 0x30 && c <= 0x39) { /* '0' - > '9' */ > +                       pc->cache = c - 0x30; > +                       pc->status = 5; > +                       pc->digit = 1; > +               } else if (c >= 0x41 && c <= 0x46) { /* 'A' - > 'F'  */ > +                       pc->cache = c - 0x41 + 10; > +                       pc->status = 5; > +                       pc->digit = 1; > +               } else if (c >= 0x61 && c <= 0x66) { /* 'a' - > 'f'  */ > +                       pc->cache = c - 0x61 + 10; > +                       pc->status = 5; > +                       pc->digit = 1; > +               } else { > +                       pc->status = 0; > +                       (*pc->decoder->filter_function)(0x26, pc->decoder); >             /* '&' */ > +                       (*pc->decoder->filter_function)(0x23, pc->decoder); >             /* '#' */ > +                       (*pc->decoder->filter_function)(0x78, pc->decoder); >             /* 'x' */ > +                       (*pc->decoder->filter_function)(c, pc->decoder); > +               } > +               break; > +       case 5: > +               s = 0; > +               f = 0; > +               if ((c >= 0x30 && c <= 0x39) || > +                       (c >= 0x41 && c <= 0x46) || > +                       (c >= 0x61 && c <= 0x66)) {     /* > '0' - '9' or 'a' - 'f'  */ > +                       if (pc->digit > 9) { > +                               pc->status = 0; > +                               s = pc->cache; > +                               f = 1; > +                       } else { > +                               if (c >= 0x30 && c <= 0x39) { > +                                       s = pc->cache*16 + (c - 0x30); > +                               } else if (c >= 0x41 && c <= 0x46) >  { > +                                       s = pc->cache*16 + (c - 0x41 + > 10); > +                               } else { > +                                       s = pc->cache*16 + (c - 0x61 + > 10); > +                               } > +                               pc->cache = s; > +                               pc->digit++; > +                       } > +               } else { > +                       pc->status = 0; > +                       s = pc->cache; > +                       f = 1; > +                       n = 0; > +                       size = pc->mapsize; > +                       while (n < size) { > +                               mapelm = &(pc->convmap[n*4]); > +                               d = s - mapelm[2]; > +                               if (d >= mapelm[0] && d <= > mapelm[1]) { > +                                       f = 0; > +                                       > (*pc->decoder->filter_function)(d, pc->decoder); > +                                       if (c != 0x3b) {        /* > ';' */ > +                                               > (*pc->decoder->filter_function)(c, pc->decoder); > +                                       } > +                                       break; > +                               } > +                               n++; > +                       } > +               } > +               if (f) { > +                       (*pc->decoder->filter_function)(0x26, pc->decoder); >             /* '&' */ > +                       (*pc->decoder->filter_function)(0x23, pc->decoder); >             /* '#' */ > +                       (*pc->decoder->filter_function)(0x78, pc->decoder); >             /* 'x' */ > +                       r = 1; > +                       n = pc->digit; > +                       while (n > 0) { > +                               r *= 16; > +                               n--; > +                       } > +                       s %= r; > +                       r /= 16; > +                       while (r > 0) { > +                               d = s/r; > +                               s %= r; > +                               r /= 16; > +                               > (*pc->decoder->filter_function)(mbfl_hexchar_table[d], pc->decoder); > +                       } > +                       (*pc->decoder->filter_function)(c, pc->decoder); > +               } > +               break; >        default: >                if (c == 0x26) {        /* '&' */ >                        pc->status = 1; > @@ -2822,6 +2907,53 @@ >        return c; >  } > > +static int > +collector_encode_hex_htmlnumericentity(int c, void *data) > +{ > +       struct collector_htmlnumericentity_data *pc = (struct > collector_htmlnumericentity_data *)data; > +       int f, n, s, r, d, size, *mapelm; > + > +       size = pc->mapsize; > +       f = 0; > +       n = 0; > +       while (n < size) { > +               mapelm = &(pc->convmap[n*4]); > +               if (c >= mapelm[0] && c <= mapelm[1]) { > +                       s = (c + mapelm[2]) & mapelm[3]; > +                       if (s >= 0) { > +                               (*pc->decoder->filter_function)(0x26, > pc->decoder);     /* '&' */ > +                               (*pc->decoder->filter_function)(0x23, > pc->decoder);     /* '#' */ > +                               (*pc->decoder->filter_function)(0x78, > pc->decoder);     /* 'x' */ > +                               r = 0x1000000; > +                               s %= r; > +                               while (r > 0) { > +                                       d = s/r; > +                                       if (d || f) { > +                                               f = 1; > +                                               s %= r; > +                                               > (*pc->decoder->filter_function)(mbfl_hexchar_table[d], pc->decoder); > +                                       } > +                                       r /= 16; > +                               } > +                               if (!f) { > +                                       f = 1; > +                                       > (*pc->decoder->filter_function)(mbfl_hexchar_table[0], pc->decoder); > +                               } > +                               (*pc->decoder->filter_function)(0x3b, > pc->decoder);             /* ';' */ > +                       } > +               } > +               if (f) { > +                       break; > +               } > +               n++; > +       } > +       if (!f) { > +               (*pc->decoder->filter_function)(c, pc->decoder); > +       } > + > +       return c; > +} > + >  mbfl_string * >  mbfl_html_numeric_entity( >     mbfl_string *string, > @@ -2850,15 +2982,20 @@ >            string->no_encoding, >            mbfl_memory_device_output, 0, &device); >        /* wchar filter */ > -       if (type == 0) { > +       if (type == 0) { /* decimal output */ >                encoder = mbfl_convert_filter_new( >                    string->no_encoding, >                    mbfl_no_encoding_wchar, >                    collector_encode_htmlnumericentity, 0, &pc); > -       } else { > +       } else if (type == 2) { /* hex output */ >                encoder = mbfl_convert_filter_new( >                    string->no_encoding, >                    mbfl_no_encoding_wchar, > +                   collector_encode_hex_htmlnumericentity, 0, &pc); > +       } else { /* type == 1: decimal/hex input */ > +               encoder = mbfl_convert_filter_new( > +                   string->no_encoding, > +                   mbfl_no_encoding_wchar, >                    collector_decode_htmlnumericentity, 0, &pc); >        } >        if (pc.decoder == NULL || encoder == NULL) { > > Modified: php/php-src/branches/PHP_5_4/ext/mbstring/mbstring.c > =================================================================== > --- php/php-src/branches/PHP_5_4/ext/mbstring/mbstring.c        2011-07-18 07:55:03 UTC > (rev 313364) > +++ php/php-src/branches/PHP_5_4/ext/mbstring/mbstring.c        2011-07-18 08:21:48 UTC > (rev 313365) > @@ -412,6 +412,7 @@ >        ZEND_ARG_INFO(0, string) >        ZEND_ARG_INFO(0, convmap) >        ZEND_ARG_INFO(0, encoding) > +       ZEND_ARG_INFO(0, is_hex) >  ZEND_END_ARG_INFO() > >  ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_decode_numericentity, 0, 0, 2) > @@ -3682,10 +3683,11 @@ >        HashTable *target_hash; >        size_t argc = ZEND_NUM_ARGS(); >        int i, *convmap, *mapelm, mapsize=0; > +       zend_bool is_hex = 0; >        mbfl_string string, result, *ret; >        enum mbfl_no_encoding no_encoding; > > -       if (zend_parse_parameters(argc TSRMLS_CC, "szs", &str, &str_len, > &zconvmap, &encoding, &encoding_len) == FAILURE) { > +       if (zend_parse_parameters(argc TSRMLS_CC, "sz|sb", &str, &str_len, > &zconvmap, &encoding, &encoding_len, &is_hex) == FAILURE) { >                return; >        } > > @@ -3696,7 +3698,7 @@ >        string.len = str_len; > >        /* encoding */ > -       if (argc == 3) { > +       if ((argc == 3 || argc == 4) && encoding_len > 0) { >                no_encoding = mbfl_name2no_encoding(encoding); >                if (no_encoding == mbfl_no_encoding_invalid) { >                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown > encoding \"%s\"", encoding); > @@ -3706,6 +3708,12 @@ >                } >        } > > +       if (argc == 4) { > +               if (type == 0 && is_hex) { > +                       type = 2; /* output in hex format */ > +               } > +       } > + >        /* conversion map */ >        convmap = NULL; >        if (Z_TYPE_P(zconvmap) == IS_ARRAY) { > @@ -3743,7 +3751,7 @@ >  } >  /* }}} */ > > -/* {{{ proto string mb_encode_numericentity(string string, array convmap [, string encoding]) > +/* {{{ proto string mb_encode_numericentity(string string, array convmap [, string encoding [, > bool is_hex]]) >    Converts specified characters to HTML numeric entities */ >  PHP_FUNCTION(mb_encode_numericentity) >  { > > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > -- Pierre @pierrejoye | http://blog.thepimp.net | http://www.libgd.org

« previous php.cvs (#65520) next »