mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
efc8f0ebf8
Add zend_ini_parse_quantity() and deprecate zend_atol(), zend_atoi() zend_atol() and zend_atoi() don't just do number parsing. They also check for a 'K', 'M', or 'G' at the end of the string, and multiply the parsed value out accordingly. Unfortunately, they ignore any other non-numerics between the numeric component and the last character in the string. This means that numbers such as the following are both valid and non-intuitive in their final output. * "123KMG" is interpreted as "123G" -> 132070244352 * "123G " is interpreted as "123 " -> 123 * "123GB" is interpreted as "123B" -> 123 * "123 I like tacos." is also interpreted as "123." -> 123 Currently, in php-src these functions are used only for parsing ini values. In this change we deprecate zend_atol(), zend_atoi(), and introduce a new function with the same behavior, but with the ability to report invalid inputs to the caller. The function's name also makes the behavior less unexpected: zend_ini_parse_quantity(). Co-authored-by: Sara Golemon <pollita@php.net>
898 lines
7.6 KiB
PHP
898 lines
7.6 KiB
PHP
--TEST--
|
|
Test parsing of quantities
|
|
--EXTENSIONS--
|
|
zend_test
|
|
--FILE--
|
|
<?php
|
|
|
|
// This test checks valid formats do not throw any warnings.
|
|
foreach (['', ' '] as $leadingWS) {
|
|
foreach (['', '+', '-'] as $sign) {
|
|
foreach (['', ' '] as $midWS) {
|
|
foreach (['', 'K', 'k', 'M', 'm', 'G', 'g'] as $exp) {
|
|
foreach (['', ' '] as $trailingWS) {
|
|
// Decimal
|
|
$setting = sprintf('%s%s1%s%s%s',
|
|
$leadingWS, $sign, $midWS, $exp, $trailingWS);
|
|
printf("# \"%s\"\n", $setting);
|
|
var_dump(zend_test_zend_ini_parse_quantity($setting));
|
|
print "\n";
|
|
|
|
if ($exp !== 'g' && $exp !== 'G') { // Would overflow
|
|
// Octal
|
|
$setting = sprintf('%s%s0123%s%s%s',
|
|
$leadingWS, $sign, $midWS, $exp, $trailingWS);
|
|
printf("# \"%s\"\n", $setting);
|
|
var_dump(zend_test_zend_ini_parse_quantity($setting));
|
|
print "\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--EXPECT--
|
|
# "1"
|
|
int(1)
|
|
|
|
# "0123"
|
|
int(83)
|
|
|
|
# "1 "
|
|
int(1)
|
|
|
|
# "0123 "
|
|
int(83)
|
|
|
|
# "1K"
|
|
int(1024)
|
|
|
|
# "0123K"
|
|
int(84992)
|
|
|
|
# "1K "
|
|
int(1024)
|
|
|
|
# "0123K "
|
|
int(84992)
|
|
|
|
# "1k"
|
|
int(1024)
|
|
|
|
# "0123k"
|
|
int(84992)
|
|
|
|
# "1k "
|
|
int(1024)
|
|
|
|
# "0123k "
|
|
int(84992)
|
|
|
|
# "1M"
|
|
int(1048576)
|
|
|
|
# "0123M"
|
|
int(87031808)
|
|
|
|
# "1M "
|
|
int(1048576)
|
|
|
|
# "0123M "
|
|
int(87031808)
|
|
|
|
# "1m"
|
|
int(1048576)
|
|
|
|
# "0123m"
|
|
int(87031808)
|
|
|
|
# "1m "
|
|
int(1048576)
|
|
|
|
# "0123m "
|
|
int(87031808)
|
|
|
|
# "1G"
|
|
int(1073741824)
|
|
|
|
# "1G "
|
|
int(1073741824)
|
|
|
|
# "1g"
|
|
int(1073741824)
|
|
|
|
# "1g "
|
|
int(1073741824)
|
|
|
|
# "1 "
|
|
int(1)
|
|
|
|
# "0123 "
|
|
int(83)
|
|
|
|
# "1 "
|
|
int(1)
|
|
|
|
# "0123 "
|
|
int(83)
|
|
|
|
# "1 K"
|
|
int(1024)
|
|
|
|
# "0123 K"
|
|
int(84992)
|
|
|
|
# "1 K "
|
|
int(1024)
|
|
|
|
# "0123 K "
|
|
int(84992)
|
|
|
|
# "1 k"
|
|
int(1024)
|
|
|
|
# "0123 k"
|
|
int(84992)
|
|
|
|
# "1 k "
|
|
int(1024)
|
|
|
|
# "0123 k "
|
|
int(84992)
|
|
|
|
# "1 M"
|
|
int(1048576)
|
|
|
|
# "0123 M"
|
|
int(87031808)
|
|
|
|
# "1 M "
|
|
int(1048576)
|
|
|
|
# "0123 M "
|
|
int(87031808)
|
|
|
|
# "1 m"
|
|
int(1048576)
|
|
|
|
# "0123 m"
|
|
int(87031808)
|
|
|
|
# "1 m "
|
|
int(1048576)
|
|
|
|
# "0123 m "
|
|
int(87031808)
|
|
|
|
# "1 G"
|
|
int(1073741824)
|
|
|
|
# "1 G "
|
|
int(1073741824)
|
|
|
|
# "1 g"
|
|
int(1073741824)
|
|
|
|
# "1 g "
|
|
int(1073741824)
|
|
|
|
# "+1"
|
|
int(1)
|
|
|
|
# "+0123"
|
|
int(83)
|
|
|
|
# "+1 "
|
|
int(1)
|
|
|
|
# "+0123 "
|
|
int(83)
|
|
|
|
# "+1K"
|
|
int(1024)
|
|
|
|
# "+0123K"
|
|
int(84992)
|
|
|
|
# "+1K "
|
|
int(1024)
|
|
|
|
# "+0123K "
|
|
int(84992)
|
|
|
|
# "+1k"
|
|
int(1024)
|
|
|
|
# "+0123k"
|
|
int(84992)
|
|
|
|
# "+1k "
|
|
int(1024)
|
|
|
|
# "+0123k "
|
|
int(84992)
|
|
|
|
# "+1M"
|
|
int(1048576)
|
|
|
|
# "+0123M"
|
|
int(87031808)
|
|
|
|
# "+1M "
|
|
int(1048576)
|
|
|
|
# "+0123M "
|
|
int(87031808)
|
|
|
|
# "+1m"
|
|
int(1048576)
|
|
|
|
# "+0123m"
|
|
int(87031808)
|
|
|
|
# "+1m "
|
|
int(1048576)
|
|
|
|
# "+0123m "
|
|
int(87031808)
|
|
|
|
# "+1G"
|
|
int(1073741824)
|
|
|
|
# "+1G "
|
|
int(1073741824)
|
|
|
|
# "+1g"
|
|
int(1073741824)
|
|
|
|
# "+1g "
|
|
int(1073741824)
|
|
|
|
# "+1 "
|
|
int(1)
|
|
|
|
# "+0123 "
|
|
int(83)
|
|
|
|
# "+1 "
|
|
int(1)
|
|
|
|
# "+0123 "
|
|
int(83)
|
|
|
|
# "+1 K"
|
|
int(1024)
|
|
|
|
# "+0123 K"
|
|
int(84992)
|
|
|
|
# "+1 K "
|
|
int(1024)
|
|
|
|
# "+0123 K "
|
|
int(84992)
|
|
|
|
# "+1 k"
|
|
int(1024)
|
|
|
|
# "+0123 k"
|
|
int(84992)
|
|
|
|
# "+1 k "
|
|
int(1024)
|
|
|
|
# "+0123 k "
|
|
int(84992)
|
|
|
|
# "+1 M"
|
|
int(1048576)
|
|
|
|
# "+0123 M"
|
|
int(87031808)
|
|
|
|
# "+1 M "
|
|
int(1048576)
|
|
|
|
# "+0123 M "
|
|
int(87031808)
|
|
|
|
# "+1 m"
|
|
int(1048576)
|
|
|
|
# "+0123 m"
|
|
int(87031808)
|
|
|
|
# "+1 m "
|
|
int(1048576)
|
|
|
|
# "+0123 m "
|
|
int(87031808)
|
|
|
|
# "+1 G"
|
|
int(1073741824)
|
|
|
|
# "+1 G "
|
|
int(1073741824)
|
|
|
|
# "+1 g"
|
|
int(1073741824)
|
|
|
|
# "+1 g "
|
|
int(1073741824)
|
|
|
|
# "-1"
|
|
int(-1)
|
|
|
|
# "-0123"
|
|
int(-83)
|
|
|
|
# "-1 "
|
|
int(-1)
|
|
|
|
# "-0123 "
|
|
int(-83)
|
|
|
|
# "-1K"
|
|
int(-1024)
|
|
|
|
# "-0123K"
|
|
int(-84992)
|
|
|
|
# "-1K "
|
|
int(-1024)
|
|
|
|
# "-0123K "
|
|
int(-84992)
|
|
|
|
# "-1k"
|
|
int(-1024)
|
|
|
|
# "-0123k"
|
|
int(-84992)
|
|
|
|
# "-1k "
|
|
int(-1024)
|
|
|
|
# "-0123k "
|
|
int(-84992)
|
|
|
|
# "-1M"
|
|
int(-1048576)
|
|
|
|
# "-0123M"
|
|
int(-87031808)
|
|
|
|
# "-1M "
|
|
int(-1048576)
|
|
|
|
# "-0123M "
|
|
int(-87031808)
|
|
|
|
# "-1m"
|
|
int(-1048576)
|
|
|
|
# "-0123m"
|
|
int(-87031808)
|
|
|
|
# "-1m "
|
|
int(-1048576)
|
|
|
|
# "-0123m "
|
|
int(-87031808)
|
|
|
|
# "-1G"
|
|
int(-1073741824)
|
|
|
|
# "-1G "
|
|
int(-1073741824)
|
|
|
|
# "-1g"
|
|
int(-1073741824)
|
|
|
|
# "-1g "
|
|
int(-1073741824)
|
|
|
|
# "-1 "
|
|
int(-1)
|
|
|
|
# "-0123 "
|
|
int(-83)
|
|
|
|
# "-1 "
|
|
int(-1)
|
|
|
|
# "-0123 "
|
|
int(-83)
|
|
|
|
# "-1 K"
|
|
int(-1024)
|
|
|
|
# "-0123 K"
|
|
int(-84992)
|
|
|
|
# "-1 K "
|
|
int(-1024)
|
|
|
|
# "-0123 K "
|
|
int(-84992)
|
|
|
|
# "-1 k"
|
|
int(-1024)
|
|
|
|
# "-0123 k"
|
|
int(-84992)
|
|
|
|
# "-1 k "
|
|
int(-1024)
|
|
|
|
# "-0123 k "
|
|
int(-84992)
|
|
|
|
# "-1 M"
|
|
int(-1048576)
|
|
|
|
# "-0123 M"
|
|
int(-87031808)
|
|
|
|
# "-1 M "
|
|
int(-1048576)
|
|
|
|
# "-0123 M "
|
|
int(-87031808)
|
|
|
|
# "-1 m"
|
|
int(-1048576)
|
|
|
|
# "-0123 m"
|
|
int(-87031808)
|
|
|
|
# "-1 m "
|
|
int(-1048576)
|
|
|
|
# "-0123 m "
|
|
int(-87031808)
|
|
|
|
# "-1 G"
|
|
int(-1073741824)
|
|
|
|
# "-1 G "
|
|
int(-1073741824)
|
|
|
|
# "-1 g"
|
|
int(-1073741824)
|
|
|
|
# "-1 g "
|
|
int(-1073741824)
|
|
|
|
# " 1"
|
|
int(1)
|
|
|
|
# " 0123"
|
|
int(83)
|
|
|
|
# " 1 "
|
|
int(1)
|
|
|
|
# " 0123 "
|
|
int(83)
|
|
|
|
# " 1K"
|
|
int(1024)
|
|
|
|
# " 0123K"
|
|
int(84992)
|
|
|
|
# " 1K "
|
|
int(1024)
|
|
|
|
# " 0123K "
|
|
int(84992)
|
|
|
|
# " 1k"
|
|
int(1024)
|
|
|
|
# " 0123k"
|
|
int(84992)
|
|
|
|
# " 1k "
|
|
int(1024)
|
|
|
|
# " 0123k "
|
|
int(84992)
|
|
|
|
# " 1M"
|
|
int(1048576)
|
|
|
|
# " 0123M"
|
|
int(87031808)
|
|
|
|
# " 1M "
|
|
int(1048576)
|
|
|
|
# " 0123M "
|
|
int(87031808)
|
|
|
|
# " 1m"
|
|
int(1048576)
|
|
|
|
# " 0123m"
|
|
int(87031808)
|
|
|
|
# " 1m "
|
|
int(1048576)
|
|
|
|
# " 0123m "
|
|
int(87031808)
|
|
|
|
# " 1G"
|
|
int(1073741824)
|
|
|
|
# " 1G "
|
|
int(1073741824)
|
|
|
|
# " 1g"
|
|
int(1073741824)
|
|
|
|
# " 1g "
|
|
int(1073741824)
|
|
|
|
# " 1 "
|
|
int(1)
|
|
|
|
# " 0123 "
|
|
int(83)
|
|
|
|
# " 1 "
|
|
int(1)
|
|
|
|
# " 0123 "
|
|
int(83)
|
|
|
|
# " 1 K"
|
|
int(1024)
|
|
|
|
# " 0123 K"
|
|
int(84992)
|
|
|
|
# " 1 K "
|
|
int(1024)
|
|
|
|
# " 0123 K "
|
|
int(84992)
|
|
|
|
# " 1 k"
|
|
int(1024)
|
|
|
|
# " 0123 k"
|
|
int(84992)
|
|
|
|
# " 1 k "
|
|
int(1024)
|
|
|
|
# " 0123 k "
|
|
int(84992)
|
|
|
|
# " 1 M"
|
|
int(1048576)
|
|
|
|
# " 0123 M"
|
|
int(87031808)
|
|
|
|
# " 1 M "
|
|
int(1048576)
|
|
|
|
# " 0123 M "
|
|
int(87031808)
|
|
|
|
# " 1 m"
|
|
int(1048576)
|
|
|
|
# " 0123 m"
|
|
int(87031808)
|
|
|
|
# " 1 m "
|
|
int(1048576)
|
|
|
|
# " 0123 m "
|
|
int(87031808)
|
|
|
|
# " 1 G"
|
|
int(1073741824)
|
|
|
|
# " 1 G "
|
|
int(1073741824)
|
|
|
|
# " 1 g"
|
|
int(1073741824)
|
|
|
|
# " 1 g "
|
|
int(1073741824)
|
|
|
|
# " +1"
|
|
int(1)
|
|
|
|
# " +0123"
|
|
int(83)
|
|
|
|
# " +1 "
|
|
int(1)
|
|
|
|
# " +0123 "
|
|
int(83)
|
|
|
|
# " +1K"
|
|
int(1024)
|
|
|
|
# " +0123K"
|
|
int(84992)
|
|
|
|
# " +1K "
|
|
int(1024)
|
|
|
|
# " +0123K "
|
|
int(84992)
|
|
|
|
# " +1k"
|
|
int(1024)
|
|
|
|
# " +0123k"
|
|
int(84992)
|
|
|
|
# " +1k "
|
|
int(1024)
|
|
|
|
# " +0123k "
|
|
int(84992)
|
|
|
|
# " +1M"
|
|
int(1048576)
|
|
|
|
# " +0123M"
|
|
int(87031808)
|
|
|
|
# " +1M "
|
|
int(1048576)
|
|
|
|
# " +0123M "
|
|
int(87031808)
|
|
|
|
# " +1m"
|
|
int(1048576)
|
|
|
|
# " +0123m"
|
|
int(87031808)
|
|
|
|
# " +1m "
|
|
int(1048576)
|
|
|
|
# " +0123m "
|
|
int(87031808)
|
|
|
|
# " +1G"
|
|
int(1073741824)
|
|
|
|
# " +1G "
|
|
int(1073741824)
|
|
|
|
# " +1g"
|
|
int(1073741824)
|
|
|
|
# " +1g "
|
|
int(1073741824)
|
|
|
|
# " +1 "
|
|
int(1)
|
|
|
|
# " +0123 "
|
|
int(83)
|
|
|
|
# " +1 "
|
|
int(1)
|
|
|
|
# " +0123 "
|
|
int(83)
|
|
|
|
# " +1 K"
|
|
int(1024)
|
|
|
|
# " +0123 K"
|
|
int(84992)
|
|
|
|
# " +1 K "
|
|
int(1024)
|
|
|
|
# " +0123 K "
|
|
int(84992)
|
|
|
|
# " +1 k"
|
|
int(1024)
|
|
|
|
# " +0123 k"
|
|
int(84992)
|
|
|
|
# " +1 k "
|
|
int(1024)
|
|
|
|
# " +0123 k "
|
|
int(84992)
|
|
|
|
# " +1 M"
|
|
int(1048576)
|
|
|
|
# " +0123 M"
|
|
int(87031808)
|
|
|
|
# " +1 M "
|
|
int(1048576)
|
|
|
|
# " +0123 M "
|
|
int(87031808)
|
|
|
|
# " +1 m"
|
|
int(1048576)
|
|
|
|
# " +0123 m"
|
|
int(87031808)
|
|
|
|
# " +1 m "
|
|
int(1048576)
|
|
|
|
# " +0123 m "
|
|
int(87031808)
|
|
|
|
# " +1 G"
|
|
int(1073741824)
|
|
|
|
# " +1 G "
|
|
int(1073741824)
|
|
|
|
# " +1 g"
|
|
int(1073741824)
|
|
|
|
# " +1 g "
|
|
int(1073741824)
|
|
|
|
# " -1"
|
|
int(-1)
|
|
|
|
# " -0123"
|
|
int(-83)
|
|
|
|
# " -1 "
|
|
int(-1)
|
|
|
|
# " -0123 "
|
|
int(-83)
|
|
|
|
# " -1K"
|
|
int(-1024)
|
|
|
|
# " -0123K"
|
|
int(-84992)
|
|
|
|
# " -1K "
|
|
int(-1024)
|
|
|
|
# " -0123K "
|
|
int(-84992)
|
|
|
|
# " -1k"
|
|
int(-1024)
|
|
|
|
# " -0123k"
|
|
int(-84992)
|
|
|
|
# " -1k "
|
|
int(-1024)
|
|
|
|
# " -0123k "
|
|
int(-84992)
|
|
|
|
# " -1M"
|
|
int(-1048576)
|
|
|
|
# " -0123M"
|
|
int(-87031808)
|
|
|
|
# " -1M "
|
|
int(-1048576)
|
|
|
|
# " -0123M "
|
|
int(-87031808)
|
|
|
|
# " -1m"
|
|
int(-1048576)
|
|
|
|
# " -0123m"
|
|
int(-87031808)
|
|
|
|
# " -1m "
|
|
int(-1048576)
|
|
|
|
# " -0123m "
|
|
int(-87031808)
|
|
|
|
# " -1G"
|
|
int(-1073741824)
|
|
|
|
# " -1G "
|
|
int(-1073741824)
|
|
|
|
# " -1g"
|
|
int(-1073741824)
|
|
|
|
# " -1g "
|
|
int(-1073741824)
|
|
|
|
# " -1 "
|
|
int(-1)
|
|
|
|
# " -0123 "
|
|
int(-83)
|
|
|
|
# " -1 "
|
|
int(-1)
|
|
|
|
# " -0123 "
|
|
int(-83)
|
|
|
|
# " -1 K"
|
|
int(-1024)
|
|
|
|
# " -0123 K"
|
|
int(-84992)
|
|
|
|
# " -1 K "
|
|
int(-1024)
|
|
|
|
# " -0123 K "
|
|
int(-84992)
|
|
|
|
# " -1 k"
|
|
int(-1024)
|
|
|
|
# " -0123 k"
|
|
int(-84992)
|
|
|
|
# " -1 k "
|
|
int(-1024)
|
|
|
|
# " -0123 k "
|
|
int(-84992)
|
|
|
|
# " -1 M"
|
|
int(-1048576)
|
|
|
|
# " -0123 M"
|
|
int(-87031808)
|
|
|
|
# " -1 M "
|
|
int(-1048576)
|
|
|
|
# " -0123 M "
|
|
int(-87031808)
|
|
|
|
# " -1 m"
|
|
int(-1048576)
|
|
|
|
# " -0123 m"
|
|
int(-87031808)
|
|
|
|
# " -1 m "
|
|
int(-1048576)
|
|
|
|
# " -0123 m "
|
|
int(-87031808)
|
|
|
|
# " -1 G"
|
|
int(-1073741824)
|
|
|
|
# " -1 G "
|
|
int(-1073741824)
|
|
|
|
# " -1 g"
|
|
int(-1073741824)
|
|
|
|
# " -1 g "
|
|
int(-1073741824)
|