|
version 1.1.1.1, 2012/02/21 23:48:02
|
version 1.1.1.5, 2014/06/15 20:03:57
|
|
Line 2
|
Line 2
|
| +----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| | PHP Version 5 | |
| PHP Version 5 | |
| +----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| | Copyright (c) 1997-2012 The PHP Group | | | Copyright (c) 1997-2014 The PHP Group | |
| +----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| | This source file is subject to version 3.01 of the PHP license, | |
| 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 | |
| that is bundled with this package in the file LICENSE, and is | |
|
Line 39
|
Line 39
|
| #include <sys/param.h> |
#include <sys/param.h> |
| #endif |
#endif |
| #include "ext/standard/head.h" |
#include "ext/standard/head.h" |
| #include "safe_mode.h" |
|
| #include "php_string.h" |
#include "php_string.h" |
| #include "pack.h" |
#include "pack.h" |
| #if HAVE_PWD_H |
#if HAVE_PWD_H |
|
Line 70 char machine_little_endian;
|
Line 69 char machine_little_endian;
|
| /* Mapping of byte from char (8bit) to long for machine endian */ |
/* Mapping of byte from char (8bit) to long for machine endian */ |
| static int byte_map[1]; |
static int byte_map[1]; |
| |
|
| /* Mappings of bytes from int (machine dependant) to int for machine endian */ | /* Mappings of bytes from int (machine dependent) to int for machine endian */ |
| static int int_map[sizeof(int)]; |
static int int_map[sizeof(int)]; |
| |
|
| /* Mappings of bytes from shorts (16bit) for all endian environments */ |
/* Mappings of bytes from shorts (16bit) for all endian environments */ |
|
Line 504 static long php_unpack(char *data, int size, int issig
|
Line 503 static long php_unpack(char *data, int size, int issig
|
| |
|
| /* unpack() is based on Perl's unpack(), but is modified a bit from there. |
/* unpack() is based on Perl's unpack(), but is modified a bit from there. |
| * Rather than depending on error-prone ordered lists or syntactically |
* Rather than depending on error-prone ordered lists or syntactically |
| * unpleasant pass-by-reference, we return an object with named paramters | * unpleasant pass-by-reference, we return an object with named parameters |
| * (like *_fetch_object()). Syntax is "f[repeat]name/...", where "f" is the |
* (like *_fetch_object()). Syntax is "f[repeat]name/...", where "f" is the |
| * formatter char (like pack()), "[repeat]" is the optional repeater argument, |
* formatter char (like pack()), "[repeat]" is the optional repeater argument, |
| * and "name" is the name of the variable to use. |
* and "name" is the name of the variable to use. |
|
Line 759 PHP_FUNCTION(unpack)
|
Line 758 PHP_FUNCTION(unpack)
|
| |
|
| case 'i': |
case 'i': |
| case 'I': { |
case 'I': { |
| long v = 0; | long v; |
| int issigned = 0; |
int issigned = 0; |
| |
|
| if (type == 'i') { |
if (type == 'i') { |
| issigned = input[inputpos + (machine_little_endian ? (sizeof(int) - 1) : 0)] & 0x80; |
issigned = input[inputpos + (machine_little_endian ? (sizeof(int) - 1) : 0)] & 0x80; |
| } else if (sizeof(long) > 4 && (input[inputpos + machine_endian_long_map[3]] & 0x80) == 0x80) { |
|
| v = ~INT_MAX; |
|
| } |
} |
| |
|
| v |= php_unpack(&input[inputpos], sizeof(int), issigned, int_map); | v = php_unpack(&input[inputpos], sizeof(int), issigned, int_map); |
| add_assoc_long(return_value, n, v); |
add_assoc_long(return_value, n, v); |
| break; |
break; |
| } |
} |