3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * He still hopefully carried some of his gear in his pack: a small tinder-box,
13 * two small shallow pans, the smaller fitting into the larger; inside them a
14 * wooden spoon, a short two-pronged fork and some skewers were stowed; and
15 * hidden at the bottom of the pack in a flat wooden box a dwindling treasure,
19 /* This file contains pp ("push/pop") functions that
20 * execute the opcodes that make up a perl program. A typical pp function
21 * expects to find its arguments on the stack, and usually pushes its
22 * results onto the stack, hence the 'pp' terminology. Each OP structure
23 * contains a pointer to the relevant pp_foo() function.
25 * This particular file just contains pp_pack() and pp_unpack(). See the
26 * other pp*.c files for the rest of the pp_ functions.
31 #define PERL_IN_PP_PACK_C
35 * Offset for integer pack/unpack.
37 * On architectures where I16 and I32 aren't really 16 and 32 bits,
38 * which for now are all Crays, pack and unpack have to play games.
42 * These values are required for portability of pack() output.
43 * If they're not right on your machine, then pack() and unpack()
44 * wouldn't work right anyway; you'll need to apply the Cray hack.
45 * (I'd like to check them with #if, but you can't use sizeof() in
46 * the preprocessor.) --???
49 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
50 defines are now in config.h. --Andy Dougherty April 1998
55 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
58 #if U16SIZE > SIZE16 || U32SIZE > SIZE32
59 # if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 /* little-endian */
60 # define OFF16(p) (char*)(p)
61 # define OFF32(p) (char*)(p)
63 # if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 /* big-endian */
64 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
65 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
67 }}}} bad cray byte order
70 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
71 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
72 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
73 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
74 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
76 # define COPY16(s,p) Copy(s, p, SIZE16, char)
77 # define COPY32(s,p) Copy(s, p, SIZE32, char)
78 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
79 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
80 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
83 /* Avoid stack overflow due to pathological templates. 100 should be plenty. */
84 #define MAX_SUB_TEMPLATE_LEVEL 100
86 /* flags (note that type modifiers can also be used as flags!) */
87 #define FLAG_UNPACK_ONLY_ONE 0x10
88 #define FLAG_UNPACK_DO_UTF8 0x08
89 #define FLAG_SLASH 0x04
90 #define FLAG_COMMA 0x02
91 #define FLAG_PACK 0x01
94 S_mul128(pTHX_ SV *sv, U8 m)
97 char *s = SvPV(sv, len);
101 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
102 SV *tmpNew = newSVpvn("0000000000", 10);
104 sv_catsv(tmpNew, sv);
105 SvREFCNT_dec(sv); /* free old sv */
110 while (!*t) /* trailing '\0'? */
113 i = ((*t - '0') << 7) + m;
114 *(t--) = '0' + (char)(i % 10);
120 /* Explosives and implosives. */
122 #if 'I' == 73 && 'J' == 74
123 /* On an ASCII/ISO kind of system */
124 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
127 Some other sort of character set - use memchr() so we don't match
130 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
134 #define TYPE_IS_SHRIEKING 0x100
135 #define TYPE_IS_BIG_ENDIAN 0x200
136 #define TYPE_IS_LITTLE_ENDIAN 0x400
137 #define TYPE_ENDIANNESS_MASK (TYPE_IS_BIG_ENDIAN|TYPE_IS_LITTLE_ENDIAN)
138 #define TYPE_ENDIANNESS(t) ((t) & TYPE_ENDIANNESS_MASK)
139 #define TYPE_NO_ENDIANNESS(t) ((t) & ~TYPE_ENDIANNESS_MASK)
140 #define TYPE_MODIFIERS(t) ((t) & ~0xFF)
141 #define TYPE_NO_MODIFIERS(t) ((t) & 0xFF)
143 #define ENDIANNESS_ALLOWED_TYPES "sSiIlLqQjJfFdDpP("
145 #define DO_BO_UNPACK(var, type) \
147 switch (TYPE_ENDIANNESS(datumtype)) { \
148 case TYPE_IS_BIG_ENDIAN: var = my_betoh ## type (var); break; \
149 case TYPE_IS_LITTLE_ENDIAN: var = my_letoh ## type (var); break; \
154 #define DO_BO_PACK(var, type) \
156 switch (TYPE_ENDIANNESS(datumtype)) { \
157 case TYPE_IS_BIG_ENDIAN: var = my_htobe ## type (var); break; \
158 case TYPE_IS_LITTLE_ENDIAN: var = my_htole ## type (var); break; \
163 #define DO_BO_UNPACK_PTR(var, type, pre_cast) \
165 switch (TYPE_ENDIANNESS(datumtype)) { \
166 case TYPE_IS_BIG_ENDIAN: \
167 var = (void *) my_betoh ## type ((pre_cast) var); \
169 case TYPE_IS_LITTLE_ENDIAN: \
170 var = (void *) my_letoh ## type ((pre_cast) var); \
177 #define DO_BO_PACK_PTR(var, type, pre_cast) \
179 switch (TYPE_ENDIANNESS(datumtype)) { \
180 case TYPE_IS_BIG_ENDIAN: \
181 var = (void *) my_htobe ## type ((pre_cast) var); \
183 case TYPE_IS_LITTLE_ENDIAN: \
184 var = (void *) my_htole ## type ((pre_cast) var); \
191 #define BO_CANT_DOIT(action, type) \
193 switch (TYPE_ENDIANNESS(datumtype)) { \
194 case TYPE_IS_BIG_ENDIAN: \
195 Perl_croak(aTHX_ "Can't %s big-endian %ss on this " \
196 "platform", #action, #type); \
198 case TYPE_IS_LITTLE_ENDIAN: \
199 Perl_croak(aTHX_ "Can't %s little-endian %ss on this " \
200 "platform", #action, #type); \
207 #if PTRSIZE == INTSIZE
208 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, i, int)
209 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, i, int)
210 #elif PTRSIZE == LONGSIZE
211 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, l, long)
212 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, l, long)
214 # define DO_BO_UNPACK_P(var) BO_CANT_DOIT(unpack, pointer)
215 # define DO_BO_PACK_P(var) BO_CANT_DOIT(pack, pointer)
218 #if defined(my_htolen) && defined(my_letohn) && \
219 defined(my_htoben) && defined(my_betohn)
220 # define DO_BO_UNPACK_N(var, type) \
222 switch (TYPE_ENDIANNESS(datumtype)) { \
223 case TYPE_IS_BIG_ENDIAN: my_betohn(&var, sizeof(type)); break;\
224 case TYPE_IS_LITTLE_ENDIAN: my_letohn(&var, sizeof(type)); break;\
229 # define DO_BO_PACK_N(var, type) \
231 switch (TYPE_ENDIANNESS(datumtype)) { \
232 case TYPE_IS_BIG_ENDIAN: my_htoben(&var, sizeof(type)); break;\
233 case TYPE_IS_LITTLE_ENDIAN: my_htolen(&var, sizeof(type)); break;\
238 # define DO_BO_UNPACK_N(var, type) BO_CANT_DOIT(unpack, type)
239 # define DO_BO_PACK_N(var, type) BO_CANT_DOIT(pack, type)
242 #define PACK_SIZE_CANNOT_CSUM 0x80
243 #define PACK_SIZE_CANNOT_ONLY_ONE 0x40
244 #define PACK_SIZE_MASK 0x3F
253 #define PACK_SIZE_NORMAL 0
254 #define PACK_SIZE_SHRIEKING 1
256 /* These tables are regenerated by genpacksizetables.pl (and then hand pasted
257 in). You're unlikely ever to need to regenerate them. */
260 unsigned char size_normal[53] = {
261 /* C */ sizeof(unsigned char),
262 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
263 /* D */ LONG_DOUBLESIZE,
270 /* I */ sizeof(unsigned int),
277 #if defined(HAS_QUAD)
278 /* Q */ sizeof(Uquad_t),
285 /* U */ sizeof(char),
287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
288 /* c */ sizeof(char),
289 /* d */ sizeof(double),
291 /* f */ sizeof(float),
300 /* p */ sizeof(char *) | PACK_SIZE_CANNOT_ONLY_ONE | PACK_SIZE_CANNOT_CSUM,
301 #if defined(HAS_QUAD)
302 /* q */ sizeof(Quad_t),
310 /* w */ sizeof(char) | PACK_SIZE_CANNOT_CSUM
312 unsigned char size_shrieking[46] = {
313 /* I */ sizeof(unsigned int),
315 /* L */ sizeof(unsigned long),
319 /* S */ sizeof(unsigned short),
322 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
325 /* l */ sizeof(long),
329 /* s */ sizeof(short),
333 struct packsize_t packsize[2] = {
334 {size_normal, 67, 53},
335 {size_shrieking, 73, 46}
338 /* EBCDIC (or bust) */
339 unsigned char size_normal[99] = {
340 /* c */ sizeof(char),
341 /* d */ sizeof(double),
343 /* f */ sizeof(float),
353 /* p */ sizeof(char *) | PACK_SIZE_CANNOT_ONLY_ONE | PACK_SIZE_CANNOT_CSUM,
354 #if defined(HAS_QUAD)
355 /* q */ sizeof(Quad_t),
359 0, 0, 0, 0, 0, 0, 0, 0, 0,
363 /* w */ sizeof(char) | PACK_SIZE_CANNOT_CSUM,
364 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
366 /* C */ sizeof(unsigned char),
367 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
368 /* D */ LONG_DOUBLESIZE,
375 /* I */ sizeof(unsigned int),
383 #if defined(HAS_QUAD)
384 /* Q */ sizeof(Uquad_t),
388 0, 0, 0, 0, 0, 0, 0, 0, 0,
391 /* U */ sizeof(char),
394 unsigned char size_shrieking[93] = {
396 0, 0, 0, 0, 0, 0, 0, 0, 0,
397 /* l */ sizeof(long),
400 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
401 /* s */ sizeof(short),
404 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
405 0, 0, 0, 0, 0, 0, 0, 0, 0,
406 /* I */ sizeof(unsigned int),
407 0, 0, 0, 0, 0, 0, 0, 0, 0,
408 /* L */ sizeof(unsigned long),
411 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
412 /* S */ sizeof(unsigned short),
416 struct packsize_t packsize[2] = {
417 {size_normal, 131, 99},
418 {size_shrieking, 137, 93}
423 /* Returns the sizeof() struct described by pat */
425 S_measure_struct(pTHX_ register tempsym_t* symptr)
427 register I32 len = 0;
428 register I32 total = 0;
433 while (next_symbol(symptr)) {
434 int which = (symptr->code & TYPE_IS_SHRIEKING)
435 ? PACK_SIZE_SHRIEKING : PACK_SIZE_NORMAL;
437 = TYPE_NO_MODIFIERS(symptr->code) - packsize[which].first;
439 switch( symptr->howlen ){
442 len = symptr->length;
445 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
446 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
450 if ((offset >= 0) && (offset < packsize[which].size))
451 size = packsize[which].array[offset] & PACK_SIZE_MASK;
456 /* endianness doesn't influence the size of a type */
457 switch(TYPE_NO_ENDIANNESS(symptr->code)) {
459 Perl_croak(aTHX_ "Invalid type '%c' in %s",
460 (int)TYPE_NO_MODIFIERS(symptr->code),
461 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
464 case 'U': /* XXXX Is it correct? */
467 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
469 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
475 tempsym_t savsym = *symptr;
476 symptr->patptr = savsym.grpbeg;
477 symptr->patend = savsym.grpend;
478 /* XXXX Theoretically, we need to measure many times at
479 different positions, since the subexpression may contain
480 alignment commands, but be not of aligned length.
481 Need to detect this and croak(). */
482 size = measure_struct(symptr);
486 case 'X' | TYPE_IS_SHRIEKING:
487 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS.
489 if (!len) /* Avoid division by 0 */
491 len = total % len; /* Assumed: the start is aligned. */
496 Perl_croak(aTHX_ "'X' outside of string in %s",
497 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
499 case 'x' | TYPE_IS_SHRIEKING:
500 if (!len) /* Avoid division by 0 */
502 star = total % len; /* Assumed: the start is aligned. */
503 if (star) /* Other portable ways? */
529 size = sizeof(char*);
539 /* locate matching closing parenthesis or bracket
540 * returns char pointer to char after match, or NULL
543 S_group_end(pTHX_ register char *patptr, register char *patend, char ender)
545 while (patptr < patend) {
553 while (patptr < patend && *patptr != '\n')
557 patptr = group_end(patptr, patend, ')') + 1;
559 patptr = group_end(patptr, patend, ']') + 1;
561 Perl_croak(aTHX_ "No group ending character '%c' found in template",
567 /* Convert unsigned decimal number to binary.
568 * Expects a pointer to the first digit and address of length variable
569 * Advances char pointer to 1st non-digit char and returns number
572 S_get_num(pTHX_ register char *patptr, I32 *lenptr )
574 I32 len = *patptr++ - '0';
575 while (isDIGIT(*patptr)) {
576 if (len >= 0x7FFFFFFF/10)
577 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
578 len = (len * 10) + (*patptr++ - '0');
584 /* The marvellous template parsing routine: Using state stored in *symptr,
585 * locates next template code and count
588 S_next_symbol(pTHX_ register tempsym_t* symptr )
590 register char* patptr = symptr->patptr;
591 register char* patend = symptr->patend;
593 symptr->flags &= ~FLAG_SLASH;
595 while (patptr < patend) {
596 if (isSPACE(*patptr))
598 else if (*patptr == '#') {
600 while (patptr < patend && *patptr != '\n')
605 /* We should have found a template code */
606 I32 code = *patptr++ & 0xFF;
607 U32 inherited_modifiers = 0;
609 if (code == ','){ /* grandfather in commas but with a warning */
610 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
611 symptr->flags |= FLAG_COMMA;
612 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
613 "Invalid type ',' in %s",
614 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
619 /* for '(', skip to ')' */
621 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
622 Perl_croak(aTHX_ "()-group starts with a count in %s",
623 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
624 symptr->grpbeg = patptr;
625 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
626 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
627 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
628 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
631 /* look for group modifiers to inherit */
632 if (TYPE_ENDIANNESS(symptr->flags)) {
633 if (strchr(ENDIANNESS_ALLOWED_TYPES, TYPE_NO_MODIFIERS(code)))
634 inherited_modifiers |= TYPE_ENDIANNESS(symptr->flags);
637 /* look for modifiers */
638 while (patptr < patend) {
643 modifier = TYPE_IS_SHRIEKING;
644 allowed = "sSiIlLxXnNvV";
647 modifier = TYPE_IS_BIG_ENDIAN;
648 allowed = ENDIANNESS_ALLOWED_TYPES;
651 modifier = TYPE_IS_LITTLE_ENDIAN;
652 allowed = ENDIANNESS_ALLOWED_TYPES;
661 if (!strchr(allowed, TYPE_NO_MODIFIERS(code)))
662 Perl_croak(aTHX_ "'%c' allowed only after types %s in %s", *patptr,
663 allowed, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
665 if (TYPE_ENDIANNESS(code | modifier) == TYPE_ENDIANNESS_MASK)
666 Perl_croak(aTHX_ "Can't use both '<' and '>' after type '%c' in %s",
667 (int) TYPE_NO_MODIFIERS(code),
668 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
669 else if (TYPE_ENDIANNESS(code | modifier | inherited_modifiers) ==
670 TYPE_ENDIANNESS_MASK)
671 Perl_croak(aTHX_ "Can't use '%c' in a group with different byte-order in %s",
672 *patptr, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
674 if (ckWARN(WARN_UNPACK)) {
676 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
677 "Duplicate modifier '%c' after '%c' in %s",
678 *patptr, (int) TYPE_NO_MODIFIERS(code),
679 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
686 /* inherit modifiers */
687 code |= inherited_modifiers;
689 /* look for count and/or / */
690 if (patptr < patend) {
691 if (isDIGIT(*patptr)) {
692 patptr = get_num( patptr, &symptr->length );
693 symptr->howlen = e_number;
695 } else if (*patptr == '*') {
697 symptr->howlen = e_star;
699 } else if (*patptr == '[') {
700 char* lenptr = ++patptr;
701 symptr->howlen = e_number;
702 patptr = group_end( patptr, patend, ']' ) + 1;
703 /* what kind of [] is it? */
704 if (isDIGIT(*lenptr)) {
705 lenptr = get_num( lenptr, &symptr->length );
707 Perl_croak(aTHX_ "Malformed integer in [] in %s",
708 symptr->flags & FLAG_PACK ? "pack" : "unpack");
710 tempsym_t savsym = *symptr;
711 symptr->patend = patptr-1;
712 symptr->patptr = lenptr;
713 savsym.length = measure_struct(symptr);
717 symptr->howlen = e_no_len;
722 while (patptr < patend) {
723 if (isSPACE(*patptr))
725 else if (*patptr == '#') {
727 while (patptr < patend && *patptr != '\n')
732 if (*patptr == '/') {
733 symptr->flags |= FLAG_SLASH;
735 if (patptr < patend &&
736 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '['))
737 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
738 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
744 /* at end - no count, no / */
745 symptr->howlen = e_no_len;
750 symptr->patptr = patptr;
754 symptr->patptr = patptr;
759 =for apidoc unpack_str
761 The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
762 and ocnt are not used. This call should not be used, use unpackstring instead.
767 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
769 tempsym_t sym = { 0 };
774 return unpack_rec(&sym, s, s, strend, NULL );
778 =for apidoc unpackstring
780 The engine implementing unpack() Perl function. C<unpackstring> puts the
781 extracted list items on the stack and returns the number of elements.
782 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
787 Perl_unpackstring(pTHX_ char *pat, register char *patend, register char *s, char *strend, U32 flags)
789 tempsym_t sym = { 0 };
794 return unpack_rec(&sym, s, s, strend, NULL );
799 S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, char *strend, char **new_s )
803 register I32 len = 0;
804 register I32 bits = 0;
807 I32 start_sp_offset = SP - PL_stack_base;
810 /* These must not be in registers: */
819 #if SHORTSIZE != SIZE16
821 unsigned short aushort;
826 #if LONGSIZE != SIZE32
827 unsigned long aulong;
832 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
833 long double aldouble;
842 const int bits_in_uv = 8 * sizeof(cuv);
845 bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
847 while (next_symbol(symptr)) {
848 datumtype = symptr->code;
849 /* do first one only unless in list context
850 / is implemented by unpacking the count, then poping it from the
851 stack, so must check that we're not in the middle of a / */
853 && (SP - PL_stack_base == start_sp_offset + 1)
854 && (datumtype != '/') ) /* XXX can this be omitted */
857 switch( howlen = symptr->howlen ){
860 len = symptr->length;
863 len = strend - strbeg; /* long enough */
868 beyond = s >= strend;
870 int which = (symptr->code & TYPE_IS_SHRIEKING)
871 ? PACK_SIZE_SHRIEKING : PACK_SIZE_NORMAL;
872 int offset = TYPE_NO_MODIFIERS(datumtype) - packsize[which].first;
874 if (offset >= 0 && offset < packsize[which].size) {
875 /* Data about this template letter */
876 unsigned char data = packsize[which].array[offset];
879 /* data nonzero means we can process this letter. */
880 long size = data & PACK_SIZE_MASK;
881 long howmany = (strend - s) / size;
885 if (!checksum || (data & PACK_SIZE_CANNOT_CSUM)) {
886 if (len && unpack_only_one &&
887 !(data & PACK_SIZE_CANNOT_ONLY_ONE))
895 switch(TYPE_NO_ENDIANNESS(datumtype)) {
897 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)TYPE_NO_MODIFIERS(datumtype) );
900 if (howlen == e_no_len)
901 len = 16; /* len is not specified */
909 char *ss = s; /* Move from register */
910 tempsym_t savsym = *symptr;
911 U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags);
912 symptr->flags |= group_modifiers;
913 symptr->patend = savsym.grpend;
917 symptr->patptr = savsym.grpbeg;
918 unpack_rec(symptr, ss, strbeg, strend, &ss );
919 if (ss == strend && savsym.howlen == e_star)
920 break; /* No way to continue */
924 symptr->flags &= ~group_modifiers;
925 savsym.flags = symptr->flags;
930 if (len > strend - strrelbeg)
931 Perl_croak(aTHX_ "'@' outside of string in unpack");
934 case 'X' | TYPE_IS_SHRIEKING:
935 if (!len) /* Avoid division by 0 */
937 len = (s - strbeg) % len;
940 if (len > s - strbeg)
941 Perl_croak(aTHX_ "'X' outside of string in unpack" );
944 case 'x' | TYPE_IS_SHRIEKING:
945 if (!len) /* Avoid division by 0 */
947 aint = (s - strbeg) % len;
948 if (aint) /* Other portable ways? */
954 if (len > strend - s)
955 Perl_croak(aTHX_ "'x' outside of string in unpack");
959 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
964 if (len > strend - s)
968 sv = newSVpvn(s, len);
969 if (len > 0 && (datumtype == 'A' || datumtype == 'Z')) {
970 aptr = s; /* borrow register */
971 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
975 if (howlen == e_star) /* exact for 'Z*' */
976 len = s - SvPVX(sv) + 1;
978 else { /* 'A' strips both nulls and spaces */
979 s = SvPVX(sv) + len - 1;
980 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
984 SvCUR_set(sv, s - SvPVX(sv));
985 s = aptr; /* unborrow register */
988 XPUSHs(sv_2mortal(sv));
992 if (howlen == e_star || len > (strend - s) * 8)
993 len = (strend - s) * 8;
996 Newz(601, PL_bitcount, 256, char);
997 for (bits = 1; bits < 256; bits++) {
998 if (bits & 1) PL_bitcount[bits]++;
999 if (bits & 2) PL_bitcount[bits]++;
1000 if (bits & 4) PL_bitcount[bits]++;
1001 if (bits & 8) PL_bitcount[bits]++;
1002 if (bits & 16) PL_bitcount[bits]++;
1003 if (bits & 32) PL_bitcount[bits]++;
1004 if (bits & 64) PL_bitcount[bits]++;
1005 if (bits & 128) PL_bitcount[bits]++;
1009 cuv += PL_bitcount[*(unsigned char*)s++];
1014 if (datumtype == 'b') {
1016 if (bits & 1) cuv++;
1022 if (bits & 128) cuv++;
1029 sv = NEWSV(35, len + 1);
1033 if (datumtype == 'b') {
1035 for (len = 0; len < aint; len++) {
1036 if (len & 7) /*SUPPRESS 595*/
1040 *str++ = '0' + (bits & 1);
1045 for (len = 0; len < aint; len++) {
1050 *str++ = '0' + ((bits & 128) != 0);
1054 XPUSHs(sv_2mortal(sv));
1058 if (howlen == e_star || len > (strend - s) * 2)
1059 len = (strend - s) * 2;
1060 sv = NEWSV(35, len + 1);
1064 if (datumtype == 'h') {
1066 for (len = 0; len < aint; len++) {
1071 *str++ = PL_hexdigit[bits & 15];
1076 for (len = 0; len < aint; len++) {
1081 *str++ = PL_hexdigit[(bits >> 4) & 15];
1085 XPUSHs(sv_2mortal(sv));
1090 if (aint >= 128) /* fake up signed chars */
1093 PUSHs(sv_2mortal(newSViv((IV)aint)));
1095 else if (checksum > bits_in_uv)
1096 cdouble += (NV)aint;
1102 unpack_C: /* unpack U will jump here if not UTF-8 */
1104 symptr->flags &= ~FLAG_UNPACK_DO_UTF8;
1117 PUSHs(sv_2mortal(newSViv((IV)auint)));
1123 symptr->flags |= FLAG_UNPACK_DO_UTF8;
1126 if ((symptr->flags & FLAG_UNPACK_DO_UTF8) == 0)
1128 while (len-- > 0 && s < strend) {
1130 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
1134 PUSHs(sv_2mortal(newSVuv((UV)auint)));
1136 else if (checksum > bits_in_uv)
1137 cdouble += (NV)auint;
1142 case 's' | TYPE_IS_SHRIEKING:
1143 #if SHORTSIZE != SIZE16
1145 COPYNN(s, &ashort, sizeof(short));
1146 DO_BO_UNPACK(ashort, s);
1149 PUSHs(sv_2mortal(newSViv((IV)ashort)));
1151 else if (checksum > bits_in_uv)
1152 cdouble += (NV)ashort;
1163 DO_BO_UNPACK(ai16, 16);
1164 #if U16SIZE > SIZE16
1170 PUSHs(sv_2mortal(newSViv((IV)ai16)));
1172 else if (checksum > bits_in_uv)
1173 cdouble += (NV)ai16;
1178 case 'S' | TYPE_IS_SHRIEKING:
1179 #if SHORTSIZE != SIZE16
1181 COPYNN(s, &aushort, sizeof(unsigned short));
1182 DO_BO_UNPACK(aushort, s);
1183 s += sizeof(unsigned short);
1185 PUSHs(sv_2mortal(newSViv((UV)aushort)));
1187 else if (checksum > bits_in_uv)
1188 cdouble += (NV)aushort;
1201 DO_BO_UNPACK(au16, 16);
1204 if (datumtype == 'n')
1205 au16 = PerlSock_ntohs(au16);
1208 if (datumtype == 'v')
1212 PUSHs(sv_2mortal(newSViv((UV)au16)));
1214 else if (checksum > bits_in_uv)
1215 cdouble += (NV)au16;
1220 case 'v' | TYPE_IS_SHRIEKING:
1221 case 'n' | TYPE_IS_SHRIEKING:
1226 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1227 ai16 = (I16)PerlSock_ntohs((U16)ai16);
1230 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1231 ai16 = (I16)vtohs((U16)ai16);
1234 PUSHs(sv_2mortal(newSViv((IV)ai16)));
1236 else if (checksum > bits_in_uv)
1237 cdouble += (NV)ai16;
1243 case 'i' | TYPE_IS_SHRIEKING:
1245 Copy(s, &aint, 1, int);
1246 DO_BO_UNPACK(aint, i);
1249 PUSHs(sv_2mortal(newSViv((IV)aint)));
1251 else if (checksum > bits_in_uv)
1252 cdouble += (NV)aint;
1258 case 'I' | TYPE_IS_SHRIEKING:
1260 Copy(s, &auint, 1, unsigned int);
1261 DO_BO_UNPACK(auint, i);
1262 s += sizeof(unsigned int);
1264 PUSHs(sv_2mortal(newSVuv((UV)auint)));
1266 else if (checksum > bits_in_uv)
1267 cdouble += (NV)auint;
1274 Copy(s, &aiv, 1, IV);
1275 #if IVSIZE == INTSIZE
1276 DO_BO_UNPACK(aiv, i);
1277 #elif IVSIZE == LONGSIZE
1278 DO_BO_UNPACK(aiv, l);
1279 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1280 DO_BO_UNPACK(aiv, 64);
1284 PUSHs(sv_2mortal(newSViv(aiv)));
1286 else if (checksum > bits_in_uv)
1294 Copy(s, &auv, 1, UV);
1295 #if UVSIZE == INTSIZE
1296 DO_BO_UNPACK(auv, i);
1297 #elif UVSIZE == LONGSIZE
1298 DO_BO_UNPACK(auv, l);
1299 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
1300 DO_BO_UNPACK(auv, 64);
1304 PUSHs(sv_2mortal(newSVuv(auv)));
1306 else if (checksum > bits_in_uv)
1312 case 'l' | TYPE_IS_SHRIEKING:
1313 #if LONGSIZE != SIZE32
1315 COPYNN(s, &along, sizeof(long));
1316 DO_BO_UNPACK(along, l);
1319 PUSHs(sv_2mortal(newSViv((IV)along)));
1321 else if (checksum > bits_in_uv)
1322 cdouble += (NV)along;
1333 DO_BO_UNPACK(ai32, 32);
1334 #if U32SIZE > SIZE32
1335 if (ai32 > 2147483647)
1340 PUSHs(sv_2mortal(newSViv((IV)ai32)));
1342 else if (checksum > bits_in_uv)
1343 cdouble += (NV)ai32;
1348 case 'L' | TYPE_IS_SHRIEKING:
1349 #if LONGSIZE != SIZE32
1351 COPYNN(s, &aulong, sizeof(unsigned long));
1352 DO_BO_UNPACK(aulong, l);
1353 s += sizeof(unsigned long);
1355 PUSHs(sv_2mortal(newSVuv((UV)aulong)));
1357 else if (checksum > bits_in_uv)
1358 cdouble += (NV)aulong;
1371 DO_BO_UNPACK(au32, 32);
1374 if (datumtype == 'N')
1375 au32 = PerlSock_ntohl(au32);
1378 if (datumtype == 'V')
1382 PUSHs(sv_2mortal(newSVuv((UV)au32)));
1384 else if (checksum > bits_in_uv)
1385 cdouble += (NV)au32;
1390 case 'V' | TYPE_IS_SHRIEKING:
1391 case 'N' | TYPE_IS_SHRIEKING:
1396 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1397 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1400 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1401 ai32 = (I32)vtohl((U32)ai32);
1404 PUSHs(sv_2mortal(newSViv((IV)ai32)));
1406 else if (checksum > bits_in_uv)
1407 cdouble += (NV)ai32;
1414 if (sizeof(char*) > strend - s)
1417 Copy(s, &aptr, 1, char*);
1418 DO_BO_UNPACK_P(aptr);
1421 /* newSVpv generates undef if aptr is NULL */
1422 PUSHs(sv_2mortal(newSVpv(aptr, 0)));
1430 while ((len > 0) && (s < strend)) {
1431 auv = (auv << 7) | (*s & 0x7f);
1432 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1433 if ((U8)(*s++) < 0x80) {
1435 PUSHs(sv_2mortal(newSVuv(auv)));
1439 else if (++bytes >= sizeof(UV)) { /* promote to string */
1443 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1444 while (s < strend) {
1445 sv = mul128(sv, (U8)(*s & 0x7f));
1446 if (!(*s++ & 0x80)) {
1455 PUSHs(sv_2mortal(sv));
1460 if ((s >= strend) && bytes)
1461 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
1465 if (symptr->howlen == e_star)
1466 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
1468 if (sizeof(char*) > strend - s)
1471 Copy(s, &aptr, 1, char*);
1472 DO_BO_UNPACK_P(aptr);
1475 /* newSVpvn generates undef if aptr is NULL */
1476 PUSHs(sv_2mortal(newSVpvn(aptr, len)));
1481 assert (s + sizeof(Quad_t) <= strend);
1482 Copy(s, &aquad, 1, Quad_t);
1483 DO_BO_UNPACK(aquad, 64);
1484 s += sizeof(Quad_t);
1486 PUSHs(sv_2mortal((aquad >= IV_MIN && aquad <= IV_MAX) ?
1487 newSViv((IV)aquad) : newSVnv((NV)aquad)));
1489 else if (checksum > bits_in_uv)
1490 cdouble += (NV)aquad;
1497 assert (s + sizeof(Uquad_t) <= strend);
1498 Copy(s, &auquad, 1, Uquad_t);
1499 DO_BO_UNPACK(auquad, 64);
1500 s += sizeof(Uquad_t);
1502 PUSHs(sv_2mortal((auquad <= UV_MAX) ?
1503 newSVuv((UV)auquad) : newSVnv((NV)auquad)));
1505 else if (checksum > bits_in_uv)
1506 cdouble += (NV)auquad;
1512 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1515 Copy(s, &afloat, 1, float);
1516 DO_BO_UNPACK_N(afloat, float);
1519 PUSHs(sv_2mortal(newSVnv((NV)afloat)));
1528 Copy(s, &adouble, 1, double);
1529 DO_BO_UNPACK_N(adouble, double);
1530 s += sizeof(double);
1532 PUSHs(sv_2mortal(newSVnv((NV)adouble)));
1541 Copy(s, &anv, 1, NV);
1542 DO_BO_UNPACK_N(anv, NV);
1545 PUSHs(sv_2mortal(newSVnv(anv)));
1552 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1555 Copy(s, &aldouble, 1, long double);
1556 DO_BO_UNPACK_N(aldouble, long double);
1557 s += LONG_DOUBLESIZE;
1559 PUSHs(sv_2mortal(newSVnv((NV)aldouble)));
1561 else {cdouble += aldouble;
1568 * Initialise the decode mapping. By using a table driven
1569 * algorithm, the code will be character-set independent
1570 * (and just as fast as doing character arithmetic)
1572 if (PL_uudmap['M'] == 0) {
1575 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1576 PL_uudmap[(U8)PL_uuemap[i]] = i;
1578 * Because ' ' and '`' map to the same value,
1579 * we need to decode them both the same.
1584 along = (strend - s) * 3 / 4;
1585 sv = NEWSV(42, along);
1588 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1593 len = PL_uudmap[*(U8*)s++] & 077;
1595 if (s < strend && ISUUCHAR(*s))
1596 a = PL_uudmap[*(U8*)s++] & 077;
1599 if (s < strend && ISUUCHAR(*s))
1600 b = PL_uudmap[*(U8*)s++] & 077;
1603 if (s < strend && ISUUCHAR(*s))
1604 c = PL_uudmap[*(U8*)s++] & 077;
1607 if (s < strend && ISUUCHAR(*s))
1608 d = PL_uudmap[*(U8*)s++] & 077;
1611 hunk[0] = (char)((a << 2) | (b >> 4));
1612 hunk[1] = (char)((b << 4) | (c >> 2));
1613 hunk[2] = (char)((c << 6) | d);
1614 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1619 else /* possible checksum byte */
1620 if (s + 1 < strend && s[1] == '\n')
1623 XPUSHs(sv_2mortal(sv));
1628 if (strchr("fFdD", TYPE_NO_MODIFIERS(datumtype)) ||
1629 (checksum > bits_in_uv &&
1630 strchr("csSiIlLnNUvVqQjJ", TYPE_NO_MODIFIERS(datumtype))) ) {
1633 adouble = (NV) (1 << (checksum & 15));
1634 while (checksum >= 16) {
1638 while (cdouble < 0.0)
1640 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1641 sv = newSVnv(cdouble);
1644 if (checksum < bits_in_uv) {
1645 UV mask = ((UV)1 << checksum) - 1;
1650 XPUSHs(sv_2mortal(sv));
1654 if (symptr->flags & FLAG_SLASH){
1655 if (SP - PL_stack_base - start_sp_offset <= 0)
1656 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1657 if( next_symbol(symptr) ){
1658 if( symptr->howlen == e_number )
1659 Perl_croak(aTHX_ "Count after length/code in unpack" );
1661 /* ...end of char buffer then no decent length available */
1662 Perl_croak(aTHX_ "length/code after end of string in unpack" );
1664 /* take top of stack (hope it's numeric) */
1667 Perl_croak(aTHX_ "Negative '/' count in unpack" );
1670 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
1672 datumtype = symptr->code;
1680 return SP - PL_stack_base - start_sp_offset;
1687 I32 gimme = GIMME_V;
1690 register char *pat = SvPV(left, llen);
1691 #ifdef PACKED_IS_OCTETS
1692 /* Packed side is assumed to be octets - so force downgrade if it
1693 has been UTF-8 encoded by accident
1695 register char *s = SvPVbyte(right, rlen);
1697 register char *s = SvPV(right, rlen);
1699 char *strend = s + rlen;
1700 register char *patend = pat + llen;
1704 cnt = unpackstring(pat, patend, s, strend,
1705 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
1706 | (DO_UTF8(right) ? FLAG_UNPACK_DO_UTF8 : 0));
1709 if ( !cnt && gimme == G_SCALAR )
1710 PUSHs(&PL_sv_undef);
1715 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
1719 *hunk = PL_uuemap[len];
1720 sv_catpvn(sv, hunk, 1);
1723 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1724 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
1725 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
1726 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
1727 sv_catpvn(sv, hunk, 4);
1732 char r = (len > 1 ? s[1] : '\0');
1733 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1734 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
1735 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
1736 hunk[3] = PL_uuemap[0];
1737 sv_catpvn(sv, hunk, 4);
1739 sv_catpvn(sv, "\n", 1);
1743 S_is_an_int(pTHX_ char *s, STRLEN l)
1746 SV *result = newSVpvn(s, l);
1747 char *result_c = SvPV(result, n_a); /* convenience */
1748 char *out = result_c;
1758 SvREFCNT_dec(result);
1781 SvREFCNT_dec(result);
1787 SvCUR_set(result, out - result_c);
1791 /* pnum must be '\0' terminated */
1793 S_div128(pTHX_ SV *pnum, bool *done)
1796 char *s = SvPV(pnum, len);
1805 i = m * 10 + (*t - '0');
1807 r = (i >> 7); /* r < 10 */
1814 SvCUR_set(pnum, (STRLEN) (t - s));
1821 =for apidoc pack_cat
1823 The engine implementing pack() Perl function. Note: parameters next_in_list and
1824 flags are not used. This call should not be used; use packlist instead.
1830 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
1832 tempsym_t sym = { 0 };
1834 sym.patend = patend;
1835 sym.flags = FLAG_PACK;
1837 (void)pack_rec( cat, &sym, beglist, endlist );
1842 =for apidoc packlist
1844 The engine implementing pack() Perl function.
1850 Perl_packlist(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist )
1852 tempsym_t sym = { 0 };
1854 sym.patend = patend;
1855 sym.flags = FLAG_PACK;
1857 (void)pack_rec( cat, &sym, beglist, endlist );
1863 S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV **endlist )
1867 register I32 len = 0;
1870 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
1871 static char *space10 = " ";
1874 /* These must not be in registers: */
1884 #if SHORTSIZE != SIZE16
1886 unsigned short aushort;
1890 #if LONGSIZE != SIZE32
1892 unsigned long aulong;
1897 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1898 long double aldouble;
1904 int strrelbeg = SvCUR(cat);
1905 tempsym_t lookahead;
1907 items = endlist - beglist;
1908 found = next_symbol( symptr );
1910 #ifndef PACKED_IS_OCTETS
1911 if (symptr->level == 0 && found && symptr->code == 'U' ){
1917 SV *lengthcode = Nullsv;
1918 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
1920 I32 datumtype = symptr->code;
1923 switch( howlen = symptr->howlen ){
1926 len = symptr->length;
1929 len = strchr("@Xxu", TYPE_NO_MODIFIERS(datumtype)) ? 0 : items;
1933 /* Look ahead for next symbol. Do we have code/code? */
1934 lookahead = *symptr;
1935 found = next_symbol(&lookahead);
1936 if ( symptr->flags & FLAG_SLASH ) {
1938 if ( 0 == strchr( "aAZ", lookahead.code ) ||
1939 e_star != lookahead.howlen )
1940 Perl_croak(aTHX_ "'/' must be followed by 'a*', 'A*' or 'Z*' in pack");
1941 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
1942 ? *beglist : &PL_sv_no)
1943 + (lookahead.code == 'Z' ? 1 : 0)));
1945 Perl_croak(aTHX_ "Code missing after '/' in pack");
1949 switch(TYPE_NO_ENDIANNESS(datumtype)) {
1951 Perl_croak(aTHX_ "Invalid type '%c' in pack", (int)TYPE_NO_MODIFIERS(datumtype));
1953 Perl_croak(aTHX_ "'%%' may not be used in pack");
1955 len += strrelbeg - SvCUR(cat);
1964 tempsym_t savsym = *symptr;
1965 U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags);
1966 symptr->flags |= group_modifiers;
1967 symptr->patend = savsym.grpend;
1970 symptr->patptr = savsym.grpbeg;
1971 beglist = pack_rec(cat, symptr, beglist, endlist );
1972 if (savsym.howlen == e_star && beglist == endlist)
1973 break; /* No way to continue */
1975 symptr->flags &= ~group_modifiers;
1976 lookahead.flags = symptr->flags;
1980 case 'X' | TYPE_IS_SHRIEKING:
1981 if (!len) /* Avoid division by 0 */
1983 len = (SvCUR(cat)) % len;
1987 if ((I32)SvCUR(cat) < len)
1988 Perl_croak(aTHX_ "'X' outside of string in pack");
1992 case 'x' | TYPE_IS_SHRIEKING:
1993 if (!len) /* Avoid division by 0 */
1995 aint = (SvCUR(cat)) % len;
1996 if (aint) /* Other portable ways? */
2005 sv_catpvn(cat, null10, 10);
2008 sv_catpvn(cat, null10, len);
2014 aptr = SvPV(fromstr, fromlen);
2015 if (howlen == e_star) {
2017 if (datumtype == 'Z')
2020 if ((I32)fromlen >= len) {
2021 sv_catpvn(cat, aptr, len);
2022 if (datumtype == 'Z')
2023 *(SvEND(cat)-1) = '\0';
2026 sv_catpvn(cat, aptr, fromlen);
2028 if (datumtype == 'A') {
2030 sv_catpvn(cat, space10, 10);
2033 sv_catpvn(cat, space10, len);
2037 sv_catpvn(cat, null10, 10);
2040 sv_catpvn(cat, null10, len);
2052 str = SvPV(fromstr, fromlen);
2053 if (howlen == e_star)
2056 SvCUR(cat) += (len+7)/8;
2057 SvGROW(cat, SvCUR(cat) + 1);
2058 aptr = SvPVX(cat) + aint;
2059 if (len > (I32)fromlen)
2063 if (datumtype == 'B') {
2064 for (len = 0; len++ < aint;) {
2065 items |= *str++ & 1;
2069 *aptr++ = items & 0xff;
2075 for (len = 0; len++ < aint;) {
2081 *aptr++ = items & 0xff;
2087 if (datumtype == 'B')
2088 items <<= 7 - (aint & 7);
2090 items >>= 7 - (aint & 7);
2091 *aptr++ = items & 0xff;
2093 str = SvPVX(cat) + SvCUR(cat);
2108 str = SvPV(fromstr, fromlen);
2109 if (howlen == e_star)
2112 SvCUR(cat) += (len+1)/2;
2113 SvGROW(cat, SvCUR(cat) + 1);
2114 aptr = SvPVX(cat) + aint;
2115 if (len > (I32)fromlen)
2119 if (datumtype == 'H') {
2120 for (len = 0; len++ < aint;) {
2122 items |= ((*str++ & 15) + 9) & 15;
2124 items |= *str++ & 15;
2128 *aptr++ = items & 0xff;
2134 for (len = 0; len++ < aint;) {
2136 items |= (((*str++ & 15) + 9) & 15) << 4;
2138 items |= (*str++ & 15) << 4;
2142 *aptr++ = items & 0xff;
2148 *aptr++ = items & 0xff;
2149 str = SvPVX(cat) + SvCUR(cat);
2160 switch (TYPE_NO_MODIFIERS(datumtype)) {
2162 aint = SvIV(fromstr);
2163 if ((aint < 0 || aint > 255) &&
2165 Perl_warner(aTHX_ packWARN(WARN_PACK),
2166 "Character in 'C' format wrapped in pack");
2168 sv_catpvn(cat, &achar, sizeof(char));
2171 aint = SvIV(fromstr);
2172 if ((aint < -128 || aint > 127) &&
2174 Perl_warner(aTHX_ packWARN(WARN_PACK),
2175 "Character in 'c' format wrapped in pack" );
2177 sv_catpvn(cat, &achar, sizeof(char));
2185 auint = UNI_TO_NATIVE(SvUV(fromstr));
2186 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
2188 (char*)uvchr_to_utf8_flags((U8*)SvEND(cat),
2191 0 : UNICODE_ALLOW_ANY)
2196 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
2201 /* VOS does not automatically map a floating-point overflow
2202 during conversion from double to float into infinity, so we
2203 do it by hand. This code should either be generalized for
2204 any OS that needs it, or removed if and when VOS implements
2205 posix-976 (suggestion to support mapping to infinity).
2206 Paul.Green@stratus.com 02-04-02. */
2207 if (SvNV(fromstr) > FLT_MAX)
2208 afloat = _float_constants[0]; /* single prec. inf. */
2209 else if (SvNV(fromstr) < -FLT_MAX)
2210 afloat = _float_constants[0]; /* single prec. inf. */
2211 else afloat = (float)SvNV(fromstr);
2213 # if defined(VMS) && !defined(__IEEE_FP)
2214 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2215 * on Alpha; fake it if we don't have them.
2217 if (SvNV(fromstr) > FLT_MAX)
2219 else if (SvNV(fromstr) < -FLT_MAX)
2221 else afloat = (float)SvNV(fromstr);
2223 afloat = (float)SvNV(fromstr);
2226 DO_BO_PACK_N(afloat, float);
2227 sv_catpvn(cat, (char *)&afloat, sizeof (float));
2234 /* VOS does not automatically map a floating-point overflow
2235 during conversion from long double to double into infinity,
2236 so we do it by hand. This code should either be generalized
2237 for any OS that needs it, or removed if and when VOS
2238 implements posix-976 (suggestion to support mapping to
2239 infinity). Paul.Green@stratus.com 02-04-02. */
2240 if (SvNV(fromstr) > DBL_MAX)
2241 adouble = _double_constants[0]; /* double prec. inf. */
2242 else if (SvNV(fromstr) < -DBL_MAX)
2243 adouble = _double_constants[0]; /* double prec. inf. */
2244 else adouble = (double)SvNV(fromstr);
2246 # if defined(VMS) && !defined(__IEEE_FP)
2247 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2248 * on Alpha; fake it if we don't have them.
2250 if (SvNV(fromstr) > DBL_MAX)
2252 else if (SvNV(fromstr) < -DBL_MAX)
2254 else adouble = (double)SvNV(fromstr);
2256 adouble = (double)SvNV(fromstr);
2259 DO_BO_PACK_N(adouble, double);
2260 sv_catpvn(cat, (char *)&adouble, sizeof (double));
2264 Zero(&anv, 1, NV); /* can be long double with unused bits */
2267 anv = SvNV(fromstr);
2268 DO_BO_PACK_N(anv, NV);
2269 sv_catpvn(cat, (char *)&anv, NVSIZE);
2272 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2274 /* long doubles can have unused bits, which may be nonzero */
2275 Zero(&aldouble, 1, long double);
2278 aldouble = (long double)SvNV(fromstr);
2279 DO_BO_PACK_N(aldouble, long double);
2280 sv_catpvn(cat, (char *)&aldouble, LONG_DOUBLESIZE);
2284 case 'n' | TYPE_IS_SHRIEKING:
2288 ai16 = (I16)SvIV(fromstr);
2290 ai16 = PerlSock_htons(ai16);
2295 case 'v' | TYPE_IS_SHRIEKING:
2299 ai16 = (I16)SvIV(fromstr);
2306 case 'S' | TYPE_IS_SHRIEKING:
2307 #if SHORTSIZE != SIZE16
2311 aushort = SvUV(fromstr);
2312 DO_BO_PACK(aushort, s);
2313 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
2324 au16 = (U16)SvUV(fromstr);
2325 DO_BO_PACK(au16, 16);
2331 case 's' | TYPE_IS_SHRIEKING:
2332 #if SHORTSIZE != SIZE16
2336 ashort = SvIV(fromstr);
2337 DO_BO_PACK(ashort, s);
2338 sv_catpvn(cat, (char *)&ashort, sizeof(short));
2348 ai16 = (I16)SvIV(fromstr);
2349 DO_BO_PACK(ai16, 16);
2354 case 'I' | TYPE_IS_SHRIEKING:
2357 auint = SvUV(fromstr);
2358 DO_BO_PACK(auint, i);
2359 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
2365 aiv = SvIV(fromstr);
2366 #if IVSIZE == INTSIZE
2368 #elif IVSIZE == LONGSIZE
2370 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
2371 DO_BO_PACK(aiv, 64);
2373 sv_catpvn(cat, (char*)&aiv, IVSIZE);
2379 auv = SvUV(fromstr);
2380 #if UVSIZE == INTSIZE
2382 #elif UVSIZE == LONGSIZE
2384 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
2385 DO_BO_PACK(auv, 64);
2387 sv_catpvn(cat, (char*)&auv, UVSIZE);
2393 anv = SvNV(fromstr);
2396 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
2398 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
2399 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
2400 any negative IVs will have already been got by the croak()
2401 above. IOK is untrue for fractions, so we test them
2402 against UV_MAX_P1. */
2403 if (SvIOK(fromstr) || anv < UV_MAX_P1)
2405 char buf[(sizeof(UV)*8)/7+1];
2406 char *in = buf + sizeof(buf);
2407 UV auv = SvUV(fromstr);
2410 *--in = (char)((auv & 0x7f) | 0x80);
2413 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2414 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2416 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
2417 char *from, *result, *in;
2422 /* Copy string and check for compliance */
2423 from = SvPV(fromstr, len);
2424 if ((norm = is_an_int(from, len)) == NULL)
2425 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2427 New('w', result, len, char);
2431 *--in = div128(norm, &done) | 0x80;
2432 result[len - 1] &= 0x7F; /* clear continue bit */
2433 sv_catpvn(cat, in, (result + len) - in);
2435 SvREFCNT_dec(norm); /* free norm */
2437 else if (SvNOKp(fromstr)) {
2438 /* 10**NV_MAX_10_EXP is the largest power of 10
2439 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
2440 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
2441 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
2442 And with that many bytes only Inf can overflow.
2443 Some C compilers are strict about integral constant
2444 expressions so we conservatively divide by a slightly
2445 smaller integer instead of multiplying by the exact
2446 floating-point value.
2448 #ifdef NV_MAX_10_EXP
2449 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
2450 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
2452 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
2453 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
2455 char *in = buf + sizeof(buf);
2457 anv = Perl_floor(anv);
2459 NV next = Perl_floor(anv / 128);
2460 if (in <= buf) /* this cannot happen ;-) */
2461 Perl_croak(aTHX_ "Cannot compress integer in pack");
2462 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
2465 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2466 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2469 char *from, *result, *in;
2474 /* Copy string and check for compliance */
2475 from = SvPV(fromstr, len);
2476 if ((norm = is_an_int(from, len)) == NULL)
2477 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2479 New('w', result, len, char);
2483 *--in = div128(norm, &done) | 0x80;
2484 result[len - 1] &= 0x7F; /* clear continue bit */
2485 sv_catpvn(cat, in, (result + len) - in);
2487 SvREFCNT_dec(norm); /* free norm */
2492 case 'i' | TYPE_IS_SHRIEKING:
2495 aint = SvIV(fromstr);
2496 DO_BO_PACK(aint, i);
2497 sv_catpvn(cat, (char*)&aint, sizeof(int));
2500 case 'N' | TYPE_IS_SHRIEKING:
2504 au32 = SvUV(fromstr);
2506 au32 = PerlSock_htonl(au32);
2511 case 'V' | TYPE_IS_SHRIEKING:
2515 au32 = SvUV(fromstr);
2522 case 'L' | TYPE_IS_SHRIEKING:
2523 #if LONGSIZE != SIZE32
2527 aulong = SvUV(fromstr);
2528 DO_BO_PACK(aulong, l);
2529 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2540 au32 = SvUV(fromstr);
2541 DO_BO_PACK(au32, 32);
2546 case 'l' | TYPE_IS_SHRIEKING:
2547 #if LONGSIZE != SIZE32
2551 along = SvIV(fromstr);
2552 DO_BO_PACK(along, l);
2553 sv_catpvn(cat, (char *)&along, sizeof(long));
2563 ai32 = SvIV(fromstr);
2564 DO_BO_PACK(ai32, 32);
2572 auquad = (Uquad_t)SvUV(fromstr);
2573 DO_BO_PACK(auquad, 64);
2574 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2580 aquad = (Quad_t)SvIV(fromstr);
2581 DO_BO_PACK(aquad, 64);
2582 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2587 len = 1; /* assume SV is correct length */
2592 if (fromstr == &PL_sv_undef)
2596 /* XXX better yet, could spirit away the string to
2597 * a safe spot and hang on to it until the result
2598 * of pack() (and all copies of the result) are
2601 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2602 || (SvPADTMP(fromstr)
2603 && !SvREADONLY(fromstr))))
2605 Perl_warner(aTHX_ packWARN(WARN_PACK),
2606 "Attempt to pack pointer to temporary value");
2608 if (SvPOK(fromstr) || SvNIOK(fromstr))
2609 aptr = SvPV(fromstr,n_a);
2611 aptr = SvPV_force(fromstr,n_a);
2614 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2619 aptr = SvPV(fromstr, fromlen);
2620 SvGROW(cat, fromlen * 4 / 3);
2625 while (fromlen > 0) {
2628 if ((I32)fromlen > len)
2632 doencodes(cat, aptr, todo);
2638 *symptr = lookahead;
2647 dSP; dMARK; dORIGMARK; dTARGET;
2648 register SV *cat = TARG;
2650 register char *pat = SvPVx(*++MARK, fromlen);
2651 register char *patend = pat + fromlen;
2654 sv_setpvn(cat, "", 0);
2656 packlist(cat, pat, patend, MARK, SP + 1);
2666 * c-indentation-style: bsd
2668 * indent-tabs-mode: t
2671 * vim: shiftwidth=4: