Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 18.222.124.172
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
www /
server /
php /
82 /
src /
ext /
standard /
[ HOME SHELL ]
Name
Size
Permission
Action
html_tables
[ DIR ]
drwxr-xr-x
tests
[ DIR ]
drwxr-xr-x
Makefile.frag
518
B
-rw-r--r--
Makefile.frag.w32
484
B
-rw-r--r--
array.c
171.38
KB
-rw-r--r--
assert.c
8.26
KB
-rw-r--r--
base64.c
30.55
KB
-rw-r--r--
base64.h
3.59
KB
-rw-r--r--
basic_functions.c
66.93
KB
-rw-r--r--
basic_functions.h
4.87
KB
-rw-r--r--
basic_functions.stub.php
48.85
KB
-rw-r--r--
basic_functions_arginfo.h
125.23
KB
-rw-r--r--
browscap.c
20.49
KB
-rw-r--r--
config.m4
10.98
KB
-rw-r--r--
config.w32
1.79
KB
-rw-r--r--
crc32.c
3.85
KB
-rw-r--r--
crc32.h
4.79
KB
-rw-r--r--
crc32_x86.c
11.99
KB
-rw-r--r--
crc32_x86.h
1.82
KB
-rw-r--r--
credits.c
5.71
KB
-rw-r--r--
credits.h
1.53
KB
-rw-r--r--
credits_ext.h
5.24
KB
-rw-r--r--
credits_sapi.h
835
B
-rw-r--r--
crypt.c
6.73
KB
-rw-r--r--
crypt_blowfish.c
30.75
KB
-rw-r--r--
crypt_blowfish.h
790
B
-rw-r--r--
crypt_freesec.c
21.52
KB
-rw-r--r--
crypt_freesec.h
662
B
-rw-r--r--
crypt_sha256.c
21.6
KB
-rw-r--r--
crypt_sha512.c
26.24
KB
-rw-r--r--
css.c
2.24
KB
-rw-r--r--
css.h
1.04
KB
-rw-r--r--
datetime.c
3.28
KB
-rw-r--r--
datetime.h
1.14
KB
-rw-r--r--
dir.c
14.04
KB
-rw-r--r--
dir.stub.php
528
B
-rw-r--r--
dir_arginfo.h
1.83
KB
-rw-r--r--
dl.c
8.18
KB
-rw-r--r--
dl.h
1.46
KB
-rw-r--r--
dl.stub.php
56
B
-rw-r--r--
dl_arginfo.h
269
B
-rw-r--r--
dns.c
29.37
KB
-rw-r--r--
dns_win32.c
15.09
KB
-rw-r--r--
exec.c
12.77
KB
-rw-r--r--
exec.h
1.27
KB
-rw-r--r--
file.c
65.14
KB
-rw-r--r--
file.h
3.93
KB
-rw-r--r--
filestat.c
28.38
KB
-rw-r--r--
filters.c
50.3
KB
-rw-r--r--
flock_compat.c
6
KB
-rw-r--r--
flock_compat.h
2.06
KB
-rw-r--r--
formatted_print.c
23.31
KB
-rw-r--r--
fsock.c
3.67
KB
-rw-r--r--
fsock.h
1.22
KB
-rw-r--r--
ftok.c
1.84
KB
-rw-r--r--
ftp_fopen_wrapper.c
31.54
KB
-rw-r--r--
head.c
10.66
KB
-rw-r--r--
head.h
1.53
KB
-rw-r--r--
hrtime.c
4.86
KB
-rw-r--r--
hrtime.h
2.31
KB
-rw-r--r--
html.c
44.9
KB
-rw-r--r--
html.h
2.34
KB
-rw-r--r--
html_tables.h
472.26
KB
-rw-r--r--
http.c
6.99
KB
-rw-r--r--
http_fopen_wrapper.c
32.23
KB
-rw-r--r--
image.c
44.79
KB
-rw-r--r--
incomplete_class.c
4.95
KB
-rw-r--r--
info.c
40.74
KB
-rw-r--r--
info.h
22.94
KB
-rw-r--r--
iptc.c
9.11
KB
-rw-r--r--
lcg.c
2.8
KB
-rw-r--r--
levenshtein.c
2.57
KB
-rw-r--r--
link.c
5.45
KB
-rw-r--r--
mail.c
15.13
KB
-rw-r--r--
math.c
27.18
KB
-rw-r--r--
md5.c
10.66
KB
-rw-r--r--
md5.h
2.02
KB
-rw-r--r--
metaphone.c
11.53
KB
-rw-r--r--
microtime.c
4.01
KB
-rw-r--r--
mt_rand.c
10.67
KB
-rw-r--r--
net.c
8.97
KB
-rw-r--r--
pack.c
31.65
KB
-rw-r--r--
pack.h
1.05
KB
-rw-r--r--
pageinfo.c
3.23
KB
-rw-r--r--
pageinfo.h
1.15
KB
-rw-r--r--
password.c
19.17
KB
-rw-r--r--
php_array.h
2.24
KB
-rw-r--r--
php_assert.h
1.24
KB
-rw-r--r--
php_browscap.h
1.11
KB
-rw-r--r--
php_crypt.h
1.37
KB
-rw-r--r--
php_crypt_r.c
5.74
KB
-rw-r--r--
php_crypt_r.h
1.64
KB
-rw-r--r--
php_dir.h
1.28
KB
-rw-r--r--
php_dns.h
2.58
KB
-rw-r--r--
php_ext_syslog.h
1.25
KB
-rw-r--r--
php_filestat.h
2.1
KB
-rw-r--r--
php_fopen_wrapper.c
11.47
KB
-rw-r--r--
php_fopen_wrappers.h
1.79
KB
-rw-r--r--
php_http.h
1.33
KB
-rw-r--r--
php_image.h
2.17
KB
-rw-r--r--
php_incomplete_class.h
2.15
KB
-rw-r--r--
php_lcg.h
1.31
KB
-rw-r--r--
php_mail.h
2.16
KB
-rw-r--r--
php_math.h
3.55
KB
-rw-r--r--
php_mt_rand.h
1.81
KB
-rw-r--r--
php_net.h
1.14
KB
-rw-r--r--
php_password.h
2.76
KB
-rw-r--r--
php_rand.h
3
KB
-rw-r--r--
php_random.h
1.86
KB
-rw-r--r--
php_smart_string.h
1.13
KB
-rw-r--r--
php_smart_string_public.h
1.14
KB
-rw-r--r--
php_standard.h
1.91
KB
-rw-r--r--
php_string.h
3.95
KB
-rw-r--r--
php_uuencode.h
1.18
KB
-rw-r--r--
php_var.h
3.41
KB
-rw-r--r--
php_versioning.h
1.18
KB
-rw-r--r--
proc_open.c
35.65
KB
-rw-r--r--
proc_open.h
1.67
KB
-rw-r--r--
quot_print.c
7
KB
-rw-r--r--
quot_print.h
1.23
KB
-rw-r--r--
rand.c
2.22
KB
-rw-r--r--
random.c
7.33
KB
-rw-r--r--
scanf.c
28.32
KB
-rw-r--r--
scanf.h
1.95
KB
-rw-r--r--
sha1.c
11.22
KB
-rw-r--r--
sha1.h
1.62
KB
-rw-r--r--
soundex.c
2.94
KB
-rw-r--r--
streamsfuncs.c
43.35
KB
-rw-r--r--
streamsfuncs.h
1.11
KB
-rw-r--r--
string.c
143.34
KB
-rw-r--r--
strnatcmp.c
4.28
KB
-rw-r--r--
syslog.c
6.02
KB
-rw-r--r--
type.c
10.77
KB
-rw-r--r--
uniqid.c
2.62
KB
-rw-r--r--
url.c
18.08
KB
-rw-r--r--
url.h
2.08
KB
-rw-r--r--
url_scanner_ex.c
38.41
KB
-rw-r--r--
url_scanner_ex.h
2.32
KB
-rw-r--r--
url_scanner_ex.re
27.63
KB
-rw-r--r--
user_filters.c
15.39
KB
-rw-r--r--
user_filters.stub.php
541
B
-rw-r--r--
user_filters_arginfo.h
2.45
KB
-rw-r--r--
uuencode.c
6.35
KB
-rw-r--r--
var.c
40.96
KB
-rw-r--r--
var_unserializer.c
42.18
KB
-rw-r--r--
var_unserializer.re
34.43
KB
-rw-r--r--
versioning.c
5.69
KB
-rw-r--r--
winver.h
6.23
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : formatted_print.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: Stig S�ther Bakken <ssb@php.net> | +----------------------------------------------------------------------+ */ #include <math.h> /* modf() */ #include "php.h" #include "ext/standard/head.h" #include "php_string.h" #include "zend_execute.h" #include <stdio.h> #include <locale.h> #ifdef ZTS #include "ext/standard/php_string.h" #define LCONV_DECIMAL_POINT (*lconv.decimal_point) #else #define LCONV_DECIMAL_POINT (*lconv->decimal_point) #endif #define ALIGN_LEFT 0 #define ALIGN_RIGHT 1 #define ADJ_WIDTH 1 #define ADJ_PRECISION 2 #define NUM_BUF_SIZE 500 #define FLOAT_PRECISION 6 #define MAX_FLOAT_PRECISION 53 #if 0 /* trick to control varargs functions through cpp */ # define PRINTF_DEBUG(arg) php_printf arg #else # define PRINTF_DEBUG(arg) #endif static const char hexchars[] = "0123456789abcdef"; static const char HEXCHARS[] = "0123456789ABCDEF"; /* php_spintf_appendchar() {{{ */ inline static void php_sprintf_appendchar(zend_string **buffer, size_t *pos, char add) { if ((*pos + 1) >= ZSTR_LEN(*buffer)) { PRINTF_DEBUG(("%s(): ereallocing buffer to %d bytes\n", get_active_function_name(), ZSTR_LEN(*buffer))); *buffer = zend_string_extend(*buffer, ZSTR_LEN(*buffer) << 1, 0); } PRINTF_DEBUG(("sprintf: appending '%c', pos=\n", add, *pos)); ZSTR_VAL(*buffer)[(*pos)++] = add; } /* }}} */ /* php_spintf_appendchar() {{{ */ inline static void php_sprintf_appendchars(zend_string **buffer, size_t *pos, char *add, size_t len) { if ((*pos + len) >= ZSTR_LEN(*buffer)) { size_t nlen = ZSTR_LEN(*buffer); PRINTF_DEBUG(("%s(): ereallocing buffer to %d bytes\n", get_active_function_name(), ZSTR_LEN(*buffer))); do { nlen = nlen << 1; } while ((*pos + len) >= nlen); *buffer = zend_string_extend(*buffer, nlen, 0); } PRINTF_DEBUG(("sprintf: appending \"%s\", pos=\n", add, *pos)); memcpy(ZSTR_VAL(*buffer) + (*pos), add, len); *pos += len; } /* }}} */ /* php_spintf_appendstring() {{{ */ inline static void php_sprintf_appendstring(zend_string **buffer, size_t *pos, char *add, size_t min_width, size_t max_width, char padding, size_t alignment, size_t len, bool neg, int expprec, int always_sign) { size_t npad; size_t req_size; size_t copy_len; size_t m_width; copy_len = (expprec ? MIN(max_width, len) : len); npad = (min_width < copy_len) ? 0 : min_width - copy_len; PRINTF_DEBUG(("sprintf: appendstring(%x, %d, %d, \"%s\", %d, '%c', %d)\n", *buffer, *pos, ZSTR_LEN(*buffer), add, min_width, padding, alignment)); m_width = MAX(min_width, copy_len); if(m_width > INT_MAX - *pos - 1) { zend_error_noreturn(E_ERROR, "Field width %zd is too long", m_width); } req_size = *pos + m_width + 1; if (req_size > ZSTR_LEN(*buffer)) { size_t size = ZSTR_LEN(*buffer); while (req_size > size) { if (size > ZEND_SIZE_MAX/2) { zend_error_noreturn(E_ERROR, "Field width %zd is too long", req_size); } size <<= 1; } PRINTF_DEBUG(("sprintf ereallocing buffer to %d bytes\n", size)); *buffer = zend_string_extend(*buffer, size, 0); } if (alignment == ALIGN_RIGHT) { if ((neg || always_sign) && padding=='0') { ZSTR_VAL(*buffer)[(*pos)++] = (neg) ? '-' : '+'; add++; len--; copy_len--; } while (npad-- > 0) { ZSTR_VAL(*buffer)[(*pos)++] = padding; } } PRINTF_DEBUG(("sprintf: appending \"%s\"\n", add)); memcpy(&ZSTR_VAL(*buffer)[*pos], add, copy_len + 1); *pos += copy_len; if (alignment == ALIGN_LEFT) { while (npad--) { ZSTR_VAL(*buffer)[(*pos)++] = padding; } } } /* }}} */ /* php_spintf_appendint() {{{ */ inline static void php_sprintf_appendint(zend_string **buffer, size_t *pos, zend_long number, size_t width, char padding, size_t alignment, int always_sign) { char numbuf[NUM_BUF_SIZE]; zend_ulong magn, nmagn; unsigned int i = NUM_BUF_SIZE - 1, neg = 0; PRINTF_DEBUG(("sprintf: appendint(%x, %x, %x, %d, %d, '%c', %d)\n", *buffer, pos, &ZSTR_LEN(*buffer), number, width, padding, alignment)); if (number < 0) { neg = 1; magn = ((zend_ulong) -(number + 1)) + 1; } else { magn = (zend_ulong) number; } /* Can't right-pad 0's on integers */ if(alignment==0 && padding=='0') padding=' '; numbuf[i] = '\0'; do { nmagn = magn / 10; numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0'; magn = nmagn; } while (magn > 0 && i > 1); if (neg) { numbuf[--i] = '-'; } else if (always_sign) { numbuf[--i] = '+'; } PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], i)); php_sprintf_appendstring(buffer, pos, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, neg, 0, always_sign); } /* }}} */ /* php_spintf_appenduint() {{{ */ inline static void php_sprintf_appenduint(zend_string **buffer, size_t *pos, zend_ulong number, size_t width, char padding, size_t alignment) { char numbuf[NUM_BUF_SIZE]; zend_ulong magn, nmagn; unsigned int i = NUM_BUF_SIZE - 1; PRINTF_DEBUG(("sprintf: appenduint(%x, %x, %x, %d, %d, '%c', %d)\n", *buffer, pos, &ZSTR_LEN(*buffer), number, width, padding, alignment)); magn = (zend_ulong) number; /* Can't right-pad 0's on integers */ if (alignment == 0 && padding == '0') padding = ' '; numbuf[i] = '\0'; do { nmagn = magn / 10; numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0'; magn = nmagn; } while (magn > 0 && i > 0); PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], i)); php_sprintf_appendstring(buffer, pos, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, /* neg */ false, 0, 0); } /* }}} */ /* php_spintf_appenddouble() {{{ */ inline static void php_sprintf_appenddouble(zend_string **buffer, size_t *pos, double number, size_t width, char padding, size_t alignment, int precision, int adjust, char fmt, int always_sign ) { char num_buf[NUM_BUF_SIZE]; char *s = NULL; size_t s_len = 0; bool is_negative = false; #ifdef ZTS struct lconv lconv; #else struct lconv *lconv; #endif PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n", *buffer, pos, &ZSTR_LEN(*buffer), number, width, padding, alignment, fmt)); if ((adjust & ADJ_PRECISION) == 0) { precision = FLOAT_PRECISION; } else if (precision > MAX_FLOAT_PRECISION) { php_error_docref(NULL, E_NOTICE, "Requested precision of %d digits was truncated to PHP maximum of %d digits", precision, MAX_FLOAT_PRECISION); precision = MAX_FLOAT_PRECISION; } if (zend_isnan(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, "NaN", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } if (zend_isinf(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, "INF", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } switch (fmt) { case 'e': case 'E': case 'f': case 'F': #ifdef ZTS localeconv_r(&lconv); #else lconv = localeconv(); #endif s = php_conv_fp((fmt == 'f')?'F':fmt, number, 0, precision, (fmt == 'f')?LCONV_DECIMAL_POINT:'.', &is_negative, &num_buf[1], &s_len); if (is_negative) { num_buf[0] = '-'; s = num_buf; s_len++; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; s_len++; } break; case 'g': case 'G': case 'h': case 'H': { if (precision == 0) precision = 1; char decimal_point = '.'; if (fmt == 'g' || fmt == 'G') { #ifdef ZTS localeconv_r(&lconv); #else lconv = localeconv(); #endif decimal_point = LCONV_DECIMAL_POINT; } char exp_char = fmt == 'G' || fmt == 'H' ? 'E' : 'e'; /* We use &num_buf[ 1 ], so that we have room for the sign. */ s = zend_gcvt(number, precision, decimal_point, exp_char, &num_buf[1]); is_negative = 0; if (*s == '-') { is_negative = 1; s = &num_buf[1]; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; } s_len = strlen(s); break; } } php_sprintf_appendstring(buffer, pos, s, width, 0, padding, alignment, s_len, is_negative, 0, always_sign); } /* }}} */ /* php_spintf_appendd2n() {{{ */ inline static void php_sprintf_append2n(zend_string **buffer, size_t *pos, zend_long number, size_t width, char padding, size_t alignment, int n, const char *chartable, int expprec) { char numbuf[NUM_BUF_SIZE]; zend_ulong num; zend_ulong i = NUM_BUF_SIZE - 1; int andbits = (1 << n) - 1; PRINTF_DEBUG(("sprintf: append2n(%x, %x, %x, %d, %d, '%c', %d, %d, %x)\n", *buffer, pos, &ZSTR_LEN(*buffer), number, width, padding, alignment, n, chartable)); PRINTF_DEBUG(("sprintf: append2n 2^%d andbits=%x\n", n, andbits)); num = (zend_ulong) number; numbuf[i] = '\0'; do { numbuf[--i] = chartable[(num & andbits)]; num >>= n; } while (num > 0); php_sprintf_appendstring(buffer, pos, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, /* neg */ false, expprec, 0); } /* }}} */ /* php_spintf_getnumber() {{{ */ inline static int php_sprintf_getnumber(char **buffer, size_t *len) { char *endptr; zend_long num = ZEND_STRTOL(*buffer, &endptr, 10); size_t i; if (endptr != NULL) { i = (endptr - *buffer); *len -= i; *buffer = endptr; } PRINTF_DEBUG(("sprintf_getnumber: number was %d bytes long\n", i)); if (num >= INT_MAX || num < 0) { return -1; } else { return (int) num; } } /* }}} */ #define ARG_NUM_NEXT -1 #define ARG_NUM_INVALID -2 int php_sprintf_get_argnum(char **format, size_t *format_len) { char *temppos = *format; while (isdigit((int) *temppos)) temppos++; if (*temppos != '$') { return ARG_NUM_NEXT; } int argnum = php_sprintf_getnumber(format, format_len); if (argnum <= 0) { zend_value_error("Argument number specifier must be greater than zero and less than %d", INT_MAX); return ARG_NUM_INVALID; } (*format)++; /* skip the '$' */ (*format_len)--; return argnum - 1; } /* php_formatted_print() {{{ * New sprintf implementation for PHP. * * Modifiers: * * " " pad integers with spaces * "-" left adjusted field * n field size * "."n precision (floats only) * "+" Always place a sign (+ or -) in front of a number * * Type specifiers: * * "%" literal "%", modifiers are ignored. * "b" integer argument is printed as binary * "c" integer argument is printed as a single character * "d" argument is an integer * "f" the argument is a float * "o" integer argument is printed as octal * "s" argument is a string * "x" integer argument is printed as lowercase hexadecimal * "X" integer argument is printed as uppercase hexadecimal * * nb_additional_parameters is used for throwing errors: * - -1: ValueError is thrown (for vsprintf where args originates from an array) * - 0 or more: ArgumentCountError is thrown */ static zend_string * php_formatted_print(char *format, size_t format_len, zval *args, int argc, int nb_additional_parameters) { size_t size = 240, outpos = 0; int alignment, currarg, adjusting, argnum, width, precision; char *temppos, padding; zend_string *result; int always_sign; int max_missing_argnum = -1; result = zend_string_alloc(size, 0); currarg = 0; argnum = 0; while (format_len) { int expprec; zval *tmp; temppos = memchr(format, '%', format_len); if (!temppos) { php_sprintf_appendchars(&result, &outpos, format, format_len); break; } else if (temppos != format) { php_sprintf_appendchars(&result, &outpos, format, temppos - format); format_len -= temppos - format; format = temppos; } format++; /* skip the '%' */ format_len--; if (*format == '%') { php_sprintf_appendchar(&result, &outpos, '%'); format++; format_len--; } else { /* starting a new format specifier, reset variables */ alignment = ALIGN_RIGHT; adjusting = 0; padding = ' '; always_sign = 0; expprec = 0; PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%d\n", *format, format - Z_STRVAL_P(z_format))); if (isalpha((int)*format)) { width = precision = 0; argnum = ARG_NUM_NEXT; } else { /* first look for argnum */ argnum = php_sprintf_get_argnum(&format, &format_len); if (argnum == ARG_NUM_INVALID) { goto fail; } /* after argnum comes modifiers */ PRINTF_DEBUG(("sprintf: looking for modifiers\n" "sprintf: now looking at '%c', inpos=%d\n", *format, format - Z_STRVAL_P(z_format))); for (;; format++, format_len--) { if (*format == ' ' || *format == '0') { padding = *format; } else if (*format == '-') { alignment = ALIGN_LEFT; /* space padding, the default */ } else if (*format == '+') { always_sign = 1; } else if (*format == '\'') { if (format_len > 1) { format++; format_len--; padding = *format; } else { zend_value_error("Missing padding character"); goto fail; } } else { PRINTF_DEBUG(("sprintf: end of modifiers\n")); break; } } PRINTF_DEBUG(("sprintf: padding='%c'\n", padding)); PRINTF_DEBUG(("sprintf: alignment=%s\n", (alignment == ALIGN_LEFT) ? "left" : "right")); /* after modifiers comes width */ if (*format == '*') { format++; format_len--; int width_argnum = php_sprintf_get_argnum(&format, &format_len); if (width_argnum == ARG_NUM_INVALID) { goto fail; } if (width_argnum == ARG_NUM_NEXT) { width_argnum = currarg++; } if (width_argnum >= argc) { max_missing_argnum = MAX(max_missing_argnum, width_argnum); continue; } tmp = &args[width_argnum]; ZVAL_DEREF(tmp); if (Z_TYPE_P(tmp) != IS_LONG) { zend_value_error("Width must be an integer"); goto fail; } if (Z_LVAL_P(tmp) < 0 || Z_LVAL_P(tmp) > INT_MAX) { zend_value_error("Width must be greater than zero and less than %d", INT_MAX); goto fail; } width = Z_LVAL_P(tmp); adjusting |= ADJ_WIDTH; } else if (isdigit((int)*format)) { PRINTF_DEBUG(("sprintf: getting width\n")); if ((width = php_sprintf_getnumber(&format, &format_len)) < 0) { zend_value_error("Width must be greater than zero and less than %d", INT_MAX); goto fail; } adjusting |= ADJ_WIDTH; } else { width = 0; } PRINTF_DEBUG(("sprintf: width=%d\n", width)); /* after width and argnum comes precision */ if (*format == '.') { format++; format_len--; PRINTF_DEBUG(("sprintf: getting precision\n")); if (*format == '*') { format++; format_len--; int prec_argnum = php_sprintf_get_argnum(&format, &format_len); if (prec_argnum == ARG_NUM_INVALID) { goto fail; } if (prec_argnum == ARG_NUM_NEXT) { prec_argnum = currarg++; } if (prec_argnum >= argc) { max_missing_argnum = MAX(max_missing_argnum, prec_argnum); continue; } tmp = &args[prec_argnum]; ZVAL_DEREF(tmp); if (Z_TYPE_P(tmp) != IS_LONG) { zend_value_error("Precision must be an integer"); goto fail; } if (Z_LVAL_P(tmp) < -1 || Z_LVAL_P(tmp) > INT_MAX) { zend_value_error("Precision must be between -1 and %d", INT_MAX); goto fail; } precision = Z_LVAL_P(tmp); adjusting |= ADJ_PRECISION; expprec = 1; } else if (isdigit((int)*format)) { if ((precision = php_sprintf_getnumber(&format, &format_len)) < 0) { zend_value_error("Precision must be greater than zero and less than %d", INT_MAX); goto fail; } adjusting |= ADJ_PRECISION; expprec = 1; } else { precision = 0; } } else { precision = 0; } PRINTF_DEBUG(("sprintf: precision=%d\n", precision)); } if (*format == 'l') { format++; format_len--; } PRINTF_DEBUG(("sprintf: format character='%c'\n", *format)); if (argnum == ARG_NUM_NEXT) { argnum = currarg++; } if (argnum >= argc) { max_missing_argnum = MAX(max_missing_argnum, argnum); continue; } if (expprec && precision == -1 && *format != 'g' && *format != 'G' && *format != 'h' && *format != 'H') { zend_value_error("Precision -1 is only supported for %%g, %%G, %%h and %%H"); goto fail; } /* now we expect to find a type specifier */ tmp = &args[argnum]; switch (*format) { case 's': { zend_string *t; zend_string *str = zval_get_tmp_string(tmp, &t); php_sprintf_appendstring(&result, &outpos, ZSTR_VAL(str), width, precision, padding, alignment, ZSTR_LEN(str), /* neg */ false, expprec, 0); zend_tmp_string_release(t); break; } case 'd': php_sprintf_appendint(&result, &outpos, zval_get_long(tmp), width, padding, alignment, always_sign); break; case 'u': php_sprintf_appenduint(&result, &outpos, zval_get_long(tmp), width, padding, alignment); break; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'h': case 'H': php_sprintf_appenddouble(&result, &outpos, zval_get_double(tmp), width, padding, alignment, precision, adjusting, *format, always_sign ); break; case 'c': php_sprintf_appendchar(&result, &outpos, (char) zval_get_long(tmp)); break; case 'o': php_sprintf_append2n(&result, &outpos, zval_get_long(tmp), width, padding, alignment, 3, hexchars, expprec); break; case 'x': php_sprintf_append2n(&result, &outpos, zval_get_long(tmp), width, padding, alignment, 4, hexchars, expprec); break; case 'X': php_sprintf_append2n(&result, &outpos, zval_get_long(tmp), width, padding, alignment, 4, HEXCHARS, expprec); break; case 'b': php_sprintf_append2n(&result, &outpos, zval_get_long(tmp), width, padding, alignment, 1, hexchars, expprec); break; case '%': php_sprintf_appendchar(&result, &outpos, '%'); break; case '\0': if (!format_len) { zend_value_error("Missing format specifier at end of string"); goto fail; } ZEND_FALLTHROUGH; default: zend_value_error("Unknown format specifier \"%c\"", *format); goto fail; } format++; format_len--; } } if (max_missing_argnum >= 0) { if (nb_additional_parameters == -1) { zend_value_error("The arguments array must contain %d items, %d given", max_missing_argnum + 1, argc); } else { zend_argument_count_error("%d arguments are required, %d given", max_missing_argnum + nb_additional_parameters + 1, argc + nb_additional_parameters); } goto fail; } /* possibly, we have to make sure we have room for the terminating null? */ ZSTR_VAL(result)[outpos]=0; ZSTR_LEN(result) = outpos; return result; fail: zend_string_efree(result); return NULL; } /* }}} */ /* php_formatted_print_get_array() {{{ */ static zval *php_formatted_print_get_array(zend_array *array, int *argc) { zval *args, *zv; int n; n = zend_hash_num_elements(array); args = (zval *)safe_emalloc(n, sizeof(zval), 0); n = 0; ZEND_HASH_FOREACH_VAL(array, zv) { ZVAL_COPY_VALUE(&args[n], zv); n++; } ZEND_HASH_FOREACH_END(); *argc = n; return args; } /* }}} */ /* {{{ Return a formatted string */ PHP_FUNCTION(sprintf) { zend_string *result; char *format; size_t format_len; zval *args; int argc; ZEND_PARSE_PARAMETERS_START(1, -1) Z_PARAM_STRING(format, format_len) Z_PARAM_VARIADIC('*', args, argc) ZEND_PARSE_PARAMETERS_END(); result = php_formatted_print(format, format_len, args, argc, 1); if (result == NULL) { RETURN_THROWS(); } RETVAL_STR(result); } /* }}} */ /* {{{ Return a formatted string */ PHP_FUNCTION(vsprintf) { zend_string *result; char *format; size_t format_len; zval *args; zend_array *array; int argc; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STRING(format, format_len) Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); args = php_formatted_print_get_array(array, &argc); result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { RETURN_THROWS(); } RETVAL_STR(result); } /* }}} */ /* {{{ Output a formatted string */ PHP_FUNCTION(printf) { zend_string *result; size_t rlen; char *format; size_t format_len; zval *args; int argc; ZEND_PARSE_PARAMETERS_START(1, -1) Z_PARAM_STRING(format, format_len) Z_PARAM_VARIADIC('*', args, argc) ZEND_PARSE_PARAMETERS_END(); result = php_formatted_print(format, format_len, args, argc, 1); if (result == NULL) { RETURN_THROWS(); } rlen = PHPWRITE(ZSTR_VAL(result), ZSTR_LEN(result)); zend_string_efree(result); RETURN_LONG(rlen); } /* }}} */ /* {{{ Output a formatted string */ PHP_FUNCTION(vprintf) { zend_string *result; size_t rlen; char *format; size_t format_len; zval *args; zend_array *array; int argc; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_STRING(format, format_len) Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); args = php_formatted_print_get_array(array, &argc); result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { RETURN_THROWS(); } rlen = PHPWRITE(ZSTR_VAL(result), ZSTR_LEN(result)); zend_string_efree(result); RETURN_LONG(rlen); } /* }}} */ /* {{{ Output a formatted string into a stream */ PHP_FUNCTION(fprintf) { php_stream *stream; char *format; size_t format_len; zval *arg1, *args; int argc; zend_string *result; ZEND_PARSE_PARAMETERS_START(2, -1) Z_PARAM_RESOURCE(arg1) Z_PARAM_STRING(format, format_len) Z_PARAM_VARIADIC('*', args, argc) ZEND_PARSE_PARAMETERS_END(); php_stream_from_zval(stream, arg1); result = php_formatted_print(format, format_len, args, argc, 2); if (result == NULL) { RETURN_THROWS(); } php_stream_write(stream, ZSTR_VAL(result), ZSTR_LEN(result)); RETVAL_LONG(ZSTR_LEN(result)); zend_string_efree(result); } /* }}} */ /* {{{ Output a formatted string into a stream */ PHP_FUNCTION(vfprintf) { php_stream *stream; char *format; size_t format_len; zval *arg1, *args; zend_array *array; int argc; zend_string *result; ZEND_PARSE_PARAMETERS_START(3, 3) Z_PARAM_RESOURCE(arg1) Z_PARAM_STRING(format, format_len) Z_PARAM_ARRAY_HT(array) ZEND_PARSE_PARAMETERS_END(); php_stream_from_zval(stream, arg1); args = php_formatted_print_get_array(array, &argc); result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { RETURN_THROWS(); } php_stream_write(stream, ZSTR_VAL(result), ZSTR_LEN(result)); RETVAL_LONG(ZSTR_LEN(result)); zend_string_efree(result); } /* }}} */
Close