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 * Offset for integer pack/unpack.
26 * On architectures where I16 and I32 aren't really 16 and 32 bits,
27 * which for now are all Crays, pack and unpack have to play games.
31 * These values are required for portability of pack() output.
32 * If they're not right on your machine, then pack() and unpack()
33 * wouldn't work right anyway; you'll need to apply the Cray hack.
34 * (I'd like to check them with #if, but you can't use sizeof() in
35 * the preprocessor.) --???
38 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
39 defines are now in config.h. --Andy Dougherty April 1998
44 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
47 #if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
48 # define PERL_NATINT_PACK
51 #if LONGSIZE > 4 && defined(_CRAY)
52 # if BYTEORDER == 0x12345678
53 # define OFF16(p) (char*)(p)
54 # define OFF32(p) (char*)(p)
56 # if BYTEORDER == 0x87654321
57 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
58 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
60 }}}} bad cray byte order
63 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
64 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
65 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
66 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
67 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
69 # define COPY16(s,p) Copy(s, p, SIZE16, char)
70 # define COPY32(s,p) Copy(s, p, SIZE32, char)
71 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
72 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
73 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
76 /* Avoid stack overflow due to pathological templates. 100 should be plenty. */
77 #define MAX_SUB_TEMPLATE_LEVEL 100
80 #define FLAG_UNPACK_ONLY_ONE 0x10
81 #define FLAG_UNPACK_DO_UTF8 0x08
82 #define FLAG_SLASH 0x04
83 #define FLAG_COMMA 0x02
84 #define FLAG_PACK 0x01
87 S_mul128(pTHX_ SV *sv, U8 m)
90 char *s = SvPV(sv, len);
94 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
95 SV *tmpNew = newSVpvn("0000000000", 10);
98 SvREFCNT_dec(sv); /* free old sv */
103 while (!*t) /* trailing '\0'? */
106 i = ((*t - '0') << 7) + m;
107 *(t--) = '0' + (char)(i % 10);
113 /* Explosives and implosives. */
115 #if 'I' == 73 && 'J' == 74
116 /* On an ASCII/ISO kind of system */
117 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
120 Some other sort of character set - use memchr() so we don't match
123 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
126 #define TYPE_IS_SHRIEKING 0x100
128 /* Returns the sizeof() struct described by pat */
130 S_measure_struct(pTHX_ register tempsym_t* symptr)
132 register I32 len = 0;
133 register I32 total = 0;
138 while (next_symbol(symptr)) {
140 switch( symptr->howlen ){
143 len = symptr->length;
146 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
147 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
151 switch(symptr->code) {
153 Perl_croak(aTHX_ "Invalid type '%c' in %s",
155 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
158 case 'U': /* XXXX Is it correct? */
161 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
163 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
169 tempsym_t savsym = *symptr;
170 symptr->patptr = savsym.grpbeg;
171 symptr->patend = savsym.grpend;
172 /* XXXX Theoretically, we need to measure many times at different
173 positions, since the subexpression may contain
174 alignment commands, but be not of aligned length.
175 Need to detect this and croak(). */
176 size = measure_struct(symptr);
180 case 'X' | TYPE_IS_SHRIEKING:
181 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS. */
182 if (!len) /* Avoid division by 0 */
184 len = total % len; /* Assumed: the start is aligned. */
189 Perl_croak(aTHX_ "'X' outside of string in %s",
190 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
192 case 'x' | TYPE_IS_SHRIEKING:
193 if (!len) /* Avoid division by 0 */
195 star = total % len; /* Assumed: the start is aligned. */
196 if (star) /* Other portable ways? */
219 case 's' | TYPE_IS_SHRIEKING:
220 #if SHORTSIZE != SIZE16
221 size = sizeof(short);
229 case 'S' | TYPE_IS_SHRIEKING:
230 #if SHORTSIZE != SIZE16
231 size = sizeof(unsigned short);
241 case 'i' | TYPE_IS_SHRIEKING:
245 case 'I' | TYPE_IS_SHRIEKING:
247 size = sizeof(unsigned int);
255 case 'l' | TYPE_IS_SHRIEKING:
256 #if LONGSIZE != SIZE32
265 case 'L' | TYPE_IS_SHRIEKING:
266 #if LONGSIZE != SIZE32
267 size = sizeof(unsigned long);
281 size = sizeof(char*);
285 size = sizeof(Quad_t);
288 size = sizeof(Uquad_t);
292 size = sizeof(float);
295 size = sizeof(double);
300 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
302 size = LONG_DOUBLESIZE;
312 /* locate matching closing parenthesis or bracket
313 * returns char pointer to char after match, or NULL
316 S_group_end(pTHX_ register char *patptr, register char *patend, char ender)
318 while (patptr < patend) {
326 while (patptr < patend && *patptr != '\n')
330 patptr = group_end(patptr, patend, ')') + 1;
332 patptr = group_end(patptr, patend, ']') + 1;
334 Perl_croak(aTHX_ "No group ending character '%c' found in template",
340 /* Convert unsigned decimal number to binary.
341 * Expects a pointer to the first digit and address of length variable
342 * Advances char pointer to 1st non-digit char and returns number
345 S_get_num(pTHX_ register char *patptr, I32 *lenptr )
347 I32 len = *patptr++ - '0';
348 while (isDIGIT(*patptr)) {
349 if (len >= 0x7FFFFFFF/10)
350 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
351 len = (len * 10) + (*patptr++ - '0');
357 /* The marvellous template parsing routine: Using state stored in *symptr,
358 * locates next template code and count
361 S_next_symbol(pTHX_ register tempsym_t* symptr )
363 register char* patptr = symptr->patptr;
364 register char* patend = symptr->patend;
366 symptr->flags &= ~FLAG_SLASH;
368 while (patptr < patend) {
369 if (isSPACE(*patptr))
371 else if (*patptr == '#') {
373 while (patptr < patend && *patptr != '\n')
378 /* We should have found a template code */
379 I32 code = *patptr++ & 0xFF;
381 if (code == ','){ /* grandfather in commas but with a warning */
382 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
383 symptr->flags |= FLAG_COMMA;
384 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
385 "Invalid type ',' in %s",
386 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
391 /* for '(', skip to ')' */
393 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
394 Perl_croak(aTHX_ "()-group starts with a count in %s",
395 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
396 symptr->grpbeg = patptr;
397 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
398 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
399 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
400 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
403 /* test for '!' modifier */
404 if (patptr < patend && *patptr == '!') {
405 static const char natstr[] = "sSiIlLxX";
407 if (strchr(natstr, code))
408 code |= TYPE_IS_SHRIEKING;
410 Perl_croak(aTHX_ "'!' allowed only after types %s in %s",
411 natstr, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
414 /* look for count and/or / */
415 if (patptr < patend) {
416 if (isDIGIT(*patptr)) {
417 patptr = get_num( patptr, &symptr->length );
418 symptr->howlen = e_number;
420 } else if (*patptr == '*') {
422 symptr->howlen = e_star;
424 } else if (*patptr == '[') {
425 char* lenptr = ++patptr;
426 symptr->howlen = e_number;
427 patptr = group_end( patptr, patend, ']' ) + 1;
428 /* what kind of [] is it? */
429 if (isDIGIT(*lenptr)) {
430 lenptr = get_num( lenptr, &symptr->length );
432 Perl_croak(aTHX_ "Malformed integer in [] in %s",
433 symptr->flags & FLAG_PACK ? "pack" : "unpack");
435 tempsym_t savsym = *symptr;
436 symptr->patend = patptr-1;
437 symptr->patptr = lenptr;
438 savsym.length = measure_struct(symptr);
442 symptr->howlen = e_no_len;
447 while (patptr < patend) {
448 if (isSPACE(*patptr))
450 else if (*patptr == '#') {
452 while (patptr < patend && *patptr != '\n')
457 if( *patptr == '/' ){
458 symptr->flags |= FLAG_SLASH;
460 if( patptr < patend &&
461 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '[') )
462 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
463 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
469 /* at end - no count, no / */
470 symptr->howlen = e_no_len;
475 symptr->patptr = patptr;
479 symptr->patptr = patptr;
484 =for apidoc unpack_str
486 The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
487 and ocnt are not used. This call should not be used, use unpackstring instead.
492 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
494 tempsym_t sym = { 0 };
499 return unpack_rec(&sym, s, s, strend, NULL );
503 =for apidoc unpackstring
505 The engine implementing unpack() Perl function. C<unpackstring> puts the
506 extracted list items on the stack and returns the number of elements.
507 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
512 Perl_unpackstring(pTHX_ char *pat, register char *patend, register char *s, char *strend, U32 flags)
514 tempsym_t sym = { 0 };
519 return unpack_rec(&sym, s, s, strend, NULL );
524 S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, char *strend, char **new_s )
528 register I32 len = 0;
529 register I32 bits = 0;
532 I32 start_sp_offset = SP - PL_stack_base;
535 /* These must not be in registers: */
554 const int bits_in_uv = 8 * sizeof(cuv);
557 bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
562 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
563 long double aldouble;
566 while (next_symbol(symptr)) {
567 datumtype = symptr->code;
568 /* do first one only unless in list context
569 / is implemented by unpacking the count, then poping it from the
570 stack, so must check that we're not in the middle of a / */
572 && (SP - PL_stack_base == start_sp_offset + 1)
573 && (datumtype != '/') ) /* XXX can this be omitted */
576 switch( howlen = symptr->howlen ){
579 len = symptr->length;
582 len = strend - strbeg; /* long enough */
587 beyond = s >= strend;
590 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)datumtype );
593 if (howlen == e_no_len)
594 len = 16; /* len is not specified */
602 char *ss = s; /* Move from register */
603 tempsym_t savsym = *symptr;
604 symptr->patend = savsym.grpend;
608 symptr->patptr = savsym.grpbeg;
609 unpack_rec(symptr, ss, strbeg, strend, &ss );
610 if (ss == strend && savsym.howlen == e_star)
611 break; /* No way to continue */
615 savsym.flags = symptr->flags;
620 if (len > strend - strrelbeg)
621 Perl_croak(aTHX_ "'@' outside of string in unpack");
624 case 'X' | TYPE_IS_SHRIEKING:
625 if (!len) /* Avoid division by 0 */
627 len = (s - strbeg) % len;
630 if (len > s - strbeg)
631 Perl_croak(aTHX_ "'X' outside of string in unpack" );
634 case 'x' | TYPE_IS_SHRIEKING:
635 if (!len) /* Avoid division by 0 */
637 aint = (s - strbeg) % len;
638 if (aint) /* Other portable ways? */
644 if (len > strend - s)
645 Perl_croak(aTHX_ "'x' outside of string in unpack");
649 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
654 if (len > strend - s)
659 sv_setpvn(sv, s, len);
660 if (len > 0 && (datumtype == 'A' || datumtype == 'Z')) {
661 aptr = s; /* borrow register */
662 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
666 if (howlen == e_star) /* exact for 'Z*' */
667 len = s - SvPVX(sv) + 1;
669 else { /* 'A' strips both nulls and spaces */
670 s = SvPVX(sv) + len - 1;
671 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
675 SvCUR_set(sv, s - SvPVX(sv));
676 s = aptr; /* unborrow register */
679 XPUSHs(sv_2mortal(sv));
683 if (howlen == e_star || len > (strend - s) * 8)
684 len = (strend - s) * 8;
687 Newz(601, PL_bitcount, 256, char);
688 for (bits = 1; bits < 256; bits++) {
689 if (bits & 1) PL_bitcount[bits]++;
690 if (bits & 2) PL_bitcount[bits]++;
691 if (bits & 4) PL_bitcount[bits]++;
692 if (bits & 8) PL_bitcount[bits]++;
693 if (bits & 16) PL_bitcount[bits]++;
694 if (bits & 32) PL_bitcount[bits]++;
695 if (bits & 64) PL_bitcount[bits]++;
696 if (bits & 128) PL_bitcount[bits]++;
700 cuv += PL_bitcount[*(unsigned char*)s++];
705 if (datumtype == 'b') {
713 if (bits & 128) cuv++;
720 sv = NEWSV(35, len + 1);
724 if (datumtype == 'b') {
726 for (len = 0; len < aint; len++) {
727 if (len & 7) /*SUPPRESS 595*/
731 *str++ = '0' + (bits & 1);
736 for (len = 0; len < aint; len++) {
741 *str++ = '0' + ((bits & 128) != 0);
745 XPUSHs(sv_2mortal(sv));
749 if (howlen == e_star || len > (strend - s) * 2)
750 len = (strend - s) * 2;
751 sv = NEWSV(35, len + 1);
755 if (datumtype == 'h') {
757 for (len = 0; len < aint; len++) {
762 *str++ = PL_hexdigit[bits & 15];
767 for (len = 0; len < aint; len++) {
772 *str++ = PL_hexdigit[(bits >> 4) & 15];
776 XPUSHs(sv_2mortal(sv));
779 if (len > strend - s)
784 if (aint >= 128) /* fake up signed chars */
786 if (checksum > bits_in_uv)
793 if (len && unpack_only_one)
799 if (aint >= 128) /* fake up signed chars */
802 sv_setiv(sv, (IV)aint);
803 PUSHs(sv_2mortal(sv));
808 unpack_C: /* unpack U will jump here if not UTF-8 */
810 symptr->flags &= ~FLAG_UNPACK_DO_UTF8;
813 if (len > strend - s)
823 if (len && unpack_only_one)
830 sv_setiv(sv, (IV)auint);
831 PUSHs(sv_2mortal(sv));
837 symptr->flags |= FLAG_UNPACK_DO_UTF8;
840 if ((symptr->flags & FLAG_UNPACK_DO_UTF8) == 0)
842 if (len > strend - s)
845 while (len-- > 0 && s < strend) {
847 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
850 if (checksum > bits_in_uv)
851 cdouble += (NV)auint;
857 if (len && unpack_only_one)
861 while (len-- > 0 && s < strend) {
863 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
867 sv_setuv(sv, (UV)auint);
868 PUSHs(sv_2mortal(sv));
872 case 's' | TYPE_IS_SHRIEKING:
873 #if SHORTSIZE != SIZE16
874 along = (strend - s) / sizeof(short);
880 COPYNN(s, &ashort, sizeof(short));
882 if (checksum > bits_in_uv)
883 cdouble += (NV)ashort;
891 if (len && unpack_only_one)
896 COPYNN(s, &ashort, sizeof(short));
899 sv_setiv(sv, (IV)ashort);
900 PUSHs(sv_2mortal(sv));
908 along = (strend - s) / SIZE16;
914 #if SHORTSIZE > SIZE16
919 if (checksum > bits_in_uv)
920 cdouble += (NV)ashort;
926 if (len && unpack_only_one)
933 #if SHORTSIZE > SIZE16
939 sv_setiv(sv, (IV)ashort);
940 PUSHs(sv_2mortal(sv));
944 case 'S' | TYPE_IS_SHRIEKING:
945 #if SHORTSIZE != SIZE16
946 along = (strend - s) / sizeof(unsigned short);
950 unsigned short aushort;
952 COPYNN(s, &aushort, sizeof(unsigned short));
953 s += sizeof(unsigned short);
954 if (checksum > bits_in_uv)
955 cdouble += (NV)aushort;
961 if (len && unpack_only_one)
966 unsigned short aushort;
967 COPYNN(s, &aushort, sizeof(unsigned short));
968 s += sizeof(unsigned short);
970 sv_setiv(sv, (UV)aushort);
971 PUSHs(sv_2mortal(sv));
981 along = (strend - s) / SIZE16;
989 if (datumtype == 'n')
990 aushort = PerlSock_ntohs(aushort);
993 if (datumtype == 'v')
994 aushort = vtohs(aushort);
996 if (checksum > bits_in_uv)
997 cdouble += (NV)aushort;
1003 if (len && unpack_only_one)
1008 COPY16(s, &aushort);
1012 if (datumtype == 'n')
1013 aushort = PerlSock_ntohs(aushort);
1016 if (datumtype == 'v')
1017 aushort = vtohs(aushort);
1019 sv_setiv(sv, (UV)aushort);
1020 PUSHs(sv_2mortal(sv));
1025 case 'i' | TYPE_IS_SHRIEKING:
1026 along = (strend - s) / sizeof(int);
1031 Copy(s, &aint, 1, int);
1033 if (checksum > bits_in_uv)
1034 cdouble += (NV)aint;
1040 if (len && unpack_only_one)
1045 Copy(s, &aint, 1, int);
1049 /* Without the dummy below unpack("i", pack("i",-1))
1050 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
1051 * cc with optimization turned on.
1053 * The bug was detected in
1054 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
1055 * with optimization (-O4) turned on.
1056 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
1057 * does not have this problem even with -O4.
1059 * This bug was reported as DECC_BUGS 1431
1060 * and tracked internally as GEM_BUGS 7775.
1062 * The bug is fixed in
1063 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
1064 * UNIX V4.0F support: DEC C V5.9-006 or later
1065 * UNIX V4.0E support: DEC C V5.8-011 or later
1068 * See also few lines later for the same bug.
1071 sv_setiv(sv, (IV)aint) :
1073 sv_setiv(sv, (IV)aint);
1074 PUSHs(sv_2mortal(sv));
1079 case 'I' | TYPE_IS_SHRIEKING:
1080 along = (strend - s) / sizeof(unsigned int);
1085 Copy(s, &auint, 1, unsigned int);
1086 s += sizeof(unsigned int);
1087 if (checksum > bits_in_uv)
1088 cdouble += (NV)auint;
1094 if (len && unpack_only_one)
1099 Copy(s, &auint, 1, unsigned int);
1100 s += sizeof(unsigned int);
1103 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
1104 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
1105 * See details few lines earlier. */
1107 sv_setuv(sv, (UV)auint) :
1109 sv_setuv(sv, (UV)auint);
1110 PUSHs(sv_2mortal(sv));
1115 along = (strend - s) / IVSIZE;
1120 Copy(s, &aiv, 1, IV);
1122 if (checksum > bits_in_uv)
1129 if (len && unpack_only_one)
1134 Copy(s, &aiv, 1, IV);
1138 PUSHs(sv_2mortal(sv));
1143 along = (strend - s) / UVSIZE;
1148 Copy(s, &auv, 1, UV);
1150 if (checksum > bits_in_uv)
1157 if (len && unpack_only_one)
1162 Copy(s, &auv, 1, UV);
1166 PUSHs(sv_2mortal(sv));
1170 case 'l' | TYPE_IS_SHRIEKING:
1171 #if LONGSIZE != SIZE32
1172 along = (strend - s) / sizeof(long);
1177 COPYNN(s, &along, sizeof(long));
1179 if (checksum > bits_in_uv)
1180 cdouble += (NV)along;
1186 if (len && unpack_only_one)
1191 COPYNN(s, &along, sizeof(long));
1194 sv_setiv(sv, (IV)along);
1195 PUSHs(sv_2mortal(sv));
1203 along = (strend - s) / SIZE32;
1208 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1212 #if LONGSIZE > SIZE32
1213 if (along > 2147483647)
1214 along -= 4294967296;
1217 if (checksum > bits_in_uv)
1218 cdouble += (NV)along;
1224 if (len && unpack_only_one)
1229 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1233 #if LONGSIZE > SIZE32
1234 if (along > 2147483647)
1235 along -= 4294967296;
1239 sv_setiv(sv, (IV)along);
1240 PUSHs(sv_2mortal(sv));
1244 case 'L' | TYPE_IS_SHRIEKING:
1245 #if LONGSIZE != SIZE32
1246 along = (strend - s) / sizeof(unsigned long);
1251 unsigned long aulong;
1252 COPYNN(s, &aulong, sizeof(unsigned long));
1253 s += sizeof(unsigned long);
1254 if (checksum > bits_in_uv)
1255 cdouble += (NV)aulong;
1261 if (len && unpack_only_one)
1266 unsigned long aulong;
1267 COPYNN(s, &aulong, sizeof(unsigned long));
1268 s += sizeof(unsigned long);
1270 sv_setuv(sv, (UV)aulong);
1271 PUSHs(sv_2mortal(sv));
1281 along = (strend - s) / SIZE32;
1289 if (datumtype == 'N')
1290 aulong = PerlSock_ntohl(aulong);
1293 if (datumtype == 'V')
1294 aulong = vtohl(aulong);
1296 if (checksum > bits_in_uv)
1297 cdouble += (NV)aulong;
1303 if (len && unpack_only_one)
1311 if (datumtype == 'N')
1312 aulong = PerlSock_ntohl(aulong);
1315 if (datumtype == 'V')
1316 aulong = vtohl(aulong);
1319 sv_setuv(sv, (UV)aulong);
1320 PUSHs(sv_2mortal(sv));
1325 along = (strend - s) / sizeof(char*);
1331 if (sizeof(char*) > strend - s)
1334 Copy(s, &aptr, 1, char*);
1340 PUSHs(sv_2mortal(sv));
1344 if (len && unpack_only_one)
1352 while ((len > 0) && (s < strend)) {
1353 auv = (auv << 7) | (*s & 0x7f);
1354 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1355 if ((U8)(*s++) < 0x80) {
1359 PUSHs(sv_2mortal(sv));
1363 else if (++bytes >= sizeof(UV)) { /* promote to string */
1367 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1368 while (s < strend) {
1369 sv = mul128(sv, (U8)(*s & 0x7f));
1370 if (!(*s++ & 0x80)) {
1379 PUSHs(sv_2mortal(sv));
1384 if ((s >= strend) && bytes)
1385 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
1389 if (symptr->howlen == e_star)
1390 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
1392 if (sizeof(char*) > strend - s)
1395 Copy(s, &aptr, 1, char*);
1400 sv_setpvn(sv, aptr, len);
1401 PUSHs(sv_2mortal(sv));
1405 along = (strend - s) / sizeof(Quad_t);
1410 Copy(s, &aquad, 1, Quad_t);
1411 s += sizeof(Quad_t);
1412 if (checksum > bits_in_uv)
1413 cdouble += (NV)aquad;
1419 if (len && unpack_only_one)
1424 if (s + sizeof(Quad_t) > strend)
1427 Copy(s, &aquad, 1, Quad_t);
1428 s += sizeof(Quad_t);
1431 if (aquad >= IV_MIN && aquad <= IV_MAX)
1432 sv_setiv(sv, (IV)aquad);
1434 sv_setnv(sv, (NV)aquad);
1435 PUSHs(sv_2mortal(sv));
1440 along = (strend - s) / sizeof(Uquad_t);
1445 Copy(s, &auquad, 1, Uquad_t);
1446 s += sizeof(Uquad_t);
1447 if (checksum > bits_in_uv)
1448 cdouble += (NV)auquad;
1454 if (len && unpack_only_one)
1459 if (s + sizeof(Uquad_t) > strend)
1462 Copy(s, &auquad, 1, Uquad_t);
1463 s += sizeof(Uquad_t);
1466 if (auquad <= UV_MAX)
1467 sv_setuv(sv, (UV)auquad);
1469 sv_setnv(sv, (NV)auquad);
1470 PUSHs(sv_2mortal(sv));
1475 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1477 along = (strend - s) / sizeof(float);
1482 Copy(s, &afloat, 1, float);
1488 if (len && unpack_only_one)
1493 Copy(s, &afloat, 1, float);
1496 sv_setnv(sv, (NV)afloat);
1497 PUSHs(sv_2mortal(sv));
1502 along = (strend - s) / sizeof(double);
1507 Copy(s, &adouble, 1, double);
1508 s += sizeof(double);
1513 if (len && unpack_only_one)
1518 Copy(s, &adouble, 1, double);
1519 s += sizeof(double);
1521 sv_setnv(sv, (NV)adouble);
1522 PUSHs(sv_2mortal(sv));
1527 along = (strend - s) / NVSIZE;
1532 Copy(s, &anv, 1, NV);
1538 if (len && unpack_only_one)
1543 Copy(s, &anv, 1, NV);
1547 PUSHs(sv_2mortal(sv));
1551 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1553 along = (strend - s) / LONG_DOUBLESIZE;
1558 Copy(s, &aldouble, 1, long double);
1559 s += LONG_DOUBLESIZE;
1560 cdouble += aldouble;
1564 if (len && unpack_only_one)
1569 Copy(s, &aldouble, 1, long double);
1570 s += LONG_DOUBLESIZE;
1572 sv_setnv(sv, (NV)aldouble);
1573 PUSHs(sv_2mortal(sv));
1580 * Initialise the decode mapping. By using a table driven
1581 * algorithm, the code will be character-set independent
1582 * (and just as fast as doing character arithmetic)
1584 if (PL_uudmap['M'] == 0) {
1587 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1588 PL_uudmap[(U8)PL_uuemap[i]] = i;
1590 * Because ' ' and '`' map to the same value,
1591 * we need to decode them both the same.
1596 along = (strend - s) * 3 / 4;
1597 sv = NEWSV(42, along);
1600 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1605 len = PL_uudmap[*(U8*)s++] & 077;
1607 if (s < strend && ISUUCHAR(*s))
1608 a = PL_uudmap[*(U8*)s++] & 077;
1611 if (s < strend && ISUUCHAR(*s))
1612 b = PL_uudmap[*(U8*)s++] & 077;
1615 if (s < strend && ISUUCHAR(*s))
1616 c = PL_uudmap[*(U8*)s++] & 077;
1619 if (s < strend && ISUUCHAR(*s))
1620 d = PL_uudmap[*(U8*)s++] & 077;
1623 hunk[0] = (char)((a << 2) | (b >> 4));
1624 hunk[1] = (char)((b << 4) | (c >> 2));
1625 hunk[2] = (char)((c << 6) | d);
1626 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1631 else /* possible checksum byte */
1632 if (s + 1 < strend && s[1] == '\n')
1635 XPUSHs(sv_2mortal(sv));
1641 if (strchr("fFdD", datumtype) ||
1642 (checksum > bits_in_uv &&
1643 strchr("csSiIlLnNUvVqQjJ", datumtype&0xFF)) ) {
1646 adouble = (NV) (1 << (checksum & 15));
1647 while (checksum >= 16) {
1651 while (cdouble < 0.0)
1653 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1654 sv_setnv(sv, cdouble);
1657 if (checksum < bits_in_uv) {
1658 UV mask = ((UV)1 << checksum) - 1;
1663 XPUSHs(sv_2mortal(sv));
1667 if (symptr->flags & FLAG_SLASH){
1668 if (SP - PL_stack_base - start_sp_offset <= 0)
1669 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1670 if( next_symbol(symptr) ){
1671 if( symptr->howlen == e_number )
1672 Perl_croak(aTHX_ "Count after length/code in unpack" );
1674 /* ...end of char buffer then no decent length available */
1675 Perl_croak(aTHX_ "length/code after end of string in unpack" );
1677 /* take top of stack (hope it's numeric) */
1680 Perl_croak(aTHX_ "Negative '/' count in unpack" );
1683 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
1685 datumtype = symptr->code;
1693 return SP - PL_stack_base - start_sp_offset;
1700 I32 gimme = GIMME_V;
1703 register char *pat = SvPV(left, llen);
1704 #ifdef PACKED_IS_OCTETS
1705 /* Packed side is assumed to be octets - so force downgrade if it
1706 has been UTF-8 encoded by accident
1708 register char *s = SvPVbyte(right, rlen);
1710 register char *s = SvPV(right, rlen);
1712 char *strend = s + rlen;
1713 register char *patend = pat + llen;
1717 cnt = unpackstring(pat, patend, s, strend,
1718 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
1719 | (DO_UTF8(right) ? FLAG_UNPACK_DO_UTF8 : 0));
1722 if ( !cnt && gimme == G_SCALAR )
1723 PUSHs(&PL_sv_undef);
1728 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
1732 *hunk = PL_uuemap[len];
1733 sv_catpvn(sv, hunk, 1);
1736 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1737 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
1738 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
1739 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
1740 sv_catpvn(sv, hunk, 4);
1745 char r = (len > 1 ? s[1] : '\0');
1746 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1747 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
1748 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
1749 hunk[3] = PL_uuemap[0];
1750 sv_catpvn(sv, hunk, 4);
1752 sv_catpvn(sv, "\n", 1);
1756 S_is_an_int(pTHX_ char *s, STRLEN l)
1759 SV *result = newSVpvn(s, l);
1760 char *result_c = SvPV(result, n_a); /* convenience */
1761 char *out = result_c;
1771 SvREFCNT_dec(result);
1794 SvREFCNT_dec(result);
1800 SvCUR_set(result, out - result_c);
1804 /* pnum must be '\0' terminated */
1806 S_div128(pTHX_ SV *pnum, bool *done)
1809 char *s = SvPV(pnum, len);
1818 i = m * 10 + (*t - '0');
1820 r = (i >> 7); /* r < 10 */
1827 SvCUR_set(pnum, (STRLEN) (t - s));
1834 =for apidoc pack_cat
1836 The engine implementing pack() Perl function. Note: parameters next_in_list and
1837 flags are not used. This call should not be used; use packlist instead.
1843 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
1845 tempsym_t sym = { 0 };
1847 sym.patend = patend;
1848 sym.flags = FLAG_PACK;
1850 (void)pack_rec( cat, &sym, beglist, endlist );
1855 =for apidoc packlist
1857 The engine implementing pack() Perl function.
1863 Perl_packlist(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist )
1865 tempsym_t sym = { 0 };
1867 sym.patend = patend;
1868 sym.flags = FLAG_PACK;
1870 (void)pack_rec( cat, &sym, beglist, endlist );
1876 S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV **endlist )
1880 register I32 len = 0;
1883 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
1884 static char *space10 = " ";
1887 /* These must not be in registers: */
1897 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1898 long double aldouble;
1907 int strrelbeg = SvCUR(cat);
1908 tempsym_t lookahead;
1910 items = endlist - beglist;
1911 found = next_symbol( symptr );
1913 #ifndef PACKED_IS_OCTETS
1914 if (symptr->level == 0 && found && symptr->code == 'U' ){
1920 SV *lengthcode = Nullsv;
1921 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
1923 I32 datumtype = symptr->code;
1926 switch( howlen = symptr->howlen ){
1929 len = symptr->length;
1932 len = strchr("@Xxu", datumtype) ? 0 : items;
1936 /* Look ahead for next symbol. Do we have code/code? */
1937 lookahead = *symptr;
1938 found = next_symbol(&lookahead);
1939 if ( symptr->flags & FLAG_SLASH ) {
1941 if ( 0 == strchr( "aAZ", lookahead.code ) ||
1942 e_star != lookahead.howlen )
1943 Perl_croak(aTHX_ "'/' must be followed by 'a*', 'A*' or 'Z*' in pack");
1944 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
1945 ? *beglist : &PL_sv_no)
1946 + (lookahead.code == 'Z' ? 1 : 0)));
1948 Perl_croak(aTHX_ "Code missing after '/' in pack");
1954 Perl_croak(aTHX_ "Invalid type '%c' in pack", (int)datumtype);
1956 Perl_croak(aTHX_ "'%%' may not be used in pack");
1958 len += strrelbeg - SvCUR(cat);
1967 tempsym_t savsym = *symptr;
1968 symptr->patend = savsym.grpend;
1971 symptr->patptr = savsym.grpbeg;
1972 beglist = pack_rec(cat, symptr, beglist, endlist );
1973 if (savsym.howlen == e_star && beglist == endlist)
1974 break; /* No way to continue */
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 (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 sv_catpvn(cat, (char *)&afloat, sizeof (float));
2233 /* VOS does not automatically map a floating-point overflow
2234 during conversion from long double to double into infinity,
2235 so we do it by hand. This code should either be generalized
2236 for any OS that needs it, or removed if and when VOS
2237 implements posix-976 (suggestion to support mapping to
2238 infinity). Paul.Green@stratus.com 02-04-02. */
2239 if (SvNV(fromstr) > DBL_MAX)
2240 adouble = _double_constants[0]; /* double prec. inf. */
2241 else if (SvNV(fromstr) < -DBL_MAX)
2242 adouble = _double_constants[0]; /* double prec. inf. */
2243 else adouble = (double)SvNV(fromstr);
2245 # if defined(VMS) && !defined(__IEEE_FP)
2246 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2247 * on Alpha; fake it if we don't have them.
2249 if (SvNV(fromstr) > DBL_MAX)
2251 else if (SvNV(fromstr) < -DBL_MAX)
2253 else adouble = (double)SvNV(fromstr);
2255 adouble = (double)SvNV(fromstr);
2258 sv_catpvn(cat, (char *)&adouble, sizeof (double));
2264 anv = SvNV(fromstr);
2265 sv_catpvn(cat, (char *)&anv, NVSIZE);
2268 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2272 aldouble = (long double)SvNV(fromstr);
2273 sv_catpvn(cat, (char *)&aldouble, LONG_DOUBLESIZE);
2280 ashort = (I16)SvIV(fromstr);
2282 ashort = PerlSock_htons(ashort);
2284 CAT16(cat, &ashort);
2290 ashort = (I16)SvIV(fromstr);
2292 ashort = htovs(ashort);
2294 CAT16(cat, &ashort);
2297 case 'S' | TYPE_IS_SHRIEKING:
2298 #if SHORTSIZE != SIZE16
2300 unsigned short aushort;
2304 aushort = SvUV(fromstr);
2305 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
2318 aushort = (U16)SvUV(fromstr);
2319 CAT16(cat, &aushort);
2324 case 's' | TYPE_IS_SHRIEKING:
2325 #if SHORTSIZE != SIZE16
2331 ashort = SvIV(fromstr);
2332 sv_catpvn(cat, (char *)&ashort, sizeof(short));
2342 ashort = (I16)SvIV(fromstr);
2343 CAT16(cat, &ashort);
2347 case 'I' | TYPE_IS_SHRIEKING:
2350 auint = SvUV(fromstr);
2351 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
2357 aiv = SvIV(fromstr);
2358 sv_catpvn(cat, (char*)&aiv, IVSIZE);
2364 auv = SvUV(fromstr);
2365 sv_catpvn(cat, (char*)&auv, UVSIZE);
2371 anv = SvNV(fromstr);
2374 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
2376 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
2377 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
2378 any negative IVs will have already been got by the croak()
2379 above. IOK is untrue for fractions, so we test them
2380 against UV_MAX_P1. */
2381 if (SvIOK(fromstr) || anv < UV_MAX_P1)
2383 char buf[(sizeof(UV)*8)/7+1];
2384 char *in = buf + sizeof(buf);
2385 UV auv = SvUV(fromstr);
2388 *--in = (char)((auv & 0x7f) | 0x80);
2391 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2392 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2394 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
2395 char *from, *result, *in;
2400 /* Copy string and check for compliance */
2401 from = SvPV(fromstr, len);
2402 if ((norm = is_an_int(from, len)) == NULL)
2403 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2405 New('w', result, len, char);
2409 *--in = div128(norm, &done) | 0x80;
2410 result[len - 1] &= 0x7F; /* clear continue bit */
2411 sv_catpvn(cat, in, (result + len) - in);
2413 SvREFCNT_dec(norm); /* free norm */
2415 else if (SvNOKp(fromstr)) {
2416 /* 10**NV_MAX_10_EXP is the largest power of 10
2417 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
2418 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
2419 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
2420 And with that many bytes only Inf can overflow.
2421 Some C compilers are strict about integral constant
2422 expressions so we conservatively divide by a slightly
2423 smaller integer instead of multiplying by the exact
2424 floating-point value.
2426 #ifdef NV_MAX_10_EXP
2427 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
2428 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
2430 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
2431 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
2433 char *in = buf + sizeof(buf);
2435 anv = Perl_floor(anv);
2437 NV next = Perl_floor(anv / 128);
2438 if (in <= buf) /* this cannot happen ;-) */
2439 Perl_croak(aTHX_ "Cannot compress integer in pack");
2440 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
2443 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2444 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2447 char *from, *result, *in;
2452 /* Copy string and check for compliance */
2453 from = SvPV(fromstr, len);
2454 if ((norm = is_an_int(from, len)) == NULL)
2455 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2457 New('w', result, len, char);
2461 *--in = div128(norm, &done) | 0x80;
2462 result[len - 1] &= 0x7F; /* clear continue bit */
2463 sv_catpvn(cat, in, (result + len) - in);
2465 SvREFCNT_dec(norm); /* free norm */
2470 case 'i' | TYPE_IS_SHRIEKING:
2473 aint = SvIV(fromstr);
2474 sv_catpvn(cat, (char*)&aint, sizeof(int));
2480 aulong = SvUV(fromstr);
2482 aulong = PerlSock_htonl(aulong);
2484 CAT32(cat, &aulong);
2490 aulong = SvUV(fromstr);
2492 aulong = htovl(aulong);
2494 CAT32(cat, &aulong);
2497 case 'L' | TYPE_IS_SHRIEKING:
2498 #if LONGSIZE != SIZE32
2500 unsigned long aulong;
2504 aulong = SvUV(fromstr);
2505 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2516 aulong = SvUV(fromstr);
2517 CAT32(cat, &aulong);
2521 case 'l' | TYPE_IS_SHRIEKING:
2522 #if LONGSIZE != SIZE32
2528 along = SvIV(fromstr);
2529 sv_catpvn(cat, (char *)&along, sizeof(long));
2539 along = SvIV(fromstr);
2547 auquad = (Uquad_t)SvUV(fromstr);
2548 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2554 aquad = (Quad_t)SvIV(fromstr);
2555 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2560 len = 1; /* assume SV is correct length */
2565 if (fromstr == &PL_sv_undef)
2569 /* XXX better yet, could spirit away the string to
2570 * a safe spot and hang on to it until the result
2571 * of pack() (and all copies of the result) are
2574 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2575 || (SvPADTMP(fromstr)
2576 && !SvREADONLY(fromstr))))
2578 Perl_warner(aTHX_ packWARN(WARN_PACK),
2579 "Attempt to pack pointer to temporary value");
2581 if (SvPOK(fromstr) || SvNIOK(fromstr))
2582 aptr = SvPV(fromstr,n_a);
2584 aptr = SvPV_force(fromstr,n_a);
2586 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2591 aptr = SvPV(fromstr, fromlen);
2592 SvGROW(cat, fromlen * 4 / 3);
2597 while (fromlen > 0) {
2600 if ((I32)fromlen > len)
2604 doencodes(cat, aptr, todo);
2610 *symptr = lookahead;
2619 dSP; dMARK; dORIGMARK; dTARGET;
2620 register SV *cat = TARG;
2622 register char *pat = SvPVx(*++MARK, fromlen);
2623 register char *patend = pat + fromlen;
2626 sv_setpvn(cat, "", 0);
2628 packlist(cat, pat, patend, MARK, SP + 1);