3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 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,
20 #define PERL_IN_PP_PACK_C
24 * The compiler on Concurrent CX/UX systems has a subtle bug which only
25 * seems to show up when compiling pp.c - it generates the wrong double
26 * precision constant value for (double)UV_MAX when used inline in the body
27 * of the code below, so this makes a static variable up front (which the
28 * compiler seems to get correct) and uses it in place of UV_MAX below.
30 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
31 static double UV_MAX_cxux = ((double)UV_MAX);
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
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) == ' ')
133 #define TYPE_IS_SHRIEKING 0x100
134 #define TYPE_IS_BIG_ENDIAN 0x200
135 #define TYPE_IS_LITTLE_ENDIAN 0x400
136 #define TYPE_ENDIANNESS_MASK (TYPE_IS_BIG_ENDIAN|TYPE_IS_LITTLE_ENDIAN)
137 #define TYPE_NO_ENDIANNESS(t) ((t) & ~TYPE_ENDIANNESS_MASK)
138 #define TYPE_NO_MODIFIERS(t) ((t) & 0xFF)
140 #define DO_BO_UNPACK(var, type) \
142 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
143 case TYPE_IS_BIG_ENDIAN: var = my_betoh ## type (var); break; \
144 case TYPE_IS_LITTLE_ENDIAN: var = my_letoh ## type (var); break; \
149 #define DO_BO_PACK(var, type) \
151 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
152 case TYPE_IS_BIG_ENDIAN: var = my_htobe ## type (var); break; \
153 case TYPE_IS_LITTLE_ENDIAN: var = my_htole ## type (var); break; \
158 #define DO_BO_UNPACK_PTR(var, type, pre_cast) \
160 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
161 case TYPE_IS_BIG_ENDIAN: \
162 var = (void *) my_betoh ## type ((pre_cast) var); \
164 case TYPE_IS_LITTLE_ENDIAN: \
165 var = (void *) my_letoh ## type ((pre_cast) var); \
172 #define DO_BO_PACK_PTR(var, type, pre_cast) \
174 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
175 case TYPE_IS_BIG_ENDIAN: \
176 var = (void *) my_htobe ## type ((pre_cast) var); \
178 case TYPE_IS_LITTLE_ENDIAN: \
179 var = (void *) my_htole ## type ((pre_cast) var); \
186 #define BO_CANT_DOIT(action, type) \
188 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
189 case TYPE_IS_BIG_ENDIAN: \
190 Perl_croak(aTHX_ "Can't %s big-endian %ss on this " \
191 "platform", #action, #type); \
193 case TYPE_IS_LITTLE_ENDIAN: \
194 Perl_croak(aTHX_ "Can't %s little-endian %ss on this " \
195 "platform", #action, #type); \
202 #if PTRSIZE == INTSIZE
203 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, i, int)
204 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, i, int)
205 #elif PTRSIZE == LONGSIZE
206 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, l, long)
207 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, l, long)
209 # define DO_BO_UNPACK_P(var) BO_CANT_DOIT(unpack, pointer)
210 # define DO_BO_PACK_P(var) BO_CANT_DOIT(pack, pointer)
213 #if defined(my_htolen) && defined(my_letohn) && \
214 defined(my_htoben) && defined(my_betohn)
215 # define DO_BO_UNPACK_N(var, type) \
217 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
218 case TYPE_IS_BIG_ENDIAN: my_betohn(&var, sizeof(type)); break;\
219 case TYPE_IS_LITTLE_ENDIAN: my_letohn(&var, sizeof(type)); break;\
224 # define DO_BO_PACK_N(var, type) \
226 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
227 case TYPE_IS_BIG_ENDIAN: my_htoben(&var, sizeof(type)); break;\
228 case TYPE_IS_LITTLE_ENDIAN: my_htolen(&var, sizeof(type)); break;\
233 # define DO_BO_UNPACK_N(var, type) BO_CANT_DOIT(unpack, type)
234 # define DO_BO_PACK_N(var, type) BO_CANT_DOIT(pack, type)
237 /* Returns the sizeof() struct described by pat */
239 S_measure_struct(pTHX_ register tempsym_t* symptr)
241 register I32 len = 0;
242 register I32 total = 0;
247 while (next_symbol(symptr)) {
249 switch( symptr->howlen ){
252 len = symptr->length;
255 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
256 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
260 /* endianness doesn't influence the size of a type */
261 switch(TYPE_NO_ENDIANNESS(symptr->code)) {
263 Perl_croak(aTHX_ "Invalid type '%c' in %s",
264 (int)TYPE_NO_MODIFIERS(symptr->code),
265 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
268 case 'U': /* XXXX Is it correct? */
271 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
273 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
279 tempsym_t savsym = *symptr;
280 symptr->patptr = savsym.grpbeg;
281 symptr->patend = savsym.grpend;
282 /* XXXX Theoretically, we need to measure many times at different
283 positions, since the subexpression may contain
284 alignment commands, but be not of aligned length.
285 Need to detect this and croak(). */
286 size = measure_struct(symptr);
290 case 'X' | TYPE_IS_SHRIEKING:
291 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS. */
292 if (!len) /* Avoid division by 0 */
294 len = total % len; /* Assumed: the start is aligned. */
299 Perl_croak(aTHX_ "'X' outside of string in %s",
300 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
302 case 'x' | TYPE_IS_SHRIEKING:
303 if (!len) /* Avoid division by 0 */
305 star = total % len; /* Assumed: the start is aligned. */
306 if (star) /* Other portable ways? */
329 case 's' | TYPE_IS_SHRIEKING:
330 #if SHORTSIZE != SIZE16
331 size = sizeof(short);
339 case 'S' | TYPE_IS_SHRIEKING:
340 #if SHORTSIZE != SIZE16
341 size = sizeof(unsigned short);
346 case 'v' | TYPE_IS_SHRIEKING:
347 case 'n' | TYPE_IS_SHRIEKING:
353 case 'i' | TYPE_IS_SHRIEKING:
357 case 'I' | TYPE_IS_SHRIEKING:
359 size = sizeof(unsigned int);
367 case 'l' | TYPE_IS_SHRIEKING:
368 #if LONGSIZE != SIZE32
377 case 'L' | TYPE_IS_SHRIEKING:
378 #if LONGSIZE != SIZE32
379 size = sizeof(unsigned long);
384 case 'V' | TYPE_IS_SHRIEKING:
385 case 'N' | TYPE_IS_SHRIEKING:
395 size = sizeof(char*);
399 size = sizeof(Quad_t);
402 size = sizeof(Uquad_t);
406 size = sizeof(float);
409 size = sizeof(double);
414 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
416 size = LONG_DOUBLESIZE;
426 /* locate matching closing parenthesis or bracket
427 * returns char pointer to char after match, or NULL
430 S_group_end(pTHX_ register char *patptr, register char *patend, char ender)
432 while (patptr < patend) {
440 while (patptr < patend && *patptr != '\n')
444 patptr = group_end(patptr, patend, ')') + 1;
446 patptr = group_end(patptr, patend, ']') + 1;
448 Perl_croak(aTHX_ "No group ending character '%c' found in template",
454 /* Convert unsigned decimal number to binary.
455 * Expects a pointer to the first digit and address of length variable
456 * Advances char pointer to 1st non-digit char and returns number
459 S_get_num(pTHX_ register char *patptr, I32 *lenptr )
461 I32 len = *patptr++ - '0';
462 while (isDIGIT(*patptr)) {
463 if (len >= 0x7FFFFFFF/10)
464 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
465 len = (len * 10) + (*patptr++ - '0');
471 /* The marvellous template parsing routine: Using state stored in *symptr,
472 * locates next template code and count
475 S_next_symbol(pTHX_ register tempsym_t* symptr )
477 register char* patptr = symptr->patptr;
478 register char* patend = symptr->patend;
480 symptr->flags &= ~FLAG_SLASH;
482 while (patptr < patend) {
483 if (isSPACE(*patptr))
485 else if (*patptr == '#') {
487 while (patptr < patend && *patptr != '\n')
492 /* We should have found a template code */
493 I32 code = *patptr++ & 0xFF;
495 if (code == ','){ /* grandfather in commas but with a warning */
496 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
497 symptr->flags |= FLAG_COMMA;
498 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
499 "Invalid type ',' in %s",
500 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
505 /* for '(', skip to ')' */
507 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
508 Perl_croak(aTHX_ "()-group starts with a count in %s",
509 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
510 symptr->grpbeg = patptr;
511 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
512 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
513 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
514 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
517 /* look for modifiers */
518 while (patptr < patend) {
523 modifier = TYPE_IS_SHRIEKING;
524 allowed = "sSiIlLxXnNvV";
527 modifier = TYPE_IS_BIG_ENDIAN;
528 allowed = "sSiIlLqQjJfFdDpP";
531 modifier = TYPE_IS_LITTLE_ENDIAN;
532 allowed = "sSiIlLqQjJfFdDpP";
539 if (!strchr(allowed, TYPE_NO_MODIFIERS(code)))
540 Perl_croak(aTHX_ "'%c' allowed only after types %s in %s", *patptr,
541 allowed, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
542 if ((code | modifier) == (code | TYPE_IS_BIG_ENDIAN | TYPE_IS_LITTLE_ENDIAN))
543 Perl_croak(aTHX_ "Can't use both '<' and '>' after type '%c' in %s",
544 (int) TYPE_NO_MODIFIERS(code),
545 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
546 if (ckWARN(WARN_UNPACK)) {
548 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
549 "Duplicate modifier '%c' after '%c' in %s",
550 *patptr, (int) TYPE_NO_MODIFIERS(code),
551 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
557 /* look for count and/or / */
558 if (patptr < patend) {
559 if (isDIGIT(*patptr)) {
560 patptr = get_num( patptr, &symptr->length );
561 symptr->howlen = e_number;
563 } else if (*patptr == '*') {
565 symptr->howlen = e_star;
567 } else if (*patptr == '[') {
568 char* lenptr = ++patptr;
569 symptr->howlen = e_number;
570 patptr = group_end( patptr, patend, ']' ) + 1;
571 /* what kind of [] is it? */
572 if (isDIGIT(*lenptr)) {
573 lenptr = get_num( lenptr, &symptr->length );
575 Perl_croak(aTHX_ "Malformed integer in [] in %s",
576 symptr->flags & FLAG_PACK ? "pack" : "unpack");
578 tempsym_t savsym = *symptr;
579 symptr->patend = patptr-1;
580 symptr->patptr = lenptr;
581 savsym.length = measure_struct(symptr);
585 symptr->howlen = e_no_len;
590 while (patptr < patend) {
591 if (isSPACE(*patptr))
593 else if (*patptr == '#') {
595 while (patptr < patend && *patptr != '\n')
600 if( *patptr == '/' ){
601 symptr->flags |= FLAG_SLASH;
603 if( patptr < patend &&
604 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '[') )
605 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
606 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
612 /* at end - no count, no / */
613 symptr->howlen = e_no_len;
618 symptr->patptr = patptr;
622 symptr->patptr = patptr;
627 =for apidoc unpack_str
629 The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
630 and ocnt are not used. This call should not be used, use unpackstring instead.
635 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
637 tempsym_t sym = { 0 };
642 return unpack_rec(&sym, s, s, strend, NULL );
646 =for apidoc unpackstring
648 The engine implementing unpack() Perl function. C<unpackstring> puts the
649 extracted list items on the stack and returns the number of elements.
650 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
655 Perl_unpackstring(pTHX_ char *pat, register char *patend, register char *s, char *strend, U32 flags)
657 tempsym_t sym = { 0 };
662 return unpack_rec(&sym, s, s, strend, NULL );
667 S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, char *strend, char **new_s )
671 register I32 len = 0;
672 register I32 bits = 0;
675 I32 start_sp_offset = SP - PL_stack_base;
678 /* These must not be in registers: */
687 #if SHORTSIZE != SIZE16
689 unsigned short aushort;
694 #if LONGSIZE != SIZE32
695 unsigned long aulong;
700 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
701 long double aldouble;
710 const int bits_in_uv = 8 * sizeof(cuv);
713 bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
715 while (next_symbol(symptr)) {
716 datumtype = symptr->code;
717 /* do first one only unless in list context
718 / is implemented by unpacking the count, then poping it from the
719 stack, so must check that we're not in the middle of a / */
721 && (SP - PL_stack_base == start_sp_offset + 1)
722 && (datumtype != '/') ) /* XXX can this be omitted */
725 switch( howlen = symptr->howlen ){
728 len = symptr->length;
731 len = strend - strbeg; /* long enough */
736 beyond = s >= strend;
737 switch(TYPE_NO_ENDIANNESS(datumtype)) {
739 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)TYPE_NO_MODIFIERS(datumtype) );
742 if (howlen == e_no_len)
743 len = 16; /* len is not specified */
751 char *ss = s; /* Move from register */
752 tempsym_t savsym = *symptr;
753 symptr->patend = savsym.grpend;
757 symptr->patptr = savsym.grpbeg;
758 unpack_rec(symptr, ss, strbeg, strend, &ss );
759 if (ss == strend && savsym.howlen == e_star)
760 break; /* No way to continue */
764 savsym.flags = symptr->flags;
769 if (len > strend - strrelbeg)
770 Perl_croak(aTHX_ "'@' outside of string in unpack");
773 case 'X' | TYPE_IS_SHRIEKING:
774 if (!len) /* Avoid division by 0 */
776 len = (s - strbeg) % len;
779 if (len > s - strbeg)
780 Perl_croak(aTHX_ "'X' outside of string in unpack" );
783 case 'x' | TYPE_IS_SHRIEKING:
784 if (!len) /* Avoid division by 0 */
786 aint = (s - strbeg) % len;
787 if (aint) /* Other portable ways? */
793 if (len > strend - s)
794 Perl_croak(aTHX_ "'x' outside of string in unpack");
798 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
803 if (len > strend - s)
808 sv_setpvn(sv, s, len);
809 if (len > 0 && (datumtype == 'A' || datumtype == 'Z')) {
810 aptr = s; /* borrow register */
811 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
815 if (howlen == e_star) /* exact for 'Z*' */
816 len = s - SvPVX(sv) + 1;
818 else { /* 'A' strips both nulls and spaces */
819 s = SvPVX(sv) + len - 1;
820 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
824 SvCUR_set(sv, s - SvPVX(sv));
825 s = aptr; /* unborrow register */
828 XPUSHs(sv_2mortal(sv));
832 if (howlen == e_star || len > (strend - s) * 8)
833 len = (strend - s) * 8;
836 Newz(601, PL_bitcount, 256, char);
837 for (bits = 1; bits < 256; bits++) {
838 if (bits & 1) PL_bitcount[bits]++;
839 if (bits & 2) PL_bitcount[bits]++;
840 if (bits & 4) PL_bitcount[bits]++;
841 if (bits & 8) PL_bitcount[bits]++;
842 if (bits & 16) PL_bitcount[bits]++;
843 if (bits & 32) PL_bitcount[bits]++;
844 if (bits & 64) PL_bitcount[bits]++;
845 if (bits & 128) PL_bitcount[bits]++;
849 cuv += PL_bitcount[*(unsigned char*)s++];
854 if (datumtype == 'b') {
862 if (bits & 128) cuv++;
869 sv = NEWSV(35, len + 1);
873 if (datumtype == 'b') {
875 for (len = 0; len < aint; len++) {
876 if (len & 7) /*SUPPRESS 595*/
880 *str++ = '0' + (bits & 1);
885 for (len = 0; len < aint; len++) {
890 *str++ = '0' + ((bits & 128) != 0);
894 XPUSHs(sv_2mortal(sv));
898 if (howlen == e_star || len > (strend - s) * 2)
899 len = (strend - s) * 2;
900 sv = NEWSV(35, len + 1);
904 if (datumtype == 'h') {
906 for (len = 0; len < aint; len++) {
911 *str++ = PL_hexdigit[bits & 15];
916 for (len = 0; len < aint; len++) {
921 *str++ = PL_hexdigit[(bits >> 4) & 15];
925 XPUSHs(sv_2mortal(sv));
928 if (len > strend - s)
933 if (aint >= 128) /* fake up signed chars */
935 if (checksum > bits_in_uv)
942 if (len && unpack_only_one)
948 if (aint >= 128) /* fake up signed chars */
951 sv_setiv(sv, (IV)aint);
952 PUSHs(sv_2mortal(sv));
957 unpack_C: /* unpack U will jump here if not UTF-8 */
959 symptr->flags &= ~FLAG_UNPACK_DO_UTF8;
962 if (len > strend - s)
972 if (len && unpack_only_one)
979 sv_setiv(sv, (IV)auint);
980 PUSHs(sv_2mortal(sv));
986 symptr->flags |= FLAG_UNPACK_DO_UTF8;
989 if ((symptr->flags & FLAG_UNPACK_DO_UTF8) == 0)
991 if (len > strend - s)
994 while (len-- > 0 && s < strend) {
996 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
999 if (checksum > bits_in_uv)
1000 cdouble += (NV)auint;
1006 if (len && unpack_only_one)
1010 while (len-- > 0 && s < strend) {
1012 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
1016 sv_setuv(sv, (UV)auint);
1017 PUSHs(sv_2mortal(sv));
1021 case 's' | TYPE_IS_SHRIEKING:
1022 #if SHORTSIZE != SIZE16
1023 along = (strend - s) / sizeof(short);
1028 COPYNN(s, &ashort, sizeof(short));
1029 DO_BO_UNPACK(ashort, s);
1031 if (checksum > bits_in_uv)
1032 cdouble += (NV)ashort;
1038 if (len && unpack_only_one)
1043 COPYNN(s, &ashort, sizeof(short));
1044 DO_BO_UNPACK(ashort, s);
1047 sv_setiv(sv, (IV)ashort);
1048 PUSHs(sv_2mortal(sv));
1056 along = (strend - s) / SIZE16;
1062 DO_BO_UNPACK(ai16, 16);
1063 #if U16SIZE > SIZE16
1068 if (checksum > bits_in_uv)
1069 cdouble += (NV)ai16;
1075 if (len && unpack_only_one)
1082 DO_BO_UNPACK(ai16, 16);
1083 #if U16SIZE > SIZE16
1089 sv_setiv(sv, (IV)ai16);
1090 PUSHs(sv_2mortal(sv));
1094 case 'S' | TYPE_IS_SHRIEKING:
1095 #if SHORTSIZE != SIZE16
1096 along = (strend - s) / sizeof(unsigned short);
1101 COPYNN(s, &aushort, sizeof(unsigned short));
1102 DO_BO_UNPACK(aushort, s);
1103 s += sizeof(unsigned short);
1104 if (checksum > bits_in_uv)
1105 cdouble += (NV)aushort;
1111 if (len && unpack_only_one)
1116 COPYNN(s, &aushort, sizeof(unsigned short));
1117 DO_BO_UNPACK(aushort, s);
1118 s += sizeof(unsigned short);
1120 sv_setiv(sv, (UV)aushort);
1121 PUSHs(sv_2mortal(sv));
1131 along = (strend - s) / SIZE16;
1137 DO_BO_UNPACK(au16, 16);
1140 if (datumtype == 'n')
1141 au16 = PerlSock_ntohs(au16);
1144 if (datumtype == 'v')
1147 if (checksum > bits_in_uv)
1148 cdouble += (NV)au16;
1154 if (len && unpack_only_one)
1160 DO_BO_UNPACK(au16, 16);
1164 if (datumtype == 'n')
1165 au16 = PerlSock_ntohs(au16);
1168 if (datumtype == 'v')
1171 sv_setiv(sv, (UV)au16);
1172 PUSHs(sv_2mortal(sv));
1176 case 'v' | TYPE_IS_SHRIEKING:
1177 case 'n' | TYPE_IS_SHRIEKING:
1178 along = (strend - s) / SIZE16;
1186 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1187 ai16 = (I16)PerlSock_ntohs((U16)ai16);
1190 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1191 ai16 = (I16)vtohs((U16)ai16);
1193 if (checksum > bits_in_uv)
1194 cdouble += (NV)ai16;
1200 if (len && unpack_only_one)
1208 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1209 ai16 = (I16)PerlSock_ntohs((U16)ai16);
1212 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1213 ai16 = (I16)vtohs((U16)ai16);
1216 sv_setiv(sv, (IV)ai16);
1217 PUSHs(sv_2mortal(sv));
1222 case 'i' | TYPE_IS_SHRIEKING:
1223 along = (strend - s) / sizeof(int);
1228 Copy(s, &aint, 1, int);
1229 DO_BO_UNPACK(aint, i);
1231 if (checksum > bits_in_uv)
1232 cdouble += (NV)aint;
1238 if (len && unpack_only_one)
1243 Copy(s, &aint, 1, int);
1244 DO_BO_UNPACK(aint, i);
1248 /* Without the dummy below unpack("i", pack("i",-1))
1249 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
1250 * cc with optimization turned on.
1252 * The bug was detected in
1253 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
1254 * with optimization (-O4) turned on.
1255 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
1256 * does not have this problem even with -O4.
1258 * This bug was reported as DECC_BUGS 1431
1259 * and tracked internally as GEM_BUGS 7775.
1261 * The bug is fixed in
1262 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
1263 * UNIX V4.0F support: DEC C V5.9-006 or later
1264 * UNIX V4.0E support: DEC C V5.8-011 or later
1267 * See also few lines later for the same bug.
1270 sv_setiv(sv, (IV)aint) :
1272 sv_setiv(sv, (IV)aint);
1273 PUSHs(sv_2mortal(sv));
1278 case 'I' | TYPE_IS_SHRIEKING:
1279 along = (strend - s) / sizeof(unsigned int);
1284 Copy(s, &auint, 1, unsigned int);
1285 DO_BO_UNPACK(auint, i);
1286 s += sizeof(unsigned int);
1287 if (checksum > bits_in_uv)
1288 cdouble += (NV)auint;
1294 if (len && unpack_only_one)
1299 Copy(s, &auint, 1, unsigned int);
1300 DO_BO_UNPACK(auint, i);
1301 s += sizeof(unsigned int);
1304 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
1305 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
1306 * See details few lines earlier. */
1308 sv_setuv(sv, (UV)auint) :
1310 sv_setuv(sv, (UV)auint);
1311 PUSHs(sv_2mortal(sv));
1316 along = (strend - s) / IVSIZE;
1321 Copy(s, &aiv, 1, IV);
1322 #if IVSIZE == INTSIZE
1323 DO_BO_UNPACK(aiv, i);
1324 #elif IVSIZE == LONGSIZE
1325 DO_BO_UNPACK(aiv, l);
1326 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1327 DO_BO_UNPACK(aiv, 64);
1330 if (checksum > bits_in_uv)
1337 if (len && unpack_only_one)
1342 Copy(s, &aiv, 1, IV);
1343 #if IVSIZE == INTSIZE
1344 DO_BO_UNPACK(aiv, i);
1345 #elif IVSIZE == LONGSIZE
1346 DO_BO_UNPACK(aiv, l);
1347 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1348 DO_BO_UNPACK(aiv, 64);
1353 PUSHs(sv_2mortal(sv));
1358 along = (strend - s) / UVSIZE;
1363 Copy(s, &auv, 1, UV);
1364 #if UVSIZE == INTSIZE
1365 DO_BO_UNPACK(auv, i);
1366 #elif UVSIZE == LONGSIZE
1367 DO_BO_UNPACK(auv, l);
1368 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
1369 DO_BO_UNPACK(auv, 64);
1372 if (checksum > bits_in_uv)
1379 if (len && unpack_only_one)
1384 Copy(s, &auv, 1, UV);
1385 #if UVSIZE == INTSIZE
1386 DO_BO_UNPACK(auv, i);
1387 #elif UVSIZE == LONGSIZE
1388 DO_BO_UNPACK(auv, l);
1389 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
1390 DO_BO_UNPACK(auv, 64);
1395 PUSHs(sv_2mortal(sv));
1399 case 'l' | TYPE_IS_SHRIEKING:
1400 #if LONGSIZE != SIZE32
1401 along = (strend - s) / sizeof(long);
1406 COPYNN(s, &along, sizeof(long));
1407 DO_BO_UNPACK(along, l);
1409 if (checksum > bits_in_uv)
1410 cdouble += (NV)along;
1416 if (len && unpack_only_one)
1421 COPYNN(s, &along, sizeof(long));
1422 DO_BO_UNPACK(along, l);
1425 sv_setiv(sv, (IV)along);
1426 PUSHs(sv_2mortal(sv));
1434 along = (strend - s) / SIZE32;
1439 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1443 DO_BO_UNPACK(along, 32);
1444 #if LONGSIZE > SIZE32
1445 if (along > 2147483647)
1446 along -= 4294967296;
1449 if (checksum > bits_in_uv)
1450 cdouble += (NV)along;
1456 if (len && unpack_only_one)
1461 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1465 DO_BO_UNPACK(along, 32);
1466 #if LONGSIZE > SIZE32
1467 if (along > 2147483647)
1468 along -= 4294967296;
1472 sv_setiv(sv, (IV)along);
1473 PUSHs(sv_2mortal(sv));
1477 case 'L' | TYPE_IS_SHRIEKING:
1478 #if LONGSIZE != SIZE32
1479 along = (strend - s) / sizeof(unsigned long);
1484 COPYNN(s, &aulong, sizeof(unsigned long));
1485 DO_BO_UNPACK(aulong, l);
1486 s += sizeof(unsigned long);
1487 if (checksum > bits_in_uv)
1488 cdouble += (NV)aulong;
1494 if (len && unpack_only_one)
1499 COPYNN(s, &aulong, sizeof(unsigned long));
1500 DO_BO_UNPACK(aulong, l);
1501 s += sizeof(unsigned long);
1503 sv_setuv(sv, (UV)aulong);
1504 PUSHs(sv_2mortal(sv));
1514 along = (strend - s) / SIZE32;
1520 DO_BO_UNPACK(au32, 32);
1523 if (datumtype == 'N')
1524 au32 = PerlSock_ntohl(au32);
1527 if (datumtype == 'V')
1530 if (checksum > bits_in_uv)
1531 cdouble += (NV)au32;
1537 if (len && unpack_only_one)
1543 DO_BO_UNPACK(au32, 32);
1546 if (datumtype == 'N')
1547 au32 = PerlSock_ntohl(au32);
1550 if (datumtype == 'V')
1554 sv_setuv(sv, (UV)au32);
1555 PUSHs(sv_2mortal(sv));
1559 case 'V' | TYPE_IS_SHRIEKING:
1560 case 'N' | TYPE_IS_SHRIEKING:
1561 along = (strend - s) / SIZE32;
1569 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1570 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1573 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1574 ai32 = (I32)vtohl((U32)ai32);
1576 if (checksum > bits_in_uv)
1577 cdouble += (NV)ai32;
1583 if (len && unpack_only_one)
1591 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1592 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1595 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1596 ai32 = (I32)vtohl((U32)ai32);
1599 sv_setiv(sv, (IV)ai32);
1600 PUSHs(sv_2mortal(sv));
1605 along = (strend - s) / sizeof(char*);
1611 if (sizeof(char*) > strend - s)
1614 Copy(s, &aptr, 1, char*);
1615 DO_BO_UNPACK_P(aptr);
1621 PUSHs(sv_2mortal(sv));
1625 if (len && unpack_only_one)
1633 while ((len > 0) && (s < strend)) {
1634 auv = (auv << 7) | (*s & 0x7f);
1635 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1636 if ((U8)(*s++) < 0x80) {
1640 PUSHs(sv_2mortal(sv));
1644 else if (++bytes >= sizeof(UV)) { /* promote to string */
1648 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1649 while (s < strend) {
1650 sv = mul128(sv, (U8)(*s & 0x7f));
1651 if (!(*s++ & 0x80)) {
1660 PUSHs(sv_2mortal(sv));
1665 if ((s >= strend) && bytes)
1666 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
1670 if (symptr->howlen == e_star)
1671 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
1673 if (sizeof(char*) > strend - s)
1676 Copy(s, &aptr, 1, char*);
1677 DO_BO_UNPACK_P(aptr);
1682 sv_setpvn(sv, aptr, len);
1683 PUSHs(sv_2mortal(sv));
1687 along = (strend - s) / sizeof(Quad_t);
1692 Copy(s, &aquad, 1, Quad_t);
1693 DO_BO_UNPACK(aquad, 64);
1694 s += sizeof(Quad_t);
1695 if (checksum > bits_in_uv)
1696 cdouble += (NV)aquad;
1702 if (len && unpack_only_one)
1707 if (s + sizeof(Quad_t) > strend)
1710 Copy(s, &aquad, 1, Quad_t);
1711 DO_BO_UNPACK(aquad, 64);
1712 s += sizeof(Quad_t);
1715 if (aquad >= IV_MIN && aquad <= IV_MAX)
1716 sv_setiv(sv, (IV)aquad);
1718 sv_setnv(sv, (NV)aquad);
1719 PUSHs(sv_2mortal(sv));
1724 along = (strend - s) / sizeof(Uquad_t);
1729 Copy(s, &auquad, 1, Uquad_t);
1730 DO_BO_UNPACK(auquad, 64);
1731 s += sizeof(Uquad_t);
1732 if (checksum > bits_in_uv)
1733 cdouble += (NV)auquad;
1739 if (len && unpack_only_one)
1744 if (s + sizeof(Uquad_t) > strend)
1747 Copy(s, &auquad, 1, Uquad_t);
1748 DO_BO_UNPACK(auquad, 64);
1749 s += sizeof(Uquad_t);
1752 if (auquad <= UV_MAX)
1753 sv_setuv(sv, (UV)auquad);
1755 sv_setnv(sv, (NV)auquad);
1756 PUSHs(sv_2mortal(sv));
1761 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1763 along = (strend - s) / sizeof(float);
1768 Copy(s, &afloat, 1, float);
1769 DO_BO_UNPACK_N(afloat, float);
1775 if (len && unpack_only_one)
1780 Copy(s, &afloat, 1, float);
1781 DO_BO_UNPACK_N(afloat, float);
1784 sv_setnv(sv, (NV)afloat);
1785 PUSHs(sv_2mortal(sv));
1790 along = (strend - s) / sizeof(double);
1795 Copy(s, &adouble, 1, double);
1796 DO_BO_UNPACK_N(adouble, double);
1797 s += sizeof(double);
1802 if (len && unpack_only_one)
1807 Copy(s, &adouble, 1, double);
1808 DO_BO_UNPACK_N(adouble, double);
1809 s += sizeof(double);
1811 sv_setnv(sv, (NV)adouble);
1812 PUSHs(sv_2mortal(sv));
1817 along = (strend - s) / NVSIZE;
1822 Copy(s, &anv, 1, NV);
1823 DO_BO_UNPACK_N(anv, NV);
1829 if (len && unpack_only_one)
1834 Copy(s, &anv, 1, NV);
1835 DO_BO_UNPACK_N(anv, NV);
1839 PUSHs(sv_2mortal(sv));
1843 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1845 along = (strend - s) / LONG_DOUBLESIZE;
1850 Copy(s, &aldouble, 1, long double);
1851 DO_BO_UNPACK_N(aldouble, long double);
1852 s += LONG_DOUBLESIZE;
1853 cdouble += aldouble;
1857 if (len && unpack_only_one)
1862 Copy(s, &aldouble, 1, long double);
1863 DO_BO_UNPACK_N(aldouble, long double);
1864 s += LONG_DOUBLESIZE;
1866 sv_setnv(sv, (NV)aldouble);
1867 PUSHs(sv_2mortal(sv));
1874 * Initialise the decode mapping. By using a table driven
1875 * algorithm, the code will be character-set independent
1876 * (and just as fast as doing character arithmetic)
1878 if (PL_uudmap['M'] == 0) {
1881 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1882 PL_uudmap[(U8)PL_uuemap[i]] = i;
1884 * Because ' ' and '`' map to the same value,
1885 * we need to decode them both the same.
1890 along = (strend - s) * 3 / 4;
1891 sv = NEWSV(42, along);
1894 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1899 len = PL_uudmap[*(U8*)s++] & 077;
1901 if (s < strend && ISUUCHAR(*s))
1902 a = PL_uudmap[*(U8*)s++] & 077;
1905 if (s < strend && ISUUCHAR(*s))
1906 b = PL_uudmap[*(U8*)s++] & 077;
1909 if (s < strend && ISUUCHAR(*s))
1910 c = PL_uudmap[*(U8*)s++] & 077;
1913 if (s < strend && ISUUCHAR(*s))
1914 d = PL_uudmap[*(U8*)s++] & 077;
1917 hunk[0] = (char)((a << 2) | (b >> 4));
1918 hunk[1] = (char)((b << 4) | (c >> 2));
1919 hunk[2] = (char)((c << 6) | d);
1920 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1925 else /* possible checksum byte */
1926 if (s + 1 < strend && s[1] == '\n')
1929 XPUSHs(sv_2mortal(sv));
1935 if (strchr("fFdD", TYPE_NO_MODIFIERS(datumtype)) ||
1936 (checksum > bits_in_uv &&
1937 strchr("csSiIlLnNUvVqQjJ", TYPE_NO_MODIFIERS(datumtype))) ) {
1940 adouble = (NV) (1 << (checksum & 15));
1941 while (checksum >= 16) {
1945 while (cdouble < 0.0)
1947 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1948 sv_setnv(sv, cdouble);
1951 if (checksum < bits_in_uv) {
1952 UV mask = ((UV)1 << checksum) - 1;
1957 XPUSHs(sv_2mortal(sv));
1961 if (symptr->flags & FLAG_SLASH){
1962 if (SP - PL_stack_base - start_sp_offset <= 0)
1963 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1964 if( next_symbol(symptr) ){
1965 if( symptr->howlen == e_number )
1966 Perl_croak(aTHX_ "Count after length/code in unpack" );
1968 /* ...end of char buffer then no decent length available */
1969 Perl_croak(aTHX_ "length/code after end of string in unpack" );
1971 /* take top of stack (hope it's numeric) */
1974 Perl_croak(aTHX_ "Negative '/' count in unpack" );
1977 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
1979 datumtype = symptr->code;
1987 return SP - PL_stack_base - start_sp_offset;
1994 I32 gimme = GIMME_V;
1997 register char *pat = SvPV(left, llen);
1998 #ifdef PACKED_IS_OCTETS
1999 /* Packed side is assumed to be octets - so force downgrade if it
2000 has been UTF-8 encoded by accident
2002 register char *s = SvPVbyte(right, rlen);
2004 register char *s = SvPV(right, rlen);
2006 char *strend = s + rlen;
2007 register char *patend = pat + llen;
2011 cnt = unpackstring(pat, patend, s, strend,
2012 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
2013 | (DO_UTF8(right) ? FLAG_UNPACK_DO_UTF8 : 0));
2016 if ( !cnt && gimme == G_SCALAR )
2017 PUSHs(&PL_sv_undef);
2022 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
2026 *hunk = PL_uuemap[len];
2027 sv_catpvn(sv, hunk, 1);
2030 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
2031 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
2032 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
2033 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
2034 sv_catpvn(sv, hunk, 4);
2039 char r = (len > 1 ? s[1] : '\0');
2040 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
2041 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
2042 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
2043 hunk[3] = PL_uuemap[0];
2044 sv_catpvn(sv, hunk, 4);
2046 sv_catpvn(sv, "\n", 1);
2050 S_is_an_int(pTHX_ char *s, STRLEN l)
2053 SV *result = newSVpvn(s, l);
2054 char *result_c = SvPV(result, n_a); /* convenience */
2055 char *out = result_c;
2065 SvREFCNT_dec(result);
2088 SvREFCNT_dec(result);
2094 SvCUR_set(result, out - result_c);
2098 /* pnum must be '\0' terminated */
2100 S_div128(pTHX_ SV *pnum, bool *done)
2103 char *s = SvPV(pnum, len);
2112 i = m * 10 + (*t - '0');
2114 r = (i >> 7); /* r < 10 */
2121 SvCUR_set(pnum, (STRLEN) (t - s));
2128 =for apidoc pack_cat
2130 The engine implementing pack() Perl function. Note: parameters next_in_list and
2131 flags are not used. This call should not be used; use packlist instead.
2137 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
2139 tempsym_t sym = { 0 };
2141 sym.patend = patend;
2142 sym.flags = FLAG_PACK;
2144 (void)pack_rec( cat, &sym, beglist, endlist );
2149 =for apidoc packlist
2151 The engine implementing pack() Perl function.
2157 Perl_packlist(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist )
2159 tempsym_t sym = { 0 };
2161 sym.patend = patend;
2162 sym.flags = FLAG_PACK;
2164 (void)pack_rec( cat, &sym, beglist, endlist );
2170 S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV **endlist )
2174 register I32 len = 0;
2177 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
2178 static char *space10 = " ";
2181 /* These must not be in registers: */
2191 #if SHORTSIZE != SIZE16
2193 unsigned short aushort;
2197 #if LONGSIZE != SIZE32
2199 unsigned long aulong;
2204 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2205 long double aldouble;
2211 int strrelbeg = SvCUR(cat);
2212 tempsym_t lookahead;
2214 items = endlist - beglist;
2215 found = next_symbol( symptr );
2217 #ifndef PACKED_IS_OCTETS
2218 if (symptr->level == 0 && found && symptr->code == 'U' ){
2224 SV *lengthcode = Nullsv;
2225 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
2227 I32 datumtype = symptr->code;
2230 switch( howlen = symptr->howlen ){
2233 len = symptr->length;
2236 len = strchr("@Xxu", TYPE_NO_MODIFIERS(datumtype)) ? 0 : items;
2240 /* Look ahead for next symbol. Do we have code/code? */
2241 lookahead = *symptr;
2242 found = next_symbol(&lookahead);
2243 if ( symptr->flags & FLAG_SLASH ) {
2245 if ( 0 == strchr( "aAZ", lookahead.code ) ||
2246 e_star != lookahead.howlen )
2247 Perl_croak(aTHX_ "'/' must be followed by 'a*', 'A*' or 'Z*' in pack");
2248 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
2249 ? *beglist : &PL_sv_no)
2250 + (lookahead.code == 'Z' ? 1 : 0)));
2252 Perl_croak(aTHX_ "Code missing after '/' in pack");
2256 switch(TYPE_NO_ENDIANNESS(datumtype)) {
2258 Perl_croak(aTHX_ "Invalid type '%c' in pack", (int)TYPE_NO_MODIFIERS(datumtype));
2260 Perl_croak(aTHX_ "'%%' may not be used in pack");
2262 len += strrelbeg - SvCUR(cat);
2271 tempsym_t savsym = *symptr;
2272 symptr->patend = savsym.grpend;
2275 symptr->patptr = savsym.grpbeg;
2276 beglist = pack_rec(cat, symptr, beglist, endlist );
2277 if (savsym.howlen == e_star && beglist == endlist)
2278 break; /* No way to continue */
2280 lookahead.flags = symptr->flags;
2284 case 'X' | TYPE_IS_SHRIEKING:
2285 if (!len) /* Avoid division by 0 */
2287 len = (SvCUR(cat)) % len;
2291 if ((I32)SvCUR(cat) < len)
2292 Perl_croak(aTHX_ "'X' outside of string in pack");
2296 case 'x' | TYPE_IS_SHRIEKING:
2297 if (!len) /* Avoid division by 0 */
2299 aint = (SvCUR(cat)) % len;
2300 if (aint) /* Other portable ways? */
2309 sv_catpvn(cat, null10, 10);
2312 sv_catpvn(cat, null10, len);
2318 aptr = SvPV(fromstr, fromlen);
2319 if (howlen == e_star) {
2321 if (datumtype == 'Z')
2324 if ((I32)fromlen >= len) {
2325 sv_catpvn(cat, aptr, len);
2326 if (datumtype == 'Z')
2327 *(SvEND(cat)-1) = '\0';
2330 sv_catpvn(cat, aptr, fromlen);
2332 if (datumtype == 'A') {
2334 sv_catpvn(cat, space10, 10);
2337 sv_catpvn(cat, space10, len);
2341 sv_catpvn(cat, null10, 10);
2344 sv_catpvn(cat, null10, len);
2356 str = SvPV(fromstr, fromlen);
2357 if (howlen == e_star)
2360 SvCUR(cat) += (len+7)/8;
2361 SvGROW(cat, SvCUR(cat) + 1);
2362 aptr = SvPVX(cat) + aint;
2363 if (len > (I32)fromlen)
2367 if (datumtype == 'B') {
2368 for (len = 0; len++ < aint;) {
2369 items |= *str++ & 1;
2373 *aptr++ = items & 0xff;
2379 for (len = 0; len++ < aint;) {
2385 *aptr++ = items & 0xff;
2391 if (datumtype == 'B')
2392 items <<= 7 - (aint & 7);
2394 items >>= 7 - (aint & 7);
2395 *aptr++ = items & 0xff;
2397 str = SvPVX(cat) + SvCUR(cat);
2412 str = SvPV(fromstr, fromlen);
2413 if (howlen == e_star)
2416 SvCUR(cat) += (len+1)/2;
2417 SvGROW(cat, SvCUR(cat) + 1);
2418 aptr = SvPVX(cat) + aint;
2419 if (len > (I32)fromlen)
2423 if (datumtype == 'H') {
2424 for (len = 0; len++ < aint;) {
2426 items |= ((*str++ & 15) + 9) & 15;
2428 items |= *str++ & 15;
2432 *aptr++ = items & 0xff;
2438 for (len = 0; len++ < aint;) {
2440 items |= (((*str++ & 15) + 9) & 15) << 4;
2442 items |= (*str++ & 15) << 4;
2446 *aptr++ = items & 0xff;
2452 *aptr++ = items & 0xff;
2453 str = SvPVX(cat) + SvCUR(cat);
2464 switch (TYPE_NO_MODIFIERS(datumtype)) {
2466 aint = SvIV(fromstr);
2467 if ((aint < 0 || aint > 255) &&
2469 Perl_warner(aTHX_ packWARN(WARN_PACK),
2470 "Character in 'C' format wrapped in pack");
2472 sv_catpvn(cat, &achar, sizeof(char));
2475 aint = SvIV(fromstr);
2476 if ((aint < -128 || aint > 127) &&
2478 Perl_warner(aTHX_ packWARN(WARN_PACK),
2479 "Character in 'c' format wrapped in pack" );
2481 sv_catpvn(cat, &achar, sizeof(char));
2489 auint = UNI_TO_NATIVE(SvUV(fromstr));
2490 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
2492 (char*)uvchr_to_utf8_flags((U8*)SvEND(cat),
2495 0 : UNICODE_ALLOW_ANY)
2500 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
2505 /* VOS does not automatically map a floating-point overflow
2506 during conversion from double to float into infinity, so we
2507 do it by hand. This code should either be generalized for
2508 any OS that needs it, or removed if and when VOS implements
2509 posix-976 (suggestion to support mapping to infinity).
2510 Paul.Green@stratus.com 02-04-02. */
2511 if (SvNV(fromstr) > FLT_MAX)
2512 afloat = _float_constants[0]; /* single prec. inf. */
2513 else if (SvNV(fromstr) < -FLT_MAX)
2514 afloat = _float_constants[0]; /* single prec. inf. */
2515 else afloat = (float)SvNV(fromstr);
2517 # if defined(VMS) && !defined(__IEEE_FP)
2518 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2519 * on Alpha; fake it if we don't have them.
2521 if (SvNV(fromstr) > FLT_MAX)
2523 else if (SvNV(fromstr) < -FLT_MAX)
2525 else afloat = (float)SvNV(fromstr);
2527 afloat = (float)SvNV(fromstr);
2530 DO_BO_PACK_N(afloat, float);
2531 sv_catpvn(cat, (char *)&afloat, sizeof (float));
2538 /* VOS does not automatically map a floating-point overflow
2539 during conversion from long double to double into infinity,
2540 so we do it by hand. This code should either be generalized
2541 for any OS that needs it, or removed if and when VOS
2542 implements posix-976 (suggestion to support mapping to
2543 infinity). Paul.Green@stratus.com 02-04-02. */
2544 if (SvNV(fromstr) > DBL_MAX)
2545 adouble = _double_constants[0]; /* double prec. inf. */
2546 else if (SvNV(fromstr) < -DBL_MAX)
2547 adouble = _double_constants[0]; /* double prec. inf. */
2548 else adouble = (double)SvNV(fromstr);
2550 # if defined(VMS) && !defined(__IEEE_FP)
2551 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2552 * on Alpha; fake it if we don't have them.
2554 if (SvNV(fromstr) > DBL_MAX)
2556 else if (SvNV(fromstr) < -DBL_MAX)
2558 else adouble = (double)SvNV(fromstr);
2560 adouble = (double)SvNV(fromstr);
2563 DO_BO_PACK_N(adouble, double);
2564 sv_catpvn(cat, (char *)&adouble, sizeof (double));
2568 Zero(&anv, 1, NV); /* can be long double with unused bits */
2571 anv = SvNV(fromstr);
2572 DO_BO_PACK_N(anv, NV);
2573 sv_catpvn(cat, (char *)&anv, NVSIZE);
2576 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2578 /* long doubles can have unused bits, which may be nonzero */
2579 Zero(&aldouble, 1, long double);
2582 aldouble = (long double)SvNV(fromstr);
2583 DO_BO_PACK_N(aldouble, long double);
2584 sv_catpvn(cat, (char *)&aldouble, LONG_DOUBLESIZE);
2588 case 'n' | TYPE_IS_SHRIEKING:
2592 ai16 = (I16)SvIV(fromstr);
2594 ai16 = PerlSock_htons(ai16);
2599 case 'v' | TYPE_IS_SHRIEKING:
2603 ai16 = (I16)SvIV(fromstr);
2610 case 'S' | TYPE_IS_SHRIEKING:
2611 #if SHORTSIZE != SIZE16
2615 aushort = SvUV(fromstr);
2616 DO_BO_PACK(aushort, s);
2617 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
2628 au16 = (U16)SvUV(fromstr);
2629 DO_BO_PACK(au16, 16);
2635 case 's' | TYPE_IS_SHRIEKING:
2636 #if SHORTSIZE != SIZE16
2640 ashort = SvIV(fromstr);
2641 DO_BO_PACK(ashort, s);
2642 sv_catpvn(cat, (char *)&ashort, sizeof(short));
2652 ai16 = (I16)SvIV(fromstr);
2653 DO_BO_PACK(ai16, 16);
2658 case 'I' | TYPE_IS_SHRIEKING:
2661 auint = SvUV(fromstr);
2662 DO_BO_PACK(auint, i);
2663 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
2669 aiv = SvIV(fromstr);
2670 #if IVSIZE == INTSIZE
2672 #elif IVSIZE == LONGSIZE
2674 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
2675 DO_BO_PACK(aiv, 64);
2677 sv_catpvn(cat, (char*)&aiv, IVSIZE);
2683 auv = SvUV(fromstr);
2684 #if UVSIZE == INTSIZE
2686 #elif UVSIZE == LONGSIZE
2688 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
2689 DO_BO_PACK(auv, 64);
2691 sv_catpvn(cat, (char*)&auv, UVSIZE);
2697 anv = SvNV(fromstr);
2700 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
2702 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
2703 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
2704 any negative IVs will have already been got by the croak()
2705 above. IOK is untrue for fractions, so we test them
2706 against UV_MAX_P1. */
2707 if (SvIOK(fromstr) || anv < UV_MAX_P1)
2709 char buf[(sizeof(UV)*8)/7+1];
2710 char *in = buf + sizeof(buf);
2711 UV auv = SvUV(fromstr);
2714 *--in = (char)((auv & 0x7f) | 0x80);
2717 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2718 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2720 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
2721 char *from, *result, *in;
2726 /* Copy string and check for compliance */
2727 from = SvPV(fromstr, len);
2728 if ((norm = is_an_int(from, len)) == NULL)
2729 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2731 New('w', result, len, char);
2735 *--in = div128(norm, &done) | 0x80;
2736 result[len - 1] &= 0x7F; /* clear continue bit */
2737 sv_catpvn(cat, in, (result + len) - in);
2739 SvREFCNT_dec(norm); /* free norm */
2741 else if (SvNOKp(fromstr)) {
2742 /* 10**NV_MAX_10_EXP is the largest power of 10
2743 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
2744 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
2745 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
2746 And with that many bytes only Inf can overflow.
2747 Some C compilers are strict about integral constant
2748 expressions so we conservatively divide by a slightly
2749 smaller integer instead of multiplying by the exact
2750 floating-point value.
2752 #ifdef NV_MAX_10_EXP
2753 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
2754 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
2756 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
2757 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
2759 char *in = buf + sizeof(buf);
2761 anv = Perl_floor(anv);
2763 NV next = Perl_floor(anv / 128);
2764 if (in <= buf) /* this cannot happen ;-) */
2765 Perl_croak(aTHX_ "Cannot compress integer in pack");
2766 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
2769 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2770 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2773 char *from, *result, *in;
2778 /* Copy string and check for compliance */
2779 from = SvPV(fromstr, len);
2780 if ((norm = is_an_int(from, len)) == NULL)
2781 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2783 New('w', result, len, char);
2787 *--in = div128(norm, &done) | 0x80;
2788 result[len - 1] &= 0x7F; /* clear continue bit */
2789 sv_catpvn(cat, in, (result + len) - in);
2791 SvREFCNT_dec(norm); /* free norm */
2796 case 'i' | TYPE_IS_SHRIEKING:
2799 aint = SvIV(fromstr);
2800 DO_BO_PACK(aint, i);
2801 sv_catpvn(cat, (char*)&aint, sizeof(int));
2804 case 'N' | TYPE_IS_SHRIEKING:
2808 au32 = SvUV(fromstr);
2810 au32 = PerlSock_htonl(au32);
2815 case 'V' | TYPE_IS_SHRIEKING:
2819 au32 = SvUV(fromstr);
2826 case 'L' | TYPE_IS_SHRIEKING:
2827 #if LONGSIZE != SIZE32
2831 aulong = SvUV(fromstr);
2832 DO_BO_PACK(aulong, l);
2833 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2844 au32 = SvUV(fromstr);
2845 DO_BO_PACK(au32, 32);
2850 case 'l' | TYPE_IS_SHRIEKING:
2851 #if LONGSIZE != SIZE32
2855 along = SvIV(fromstr);
2856 DO_BO_PACK(along, l);
2857 sv_catpvn(cat, (char *)&along, sizeof(long));
2867 ai32 = SvIV(fromstr);
2868 DO_BO_PACK(ai32, 32);
2876 auquad = (Uquad_t)SvUV(fromstr);
2877 DO_BO_PACK(auquad, 64);
2878 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2884 aquad = (Quad_t)SvIV(fromstr);
2885 DO_BO_PACK(aquad, 64);
2886 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2891 len = 1; /* assume SV is correct length */
2896 if (fromstr == &PL_sv_undef)
2900 /* XXX better yet, could spirit away the string to
2901 * a safe spot and hang on to it until the result
2902 * of pack() (and all copies of the result) are
2905 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2906 || (SvPADTMP(fromstr)
2907 && !SvREADONLY(fromstr))))
2909 Perl_warner(aTHX_ packWARN(WARN_PACK),
2910 "Attempt to pack pointer to temporary value");
2912 if (SvPOK(fromstr) || SvNIOK(fromstr))
2913 aptr = SvPV(fromstr,n_a);
2915 aptr = SvPV_force(fromstr,n_a);
2918 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2923 aptr = SvPV(fromstr, fromlen);
2924 SvGROW(cat, fromlen * 4 / 3);
2929 while (fromlen > 0) {
2932 if ((I32)fromlen > len)
2936 doencodes(cat, aptr, todo);
2942 *symptr = lookahead;
2951 dSP; dMARK; dORIGMARK; dTARGET;
2952 register SV *cat = TARG;
2954 register char *pat = SvPVx(*++MARK, fromlen);
2955 register char *patend = pat + fromlen;
2958 sv_setpvn(cat, "", 0);
2960 packlist(cat, pat, patend, MARK, SP + 1);