php-src/Zend/tests/zend_ini_parse_quantity.phpt
Arnaud Le Blanc efc8f0ebf8
Deprecate zend_atol() / add zend_ini_parse_quantity() (#7951)
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>
2022-06-17 14:12:53 +02:00

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)