Annotation of embedaddon/php/ext/intl/tests/grapheme.phpt, revision 1.1.1.1

1.1       misho       1: --TEST--
                      2: grapheme()
                      3: --SKIPIF--
                      4: <?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
                      5: --FILE--
                      6: <?php
                      7: 
                      8: /*
                      9:  * Test grapheme functions (procedural only)
                     10:  */
                     11: 
                     12: function ut_main()
                     13: {
                     14:        $res_str = '';
                     15: 
                     16:        $char_a_diaeresis = "\xC3\xA4"; // 'LATIN SMALL LETTER A WITH DIAERESIS' (U+00E4)
                     17:        $char_a_ring = "\xC3\xA5";              // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5)
                     18:        $char_o_diaeresis = "\xC3\xB6";    // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6)
                     19:        $char_O_diaeresis = "\xC3\x96";    // 'LATIN CAPITAL LETTER O WITH DIAERESIS' (U+00D6)
                     20: 
                     21:        $char_angstrom_sign = "\xE2\x84\xAB"; // 'ANGSTROM SIGN' (U+212B)
                     22:        $char_A_ring = "\xC3\x85";      // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
                     23: 
                     24:        $char_ohm_sign = "\xE2\x84\xA6";        // 'OHM SIGN' (U+2126)
                     25:        $char_omega = "\xCE\xA9";  // 'GREEK CAPITAL LETTER OMEGA' (U+03A9)
                     26: 
                     27:        $char_combining_ring_above = "\xCC\x8A";  // 'COMBINING RING ABOVE' (U+030A)
                     28: 
                     29:        $char_fi_ligature = "\xEF\xAC\x81";  // 'LATIN SMALL LIGATURE FI' (U+FB01)
                     30: 
                     31:        $char_long_s_dot = "\xE1\xBA\x9B";      // 'LATIN SMALL LETTER LONG S WITH DOT ABOVE' (U+1E9B)
                     32:        
                     33:        // the word 'hindi' using Devanagari characters:
                     34:        $hindi = "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80";
                     35: 
                     36:        $char_a_ring_nfd = "a\xCC\x8A";
                     37:        $char_A_ring_nfd = "A\xCC\x8A";
                     38:        $char_o_diaeresis_nfd = "o\xCC\x88";
                     39:        $char_O_diaeresis_nfd = "O\xCC\x88";
                     40:        $char_diaeresis = "\xCC\x88";
                     41: 
                     42:        //=====================================================================================
                     43:        $res_str .= "\n" . 'function grapheme_strlen($string) {}' . "\n\n";
                     44: 
                     45:        
                     46:        $res_str .= "\"hindi\" in devanagari strlen " . grapheme_strlen($hindi) . "\n";
                     47:        $res_str .= "\"ab\" + \"hindi\" + \"cde\" strlen " . grapheme_strlen('ab' . $hindi . 'cde') . "\n";
                     48:        $res_str .= "\"\" strlen " . grapheme_strlen("") . "\n";
                     49:        $res_str .= "char_a_ring_nfd strlen " . grapheme_strlen($char_a_ring_nfd) . "\n";
                     50:        $res_str .= "char_a_ring_nfd + \"bc\" strlen " . grapheme_strlen($char_a_ring_nfd . 'bc') . "\n";
                     51:        $res_str .= "\"abc\" strlen " . grapheme_strlen('abc') . "\n";
                     52: 
                     53:        
                     54:        //=====================================================================================
                     55:        $res_str .= "\n" . 'function grapheme_strpos($haystack, $needle, $offset = 0) {}' . "\n\n";
                     56: 
                     57:        $tests = array(
                     58:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 5 ),
                     59:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
                     60:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
                     61:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2 ),
                     62:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
                     63:                array( "abc", $char_a_ring_nfd, "false" ),
                     64:                array( $char_a_ring_nfd . "bc", "a", "false" ),
                     65:                array( "abc", "d", "false" ),
                     66:                array( "abc", "c", 2 ),
                     67:                array( "abc", "b", 1 ),
                     68:                array( "abc", "a", 0 ),
                     69:                array( "abc", "a", 0, 0 ),
                     70:                array( "abc", "a", 1, "false" ),
                     71:                array( "ababc", "a", 1, 2 ),
                     72:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 2, 6 ),
                     73:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
                     74:                
                     75:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "op", 5 ),
                     76:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "opq", 5 ),
                     77:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
                     78:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
                     79:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 2 ),
                     80:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 1 ),
                     81:                array( "abc", $char_a_ring_nfd . "bc", "false" ),
                     82:                array( $char_a_ring_nfd . "bc", "abcdefg", "false" ),
                     83:                array( "abc", "defghijklmnopq", "false" ),
                     84:                array( "abc", "ab", 0 ),
                     85:                array( "abc", "bc", 1 ),
                     86:                array( "abc", "abc", 0 ),
                     87:                array( "abc", "abcd", "false" ),
                     88:                array( "abc", "ab", 0, 0 ),
                     89:                array( "abc", "abc", 0, 0 ),
                     90:                array( "abc", "abc", 1, "false" ),
                     91:                array( "ababc", "ab", 1, 2 ),
                     92:                array( "ababc", "abc", 1, 2 ),
                     93:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_a_ring_nfd . "bc", "o" . $char_a_ring_nfd . "bc", 2, 6 ),
                     94:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "bc" . $char_a_ring_nfd, 2, 3 ),
                     95:        );
                     96: 
                     97:        foreach( $tests as $test ) {
                     98:            $arg1 = urlencode($test[1]);
                     99:            $arg0 = urlencode($test[0]);
                    100:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strpos";
                    101:                if ( 3 == count( $test ) ) {
                    102:                        $result = grapheme_strpos($test[0], $test[1]);
                    103:                }
                    104:                else {
                    105:                        $res_str .= " from $test[2]";
                    106:                        $result = grapheme_strpos($test[0], $test[1], $test[2]);
                    107:                }
                    108:                $res_str .= " = ";
                    109:                if ( $result === false ) {
                    110:                        $res_str .= 'false';
                    111:                }
                    112:                else {
                    113:                        $res_str .= $result;
                    114:                }
                    115:                $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
                    116:        }
                    117:        
                    118:        //=====================================================================================
                    119:        $res_str .= "\n" . 'function grapheme_stripos($haystack, $needle, $offset = 0) {}' . "\n\n";
                    120:        
                    121:        $tests = array(
                    122:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 2, 6 ),
                    123:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
                    124:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 5 ),
                    125:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "O", "false" ),
                    126:                array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
                    127:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, 2 ),
                    128:                array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
                    129:                array( "Abc", $char_a_ring_nfd, "false" ),
                    130:                array( $char_a_ring_nfd . "bc", "A", "false" ),
                    131:                array( "abc", "D", "false" ),
                    132:                array( "abC", "c", 2 ),
                    133:                array( "abc", "B", 1 ),
                    134:                array( "Abc", "a", 0 ),
                    135:                array( "abc", "A", 0, 0 ),
                    136:                array( "Abc", "a", 1, "false" ),
                    137:                array( "ababc", "A", 1, 2 ),
                    138:                
                    139:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "oP", 5 ),
                    140:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "opQ", 5 ),
                    141:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
                    142:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bC" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
                    143:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "Bc", $char_A_ring_nfd . "bc", 2 ),
                    144:                array( "a" . $char_a_ring_nfd . "BC", $char_a_ring_nfd . "bc", 1 ),
                    145:                array( "abc", $char_a_ring_nfd . "BC", "false" ),
                    146:                array( $char_a_ring_nfd . "BC", "aBCdefg", "false" ),
                    147:                array( "aBC", "Defghijklmnopq", "false" ),
                    148:                array( "abC", "Ab", 0 ),
                    149:                array( "aBC", "bc", 1 ),
                    150:                array( "abC", "Abc", 0 ),
                    151:                array( "abC", "aBcd", "false" ),
                    152:                array( "ABc", "ab", 0, 0 ),
                    153:                array( "aBc", "abC", 0, 0 ),
                    154:                array( "abc", "aBc", 1, "false" ),
                    155:                array( "ABabc", "AB", 1, 2 ),
                    156:                array( "abaBc", "aBc", 1, 2 ),
                    157:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_A_ring_nfd . "bC", "O" . $char_a_ring_nfd . "bC", 2, 6 ),
                    158:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bC" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "Bc" . $char_a_ring_nfd, 2, 3 ),
                    159:        );
                    160: 
                    161:        foreach( $tests as $test ) {
                    162:            $arg1 = urlencode($test[1]);
                    163:            $arg0 = urlencode($test[0]);
                    164:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_stripos";
                    165:                if ( 3 == count( $test ) ) {
                    166:                        $result = grapheme_stripos($test[0], $test[1]);
                    167:                }
                    168:                else {
                    169:                        $res_str .= " from $test[2]";
                    170:                        $result = grapheme_stripos($test[0], $test[1], $test[2]);
                    171:                }
                    172:                $res_str .= " = ";
                    173:                if ( $result === false ) {
                    174:                        $res_str .= 'false';
                    175:                }
                    176:                else {
                    177:                        $res_str .= $result;
                    178:                }
                    179:                $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
                    180:        }
                    181: 
                    182:        
                    183:        //=====================================================================================
                    184:        $res_str .= "\n" . 'function grapheme_strrpos($haystack, $needle, $offset = 0) {}' . "\n\n";
                    185: 
                    186: 
                    187:        $tests = array(
                    188:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 5 ),
                    189:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
                    190:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
                    191:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2 ),
                    192:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
                    193:                array( "abc", $char_a_ring_nfd, "false" ),
                    194:                array( $char_a_ring_nfd . "bc", "a", "false" ),
                    195:                array( "abc", "d", "false" ),
                    196:                array( "abc", "c", 2 ),
                    197:                array( "abc", "b", 1 ),
                    198:                array( "abc", "a", 0 ),
                    199:                array( "abc", "a", 0, 0 ),
                    200:                array( "abc", "a", 1, "false" ),
                    201:                array( "ababc", "a", 1, 2 ),
                    202:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 2, 6 ),
                    203:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
                    204:                
                    205:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "op", 5 ),
                    206:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "opq", 5 ),
                    207:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
                    208:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
                    209:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 2 ),
                    210:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 1 ),
                    211:                array( "abc", $char_a_ring_nfd . "bc", "false" ),
                    212:                array( $char_a_ring_nfd . "bc", "abcdefg", "false" ),
                    213:                array( "abc", "defghijklmnopq", "false" ),
                    214:                array( "abc", "ab", 0 ),
                    215:                array( "abc", "bc", 1 ),
                    216:                array( "abc", "abc", 0 ),
                    217:                array( "abc", "abcd", "false" ),
                    218:                array( "abc", "ab", 0, 0 ),
                    219:                array( "abc", "abc", 0, 0 ),
                    220:                array( "abc", "abc", 1, "false" ),
                    221:                array( "ababc", "ab", 1, 2 ),
                    222:                array( "ababc", "abc", 1, 2 ),
                    223:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_a_ring_nfd . "bc", "o" . $char_a_ring_nfd . "bc", 2, 6 ),
                    224:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "bc" . $char_a_ring_nfd, 2, 3 ),
                    225:        );
                    226: 
                    227:        foreach( $tests as $test ) {
                    228:            $arg1 = urlencode($test[1]);
                    229:            $arg0 = urlencode($test[0]);
                    230:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strrpos";
                    231:                if ( 3 == count( $test ) ) {
                    232:                        $result = grapheme_strrpos($test[0], $test[1]);
                    233:                }
                    234:                else {
                    235:                        $res_str .= " from $test[2]";
                    236:                        $result = grapheme_strrpos($test[0], $test[1], $test[2]);
                    237:                }
                    238:                $res_str .= " = ";
                    239:                if ( $result === false ) {
                    240:                        $res_str .= 'false';
                    241:                }
                    242:                else {
                    243:                        $res_str .= $result;
                    244:                }
                    245:                $res_str .= " == " . $test[count($test)-1] .  check_result($result, $test[count($test)-1]) . "\n";
                    246:        }
                    247:        
                    248: 
                    249:        //=====================================================================================
                    250:        $res_str .= "\n" . 'function grapheme_strripos($haystack, $needle, $offset = 0) {}' . "\n\n";
                    251:        
                    252:        $tests = array(
                    253:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 2, 6 ),
                    254:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
                    255:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 5 ),
                    256:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "O", "false" ),
                    257:                array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
                    258:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, 2 ),
                    259:                array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
                    260:                array( "Abc", $char_a_ring_nfd, "false" ),
                    261:                array( $char_a_ring_nfd . "bc", "A", "false" ),
                    262:                array( "abc", "D", "false" ),
                    263:                array( "abC", "c", 2 ),
                    264:                array( "abc", "B", 1 ),
                    265:                array( "Abc", "a", 0 ),
                    266:                array( "abc", "A", 0, 0 ),
                    267:                array( "Abc", "a", 1, "false" ),
                    268:                array( "ababc", "A", 1, 2 ),
                    269:                
                    270:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "oP", 5 ),
                    271:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "opQ", 5 ),
                    272:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
                    273:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bC" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
                    274:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "Bc", $char_A_ring_nfd . "bc", 2 ),
                    275:                array( "a" . $char_a_ring_nfd . "BC", $char_a_ring_nfd . "bc", 1 ),
                    276:                array( "abc", $char_a_ring_nfd . "BC", "false" ),
                    277:                array( $char_a_ring_nfd . "BC", "aBCdefg", "false" ),
                    278:                array( "aBC", "Defghijklmnopq", "false" ),
                    279:                array( "abC", "Ab", 0 ),
                    280:                array( "aBC", "bc", 1 ),
                    281:                array( "abC", "Abc", 0 ),
                    282:                array( "abC", "aBcd", "false" ),
                    283:                array( "ABc", "ab", 0, 0 ),
                    284:                array( "aBc", "abC", 0, 0 ),
                    285:                array( "abc", "aBc", 1, "false" ),
                    286:                array( "ABabc", "AB", 1, 2 ),
                    287:                array( "abaBc", "aBc", 1, 2 ),
                    288:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_A_ring_nfd . "bC", "O" . $char_a_ring_nfd . "bC", 2, 6 ),
                    289:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bC" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "Bc" . $char_a_ring_nfd, 2, 3 ),
                    290:        );
                    291: 
                    292:        foreach( $tests as $test ) {
                    293:            $arg1 = urlencode($test[1]);
                    294:            $arg0 = urlencode($test[0]);
                    295:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strripos";
                    296:                if ( 3 == count( $test ) ) {
                    297:                        $result = grapheme_strripos($test[0], $test[1]);
                    298:                }
                    299:                else {
                    300:                        $res_str .= " from $test[2]";
                    301:                        $result = grapheme_strripos($test[0], $test[1], $test[2]);
                    302:                }
                    303:                $res_str .= " = ";
                    304:                if ( $result === false ) {
                    305:                        $res_str .= 'false';
                    306:                }
                    307:                else {
                    308:                        $res_str .= $result;
                    309:                }
                    310:                $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
                    311:        }
                    312:        
                    313:        
                    314:        //=====================================================================================
                    315:        $res_str .= "\n" . 'function grapheme_substr($string, $start, $length = -1) {}' . "\n\n";
                    316: 
                    317:        $tests = array(
                    318: 
                    319:                array( "abc", 3, "false" ),
                    320:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, 5, "false" ),
                    321:                array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", 2, $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
                    322:                array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", 2, "a" . $char_A_ring_nfd . "bc" ),
                    323:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", 5, "O" ),
                    324:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, 5, "false" ),
                    325:                array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, 4, $char_O_diaeresis_nfd ),
                    326:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", 2, $char_a_ring_nfd . "bc" ),
                    327:                array( "a" . $char_A_ring_nfd . "bc", 1, $char_A_ring_nfd . "bc" ),
                    328:                array( "Abc", -5, "false" ),
                    329:                array( $char_a_ring_nfd . "bc", 3, "false" ),
                    330:                array( "abc", 4, "false" ),
                    331:                array( "abC", 2, "C" ),
                    332:                array( "abc", 1, "bc" ),
                    333:                array( "Abc", 1, 1, "b" ),
                    334:                array( "abc", 0, 2, "ab" ),
                    335:                array( "Abc", -4, 1, "false" ),
                    336:                array( "ababc", 1, 2, "ba" ),
                    337:                array( "ababc", 0, 10, "ababc" ),
                    338:                
                    339:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, 10 , "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    340:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, "Opq" ),
                    341:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -1, "Op" ),
                    342:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -2, "O" ),
                    343:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -3, "" ),
                    344:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -4, "false" ),
                    345: 
                    346:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    347:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -1, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
                    348:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -2, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
                    349:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -3, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
                    350:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -4, "a" . $char_a_ring_nfd . "bc" ),
                    351:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -5, "a" . $char_a_ring_nfd . "b" ),
                    352:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -6, "a" . $char_a_ring_nfd ),
                    353:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -7, "a" ),
                    354:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -8, "" ),
                    355:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -9, "false" ),
                    356: 
                    357:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    358:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -7, $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    359:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -6, "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    360:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -5, "c" . $char_o_diaeresis_nfd . "Opq" ),
                    361:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -4, $char_o_diaeresis_nfd . "Opq" ),
                    362:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -3, "Opq" ),
                    363:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -2, "pq" ),
                    364:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -1, "q" ),
                    365:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -999, "false" ),
                    366: 
                    367:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 8, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
                    368:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 7, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
                    369:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 6, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
                    370:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 5, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
                    371:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 4, "a" . $char_a_ring_nfd . "bc" ),
                    372:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 3, "a" . $char_a_ring_nfd . "b" ),
                    373:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 2, "a" . $char_a_ring_nfd ),
                    374:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 1, "a" ),
                    375:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 0, "" ),
                    376:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -999, "false" ),
                    377: 
                    378:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -1, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
                    379:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -2, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
                    380:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -3, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
                    381:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -4, "a" . $char_a_ring_nfd . "bc" ),
                    382:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -5, "a" . $char_a_ring_nfd . "b" ),
                    383:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -6, "a" . $char_a_ring_nfd ),
                    384:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -7, "a" ),
                    385:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -8, "" ),
                    386:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -9, "false" ),
                    387:                
                    388:        );
                    389: 
                    390:        foreach( $tests as $test ) {
                    391:            $arg0 = urlencode($test[0]);
                    392:                $res_str .= "substring of \"$arg0\" from \"$test[1]\" - grapheme_substr";
                    393:                if ( 3 == count( $test ) ) {
                    394:                        $result = grapheme_substr($test[0], $test[1]);
                    395:                }
                    396:                else {
                    397:                        $res_str .= " with length $test[2]";
                    398:                        $result = grapheme_substr($test[0], $test[1], $test[2]);
                    399:                }
                    400:                $res_str .= " = ";
                    401:                if ( $result === false ) {
                    402:                        $res_str .= 'false';
                    403:                }
                    404:                else {
                    405:                        $res_str .= urlencode($result);
                    406:                }
                    407:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
                    408:        }
                    409:        
                    410: 
                    411:        //=====================================================================================
                    412:        $res_str .= "\n" . 'function grapheme_strstr($haystack, $needle, $before_needle = FALSE) {}' . "\n\n";
                    413: 
                    414:        $tests = array(
                    415:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", "o" ),
                    416:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
                    417:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, $char_o_diaeresis_nfd ),
                    418:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
                    419:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
                    420:                array( "abc", $char_a_ring_nfd, "false" ),
                    421:                array( $char_a_ring_nfd . "bc", "a", "false" ),
                    422:                array( "abc", "d", "false" ),
                    423:                array( "abc", "c", "c" ),
                    424:                array( "abc", "b", "bc" ),
                    425:                array( "abc", "a", "abc" ),
                    426:                array( "abc", "ab", "abc" ),
                    427:                array( "abc", "abc", "abc" ),
                    428:                array( "abc", "bc", "bc" ),
                    429:                array( "abc", "a", FALSE, "abc" ),
                    430:                array( "abc", "a", TRUE, "" ),
                    431:                array( "abc", "b", TRUE, "a" ),
                    432:                array( "abc", "c", TRUE, "ab" ),
                    433:                array( "ababc", "bab", TRUE, "a" ),
                    434:                array( "ababc", "abc", TRUE, "ab" ),
                    435:                array( "ababc", "abc", FALSE, "abc" ),
                    436:                
                    437:                array( "ab" . $char_a_ring_nfd . "c", "d", "false" ),
                    438:                array( "bc" . $char_a_ring_nfd . "a", "a", "a" ),
                    439:                array( "a" . $char_a_ring_nfd . "bc", "b", "bc" ),
                    440:                array( $char_a_ring_nfd . "bc", "a", "false" ),
                    441:                array( $char_a_ring_nfd . "abc", "ab", "abc" ),
                    442:                array( "abc" . $char_a_ring_nfd, "abc", "abc" . $char_a_ring_nfd),
                    443:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc" ),
                    444:                array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, FALSE, $char_a_ring_nfd . "bc"),
                    445:                array( "a" . $char_a_ring_nfd . "bc", "a", TRUE, "" ),
                    446:                array( $char_a_ring_nfd . "abc", "b", TRUE, $char_a_ring_nfd . "a" ),
                    447:                array( "ab" . $char_a_ring_nfd . "c", "c", TRUE, "ab" . $char_a_ring_nfd ),
                    448:                array( "aba" . $char_a_ring_nfd . "bc", "ba" . $char_a_ring_nfd . "b", TRUE, "a" ),
                    449:                array( "ababc" . $char_a_ring_nfd, "abc" . $char_a_ring_nfd, TRUE, "ab" ),
                    450:                array( "abab" . $char_a_ring_nfd . "c", "ab" . $char_a_ring_nfd . "c", FALSE, "ab" . $char_a_ring_nfd . "c" ),
                    451: 
                    452:        );
                    453: 
                    454:        foreach( $tests as $test ) {
                    455:            $arg1 = urlencode($test[1]);
                    456:            $arg0 = urlencode($test[0]);
                    457:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strstr";
                    458:                if ( 3 == count( $test ) ) {
                    459:                        $result = grapheme_strstr($test[0], $test[1]);
                    460:                }
                    461:                else {
                    462:                        $res_str .= " before flag is " . ( $test[2] ? "TRUE" : "FALSE" );
                    463:                        $result = grapheme_strstr($test[0], $test[1], $test[2]);
                    464:                }
                    465:                $res_str .= " = ";
                    466:                if ( $result === false ) {
                    467:                        $res_str .= 'false';
                    468:                }
                    469:                else {
                    470:                        $res_str .= urlencode($result);
                    471:                }
                    472:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
                    473:        }
                    474:        
                    475: 
                    476:        //=====================================================================================
                    477:        $res_str .= "\n" . 'function grapheme_stristr($haystack, $needle, $before_needle = FALSE) {}' . "\n\n";
                    478: 
                    479:        $tests = array(
                    480:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd, $char_o_diaeresis_nfd ),
                    481:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", "O" ),
                    482:                array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
                    483:                array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
                    484:                array( "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, $char_a_ring_nfd . "bc"),
                    485:                array( "abc", $char_a_ring_nfd, "false" ),
                    486:                array( $char_a_ring_nfd . "bc", "A", "false" ),
                    487:                array( "abc", "d", "false" ),
                    488:                array( "abc", "C", "c" ),
                    489:                array( "aBc", "b", "Bc" ),
                    490:                array( "abc", "A", "abc" ),
                    491:                array( "abC", "ab", "abC" ),
                    492:                array( "abc", "aBc", "abc" ),
                    493:                array( "abC", "bc", "bC" ),
                    494:                array( "abc", "A", FALSE, "abc" ),
                    495:                array( "abc", "a", TRUE, "" ),
                    496:                array( "aBc", "b", TRUE, "a" ),
                    497:                array( "abc", "C", TRUE, "ab" ),
                    498:                array( "aBabc", "bab", TRUE, "a" ),
                    499:                array( "ababc", "aBc", TRUE, "ab" ),
                    500:                array( "ababc", "abC", FALSE, "abc" ),
                    501:                
                    502:                array( "ab" . $char_a_ring_nfd . "c", "d", "false" ),
                    503:                array( "bc" . $char_a_ring_nfd . "A", "a", "A" ),
                    504:                array( "a" . $char_a_ring_nfd . "bc", "B", "bc" ),
                    505:                array( $char_A_ring_nfd . "bc", "a", "false" ),
                    506:                array( $char_a_ring_nfd . "abc", "Ab", "abc" ),
                    507:                array( "abc" . $char_A_ring_nfd, "abc", "abc" . $char_A_ring_nfd),
                    508:                array( "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd . "bc", $char_a_ring_nfd . "bc" ),
                    509:                array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, FALSE, $char_A_ring_nfd . "bc" ),
                    510:                array( "a" . $char_a_ring_nfd . "bc", "A", TRUE, "" ),
                    511:                array( $char_a_ring_nfd . "aBc", "b", TRUE, $char_a_ring_nfd . "a" ),
                    512:                array( "ab" . $char_a_ring_nfd . "c", "C", TRUE, "ab" . $char_a_ring_nfd ),
                    513:                array( "aba" . $char_A_ring_nfd . "bc", "ba" . $char_a_ring_nfd . "b", TRUE, "a" ),
                    514:                array( "ababc" . $char_a_ring_nfd, "aBc" . $char_A_ring_nfd, TRUE, "ab" ),
                    515:                array( "abAB" . $char_A_ring_nfd . "c", "ab" . $char_a_ring_nfd . "c", FALSE, "AB" . $char_A_ring_nfd . "c" ),
                    516: 
                    517:        );
                    518: 
                    519:        foreach( $tests as $test ) {
                    520:            $arg1 = urlencode($test[1]);
                    521:            $arg0 = urlencode($test[0]);
                    522:                $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_stristr";
                    523:                if ( 3 == count( $test ) ) {
                    524:                        $result = grapheme_stristr($test[0], $test[1]);
                    525:                }
                    526:                else {
                    527:                        $res_str .= " before flag is " . ( $test[2] ? "TRUE" : "FALSE" );
                    528:                        $result = grapheme_stristr($test[0], $test[1], $test[2]);
                    529:                }
                    530:                $res_str .= " = ";
                    531:                if ( $result === false ) {
                    532:                        $res_str .= 'false';
                    533:                }
                    534:                else {
                    535:                        $res_str .= urlencode($result);
                    536:                }
                    537:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
                    538:        }
                    539:        
                    540: 
                    541:        //=====================================================================================
                    542:        $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_COUNT, $start = 0[, $next])' . "\n\n";
                    543: 
                    544:        $tests = array(
                    545:                // haystack, count, [[offset], [next]], result
                    546:                array( "abc", 3, "abc" ),
                    547:                array( "abc", 2, "ab" ),
                    548:                array( "abc", 1, "a" ),
                    549:                array( "abc", 0, "" ),
                    550:                array( "abc", 1, 0, "a" ),
                    551:                array( "abc", 1, 1, "b" ),
                    552:                array( "abc", 1, 2, "c" ),
                    553:                array( "abc", 0, 2, "" ),
                    554: 
                    555:                array( "abc", 3, 0, 3, "abc" ),
                    556:                array( "abc", 2, 0, 2, "ab" ),
                    557:                array( "abc", 1, 0, 1, "a" ),
                    558:                array( "abc", 0, 0, 0, "" ),
                    559:                array( "abc", 1, 0, 1, "a" ),
                    560:                array( "abc", 1, 1, 2, "b" ),
                    561:                array( "abc", 1, 2, 3, "c" ),
                    562:                array( "abc", 0, 2, 2, "" ),
                    563:         array( "http://news.bbc.co.uk/2/hi/middle_east/7831588.stm", 48, 48 , 50 , "tm" ),
                    564: 
                    565:                array( $char_a_ring_nfd . "bc", 3, $char_a_ring_nfd . "bc" ),
                    566:                array( $char_a_ring_nfd . "bc", 2, $char_a_ring_nfd . "b" ),
                    567:                array( $char_a_ring_nfd . "bc", 1, $char_a_ring_nfd . "" ),
                    568:                array( $char_a_ring_nfd . "bc", 3, 0, 5, $char_a_ring_nfd . "bc" ),
                    569:                array( $char_a_ring_nfd . "bc", 2, 0, 4, $char_a_ring_nfd . "b" ),
                    570:                array( $char_a_ring_nfd . "bc", 1, 0, 3, $char_a_ring_nfd . "" ),
                    571:                array( $char_a_ring_nfd . "bcde", 2, 3, 5, "bc" ),
                    572:                array( $char_a_ring_nfd . "bcde", 2, 4, 6, "cd" ),
                    573:                array( $char_a_ring_nfd . "bcde" . $char_a_ring_nfd . "f", 4, 5, 11, "de" . $char_a_ring_nfd . "f" ),
                    574: 
                    575:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
                    576:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, $char_a_ring_nfd . $char_o_diaeresis_nfd ),
                    577:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 1, $char_a_ring_nfd . "" ),
                    578: 
                    579:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 0, $char_o_diaeresis_nfd),
                    580:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 2, $char_o_diaeresis_nfd),
                    581:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 3, $char_o_diaeresis_nfd),
                    582:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 4, $char_diaeresis),
                    583: 
                    584:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 0, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    585:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 2, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    586:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 3, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    587:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 4, $char_diaeresis . $char_o_diaeresis_nfd),
                    588:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 7, $char_diaeresis . $char_o_diaeresis_nfd),
                    589:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 8, $char_o_diaeresis_nfd),
                    590:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 10, $char_diaeresis),
                    591:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 11, "false"),
                    592: 
                    593:        );
                    594: 
                    595:        $next = -1;
                    596:        foreach( $tests as $test ) {
                    597:            $arg0 = urlencode($test[0]);
                    598:                $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract";
                    599:                if ( 3 == count( $test ) ) {
                    600:                        $result = grapheme_extract($test[0], $test[1]);
                    601:                }
                    602:                elseif ( 4 == count ( $test ) ) {
                    603:                        $res_str .= " starting at byte position $test[2]";
                    604:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_COUNT, $test[2]);
                    605:                }
                    606:                else {
                    607:                        $res_str .= " starting at byte position $test[2] with \$next";
                    608:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_COUNT, $test[2], $next);
                    609:                }
                    610:                $res_str .= " = ";
                    611:                if ( $result === false ) {
                    612:                        $res_str .= 'false';
                    613:                }
                    614:                else {
                    615:                        $res_str .= urlencode($result);
                    616:                }
                    617:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]);
                    618:                if ( 5 == count ( $test ) ) {
                    619:                        $res_str .= " \$next=$next == $test[3] ";
                    620:                        if ( $next != $test[3] ) {
                    621:                                $res_str .= "***FAILED***";
                    622:                        }
                    623:                }
                    624:                $res_str .= "\n";
                    625:        }
                    626:        
                    627: 
                    628:        //=====================================================================================
                    629:        $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXBYTES, $start = 0)' . "\n\n";
                    630: 
                    631:        $tests = array(
                    632:                array( "abc", 3, "abc" ),
                    633:                array( "abc", 2, "ab" ),
                    634:                array( "abc", 1, "a" ),
                    635:                array( "abc", 0, "" ),
                    636:                array( $char_a_ring_nfd . "bc", 5, $char_a_ring_nfd . "bc" ),
                    637:                array( $char_a_ring_nfd . "bc", 4, $char_a_ring_nfd . "b" ),
                    638:                array( $char_a_ring_nfd . "bc", 1, "" ),
                    639:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 9, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
                    640:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 10, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
                    641:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 11, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
                    642:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, $char_a_ring_nfd . $char_o_diaeresis_nfd ),
                    643:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 3, $char_a_ring_nfd . "" ),
                    644:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 4, $char_a_ring_nfd . "" ),
                    645:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 5, $char_a_ring_nfd . "" ),
                    646:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 6, $char_a_ring_nfd . $char_o_diaeresis_nfd  ),
                    647:                array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 7, $char_a_ring_nfd . $char_o_diaeresis_nfd . "c" ),
                    648: 
                    649:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 0, $char_o_diaeresis_nfd),
                    650:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 2, $char_o_diaeresis_nfd),
                    651:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 3, $char_o_diaeresis_nfd),
                    652:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 4, $char_diaeresis),
                    653: 
                    654:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 0, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    655:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 2, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    656:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 3, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
                    657:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 5, 4, $char_diaeresis . $char_o_diaeresis_nfd),
                    658:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 5, 7, $char_diaeresis . $char_o_diaeresis_nfd),
                    659:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 8, $char_o_diaeresis_nfd),
                    660:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 10, $char_diaeresis),
                    661:                array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 11, "false"),
                    662: 
                    663:        );
                    664: 
                    665:        foreach( $tests as $test ) {
                    666:            $arg0 = urlencode($test[0]);
                    667:                $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES";
                    668:                if ( 3 == count( $test ) ) {
                    669:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXBYTES);
                    670:                }
                    671:                else {
                    672:                        $res_str .= " starting at byte position $test[2]";
                    673:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXBYTES, $test[2]);
                    674:                }
                    675:                $res_str .= " = ";
                    676:                if ( $result === false ) {
                    677:                        $res_str .= 'false';
                    678:                }
                    679:                else {
                    680:                        $res_str .= urlencode($result);
                    681:                }
                    682:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
                    683:        }
                    684:        
                    685: 
                    686:        //=====================================================================================
                    687:        $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXCHARS, $start = 0)' . "\n\n";
                    688: 
                    689:        $tests = array(
                    690:                array( "abc", 3, "abc" ),
                    691:                array( "abc", 2, "ab" ),
                    692:                array( "abc", 1, "a" ),
                    693:                array( "abc", 0, "" ),
                    694:                array( "abc" . $char_o_diaeresis_nfd, 0, "" ),
                    695:                array( "abc" . $char_o_diaeresis_nfd, 1, "a" ),
                    696:                array( "abc" . $char_o_diaeresis_nfd, 2, "ab" ),
                    697:                array( "abc" . $char_o_diaeresis_nfd, 3, "abc" ),
                    698:                array( "abc" . $char_o_diaeresis_nfd, 4, "abc" ),
                    699:                array( "abc" . $char_o_diaeresis_nfd, 5, "abc" . $char_o_diaeresis_nfd),
                    700:                array( "abc" . $char_o_diaeresis_nfd, 6, "abc" . $char_o_diaeresis_nfd),
                    701:                array( $char_o_diaeresis_nfd . "abc", 0, "" ),
                    702:                array( $char_o_diaeresis_nfd . "abc", 1, "" ),
                    703:                array( $char_o_diaeresis_nfd . "abc", 2, $char_o_diaeresis_nfd ),
                    704:                array( $char_o_diaeresis_nfd . "abc", 3, $char_o_diaeresis_nfd . "a" ),
                    705:                array( $char_o_diaeresis_nfd . "abc", 4, $char_o_diaeresis_nfd . "ab" ),
                    706:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 5, $char_o_diaeresis_nfd . "abc" ),
                    707:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 6, $char_o_diaeresis_nfd . "abc" ),
                    708:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 7, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd ),
                    709:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "x" ),
                    710: 
                    711:                array( "abc", 3, 0, "abc" ),
                    712:                array( "abc", 2, 1, "bc" ),
                    713:                array( "abc", 1, 2, "c" ),
                    714:                array( "abc", 0, 3, "false" ),
                    715:                array( "abc", 1, 3, "false" ),
                    716:                array( "abc", 1, 999, "false" ),
                    717:                array( $char_o_diaeresis_nfd . "abc", 1, 6, "false" ),
                    718:                array( $char_o_diaeresis_nfd . "abc", 1, 999, "false" ),
                    719:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 0, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "x" ),
                    720:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 1, $char_diaeresis . "abc" . $char_a_ring_nfd . "xy" ),
                    721:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 2, "abc" . $char_a_ring_nfd . "xyz" ),
                    722:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 3, "abc" . $char_a_ring_nfd . "xyz" ),
                    723:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 4, "bc" . $char_a_ring_nfd . "xyz" ),
                    724:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 5, "c" . $char_a_ring_nfd . "xyz" ),
                    725:                array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 6, $char_a_ring_nfd . "xyz" ),
                    726: 
                    727:        );
                    728: 
                    729:        foreach( $tests as $test ) {
                    730:            $arg0 = urlencode($test[0]);
                    731:                $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS";
                    732:                if ( 3 == count( $test ) ) {
                    733:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXCHARS);
                    734:                }
                    735:                else {
                    736:                        $res_str .= " starting at byte position $test[2]";
                    737:                        $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXCHARS, $test[2]);
                    738:                }
                    739:                $res_str .= " = ";
                    740:                if ( $result === false ) {
                    741:                        $res_str .= 'false';
                    742:                }
                    743:                else {
                    744:                        $res_str .= urlencode($result);
                    745:                }
                    746:                $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
                    747:        }
                    748:        
                    749:        
                    750:        //=====================================================================================
                    751:        
                    752:        return $res_str;
                    753: }
                    754: 
                    755: echo ut_main();
                    756: 
                    757: function check_result($result, $expected) {
                    758: 
                    759:        if ( $result === false ) {
                    760:                $result = 'false';
                    761:        }
                    762: 
                    763:        if ( strcmp($result, $expected) != 0 ) {
                    764:                return " **FAILED** ";
                    765:        }
                    766: 
                    767:        return "";
                    768: }
                    769: 
                    770: ?>
                    771: --EXPECT--
                    772: 
                    773: function grapheme_strlen($string) {}
                    774: 
                    775: "hindi" in devanagari strlen 3
                    776: "ab" + "hindi" + "cde" strlen 8
                    777: "" strlen 0
                    778: char_a_ring_nfd strlen 1
                    779: char_a_ring_nfd + "bc" strlen 3
                    780: "abc" strlen 3
                    781: 
                    782: function grapheme_strpos($haystack, $needle, $offset = 0) {}
                    783: 
                    784: find "o" in "aa%CC%8Abco%CC%88o" - grapheme_strpos = 5 == 5
                    785: find "o" in "aa%CC%8Abco%CC%88" - grapheme_strpos = false == false
                    786: find "o%CC%88" in "aa%CC%8Abco%CC%88" - grapheme_strpos = 4 == 4
                    787: find "a%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_strpos = 2 == 2
                    788: find "a%CC%8A" in "aa%CC%8Abc" - grapheme_strpos = 1 == 1
                    789: find "a%CC%8A" in "abc" - grapheme_strpos = false == false
                    790: find "a" in "a%CC%8Abc" - grapheme_strpos = false == false
                    791: find "d" in "abc" - grapheme_strpos = false == false
                    792: find "c" in "abc" - grapheme_strpos = 2 == 2
                    793: find "b" in "abc" - grapheme_strpos = 1 == 1
                    794: find "a" in "abc" - grapheme_strpos = 0 == 0
                    795: find "a" in "abc" - grapheme_strpos from 0 = 0 == 0
                    796: find "a" in "abc" - grapheme_strpos from 1 = false == false
                    797: find "a" in "ababc" - grapheme_strpos from 1 = 2 == 2
                    798: find "o" in "aoa%CC%8Abco%CC%88o" - grapheme_strpos from 2 = 6 == 6
                    799: find "a%CC%8A" in "o%CC%88a%CC%8Aaa%CC%8Abc" - grapheme_strpos from 2 = 3 == 3
                    800: find "op" in "aa%CC%8Abco%CC%88opq" - grapheme_strpos = 5 == 5
                    801: find "opq" in "aa%CC%8Abco%CC%88opq" - grapheme_strpos = 5 == 5
                    802: find "abc" in "aa%CC%8Abco%CC%88" - grapheme_strpos = false == false
                    803: find "o%CC%88bco%CC%88" in "aa%CC%8Abco%CC%88bco%CC%88" - grapheme_strpos = 4 == 4
                    804: find "a%CC%8Abc" in "o%CC%88aa%CC%8Abc" - grapheme_strpos = 2 == 2
                    805: find "a%CC%8Abc" in "aa%CC%8Abc" - grapheme_strpos = 1 == 1
                    806: find "a%CC%8Abc" in "abc" - grapheme_strpos = false == false
                    807: find "abcdefg" in "a%CC%8Abc" - grapheme_strpos = false == false
                    808: find "defghijklmnopq" in "abc" - grapheme_strpos = false == false
                    809: find "ab" in "abc" - grapheme_strpos = 0 == 0
                    810: find "bc" in "abc" - grapheme_strpos = 1 == 1
                    811: find "abc" in "abc" - grapheme_strpos = 0 == 0
                    812: find "abcd" in "abc" - grapheme_strpos = false == false
                    813: find "ab" in "abc" - grapheme_strpos from 0 = 0 == 0
                    814: find "abc" in "abc" - grapheme_strpos from 0 = 0 == 0
                    815: find "abc" in "abc" - grapheme_strpos from 1 = false == false
                    816: find "ab" in "ababc" - grapheme_strpos from 1 = 2 == 2
                    817: find "abc" in "ababc" - grapheme_strpos from 1 = 2 == 2
                    818: find "oa%CC%8Abc" in "aoa%CC%8Abco%CC%88oa%CC%8Abc" - grapheme_strpos from 2 = 6 == 6
                    819: find "a%CC%8Abca%CC%8A" in "o%CC%88a%CC%8Aaa%CC%8Abca%CC%8Adef" - grapheme_strpos from 2 = 3 == 3
                    820: 
                    821: function grapheme_stripos($haystack, $needle, $offset = 0) {}
                    822: 
                    823: find "o" in "aoa%CC%8Abco%CC%88O" - grapheme_stripos from 2 = 6 == 6
                    824: find "a%CC%8A" in "o%CC%88a%CC%8AaA%CC%8Abc" - grapheme_stripos from 2 = 3 == 3
                    825: find "o" in "aa%CC%8Abco%CC%88O" - grapheme_stripos = 5 == 5
                    826: find "O" in "aa%CC%8Abco%CC%88" - grapheme_stripos = false == false
                    827: find "o%CC%88" in "aa%CC%8AbcO%CC%88" - grapheme_stripos = 4 == 4
                    828: find "A%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_stripos = 2 == 2
                    829: find "a%CC%8A" in "aA%CC%8Abc" - grapheme_stripos = 1 == 1
                    830: find "a%CC%8A" in "Abc" - grapheme_stripos = false == false
                    831: find "A" in "a%CC%8Abc" - grapheme_stripos = false == false
                    832: find "D" in "abc" - grapheme_stripos = false == false
                    833: find "c" in "abC" - grapheme_stripos = 2 == 2
                    834: find "B" in "abc" - grapheme_stripos = 1 == 1
                    835: find "a" in "Abc" - grapheme_stripos = 0 == 0
                    836: find "A" in "abc" - grapheme_stripos from 0 = 0 == 0
                    837: find "a" in "Abc" - grapheme_stripos from 1 = false == false
                    838: find "A" in "ababc" - grapheme_stripos from 1 = 2 == 2
                    839: find "oP" in "aa%CC%8Abco%CC%88Opq" - grapheme_stripos = 5 == 5
                    840: find "opQ" in "aa%CC%8Abco%CC%88Opq" - grapheme_stripos = 5 == 5
                    841: find "abc" in "aa%CC%8Abco%CC%88" - grapheme_stripos = false == false
                    842: find "O%CC%88bco%CC%88" in "aa%CC%8Abco%CC%88bCo%CC%88" - grapheme_stripos = 4 == 4
                    843: find "A%CC%8Abc" in "o%CC%88aa%CC%8ABc" - grapheme_stripos = 2 == 2
                    844: find "a%CC%8Abc" in "aa%CC%8ABC" - grapheme_stripos = 1 == 1
                    845: find "a%CC%8ABC" in "abc" - grapheme_stripos = false == false
                    846: find "aBCdefg" in "a%CC%8ABC" - grapheme_stripos = false == false
                    847: find "Defghijklmnopq" in "aBC" - grapheme_stripos = false == false
                    848: find "Ab" in "abC" - grapheme_stripos = 0 == 0
                    849: find "bc" in "aBC" - grapheme_stripos = 1 == 1
                    850: find "Abc" in "abC" - grapheme_stripos = 0 == 0
                    851: find "aBcd" in "abC" - grapheme_stripos = false == false
                    852: find "ab" in "ABc" - grapheme_stripos from 0 = 0 == 0
                    853: find "abC" in "aBc" - grapheme_stripos from 0 = 0 == 0
                    854: find "aBc" in "abc" - grapheme_stripos from 1 = false == false
                    855: find "AB" in "ABabc" - grapheme_stripos from 1 = 2 == 2
                    856: find "aBc" in "abaBc" - grapheme_stripos from 1 = 2 == 2
                    857: find "Oa%CC%8AbC" in "aoa%CC%8Abco%CC%88oA%CC%8AbC" - grapheme_stripos from 2 = 6 == 6
                    858: find "a%CC%8ABca%CC%8A" in "o%CC%88a%CC%8AaA%CC%8AbCa%CC%8Adef" - grapheme_stripos from 2 = 3 == 3
                    859: 
                    860: function grapheme_strrpos($haystack, $needle, $offset = 0) {}
                    861: 
                    862: find "o" in "aa%CC%8Abco%CC%88o" - grapheme_strrpos = 5 == 5
                    863: find "o" in "aa%CC%8Abco%CC%88" - grapheme_strrpos = false == false
                    864: find "o%CC%88" in "aa%CC%8Abco%CC%88" - grapheme_strrpos = 4 == 4
                    865: find "a%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_strrpos = 2 == 2
                    866: find "a%CC%8A" in "aa%CC%8Abc" - grapheme_strrpos = 1 == 1
                    867: find "a%CC%8A" in "abc" - grapheme_strrpos = false == false
                    868: find "a" in "a%CC%8Abc" - grapheme_strrpos = false == false
                    869: find "d" in "abc" - grapheme_strrpos = false == false
                    870: find "c" in "abc" - grapheme_strrpos = 2 == 2
                    871: find "b" in "abc" - grapheme_strrpos = 1 == 1
                    872: find "a" in "abc" - grapheme_strrpos = 0 == 0
                    873: find "a" in "abc" - grapheme_strrpos from 0 = 0 == 0
                    874: find "a" in "abc" - grapheme_strrpos from 1 = false == false
                    875: find "a" in "ababc" - grapheme_strrpos from 1 = 2 == 2
                    876: find "o" in "aoa%CC%8Abco%CC%88o" - grapheme_strrpos from 2 = 6 == 6
                    877: find "a%CC%8A" in "o%CC%88a%CC%8Aaa%CC%8Abc" - grapheme_strrpos from 2 = 3 == 3
                    878: find "op" in "aa%CC%8Abco%CC%88opq" - grapheme_strrpos = 5 == 5
                    879: find "opq" in "aa%CC%8Abco%CC%88opq" - grapheme_strrpos = 5 == 5
                    880: find "abc" in "aa%CC%8Abco%CC%88" - grapheme_strrpos = false == false
                    881: find "o%CC%88bco%CC%88" in "aa%CC%8Abco%CC%88bco%CC%88" - grapheme_strrpos = 4 == 4
                    882: find "a%CC%8Abc" in "o%CC%88aa%CC%8Abc" - grapheme_strrpos = 2 == 2
                    883: find "a%CC%8Abc" in "aa%CC%8Abc" - grapheme_strrpos = 1 == 1
                    884: find "a%CC%8Abc" in "abc" - grapheme_strrpos = false == false
                    885: find "abcdefg" in "a%CC%8Abc" - grapheme_strrpos = false == false
                    886: find "defghijklmnopq" in "abc" - grapheme_strrpos = false == false
                    887: find "ab" in "abc" - grapheme_strrpos = 0 == 0
                    888: find "bc" in "abc" - grapheme_strrpos = 1 == 1
                    889: find "abc" in "abc" - grapheme_strrpos = 0 == 0
                    890: find "abcd" in "abc" - grapheme_strrpos = false == false
                    891: find "ab" in "abc" - grapheme_strrpos from 0 = 0 == 0
                    892: find "abc" in "abc" - grapheme_strrpos from 0 = 0 == 0
                    893: find "abc" in "abc" - grapheme_strrpos from 1 = false == false
                    894: find "ab" in "ababc" - grapheme_strrpos from 1 = 2 == 2
                    895: find "abc" in "ababc" - grapheme_strrpos from 1 = 2 == 2
                    896: find "oa%CC%8Abc" in "aoa%CC%8Abco%CC%88oa%CC%8Abc" - grapheme_strrpos from 2 = 6 == 6
                    897: find "a%CC%8Abca%CC%8A" in "o%CC%88a%CC%8Aaa%CC%8Abca%CC%8Adef" - grapheme_strrpos from 2 = 3 == 3
                    898: 
                    899: function grapheme_strripos($haystack, $needle, $offset = 0) {}
                    900: 
                    901: find "o" in "aoa%CC%8Abco%CC%88O" - grapheme_strripos from 2 = 6 == 6
                    902: find "a%CC%8A" in "o%CC%88a%CC%8AaA%CC%8Abc" - grapheme_strripos from 2 = 3 == 3
                    903: find "o" in "aa%CC%8Abco%CC%88O" - grapheme_strripos = 5 == 5
                    904: find "O" in "aa%CC%8Abco%CC%88" - grapheme_strripos = false == false
                    905: find "o%CC%88" in "aa%CC%8AbcO%CC%88" - grapheme_strripos = 4 == 4
                    906: find "A%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_strripos = 2 == 2
                    907: find "a%CC%8A" in "aA%CC%8Abc" - grapheme_strripos = 1 == 1
                    908: find "a%CC%8A" in "Abc" - grapheme_strripos = false == false
                    909: find "A" in "a%CC%8Abc" - grapheme_strripos = false == false
                    910: find "D" in "abc" - grapheme_strripos = false == false
                    911: find "c" in "abC" - grapheme_strripos = 2 == 2
                    912: find "B" in "abc" - grapheme_strripos = 1 == 1
                    913: find "a" in "Abc" - grapheme_strripos = 0 == 0
                    914: find "A" in "abc" - grapheme_strripos from 0 = 0 == 0
                    915: find "a" in "Abc" - grapheme_strripos from 1 = false == false
                    916: find "A" in "ababc" - grapheme_strripos from 1 = 2 == 2
                    917: find "oP" in "aa%CC%8Abco%CC%88Opq" - grapheme_strripos = 5 == 5
                    918: find "opQ" in "aa%CC%8Abco%CC%88Opq" - grapheme_strripos = 5 == 5
                    919: find "abc" in "aa%CC%8Abco%CC%88" - grapheme_strripos = false == false
                    920: find "O%CC%88bco%CC%88" in "aa%CC%8Abco%CC%88bCo%CC%88" - grapheme_strripos = 4 == 4
                    921: find "A%CC%8Abc" in "o%CC%88aa%CC%8ABc" - grapheme_strripos = 2 == 2
                    922: find "a%CC%8Abc" in "aa%CC%8ABC" - grapheme_strripos = 1 == 1
                    923: find "a%CC%8ABC" in "abc" - grapheme_strripos = false == false
                    924: find "aBCdefg" in "a%CC%8ABC" - grapheme_strripos = false == false
                    925: find "Defghijklmnopq" in "aBC" - grapheme_strripos = false == false
                    926: find "Ab" in "abC" - grapheme_strripos = 0 == 0
                    927: find "bc" in "aBC" - grapheme_strripos = 1 == 1
                    928: find "Abc" in "abC" - grapheme_strripos = 0 == 0
                    929: find "aBcd" in "abC" - grapheme_strripos = false == false
                    930: find "ab" in "ABc" - grapheme_strripos from 0 = 0 == 0
                    931: find "abC" in "aBc" - grapheme_strripos from 0 = 0 == 0
                    932: find "aBc" in "abc" - grapheme_strripos from 1 = false == false
                    933: find "AB" in "ABabc" - grapheme_strripos from 1 = 2 == 2
                    934: find "aBc" in "abaBc" - grapheme_strripos from 1 = 2 == 2
                    935: find "Oa%CC%8AbC" in "aoa%CC%8Abco%CC%88oA%CC%8AbC" - grapheme_strripos from 2 = 6 == 6
                    936: find "a%CC%8ABca%CC%8A" in "o%CC%88a%CC%8AaA%CC%8AbCa%CC%8Adef" - grapheme_strripos from 2 = 3 == 3
                    937: 
                    938: function grapheme_substr($string, $start, $length = -1) {}
                    939: 
                    940: substring of "abc" from "3" - grapheme_substr = false == false
                    941: substring of "aa%CC%8Abco%CC%88" from "5" - grapheme_substr = false == false
                    942: substring of "aoa%CC%8Abco%CC%88O" from "2" - grapheme_substr = a%CC%8Abco%CC%88O == a%CC%8Abco%CC%88O
                    943: substring of "o%CC%88a%CC%8AaA%CC%8Abc" from "2" - grapheme_substr = aA%CC%8Abc == aA%CC%8Abc
                    944: substring of "aa%CC%8Abco%CC%88O" from "5" - grapheme_substr = O == O
                    945: substring of "aa%CC%8Abco%CC%88" from "5" - grapheme_substr = false == false
                    946: substring of "aa%CC%8AbcO%CC%88" from "4" - grapheme_substr = O%CC%88 == O%CC%88
                    947: substring of "o%CC%88aa%CC%8Abc" from "2" - grapheme_substr = a%CC%8Abc == a%CC%8Abc
                    948: substring of "aA%CC%8Abc" from "1" - grapheme_substr = A%CC%8Abc == A%CC%8Abc
                    949: substring of "Abc" from "-5" - grapheme_substr = false == false
                    950: substring of "a%CC%8Abc" from "3" - grapheme_substr = false == false
                    951: substring of "abc" from "4" - grapheme_substr = false == false
                    952: substring of "abC" from "2" - grapheme_substr = C == C
                    953: substring of "abc" from "1" - grapheme_substr = bc == bc
                    954: substring of "Abc" from "1" - grapheme_substr with length 1 = b == b
                    955: substring of "abc" from "0" - grapheme_substr with length 2 = ab == ab
                    956: substring of "Abc" from "-4" - grapheme_substr with length 1 = false == false
                    957: substring of "ababc" from "1" - grapheme_substr with length 2 = ba == ba
                    958: substring of "ababc" from "0" - grapheme_substr with length 10 = ababc == ababc
                    959: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length 10 = aa%CC%8Abco%CC%88Opq == aa%CC%8Abco%CC%88Opq
                    960: substring of "aa%CC%8Abco%CC%88Opq" from "5" - grapheme_substr = Opq == Opq
                    961: substring of "aa%CC%8Abco%CC%88Opq" from "5" - grapheme_substr with length -1 = Op == Op
                    962: substring of "aa%CC%8Abco%CC%88Opq" from "5" - grapheme_substr with length -2 = O == O
                    963: substring of "aa%CC%8Abco%CC%88Opq" from "5" - grapheme_substr with length -3 =  == 
                    964: substring of "aa%CC%8Abco%CC%88Opq" from "5" - grapheme_substr with length -4 = false == false
                    965: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr = aa%CC%8Abco%CC%88Opq == aa%CC%8Abco%CC%88Opq
                    966: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -1 = aa%CC%8Abco%CC%88Op == aa%CC%8Abco%CC%88Op
                    967: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -2 = aa%CC%8Abco%CC%88O == aa%CC%8Abco%CC%88O
                    968: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -3 = aa%CC%8Abco%CC%88 == aa%CC%8Abco%CC%88
                    969: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -4 = aa%CC%8Abc == aa%CC%8Abc
                    970: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -5 = aa%CC%8Ab == aa%CC%8Ab
                    971: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -6 = aa%CC%8A == aa%CC%8A
                    972: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -7 = a == a
                    973: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -8 =  == 
                    974: substring of "aa%CC%8Abco%CC%88Opq" from "0" - grapheme_substr with length -9 = false == false
                    975: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr = aa%CC%8Abco%CC%88Opq == aa%CC%8Abco%CC%88Opq
                    976: substring of "aa%CC%8Abco%CC%88Opq" from "-7" - grapheme_substr = a%CC%8Abco%CC%88Opq == a%CC%8Abco%CC%88Opq
                    977: substring of "aa%CC%8Abco%CC%88Opq" from "-6" - grapheme_substr = bco%CC%88Opq == bco%CC%88Opq
                    978: substring of "aa%CC%8Abco%CC%88Opq" from "-5" - grapheme_substr = co%CC%88Opq == co%CC%88Opq
                    979: substring of "aa%CC%8Abco%CC%88Opq" from "-4" - grapheme_substr = o%CC%88Opq == o%CC%88Opq
                    980: substring of "aa%CC%8Abco%CC%88Opq" from "-3" - grapheme_substr = Opq == Opq
                    981: substring of "aa%CC%8Abco%CC%88Opq" from "-2" - grapheme_substr = pq == pq
                    982: substring of "aa%CC%8Abco%CC%88Opq" from "-1" - grapheme_substr = q == q
                    983: substring of "aa%CC%8Abco%CC%88Opq" from "-999" - grapheme_substr = false == false
                    984: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 8 = aa%CC%8Abco%CC%88Opq == aa%CC%8Abco%CC%88Opq
                    985: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 7 = aa%CC%8Abco%CC%88Op == aa%CC%8Abco%CC%88Op
                    986: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 6 = aa%CC%8Abco%CC%88O == aa%CC%8Abco%CC%88O
                    987: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 5 = aa%CC%8Abco%CC%88 == aa%CC%8Abco%CC%88
                    988: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 4 = aa%CC%8Abc == aa%CC%8Abc
                    989: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 3 = aa%CC%8Ab == aa%CC%8Ab
                    990: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 2 = aa%CC%8A == aa%CC%8A
                    991: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 1 = a == a
                    992: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length 0 =  == 
                    993: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -999 = false == false
                    994: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -1 = aa%CC%8Abco%CC%88Op == aa%CC%8Abco%CC%88Op
                    995: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -2 = aa%CC%8Abco%CC%88O == aa%CC%8Abco%CC%88O
                    996: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -3 = aa%CC%8Abco%CC%88 == aa%CC%8Abco%CC%88
                    997: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -4 = aa%CC%8Abc == aa%CC%8Abc
                    998: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -5 = aa%CC%8Ab == aa%CC%8Ab
                    999: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -6 = aa%CC%8A == aa%CC%8A
                   1000: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -7 = a == a
                   1001: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -8 =  == 
                   1002: substring of "aa%CC%8Abco%CC%88Opq" from "-8" - grapheme_substr with length -9 = false == false
                   1003: 
                   1004: function grapheme_strstr($haystack, $needle, $before_needle = FALSE) {}
                   1005: 
                   1006: find "o" in "aa%CC%8Abco%CC%88o" - grapheme_strstr = o == o
                   1007: find "o" in "aa%CC%8Abco%CC%88" - grapheme_strstr = false == false
                   1008: find "o%CC%88" in "aa%CC%8Abco%CC%88" - grapheme_strstr = o%CC%88 == o%CC%88
                   1009: find "a%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_strstr = a%CC%8Abc == a%CC%8Abc
                   1010: find "a%CC%8A" in "aa%CC%8Abc" - grapheme_strstr = a%CC%8Abc == a%CC%8Abc
                   1011: find "a%CC%8A" in "abc" - grapheme_strstr = false == false
                   1012: find "a" in "a%CC%8Abc" - grapheme_strstr = false == false
                   1013: find "d" in "abc" - grapheme_strstr = false == false
                   1014: find "c" in "abc" - grapheme_strstr = c == c
                   1015: find "b" in "abc" - grapheme_strstr = bc == bc
                   1016: find "a" in "abc" - grapheme_strstr = abc == abc
                   1017: find "ab" in "abc" - grapheme_strstr = abc == abc
                   1018: find "abc" in "abc" - grapheme_strstr = abc == abc
                   1019: find "bc" in "abc" - grapheme_strstr = bc == bc
                   1020: find "a" in "abc" - grapheme_strstr before flag is FALSE = abc == abc
                   1021: find "a" in "abc" - grapheme_strstr before flag is TRUE =  == 
                   1022: find "b" in "abc" - grapheme_strstr before flag is TRUE = a == a
                   1023: find "c" in "abc" - grapheme_strstr before flag is TRUE = ab == ab
                   1024: find "bab" in "ababc" - grapheme_strstr before flag is TRUE = a == a
                   1025: find "abc" in "ababc" - grapheme_strstr before flag is TRUE = ab == ab
                   1026: find "abc" in "ababc" - grapheme_strstr before flag is FALSE = abc == abc
                   1027: find "d" in "aba%CC%8Ac" - grapheme_strstr = false == false
                   1028: find "a" in "bca%CC%8Aa" - grapheme_strstr = a == a
                   1029: find "b" in "aa%CC%8Abc" - grapheme_strstr = bc == bc
                   1030: find "a" in "a%CC%8Abc" - grapheme_strstr = false == false
                   1031: find "ab" in "a%CC%8Aabc" - grapheme_strstr = abc == abc
                   1032: find "abc" in "abca%CC%8A" - grapheme_strstr = abca%CC%8A == abca%CC%8A
                   1033: find "a%CC%8Abc" in "aa%CC%8Abc" - grapheme_strstr = a%CC%8Abc == a%CC%8Abc
                   1034: find "a%CC%8A" in "aa%CC%8Abc" - grapheme_strstr before flag is FALSE = a%CC%8Abc == a%CC%8Abc
                   1035: find "a" in "aa%CC%8Abc" - grapheme_strstr before flag is TRUE =  == 
                   1036: find "b" in "a%CC%8Aabc" - grapheme_strstr before flag is TRUE = a%CC%8Aa == a%CC%8Aa
                   1037: find "c" in "aba%CC%8Ac" - grapheme_strstr before flag is TRUE = aba%CC%8A == aba%CC%8A
                   1038: find "baa%CC%8Ab" in "abaa%CC%8Abc" - grapheme_strstr before flag is TRUE = a == a
                   1039: find "abca%CC%8A" in "ababca%CC%8A" - grapheme_strstr before flag is TRUE = ab == ab
                   1040: find "aba%CC%8Ac" in "ababa%CC%8Ac" - grapheme_strstr before flag is FALSE = aba%CC%8Ac == aba%CC%8Ac
                   1041: 
                   1042: function grapheme_stristr($haystack, $needle, $before_needle = FALSE) {}
                   1043: 
                   1044: find "O%CC%88" in "aa%CC%8Abco%CC%88" - grapheme_stristr = o%CC%88 == o%CC%88
                   1045: find "o" in "aa%CC%8Abco%CC%88O" - grapheme_stristr = O == O
                   1046: find "o" in "aa%CC%8Abco%CC%88" - grapheme_stristr = false == false
                   1047: find "a%CC%8A" in "o%CC%88aa%CC%8Abc" - grapheme_stristr = a%CC%8Abc == a%CC%8Abc
                   1048: find "A%CC%8A" in "aa%CC%8Abc" - grapheme_stristr = a%CC%8Abc == a%CC%8Abc
                   1049: find "a%CC%8A" in "abc" - grapheme_stristr = false == false
                   1050: find "A" in "a%CC%8Abc" - grapheme_stristr = false == false
                   1051: find "d" in "abc" - grapheme_stristr = false == false
                   1052: find "C" in "abc" - grapheme_stristr = c == c
                   1053: find "b" in "aBc" - grapheme_stristr = Bc == Bc
                   1054: find "A" in "abc" - grapheme_stristr = abc == abc
                   1055: find "ab" in "abC" - grapheme_stristr = abC == abC
                   1056: find "aBc" in "abc" - grapheme_stristr = abc == abc
                   1057: find "bc" in "abC" - grapheme_stristr = bC == bC
                   1058: find "A" in "abc" - grapheme_stristr before flag is FALSE = abc == abc
                   1059: find "a" in "abc" - grapheme_stristr before flag is TRUE =  == 
                   1060: find "b" in "aBc" - grapheme_stristr before flag is TRUE = a == a
                   1061: find "C" in "abc" - grapheme_stristr before flag is TRUE = ab == ab
                   1062: find "bab" in "aBabc" - grapheme_stristr before flag is TRUE = a == a
                   1063: find "aBc" in "ababc" - grapheme_stristr before flag is TRUE = ab == ab
                   1064: find "abC" in "ababc" - grapheme_stristr before flag is FALSE = abc == abc
                   1065: find "d" in "aba%CC%8Ac" - grapheme_stristr = false == false
                   1066: find "a" in "bca%CC%8AA" - grapheme_stristr = A == A
                   1067: find "B" in "aa%CC%8Abc" - grapheme_stristr = bc == bc
                   1068: find "a" in "A%CC%8Abc" - grapheme_stristr = false == false
                   1069: find "Ab" in "a%CC%8Aabc" - grapheme_stristr = abc == abc
                   1070: find "abc" in "abcA%CC%8A" - grapheme_stristr = abcA%CC%8A == abcA%CC%8A
                   1071: find "A%CC%8Abc" in "aa%CC%8Abc" - grapheme_stristr = a%CC%8Abc == a%CC%8Abc
                   1072: find "a%CC%8A" in "aA%CC%8Abc" - grapheme_stristr before flag is FALSE = A%CC%8Abc == A%CC%8Abc
                   1073: find "A" in "aa%CC%8Abc" - grapheme_stristr before flag is TRUE =  == 
                   1074: find "b" in "a%CC%8AaBc" - grapheme_stristr before flag is TRUE = a%CC%8Aa == a%CC%8Aa
                   1075: find "C" in "aba%CC%8Ac" - grapheme_stristr before flag is TRUE = aba%CC%8A == aba%CC%8A
                   1076: find "baa%CC%8Ab" in "abaA%CC%8Abc" - grapheme_stristr before flag is TRUE = a == a
                   1077: find "aBcA%CC%8A" in "ababca%CC%8A" - grapheme_stristr before flag is TRUE = ab == ab
                   1078: find "aba%CC%8Ac" in "abABA%CC%8Ac" - grapheme_stristr before flag is FALSE = ABA%CC%8Ac == ABA%CC%8Ac
                   1079: 
                   1080: function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_COUNT, $start = 0[, $next])
                   1081: 
                   1082: extract from "abc" "3" graphemes - grapheme_extract = abc == abc
                   1083: extract from "abc" "2" graphemes - grapheme_extract = ab == ab
                   1084: extract from "abc" "1" graphemes - grapheme_extract = a == a
                   1085: extract from "abc" "0" graphemes - grapheme_extract =  == 
                   1086: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 0 = a == a
                   1087: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 1 = b == b
                   1088: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 2 = c == c
                   1089: extract from "abc" "0" graphemes - grapheme_extract starting at byte position 2 =  == 
                   1090: extract from "abc" "3" graphemes - grapheme_extract starting at byte position 0 with $next = abc == abc $next=3 == 3 
                   1091: extract from "abc" "2" graphemes - grapheme_extract starting at byte position 0 with $next = ab == ab $next=2 == 2 
                   1092: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 0 with $next = a == a $next=1 == 1 
                   1093: extract from "abc" "0" graphemes - grapheme_extract starting at byte position 0 with $next =  ==  $next=0 == 0 
                   1094: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 0 with $next = a == a $next=1 == 1 
                   1095: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 1 with $next = b == b $next=2 == 2 
                   1096: extract from "abc" "1" graphemes - grapheme_extract starting at byte position 2 with $next = c == c $next=3 == 3 
                   1097: extract from "abc" "0" graphemes - grapheme_extract starting at byte position 2 with $next =  ==  $next=2 == 2 
                   1098: extract from "http%3A%2F%2Fnews.bbc.co.uk%2F2%2Fhi%2Fmiddle_east%2F7831588.stm" "48" graphemes - grapheme_extract starting at byte position 48 with $next = tm == tm $next=50 == 50 
                   1099: extract from "a%CC%8Abc" "3" graphemes - grapheme_extract = a%CC%8Abc == a%CC%8Abc
                   1100: extract from "a%CC%8Abc" "2" graphemes - grapheme_extract = a%CC%8Ab == a%CC%8Ab
                   1101: extract from "a%CC%8Abc" "1" graphemes - grapheme_extract = a%CC%8A == a%CC%8A
                   1102: extract from "a%CC%8Abc" "3" graphemes - grapheme_extract starting at byte position 0 with $next = a%CC%8Abc == a%CC%8Abc $next=5 == 5 
                   1103: extract from "a%CC%8Abc" "2" graphemes - grapheme_extract starting at byte position 0 with $next = a%CC%8Ab == a%CC%8Ab $next=4 == 4 
                   1104: extract from "a%CC%8Abc" "1" graphemes - grapheme_extract starting at byte position 0 with $next = a%CC%8A == a%CC%8A $next=3 == 3 
                   1105: extract from "a%CC%8Abcde" "2" graphemes - grapheme_extract starting at byte position 3 with $next = bc == bc $next=5 == 5 
                   1106: extract from "a%CC%8Abcde" "2" graphemes - grapheme_extract starting at byte position 4 with $next = cd == cd $next=6 == 6 
                   1107: extract from "a%CC%8Abcdea%CC%8Af" "4" graphemes - grapheme_extract starting at byte position 5 with $next = dea%CC%8Af == dea%CC%8Af $next=11 == 11 
                   1108: extract from "a%CC%8Ao%CC%88o%CC%88" "3" graphemes - grapheme_extract = a%CC%8Ao%CC%88o%CC%88 == a%CC%8Ao%CC%88o%CC%88
                   1109: extract from "a%CC%8Ao%CC%88o%CC%88" "2" graphemes - grapheme_extract = a%CC%8Ao%CC%88 == a%CC%8Ao%CC%88
                   1110: extract from "a%CC%8Ao%CC%88c" "1" graphemes - grapheme_extract = a%CC%8A == a%CC%8A
                   1111: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "1" graphemes - grapheme_extract starting at byte position 0 = o%CC%88 == o%CC%88
                   1112: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "1" graphemes - grapheme_extract starting at byte position 2 = o%CC%88 == o%CC%88
                   1113: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "1" graphemes - grapheme_extract starting at byte position 3 = o%CC%88 == o%CC%88
                   1114: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "1" graphemes - grapheme_extract starting at byte position 4 = %CC%88 == %CC%88
                   1115: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 0 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1116: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 2 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1117: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 3 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1118: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 4 = %CC%88o%CC%88 == %CC%88o%CC%88
                   1119: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 7 = %CC%88o%CC%88 == %CC%88o%CC%88
                   1120: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 8 = o%CC%88 == o%CC%88
                   1121: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 10 = %CC%88 == %CC%88
                   1122: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract starting at byte position 11 = false == false
                   1123: 
                   1124: function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXBYTES, $start = 0)
                   1125: 
                   1126: extract from "abc" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = abc == abc
                   1127: extract from "abc" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = ab == ab
                   1128: extract from "abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a == a
                   1129: extract from "abc" "0" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES =  == 
                   1130: extract from "a%CC%8Abc" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Abc == a%CC%8Abc
                   1131: extract from "a%CC%8Abc" "4" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ab == a%CC%8Ab
                   1132: extract from "a%CC%8Abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES =  == 
                   1133: extract from "a%CC%8Ao%CC%88o%CC%88" "9" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88o%CC%88 == a%CC%8Ao%CC%88o%CC%88
                   1134: extract from "a%CC%8Ao%CC%88o%CC%88" "10" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88o%CC%88 == a%CC%8Ao%CC%88o%CC%88
                   1135: extract from "a%CC%8Ao%CC%88o%CC%88" "11" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88o%CC%88 == a%CC%8Ao%CC%88o%CC%88
                   1136: extract from "a%CC%8Ao%CC%88o%CC%88" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88 == a%CC%8Ao%CC%88
                   1137: extract from "a%CC%8Ao%CC%88c" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8A == a%CC%8A
                   1138: extract from "a%CC%8Ao%CC%88c" "4" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8A == a%CC%8A
                   1139: extract from "a%CC%8Ao%CC%88c" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8A == a%CC%8A
                   1140: extract from "a%CC%8Ao%CC%88c" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88 == a%CC%8Ao%CC%88
                   1141: extract from "a%CC%8Ao%CC%88c" "7" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES = a%CC%8Ao%CC%88c == a%CC%8Ao%CC%88c
                   1142: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 0 = o%CC%88 == o%CC%88
                   1143: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 2 = o%CC%88 == o%CC%88
                   1144: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 3 = o%CC%88 == o%CC%88
                   1145: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 4 = %CC%88 == %CC%88
                   1146: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 0 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1147: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 2 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1148: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 3 = o%CC%88o%CC%88 == o%CC%88o%CC%88
                   1149: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 4 = %CC%88o%CC%88 == %CC%88o%CC%88
                   1150: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 7 = %CC%88o%CC%88 == %CC%88o%CC%88
                   1151: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 8 = o%CC%88 == o%CC%88
                   1152: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 10 = %CC%88 == %CC%88
                   1153: extract from "o%CC%88o%CC%88o%CC%88o%CC%88" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES starting at byte position 11 = false == false
                   1154: 
                   1155: function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXCHARS, $start = 0)
                   1156: 
                   1157: extract from "abc" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = abc == abc
                   1158: extract from "abc" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = ab == ab
                   1159: extract from "abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = a == a
                   1160: extract from "abc" "0" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS =  == 
                   1161: extract from "abco%CC%88" "0" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS =  == 
                   1162: extract from "abco%CC%88" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = a == a
                   1163: extract from "abco%CC%88" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = ab == ab
                   1164: extract from "abco%CC%88" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = abc == abc
                   1165: extract from "abco%CC%88" "4" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = abc == abc
                   1166: extract from "abco%CC%88" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = abco%CC%88 == abco%CC%88
                   1167: extract from "abco%CC%88" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = abco%CC%88 == abco%CC%88
                   1168: extract from "o%CC%88abc" "0" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS =  == 
                   1169: extract from "o%CC%88abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS =  == 
                   1170: extract from "o%CC%88abc" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88 == o%CC%88
                   1171: extract from "o%CC%88abc" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88a == o%CC%88a
                   1172: extract from "o%CC%88abc" "4" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88ab == o%CC%88ab
                   1173: extract from "o%CC%88abca%CC%8Axyz" "5" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88abc == o%CC%88abc
                   1174: extract from "o%CC%88abca%CC%8Axyz" "6" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88abc == o%CC%88abc
                   1175: extract from "o%CC%88abca%CC%8Axyz" "7" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88abca%CC%8A == o%CC%88abca%CC%8A
                   1176: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS = o%CC%88abca%CC%8Ax == o%CC%88abca%CC%8Ax
                   1177: extract from "abc" "3" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 0 = abc == abc
                   1178: extract from "abc" "2" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 1 = bc == bc
                   1179: extract from "abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 2 = c == c
                   1180: extract from "abc" "0" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 3 = false == false
                   1181: extract from "abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 3 = false == false
                   1182: extract from "abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 999 = false == false
                   1183: extract from "o%CC%88abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 6 = false == false
                   1184: extract from "o%CC%88abc" "1" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 999 = false == false
                   1185: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 0 = o%CC%88abca%CC%8Ax == o%CC%88abca%CC%8Ax
                   1186: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 1 = %CC%88abca%CC%8Axy == %CC%88abca%CC%8Axy
                   1187: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 2 = abca%CC%8Axyz == abca%CC%8Axyz
                   1188: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 3 = abca%CC%8Axyz == abca%CC%8Axyz
                   1189: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 4 = bca%CC%8Axyz == bca%CC%8Axyz
                   1190: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 5 = ca%CC%8Axyz == ca%CC%8Axyz
                   1191: extract from "o%CC%88abca%CC%8Axyz" "8" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS starting at byte position 6 = a%CC%8Axyz == a%CC%8Axyz
                   1192: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>