From 263d919a2047bae3b6ae3708fd073a1868111fb7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 17 Aug 2005 15:12:03 +0000 Subject: [PATCH] Unicode support for range() --- ext/standard/array.c | 42 +- ext/standard/tests/array/range.phpt | 1317 +++++++++++++++++++++++++++ 2 files changed, 1352 insertions(+), 7 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index b51a070890..0a07bd160b 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1631,6 +1631,23 @@ PHP_FUNCTION(array_fill) } /* }}} */ +static void u_add_next_index_stringl(zval *arg, char *str, uint length, int duplicate TSRMLS_DC) +{ + if (UG(unicode)) { + UErrorCode status = U_ZERO_ERROR; + UChar *u_str; + int32_t u_len; + + zend_convert_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &u_str, &u_len, str, length, &status); + add_next_index_unicodel(arg, u_str, u_len, 0); + if (!duplicate) { + efree(str); + } + } else { + add_next_index_stringl(arg, str, length, duplicate); + } +} + /* {{{ proto array range(mixed low, mixed high[, int step]) Create an array containing the range of integers or characters from low to high (inclusive) */ PHP_FUNCTION(range) @@ -1644,7 +1661,9 @@ PHP_FUNCTION(range) } if (zstep) { - if (Z_TYPE_P(zstep) == IS_DOUBLE || (Z_TYPE_P(zstep) == IS_STRING && is_numeric_string(Z_STRVAL_P(zstep), Z_STRLEN_P(zstep), NULL, NULL, 0) == IS_DOUBLE)) { + if (Z_TYPE_P(zstep) == IS_DOUBLE || + (Z_TYPE_P(zstep) == IS_STRING && is_numeric_string(Z_STRVAL_P(zstep), Z_STRLEN_P(zstep), NULL, NULL, 0) == IS_DOUBLE) || + (Z_TYPE_P(zstep) == IS_UNICODE && is_numeric_unicode(Z_USTRVAL_P(zstep), Z_USTRLEN_P(zstep), NULL, NULL, 0) == IS_DOUBLE)) { is_step_double = 1; } @@ -1660,8 +1679,19 @@ PHP_FUNCTION(range) /* Initialize the return_value as an array. */ array_init(return_value); + if (Z_TYPE_P(zlow) == IS_UNICODE) { + convert_to_string(zlow); + } + + if (Z_TYPE_P(zhigh) == IS_UNICODE) { + convert_to_string(zhigh); + } + /* If the range is given as strings, generate an array of characters. */ - if (Z_TYPE_P(zlow) == IS_STRING && Z_TYPE_P(zhigh) == IS_STRING && Z_STRLEN_P(zlow) >= 1 && Z_STRLEN_P(zhigh) >= 1) { + if (Z_TYPE_P(zlow) == IS_STRING && + Z_TYPE_P(zhigh) == IS_STRING && + Z_STRLEN_P(zlow) >= 1 && + Z_STRLEN_P(zhigh) >= 1) { int type1, type2; unsigned char *low, *high; long lstep = (long) step; @@ -1675,8 +1705,6 @@ PHP_FUNCTION(range) goto long_str; } - convert_to_string(zlow); - convert_to_string(zhigh); low = (unsigned char *)Z_STRVAL_P(zlow); high = (unsigned char *)Z_STRVAL_P(zhigh); @@ -1686,7 +1714,7 @@ PHP_FUNCTION(range) goto err; } for (; *low >= *high; (*low) -= (unsigned int)lstep) { - add_next_index_stringl(return_value, low, 1, 1); + u_add_next_index_stringl(return_value, low, 1, 1 TSRMLS_CC); if (((signed int)*low - lstep) < 0) { break; } @@ -1697,13 +1725,13 @@ PHP_FUNCTION(range) goto err; } for (; *low <= *high; (*low) += (unsigned int)lstep) { - add_next_index_stringl(return_value, low, 1, 1); + u_add_next_index_stringl(return_value, low, 1, 1 TSRMLS_CC); if (((signed int)*low + lstep) > 255) { break; } } } else { - add_next_index_stringl(return_value, low, 1, 1); + u_add_next_index_stringl(return_value, low, 1, 1 TSRMLS_CC); } } else if (Z_TYPE_P(zlow) == IS_DOUBLE || Z_TYPE_P(zhigh) == IS_DOUBLE || is_step_double) { diff --git a/ext/standard/tests/array/range.phpt b/ext/standard/tests/array/range.phpt index 23fb985f86..049260c36d 100644 --- a/ext/standard/tests/array/range.phpt +++ b/ext/standard/tests/array/range.phpt @@ -1343,3 +1343,1320 @@ array(41) { [40]=> float(5) } +--UEXPECT-- +array(100) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + [7]=> + int(8) + [8]=> + int(9) + [9]=> + int(10) + [10]=> + int(11) + [11]=> + int(12) + [12]=> + int(13) + [13]=> + int(14) + [14]=> + int(15) + [15]=> + int(16) + [16]=> + int(17) + [17]=> + int(18) + [18]=> + int(19) + [19]=> + int(20) + [20]=> + int(21) + [21]=> + int(22) + [22]=> + int(23) + [23]=> + int(24) + [24]=> + int(25) + [25]=> + int(26) + [26]=> + int(27) + [27]=> + int(28) + [28]=> + int(29) + [29]=> + int(30) + [30]=> + int(31) + [31]=> + int(32) + [32]=> + int(33) + [33]=> + int(34) + [34]=> + int(35) + [35]=> + int(36) + [36]=> + int(37) + [37]=> + int(38) + [38]=> + int(39) + [39]=> + int(40) + [40]=> + int(41) + [41]=> + int(42) + [42]=> + int(43) + [43]=> + int(44) + [44]=> + int(45) + [45]=> + int(46) + [46]=> + int(47) + [47]=> + int(48) + [48]=> + int(49) + [49]=> + int(50) + [50]=> + int(51) + [51]=> + int(52) + [52]=> + int(53) + [53]=> + int(54) + [54]=> + int(55) + [55]=> + int(56) + [56]=> + int(57) + [57]=> + int(58) + [58]=> + int(59) + [59]=> + int(60) + [60]=> + int(61) + [61]=> + int(62) + [62]=> + int(63) + [63]=> + int(64) + [64]=> + int(65) + [65]=> + int(66) + [66]=> + int(67) + [67]=> + int(68) + [68]=> + int(69) + [69]=> + int(70) + [70]=> + int(71) + [71]=> + int(72) + [72]=> + int(73) + [73]=> + int(74) + [74]=> + int(75) + [75]=> + int(76) + [76]=> + int(77) + [77]=> + int(78) + [78]=> + int(79) + [79]=> + int(80) + [80]=> + int(81) + [81]=> + int(82) + [82]=> + int(83) + [83]=> + int(84) + [84]=> + int(85) + [85]=> + int(86) + [86]=> + int(87) + [87]=> + int(88) + [88]=> + int(89) + [89]=> + int(90) + [90]=> + int(91) + [91]=> + int(92) + [92]=> + int(93) + [93]=> + int(94) + [94]=> + int(95) + [95]=> + int(96) + [96]=> + int(97) + [97]=> + int(98) + [98]=> + int(99) + [99]=> + int(100) +} +array(100) { + [0]=> + int(100) + [1]=> + int(99) + [2]=> + int(98) + [3]=> + int(97) + [4]=> + int(96) + [5]=> + int(95) + [6]=> + int(94) + [7]=> + int(93) + [8]=> + int(92) + [9]=> + int(91) + [10]=> + int(90) + [11]=> + int(89) + [12]=> + int(88) + [13]=> + int(87) + [14]=> + int(86) + [15]=> + int(85) + [16]=> + int(84) + [17]=> + int(83) + [18]=> + int(82) + [19]=> + int(81) + [20]=> + int(80) + [21]=> + int(79) + [22]=> + int(78) + [23]=> + int(77) + [24]=> + int(76) + [25]=> + int(75) + [26]=> + int(74) + [27]=> + int(73) + [28]=> + int(72) + [29]=> + int(71) + [30]=> + int(70) + [31]=> + int(69) + [32]=> + int(68) + [33]=> + int(67) + [34]=> + int(66) + [35]=> + int(65) + [36]=> + int(64) + [37]=> + int(63) + [38]=> + int(62) + [39]=> + int(61) + [40]=> + int(60) + [41]=> + int(59) + [42]=> + int(58) + [43]=> + int(57) + [44]=> + int(56) + [45]=> + int(55) + [46]=> + int(54) + [47]=> + int(53) + [48]=> + int(52) + [49]=> + int(51) + [50]=> + int(50) + [51]=> + int(49) + [52]=> + int(48) + [53]=> + int(47) + [54]=> + int(46) + [55]=> + int(45) + [56]=> + int(44) + [57]=> + int(43) + [58]=> + int(42) + [59]=> + int(41) + [60]=> + int(40) + [61]=> + int(39) + [62]=> + int(38) + [63]=> + int(37) + [64]=> + int(36) + [65]=> + int(35) + [66]=> + int(34) + [67]=> + int(33) + [68]=> + int(32) + [69]=> + int(31) + [70]=> + int(30) + [71]=> + int(29) + [72]=> + int(28) + [73]=> + int(27) + [74]=> + int(26) + [75]=> + int(25) + [76]=> + int(24) + [77]=> + int(23) + [78]=> + int(22) + [79]=> + int(21) + [80]=> + int(20) + [81]=> + int(19) + [82]=> + int(18) + [83]=> + int(17) + [84]=> + int(16) + [85]=> + int(15) + [86]=> + int(14) + [87]=> + int(13) + [88]=> + int(12) + [89]=> + int(11) + [90]=> + int(10) + [91]=> + int(9) + [92]=> + int(8) + [93]=> + int(7) + [94]=> + int(6) + [95]=> + int(5) + [96]=> + int(4) + [97]=> + int(3) + [98]=> + int(2) + [99]=> + int(1) +} +array(100) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + [7]=> + int(8) + [8]=> + int(9) + [9]=> + int(10) + [10]=> + int(11) + [11]=> + int(12) + [12]=> + int(13) + [13]=> + int(14) + [14]=> + int(15) + [15]=> + int(16) + [16]=> + int(17) + [17]=> + int(18) + [18]=> + int(19) + [19]=> + int(20) + [20]=> + int(21) + [21]=> + int(22) + [22]=> + int(23) + [23]=> + int(24) + [24]=> + int(25) + [25]=> + int(26) + [26]=> + int(27) + [27]=> + int(28) + [28]=> + int(29) + [29]=> + int(30) + [30]=> + int(31) + [31]=> + int(32) + [32]=> + int(33) + [33]=> + int(34) + [34]=> + int(35) + [35]=> + int(36) + [36]=> + int(37) + [37]=> + int(38) + [38]=> + int(39) + [39]=> + int(40) + [40]=> + int(41) + [41]=> + int(42) + [42]=> + int(43) + [43]=> + int(44) + [44]=> + int(45) + [45]=> + int(46) + [46]=> + int(47) + [47]=> + int(48) + [48]=> + int(49) + [49]=> + int(50) + [50]=> + int(51) + [51]=> + int(52) + [52]=> + int(53) + [53]=> + int(54) + [54]=> + int(55) + [55]=> + int(56) + [56]=> + int(57) + [57]=> + int(58) + [58]=> + int(59) + [59]=> + int(60) + [60]=> + int(61) + [61]=> + int(62) + [62]=> + int(63) + [63]=> + int(64) + [64]=> + int(65) + [65]=> + int(66) + [66]=> + int(67) + [67]=> + int(68) + [68]=> + int(69) + [69]=> + int(70) + [70]=> + int(71) + [71]=> + int(72) + [72]=> + int(73) + [73]=> + int(74) + [74]=> + int(75) + [75]=> + int(76) + [76]=> + int(77) + [77]=> + int(78) + [78]=> + int(79) + [79]=> + int(80) + [80]=> + int(81) + [81]=> + int(82) + [82]=> + int(83) + [83]=> + int(84) + [84]=> + int(85) + [85]=> + int(86) + [86]=> + int(87) + [87]=> + int(88) + [88]=> + int(89) + [89]=> + int(90) + [90]=> + int(91) + [91]=> + int(92) + [92]=> + int(93) + [93]=> + int(94) + [94]=> + int(95) + [95]=> + int(96) + [96]=> + int(97) + [97]=> + int(98) + [98]=> + int(99) + [99]=> + int(100) +} +array(100) { + [0]=> + int(100) + [1]=> + int(99) + [2]=> + int(98) + [3]=> + int(97) + [4]=> + int(96) + [5]=> + int(95) + [6]=> + int(94) + [7]=> + int(93) + [8]=> + int(92) + [9]=> + int(91) + [10]=> + int(90) + [11]=> + int(89) + [12]=> + int(88) + [13]=> + int(87) + [14]=> + int(86) + [15]=> + int(85) + [16]=> + int(84) + [17]=> + int(83) + [18]=> + int(82) + [19]=> + int(81) + [20]=> + int(80) + [21]=> + int(79) + [22]=> + int(78) + [23]=> + int(77) + [24]=> + int(76) + [25]=> + int(75) + [26]=> + int(74) + [27]=> + int(73) + [28]=> + int(72) + [29]=> + int(71) + [30]=> + int(70) + [31]=> + int(69) + [32]=> + int(68) + [33]=> + int(67) + [34]=> + int(66) + [35]=> + int(65) + [36]=> + int(64) + [37]=> + int(63) + [38]=> + int(62) + [39]=> + int(61) + [40]=> + int(60) + [41]=> + int(59) + [42]=> + int(58) + [43]=> + int(57) + [44]=> + int(56) + [45]=> + int(55) + [46]=> + int(54) + [47]=> + int(53) + [48]=> + int(52) + [49]=> + int(51) + [50]=> + int(50) + [51]=> + int(49) + [52]=> + int(48) + [53]=> + int(47) + [54]=> + int(46) + [55]=> + int(45) + [56]=> + int(44) + [57]=> + int(43) + [58]=> + int(42) + [59]=> + int(41) + [60]=> + int(40) + [61]=> + int(39) + [62]=> + int(38) + [63]=> + int(37) + [64]=> + int(36) + [65]=> + int(35) + [66]=> + int(34) + [67]=> + int(33) + [68]=> + int(32) + [69]=> + int(31) + [70]=> + int(30) + [71]=> + int(29) + [72]=> + int(28) + [73]=> + int(27) + [74]=> + int(26) + [75]=> + int(25) + [76]=> + int(24) + [77]=> + int(23) + [78]=> + int(22) + [79]=> + int(21) + [80]=> + int(20) + [81]=> + int(19) + [82]=> + int(18) + [83]=> + int(17) + [84]=> + int(16) + [85]=> + int(15) + [86]=> + int(14) + [87]=> + int(13) + [88]=> + int(12) + [89]=> + int(11) + [90]=> + int(10) + [91]=> + int(9) + [92]=> + int(8) + [93]=> + int(7) + [94]=> + int(6) + [95]=> + int(5) + [96]=> + int(4) + [97]=> + int(3) + [98]=> + int(2) + [99]=> + int(1) +} +array(26) { + [0]=> + unicode(1) "a" + [1]=> + unicode(1) "b" + [2]=> + unicode(1) "c" + [3]=> + unicode(1) "d" + [4]=> + unicode(1) "e" + [5]=> + unicode(1) "f" + [6]=> + unicode(1) "g" + [7]=> + unicode(1) "h" + [8]=> + unicode(1) "i" + [9]=> + unicode(1) "j" + [10]=> + unicode(1) "k" + [11]=> + unicode(1) "l" + [12]=> + unicode(1) "m" + [13]=> + unicode(1) "n" + [14]=> + unicode(1) "o" + [15]=> + unicode(1) "p" + [16]=> + unicode(1) "q" + [17]=> + unicode(1) "r" + [18]=> + unicode(1) "s" + [19]=> + unicode(1) "t" + [20]=> + unicode(1) "u" + [21]=> + unicode(1) "v" + [22]=> + unicode(1) "w" + [23]=> + unicode(1) "x" + [24]=> + unicode(1) "y" + [25]=> + unicode(1) "z" +} +array(26) { + [0]=> + unicode(1) "z" + [1]=> + unicode(1) "y" + [2]=> + unicode(1) "x" + [3]=> + unicode(1) "w" + [4]=> + unicode(1) "v" + [5]=> + unicode(1) "u" + [6]=> + unicode(1) "t" + [7]=> + unicode(1) "s" + [8]=> + unicode(1) "r" + [9]=> + unicode(1) "q" + [10]=> + unicode(1) "p" + [11]=> + unicode(1) "o" + [12]=> + unicode(1) "n" + [13]=> + unicode(1) "m" + [14]=> + unicode(1) "l" + [15]=> + unicode(1) "k" + [16]=> + unicode(1) "j" + [17]=> + unicode(1) "i" + [18]=> + unicode(1) "h" + [19]=> + unicode(1) "g" + [20]=> + unicode(1) "f" + [21]=> + unicode(1) "e" + [22]=> + unicode(1) "d" + [23]=> + unicode(1) "c" + [24]=> + unicode(1) "b" + [25]=> + unicode(1) "a" +} +array(1) { + [0]=> + unicode(1) "q" +} +array(1) { + [0]=> + int(5) +} +array(6) { + [0]=> + float(5.1) + [1]=> + float(6.1) + [2]=> + float(7.1) + [3]=> + float(8.1) + [4]=> + float(9.1) + [5]=> + float(10.1) +} +array(6) { + [0]=> + float(10.1) + [1]=> + float(9.1) + [2]=> + float(8.1) + [3]=> + float(7.1) + [4]=> + float(6.1) + [5]=> + float(5.1) +} +array(6) { + [0]=> + float(5.1) + [1]=> + float(6.1) + [2]=> + float(7.1) + [3]=> + float(8.1) + [4]=> + float(9.1) + [5]=> + float(10.1) +} +array(6) { + [0]=> + float(10.1) + [1]=> + float(9.1) + [2]=> + float(8.1) + [3]=> + float(7.1) + [4]=> + float(6.1) + [5]=> + float(5.1) +} +array(41) { + [0]=> + float(1) + [1]=> + float(1.1) + [2]=> + float(1.2) + [3]=> + float(1.3) + [4]=> + float(1.4) + [5]=> + float(1.5) + [6]=> + float(1.6) + [7]=> + float(1.7) + [8]=> + float(1.8) + [9]=> + float(1.9) + [10]=> + float(2) + [11]=> + float(2.1) + [12]=> + float(2.2) + [13]=> + float(2.3) + [14]=> + float(2.4) + [15]=> + float(2.5) + [16]=> + float(2.6) + [17]=> + float(2.7) + [18]=> + float(2.8) + [19]=> + float(2.9) + [20]=> + float(3) + [21]=> + float(3.1) + [22]=> + float(3.2) + [23]=> + float(3.3) + [24]=> + float(3.4) + [25]=> + float(3.5) + [26]=> + float(3.6) + [27]=> + float(3.7) + [28]=> + float(3.8) + [29]=> + float(3.9) + [30]=> + float(4) + [31]=> + float(4.1) + [32]=> + float(4.2) + [33]=> + float(4.3) + [34]=> + float(4.4) + [35]=> + float(4.5) + [36]=> + float(4.6) + [37]=> + float(4.7) + [38]=> + float(4.8) + [39]=> + float(4.9) + [40]=> + float(5) +} +array(41) { + [0]=> + float(5) + [1]=> + float(4.9) + [2]=> + float(4.8) + [3]=> + float(4.7) + [4]=> + float(4.6) + [5]=> + float(4.5) + [6]=> + float(4.4) + [7]=> + float(4.3) + [8]=> + float(4.2) + [9]=> + float(4.1) + [10]=> + float(4) + [11]=> + float(3.9) + [12]=> + float(3.8) + [13]=> + float(3.7) + [14]=> + float(3.6) + [15]=> + float(3.5) + [16]=> + float(3.4) + [17]=> + float(3.3) + [18]=> + float(3.2) + [19]=> + float(3.1) + [20]=> + float(3) + [21]=> + float(2.9) + [22]=> + float(2.8) + [23]=> + float(2.7) + [24]=> + float(2.6) + [25]=> + float(2.5) + [26]=> + float(2.4) + [27]=> + float(2.3) + [28]=> + float(2.2) + [29]=> + float(2.1) + [30]=> + float(2) + [31]=> + float(1.9) + [32]=> + float(1.8) + [33]=> + float(1.7) + [34]=> + float(1.6) + [35]=> + float(1.5) + [36]=> + float(1.4) + [37]=> + float(1.3) + [38]=> + float(1.2) + [39]=> + float(1.1) + [40]=> + float(1) +} +array(41) { + [0]=> + float(1) + [1]=> + float(1.1) + [2]=> + float(1.2) + [3]=> + float(1.3) + [4]=> + float(1.4) + [5]=> + float(1.5) + [6]=> + float(1.6) + [7]=> + float(1.7) + [8]=> + float(1.8) + [9]=> + float(1.9) + [10]=> + float(2) + [11]=> + float(2.1) + [12]=> + float(2.2) + [13]=> + float(2.3) + [14]=> + float(2.4) + [15]=> + float(2.5) + [16]=> + float(2.6) + [17]=> + float(2.7) + [18]=> + float(2.8) + [19]=> + float(2.9) + [20]=> + float(3) + [21]=> + float(3.1) + [22]=> + float(3.2) + [23]=> + float(3.3) + [24]=> + float(3.4) + [25]=> + float(3.5) + [26]=> + float(3.6) + [27]=> + float(3.7) + [28]=> + float(3.8) + [29]=> + float(3.9) + [30]=> + float(4) + [31]=> + float(4.1) + [32]=> + float(4.2) + [33]=> + float(4.3) + [34]=> + float(4.4) + [35]=> + float(4.5) + [36]=> + float(4.6) + [37]=> + float(4.7) + [38]=> + float(4.8) + [39]=> + float(4.9) + [40]=> + float(5) +} +array(41) { + [0]=> + float(1) + [1]=> + float(1.1) + [2]=> + float(1.2) + [3]=> + float(1.3) + [4]=> + float(1.4) + [5]=> + float(1.5) + [6]=> + float(1.6) + [7]=> + float(1.7) + [8]=> + float(1.8) + [9]=> + float(1.9) + [10]=> + float(2) + [11]=> + float(2.1) + [12]=> + float(2.2) + [13]=> + float(2.3) + [14]=> + float(2.4) + [15]=> + float(2.5) + [16]=> + float(2.6) + [17]=> + float(2.7) + [18]=> + float(2.8) + [19]=> + float(2.9) + [20]=> + float(3) + [21]=> + float(3.1) + [22]=> + float(3.2) + [23]=> + float(3.3) + [24]=> + float(3.4) + [25]=> + float(3.5) + [26]=> + float(3.6) + [27]=> + float(3.7) + [28]=> + float(3.8) + [29]=> + float(3.9) + [30]=> + float(4) + [31]=> + float(4.1) + [32]=> + float(4.2) + [33]=> + float(4.3) + [34]=> + float(4.4) + [35]=> + float(4.5) + [36]=> + float(4.6) + [37]=> + float(4.7) + [38]=> + float(4.8) + [39]=> + float(4.9) + [40]=> + float(5) +} -- 2.40.0