com php-src: Merge branch 'PHP-5.6': ext/standard/pack.c
| From: | Tjerk Anne Meesters | Date: | Thu, 09 Oct 2014 23:05:36 +0000 |
| Subject: | com php-src: Merge branch 'PHP-5.6': ext/standard/pack.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-82232@lists.php.net to get a copy of this message | ||
Commit: 284358b317d3066be12552bdc0ab7e0c032f6e29
Author: Tjerk Meesters <datibbaw@php.net> Fri, 10 Oct 2014 07:05:36 +0800
Parents: 2c434470a6d9ea1dbab744da0b5269bb649d2ee2 30f8a9bafff21410aa849447eb386be7a98526d6
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=284358b317d3066be12552bdc0ab7e0c032f6e29
Log:
Merge branch 'PHP-5.6'
* PHP-5.6:
Add 64 bit formats to pack() and unpack()
Changed paths:
MM ext/standard/pack.c
Diff:
diff --cc ext/standard/pack.c
index f2bcb09,9427db9..a690b7b
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@@ -82,9 -82,16 +82,16 @@@ static int machine_endian_long_map[4]
static int big_endian_long_map[4];
static int little_endian_long_map[4];
+ #if SIZEOF_LONG > 4
+ /* Mappings of bytes from quads (64bit) for all endian environments */
+ static int machine_endian_longlong_map[8];
+ static int big_endian_longlong_map[8];
+ static int little_endian_longlong_map[8];
+ #endif
+
/* {{{ php_pack
*/
-static void php_pack(zval **val, int size, int *map, char *output)
+static void php_pack(zval *val, size_t size, int *map, char *output)
{
int i;
char *v;
@@@ -430,9 -464,34 +457,30 @@@ PHP_FUNCTION(pack
break;
}
+ #if SIZEOF_LONG > 4
+ case 'q':
+ case 'Q':
+ case 'J':
+ case 'P': {
+ int *map = machine_endian_longlong_map;
+
+ if (code == 'J') {
+ map = big_endian_longlong_map;
+ } else if (code == 'P') {
+ map = little_endian_longlong_map;
+ }
+
+ while (arg-- > 0) {
+ php_pack(argv[currentarg++], 8, map, &output[outputpos]);
+ outputpos += 8;
+ }
+ break;
+ }
+ #endif
+
case 'f': {
- float v;
-
while (arg-- > 0) {
- val = argv[currentarg++];
- convert_to_double_ex(val);
- v = (float) Z_DVAL_PP(val);
+ float v = (float) zval_get_double(&argv[currentarg++]);
memcpy(&output[outputpos], &v, sizeof(v));
outputpos += sizeof(v);
}