93#define LCONV_DECIMAL_POINT (*lconv.decimal_point)
95#define LCONV_DECIMAL_POINT (*lconv->decimal_point)
101#define INT_NULL ((int *)0)
103#define S_NULL "(null)"
106#define FLOAT_DIGITS 6
107#define EXPONENT_LENGTH 10
114#define INS_CHAR(xbuf, ch, is_char) do { \
116 smart_string_appendc((smart_string *)(xbuf), (ch)); \
118 smart_str_appendc((smart_str *)(xbuf), (ch)); \
122#define INS_STRING(xbuf, str, len, is_char) do { \
124 smart_string_appendl((smart_string *)(xbuf), (str), (len)); \
126 smart_str_appendl((smart_str *)(xbuf), (str), (len)); \
130#define PAD_CHAR(xbuf, ch, count, is_char) do { \
132 smart_string_alloc(((smart_string *)(xbuf)), (count), 0); \
133 memset(((smart_string *)(xbuf))->c + ((smart_string *)(xbuf))->len, (ch), (count)); \
134 ((smart_string *)(xbuf))->len += (count); \
136 smart_str_alloc(((smart_str *)(xbuf)), (count), 0); \
137 memset(ZSTR_VAL(((smart_str *)(xbuf))->s) + ZSTR_LEN(((smart_str *)(xbuf))->s), (ch), (count)); \
138 ZSTR_LEN(((smart_str *)(xbuf))->s) += (count); \
146#define NUM_BUF_SIZE ZEND_DOUBLE_MAX_LENGTH
148#define NUM(c) (c - '0')
150#define STR_TO_DEC(str, num) do { \
152 while (isdigit((int)*str)) { \
154 num += NUM(*str++); \
155 if (num >= INT_MAX / 10) { \
156 while (isdigit((int)*str++)); \
168#define FIX_PRECISION(adjust, precision, s, s_len) do { \
170 while (s_len < (size_t)precision) { \
181static void xbuf_format_converter(
void *xbuf,
bool is_char,
const char *fmt, va_list ap)
195 int64_t i_num = (int64_t) 0;
196 uint64_t ui_num = (uint64_t) 0;
204 struct lconv *lconv =
NULL;
214 bool adjust_precision;
227 alternate_form = print_sign = print_blank =
false;
236 if (isascii((
int)*fmt) && !islower((
int)*fmt)) {
243 else if (*fmt ==
'+')
245 else if (*fmt ==
'#')
246 alternate_form =
true;
247 else if (*fmt ==
' ')
249 else if (*fmt ==
'0')
258 if (isdigit((
int)*fmt)) {
261 }
else if (*fmt ==
'*') {
262 min_width = va_arg(ap,
int);
267 min_width = -min_width;
270 adjust_width =
false;
276 adjust_precision =
true;
278 if (isdigit((
int)*fmt)) {
280 }
else if (*fmt ==
'*') {
281 precision = va_arg(ap,
int);
288 adjust_precision =
false;
290 adjust_precision = adjust_width =
false;
305 modifier = LM_LONG_LONG;
317 modifier = LM_INTMAX_T;
325 modifier = LM_PTRDIFF_T;
332 char __next = *(fmt+1);
333 if (
'd' == __next ||
'u' == __next ||
'x' == __next ||
'o' == __next) {
335 "printf \"p\" modifier is no longer supported, use ZEND_LONG_FMT");
366 zend_string *str = zval_get_tmp_string(zvp, &tmp_str);
369 if (adjust_precision && (
size_t)precision < s_len) {
378 if (adjust_precision && (
size_t)precision < s_len) {
386 i_num = (int64_t) va_arg(ap,
unsigned int);
391 i_num = (int64_t) va_arg(ap,
unsigned long int);
394 i_num = (int64_t) va_arg(ap,
size_t);
398 i_num = (int64_t) va_arg(ap,
unsigned long long int);
403 i_num = (int64_t) va_arg(ap, uintmax_t);
425 i_num = (int64_t) va_arg(ap,
int);
430 i_num = (int64_t) va_arg(ap,
long int);
434 i_num = (int64_t) va_arg(ap, ssize_t);
436 i_num = (int64_t) va_arg(ap,
size_t);
441 i_num = (int64_t) va_arg(ap,
long long int);
446 i_num = (int64_t) va_arg(ap, intmax_t);
465 else if (print_blank)
474 ui_num = (uint64_t) va_arg(ap,
unsigned int);
479 ui_num = (uint64_t) va_arg(ap,
unsigned long int);
482 ui_num = (uint64_t) va_arg(ap,
size_t);
486 ui_num = (uint64_t) va_arg(ap,
unsigned long long int);
491 ui_num = (uint64_t) va_arg(ap, uintmax_t);
496 ui_num = (uint64_t) va_arg(ap,
ptrdiff_t);
503 if (alternate_form && *
s !=
'0') {
514 ui_num = (uint64_t) va_arg(ap,
unsigned int);
519 ui_num = (uint64_t) va_arg(ap,
unsigned long int);
522 ui_num = (uint64_t) va_arg(ap,
size_t);
526 ui_num = (uint64_t) va_arg(ap,
unsigned long long int);
531 ui_num = (uint64_t) va_arg(ap, uintmax_t);
536 ui_num = (uint64_t) va_arg(ap,
ptrdiff_t);
543 if (alternate_form && ui_num != 0) {
552 s = va_arg(ap,
char *);
554 if (!adjust_precision) {
557 s_len = zend_strnlen(
s, precision);
573 fp_num = (double) va_arg(ap,
long double);
576 fp_num = va_arg(ap,
double);
596 s =
php_conv_fp((*fmt ==
'f')?
'F':*fmt, fp_num, alternate_form,
599 &is_negative, &num_buf[1], &s_len);
604 else if (print_blank)
616 fp_num = (double) va_arg(ap,
long double);
619 fp_num = va_arg(ap,
double);
640 if (adjust_precision ==
false)
642 else if (precision == 0)
659 else if (print_blank)
670 char_buf[0] = (char) (va_arg(ap,
int));
698 if (
sizeof(
char *) <=
sizeof(uint64_t)) {
699 ui_num = (uint64_t)((
size_t) va_arg(ap,
char *));
724 php_error(
E_ERROR,
"Illegal length modifier specified '%c' in s[np]printf call", *fmt);
745 if (prefix_char !=
NUL) {
749 if (adjust_width && adjust == RIGHT && (
size_t)min_width > s_len) {
750 if (pad_char ==
'0' && prefix_char !=
NUL) {
756 PAD_CHAR(xbuf, pad_char, min_width - s_len, is_char);
763 if (adjust_width && adjust == LEFT && (
size_t)min_width > s_len) {
764 PAD_CHAR(xbuf, pad_char, min_width - s_len, is_char);
767 zend_tmp_string_release(tmp_str);
778 xbuf_format_converter(
buf, 1, format, ap);
784 xbuf_format_converter(
buf, 0, format, ap);
strchr(string $haystack, string $needle, bool $before_needle=false)
zend_ffi_ctype_name_buf buf
PHPAPI struct lconv * localeconv_r(struct lconv *out)
#define LCONV_DECIMAL_POINT
PHPAPI char * php_conv_fp(char format, double num, bool add_dp, int precision, char dec_point, bool *is_negative, char *buf, size_t *len)
PHPAPI char * ap_php_conv_p2(uint64_t num, int nbits, char format, char *buf_end, size_t *len)
PHPAPI char * ap_php_conv_10(int64_t num, bool is_unsigned, bool *is_negative, char *buf_end, size_t *len)
#define STR_TO_DEC(str, num)
#define INS_STRING(xbuf, str, len, is_char)
PHPAPI void php_printf_to_smart_str(smart_str *buf, const char *format, va_list ap)
PHPAPI void php_printf_to_smart_string(smart_string *buf, const char *format, va_list ap)
#define FIX_PRECISION(adjust, precision, s, s_len)
#define PAD_CHAR(xbuf, ch, count, is_char)
#define INS_CHAR(xbuf, ch, is_char)
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
struct _zend_string zend_string
ZEND_API char * zend_gcvt(double value, int ndigit, char dec_point, char exponent, char *buf)