php-src/ext/zend_test/php_test.h
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

85 lines
2.6 KiB
C

/*
+----------------------------------------------------------------------+
| Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| https://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: |
+----------------------------------------------------------------------+
*/
#ifndef PHP_TEST_H
#define PHP_TEST_H
#include "fiber.h"
extern zend_module_entry zend_test_module_entry;
#define phpext_zend_test_ptr &zend_test_module_entry
#define PHP_ZEND_TEST_VERSION "0.1.0"
#ifdef ZTS
#include "TSRM.h"
#endif
#if defined(ZTS) && defined(COMPILE_DL_ZEND_TEST)
ZEND_TSRMLS_CACHE_EXTERN()
#endif
ZEND_BEGIN_MODULE_GLOBALS(zend_test)
int observer_enabled;
int observer_show_output;
int observer_observe_all;
int observer_observe_includes;
int observer_observe_functions;
zend_array *observer_observe_function_names;
int observer_show_return_type;
int observer_show_return_value;
int observer_show_init_backtrace;
int observer_show_opcode;
char *observer_show_opcode_in_user_handler;
int observer_nesting_depth;
int observer_fiber_init;
int observer_fiber_switch;
int observer_fiber_destroy;
HashTable global_weakmap;
int replace_zend_execute_ex;
int register_passes;
bool print_stderr_mshutdown;
zend_test_fiber *active_fiber;
zend_long quantity_value;
ZEND_END_MODULE_GLOBALS(zend_test)
extern ZEND_DECLARE_MODULE_GLOBALS(zend_test)
#define ZT_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(zend_test, v)
struct bug79096 {
uint64_t a;
uint64_t b;
};
#ifdef PHP_WIN32
# define PHP_ZEND_TEST_API __declspec(dllexport)
#elif defined(__GNUC__) && __GNUC__ >= 4
# define PHP_ZEND_TEST_API __attribute__ ((visibility("default")))
#else
# define PHP_ZEND_TEST_API
#endif
PHP_ZEND_TEST_API int ZEND_FASTCALL bug78270(const char *str, size_t str_len);
PHP_ZEND_TEST_API struct bug79096 bug79096(void);
PHP_ZEND_TEST_API void bug79532(off_t *array, size_t elems);
extern PHP_ZEND_TEST_API int *(*bug79177_cb)(void);
PHP_ZEND_TEST_API void bug79177(void);
#endif