240 size_t formatcount = 0;
241 int outputpos = 0, outputsize = 0;
250 formatcodes =
safe_emalloc(formatlen,
sizeof(*formatcodes), 0);
251 formatargs =
safe_emalloc(formatlen,
sizeof(*formatargs), 0);
255 for (i = 0; i < formatlen; formatcount++) {
256 char code = format[i++];
267 else if (c >=
'0' && c <=
'9') {
268 arg = atoi(&format[i]);
270 while (format[i] >=
'0' && format[i] <=
'9' && i < formatlen) {
277 switch ((
int) code) {
302 if (!try_convert_to_string(&argv[currentarg])) {
325#if SIZEOF_ZEND_LONG < 8
328 zend_value_error(
"64-bit format codes are not available for 32-bit versions of PHP");
373 formatcodes[formatcount] = code;
374 formatargs[formatcount] =
arg;
382 for (i = 0; i < formatcount; i++) {
383 int code = (int) formatcodes[i];
384 int arg = formatargs[i];
386 switch ((
int) code) {
420#if SIZEOF_ZEND_LONG > 4
455 if (outputsize < outputpos) {
456 outputsize = outputpos;
460 output = zend_string_alloc(outputsize, 0);
465 for (i = 0; i < formatcount; i++) {
466 int code = (int) formatcodes[i];
467 int arg = formatargs[i];
469 switch ((
int) code) {
473 size_t arg_cp = (code !=
'Z') ?
arg :
MAX(0,
arg - 1);
475 zend_string *str = zval_get_tmp_string(&argv[currentarg++], &tmp_str);
477 memset(&
ZSTR_VAL(output)[outputpos], (code ==
'a' || code ==
'Z') ?
'\0' :
' ',
arg);
482 zend_tmp_string_release(tmp_str);
488 int nibbleshift = (code ==
'h') ? 0 : 4;
491 zend_string *str = zval_get_tmp_string(&argv[currentarg++], &tmp_str);
503 if (
n >=
'0' &&
n <=
'9') {
505 }
else if (
n >=
'A' &&
n <=
'F') {
507 }
else if (
n >=
'a' &&
n <=
'f') {
520 ZSTR_VAL(output)[outputpos] |= (
n << nibbleshift);
521 nibbleshift = (nibbleshift + 4) & 7;
525 zend_tmp_string_release(tmp_str);
532 php_pack(&argv[currentarg++], 1, byte_map, &
ZSTR_VAL(output)[outputpos]);
541 int *map = machine_endian_short_map;
544 map = big_endian_short_map;
545 }
else if (code ==
'v') {
546 map = little_endian_short_map;
550 php_pack(&argv[currentarg++], 2, map, &
ZSTR_VAL(output)[outputpos]);
559 php_pack(&argv[currentarg++],
sizeof(
int), int_map, &
ZSTR_VAL(output)[outputpos]);
560 outputpos +=
sizeof(int);
568 int *map = machine_endian_long_map;
571 map = big_endian_long_map;
572 }
else if (code ==
'V') {
573 map = little_endian_long_map;
577 php_pack(&argv[currentarg++], 4, map, &
ZSTR_VAL(output)[outputpos]);
583#if SIZEOF_ZEND_LONG > 4
588 int *map = machine_endian_longlong_map;
591 map = big_endian_longlong_map;
592 }
else if (code ==
'P') {
593 map = little_endian_longlong_map;
597 php_pack(&argv[currentarg++], 8, map, &
ZSTR_VAL(output)[outputpos]);
606 float v = (float) zval_get_double(&argv[currentarg++]);
608 outputpos +=
sizeof(
v);
616 float v = (float) zval_get_double(&argv[currentarg++]);
617 php_pack_copy_float(1, &
ZSTR_VAL(output)[outputpos],
v);
618 outputpos +=
sizeof(
v);
626 float v = (float) zval_get_double(&argv[currentarg++]);
627 php_pack_copy_float(0, &
ZSTR_VAL(output)[outputpos],
v);
628 outputpos +=
sizeof(
v);
635 double v = (double) zval_get_double(&argv[currentarg++]);
637 outputpos +=
sizeof(
v);
645 double v = (double) zval_get_double(&argv[currentarg++]);
646 php_pack_copy_double(1, &
ZSTR_VAL(output)[outputpos],
v);
647 outputpos +=
sizeof(
v);
655 double v = (double) zval_get_double(&argv[currentarg++]);
656 php_pack_copy_double(0, &
ZSTR_VAL(output)[outputpos],
v);
657 outputpos +=
sizeof(
v);
676 if (
arg > outputpos) {
708 char *format, *input;
738 while (formatlen-- > 0) {
739 char type = *(format++);
741 int repetitions = 1, argb;
750 if (c >=
'0' && c <=
'9') {
752 long tmp = strtol(format,
NULL, 10);
762 while (formatlen > 0 && *format >=
'0' && *format <=
'9') {
766 }
else if (c ==
'*') {
777 while (formatlen > 0 && *format !=
'/') {
787 switch ((
int)
type) {
791 if (repetitions < 0) {
810 size = (repetitions > 0) ? ((
unsigned int) repetitions + 1) / 2 : repetitions;
848#if SIZEOF_ZEND_LONG > 4
852 zend_value_error(
"64-bit format codes are not available for 32-bit versions of PHP");
860 size =
sizeof(float);
867 size =
sizeof(double);
877 for (i = 0; i != repetitions; i++ ) {
885 if ((inputpos +
size) <= inputlen) {
890 if (repetitions == 1 &&
namelen > 0) {
897 char *
res = zend_print_ulong_to_buf(
buf +
sizeof(
buf) - 1, i+1);
898 size_t digits =
buf +
sizeof(
buf) - 1 -
res;
902 switch ((
int)
type) {
920 char padn =
'\0';
char pads =
' ';
char padt =
'\t';
char padc =
'\r';
char padl =
'\n';
932 if (input[inputpos +
len] != padn
933 && input[inputpos +
len] != pads
934 && input[inputpos +
len] != padt
935 && input[inputpos +
len] != padc
936 && input[inputpos +
len] != padl
950 len = inputlen - inputpos;
960 for (
s=0 ;
s <
len ;
s++) {
961 if (input[inputpos +
s] == pad)
975 int nibbleshift = (
type ==
'h') ? 0 : 4;
982 zend_string_release(real_name);
992 if (
len > 0 && argb > 0) {
996 buf = zend_string_alloc(
len, 0);
998 for (ipos = opos = 0; opos <
len; opos++) {
999 char cc = (input[inputpos + ipos] >> nibbleshift) & 0xf;
1008 nibbleshift = (nibbleshift + 4) & 7;
1025 uint8_t x = input[inputpos];
1038 uint16_t x = *((unaligned_uint16_t*) &input[inputpos]);
1043 v = php_pack_reverse_int16(x);
1057 int x = *((unaligned_int*) &input[inputpos]);
1060 unsigned int x = *((unaligned_uint*) &input[inputpos]);
1074 uint32_t x = *((unaligned_uint32_t*) &input[inputpos]);
1079 v = php_pack_reverse_int32(x);
1090#if SIZEOF_ZEND_LONG > 4
1096 uint64_t x = *((unaligned_uint64_t*) &input[inputpos]);
1101 v = php_pack_reverse_int64(x);
1119 v = php_pack_parse_float(1, &input[inputpos]);
1120 }
else if (
type ==
'G') {
1121 v = php_pack_parse_float(0, &input[inputpos]);
1123 memcpy(&
v, &input[inputpos],
sizeof(
float));
1138 v = php_pack_parse_double(1, &input[inputpos]);
1139 }
else if (
type ==
'E') {
1140 v = php_pack_parse_double(0, &input[inputpos]);
1142 memcpy(&
v, &input[inputpos],
sizeof(
double));
1155 if (inputpos <
size) {
1157 i = repetitions - 1;
1159 if (repetitions >= 0) {
1166 if (repetitions <= inputlen) {
1167 inputpos = repetitions;
1172 i = repetitions - 1;
1176 zend_string_release(real_name);
1185 }
else if (repetitions < 0) {
1195 if (formatlen > 0) {
1212 for (i = 0; i < (int)
sizeof(int); i++) {
1216 machine_endian_short_map[0] = 0;
1217 machine_endian_short_map[1] = 1;
1218 big_endian_short_map[0] = 1;
1219 big_endian_short_map[1] = 0;
1220 little_endian_short_map[0] = 0;
1221 little_endian_short_map[1] = 1;
1223 machine_endian_long_map[0] = 0;
1224 machine_endian_long_map[1] = 1;
1225 machine_endian_long_map[2] = 2;
1226 machine_endian_long_map[3] = 3;
1227 big_endian_long_map[0] = 3;
1228 big_endian_long_map[1] = 2;
1229 big_endian_long_map[2] = 1;
1230 big_endian_long_map[3] = 0;
1231 little_endian_long_map[0] = 0;
1232 little_endian_long_map[1] = 1;
1233 little_endian_long_map[2] = 2;
1234 little_endian_long_map[3] = 3;
1236#if SIZEOF_ZEND_LONG > 4
1237 machine_endian_longlong_map[0] = 0;
1238 machine_endian_longlong_map[1] = 1;
1239 machine_endian_longlong_map[2] = 2;
1240 machine_endian_longlong_map[3] = 3;
1241 machine_endian_longlong_map[4] = 4;
1242 machine_endian_longlong_map[5] = 5;
1243 machine_endian_longlong_map[6] = 6;
1244 machine_endian_longlong_map[7] = 7;
1245 big_endian_longlong_map[0] = 7;
1246 big_endian_longlong_map[1] = 6;
1247 big_endian_longlong_map[2] = 5;
1248 big_endian_longlong_map[3] = 4;
1249 big_endian_longlong_map[4] = 3;
1250 big_endian_longlong_map[5] = 2;
1251 big_endian_longlong_map[6] = 1;
1252 big_endian_longlong_map[7] = 0;
1253 little_endian_longlong_map[0] = 0;
1254 little_endian_longlong_map[1] = 1;
1255 little_endian_longlong_map[2] = 2;
1256 little_endian_longlong_map[3] = 3;
1257 little_endian_longlong_map[4] = 4;
1258 little_endian_longlong_map[5] = 5;
1259 little_endian_longlong_map[6] = 6;
1260 little_endian_longlong_map[7] = 7;
1269 byte_map[0] =
size - 1;
1271 for (i = 0; i < (int)
sizeof(int); i++) {
1272 int_map[i] =
size - (
sizeof(int) - i);
1275 machine_endian_short_map[0] =
size - 2;
1276 machine_endian_short_map[1] =
size - 1;
1277 big_endian_short_map[0] =
size - 2;
1278 big_endian_short_map[1] =
size - 1;
1279 little_endian_short_map[0] =
size - 1;
1280 little_endian_short_map[1] =
size - 2;
1282 machine_endian_long_map[0] =
size - 4;
1283 machine_endian_long_map[1] =
size - 3;
1284 machine_endian_long_map[2] =
size - 2;
1285 machine_endian_long_map[3] =
size - 1;
1286 big_endian_long_map[0] =
size - 4;
1287 big_endian_long_map[1] =
size - 3;
1288 big_endian_long_map[2] =
size - 2;
1289 big_endian_long_map[3] =
size - 1;
1290 little_endian_long_map[0] =
size - 1;
1291 little_endian_long_map[1] =
size - 2;
1292 little_endian_long_map[2] =
size - 3;
1293 little_endian_long_map[3] =
size - 4;
1295#if SIZEOF_ZEND_LONG > 4
1296 machine_endian_longlong_map[0] =
size - 8;
1297 machine_endian_longlong_map[1] =
size - 7;
1298 machine_endian_longlong_map[2] =
size - 6;
1299 machine_endian_longlong_map[3] =
size - 5;
1300 machine_endian_longlong_map[4] =
size - 4;
1301 machine_endian_longlong_map[5] =
size - 3;
1302 machine_endian_longlong_map[6] =
size - 2;
1303 machine_endian_longlong_map[7] =
size - 1;
1304 big_endian_longlong_map[0] =
size - 8;
1305 big_endian_longlong_map[1] =
size - 7;
1306 big_endian_longlong_map[2] =
size - 6;
1307 big_endian_longlong_map[3] =
size - 5;
1308 big_endian_longlong_map[4] =
size - 4;
1309 big_endian_longlong_map[5] =
size - 3;
1310 big_endian_longlong_map[6] =
size - 2;
1311 big_endian_longlong_map[7] =
size - 1;
1312 little_endian_longlong_map[0] =
size - 1;
1313 little_endian_longlong_map[1] =
size - 2;
1314 little_endian_longlong_map[2] =
size - 3;
1315 little_endian_longlong_map[3] =
size - 4;
1316 little_endian_longlong_map[4] =
size - 5;
1317 little_endian_longlong_map[5] =
size - 6;
1318 little_endian_longlong_map[6] =
size - 7;
1319 little_endian_longlong_map[7] =
size - 8;
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)