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 SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
59 # define PERL_NATINT_PACK
62 #if LONGSIZE > 4 && defined(_CRAY)
63 # if BYTEORDER == 0x12345678
64 # define OFF16(p) (char*)(p)
65 # define OFF32(p) (char*)(p)
67 # if BYTEORDER == 0x87654321
68 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
69 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
71 }}}} bad cray byte order
74 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
75 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
76 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
77 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
78 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
80 # define COPY16(s,p) Copy(s, p, SIZE16, char)
81 # define COPY32(s,p) Copy(s, p, SIZE32, char)
82 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
83 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
84 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
87 /* Avoid stack overflow due to pathological templates. 100 should be plenty. */
88 #define MAX_SUB_TEMPLATE_LEVEL 100
91 #define FLAG_UNPACK_ONLY_ONE 0x10
92 #define FLAG_UNPACK_DO_UTF8 0x08
93 #define FLAG_SLASH 0x04
94 #define FLAG_COMMA 0x02
95 #define FLAG_PACK 0x01
98 S_mul128(pTHX_ SV *sv, U8 m)
101 char *s = SvPV(sv, len);
105 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
106 SV *tmpNew = newSVpvn("0000000000", 10);
108 sv_catsv(tmpNew, sv);
109 SvREFCNT_dec(sv); /* free old sv */
114 while (!*t) /* trailing '\0'? */
117 i = ((*t - '0') << 7) + m;
118 *(t--) = '0' + (char)(i % 10);
124 /* Explosives and implosives. */
126 #if 'I' == 73 && 'J' == 74
127 /* On an ASCII/ISO kind of system */
128 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
131 Some other sort of character set - use memchr() so we don't match
134 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
137 #define TYPE_IS_SHRIEKING 0x100
139 /* Returns the sizeof() struct described by pat */
141 S_measure_struct(pTHX_ register tempsym_t* symptr)
143 register I32 len = 0;
144 register I32 total = 0;
149 while (next_symbol(symptr)) {
151 switch( symptr->howlen ){
154 len = symptr->length;
157 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
158 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
162 switch(symptr->code) {
164 Perl_croak(aTHX_ "Invalid type '%c' in %s",
166 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
169 case 'U': /* XXXX Is it correct? */
172 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
174 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
180 tempsym_t savsym = *symptr;
181 symptr->patptr = savsym.grpbeg;
182 symptr->patend = savsym.grpend;
183 /* XXXX Theoretically, we need to measure many times at different
184 positions, since the subexpression may contain
185 alignment commands, but be not of aligned length.
186 Need to detect this and croak(). */
187 size = measure_struct(symptr);
191 case 'X' | TYPE_IS_SHRIEKING:
192 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS. */
193 if (!len) /* Avoid division by 0 */
195 len = total % len; /* Assumed: the start is aligned. */
200 Perl_croak(aTHX_ "'X' outside of string in %s",
201 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
203 case 'x' | TYPE_IS_SHRIEKING:
204 if (!len) /* Avoid division by 0 */
206 star = total % len; /* Assumed: the start is aligned. */
207 if (star) /* Other portable ways? */
230 case 's' | TYPE_IS_SHRIEKING:
231 #if SHORTSIZE != SIZE16
232 size = sizeof(short);
240 case 'S' | TYPE_IS_SHRIEKING:
241 #if SHORTSIZE != SIZE16
242 size = sizeof(unsigned short);
247 case 'v' | TYPE_IS_SHRIEKING:
248 case 'n' | TYPE_IS_SHRIEKING:
254 case 'i' | TYPE_IS_SHRIEKING:
258 case 'I' | TYPE_IS_SHRIEKING:
260 size = sizeof(unsigned int);
268 case 'l' | TYPE_IS_SHRIEKING:
269 #if LONGSIZE != SIZE32
278 case 'L' | TYPE_IS_SHRIEKING:
279 #if LONGSIZE != SIZE32
280 size = sizeof(unsigned long);
285 case 'V' | TYPE_IS_SHRIEKING:
286 case 'N' | TYPE_IS_SHRIEKING:
296 size = sizeof(char*);
300 size = sizeof(Quad_t);
303 size = sizeof(Uquad_t);
307 size = sizeof(float);
310 size = sizeof(double);
315 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
317 size = LONG_DOUBLESIZE;
327 /* locate matching closing parenthesis or bracket
328 * returns char pointer to char after match, or NULL
331 S_group_end(pTHX_ register char *patptr, register char *patend, char ender)
333 while (patptr < patend) {
341 while (patptr < patend && *patptr != '\n')
345 patptr = group_end(patptr, patend, ')') + 1;
347 patptr = group_end(patptr, patend, ']') + 1;
349 Perl_croak(aTHX_ "No group ending character '%c' found in template",
355 /* Convert unsigned decimal number to binary.
356 * Expects a pointer to the first digit and address of length variable
357 * Advances char pointer to 1st non-digit char and returns number
360 S_get_num(pTHX_ register char *patptr, I32 *lenptr )
362 I32 len = *patptr++ - '0';
363 while (isDIGIT(*patptr)) {
364 if (len >= 0x7FFFFFFF/10)
365 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
366 len = (len * 10) + (*patptr++ - '0');
372 /* The marvellous template parsing routine: Using state stored in *symptr,
373 * locates next template code and count
376 S_next_symbol(pTHX_ register tempsym_t* symptr )
378 register char* patptr = symptr->patptr;
379 register char* patend = symptr->patend;
381 symptr->flags &= ~FLAG_SLASH;
383 while (patptr < patend) {
384 if (isSPACE(*patptr))
386 else if (*patptr == '#') {
388 while (patptr < patend && *patptr != '\n')
393 /* We should have found a template code */
394 I32 code = *patptr++ & 0xFF;
396 if (code == ','){ /* grandfather in commas but with a warning */
397 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
398 symptr->flags |= FLAG_COMMA;
399 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
400 "Invalid type ',' in %s",
401 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
406 /* for '(', skip to ')' */
408 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
409 Perl_croak(aTHX_ "()-group starts with a count in %s",
410 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
411 symptr->grpbeg = patptr;
412 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
413 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
414 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
415 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
418 /* test for '!' modifier */
419 if (patptr < patend && *patptr == '!') {
420 static const char natstr[] = "sSiIlLxXnNvV";
422 if (strchr(natstr, code))
423 code |= TYPE_IS_SHRIEKING;
425 Perl_croak(aTHX_ "'!' allowed only after types %s in %s",
426 natstr, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
429 /* look for count and/or / */
430 if (patptr < patend) {
431 if (isDIGIT(*patptr)) {
432 patptr = get_num( patptr, &symptr->length );
433 symptr->howlen = e_number;
435 } else if (*patptr == '*') {
437 symptr->howlen = e_star;
439 } else if (*patptr == '[') {
440 char* lenptr = ++patptr;
441 symptr->howlen = e_number;
442 patptr = group_end( patptr, patend, ']' ) + 1;
443 /* what kind of [] is it? */
444 if (isDIGIT(*lenptr)) {
445 lenptr = get_num( lenptr, &symptr->length );
447 Perl_croak(aTHX_ "Malformed integer in [] in %s",
448 symptr->flags & FLAG_PACK ? "pack" : "unpack");
450 tempsym_t savsym = *symptr;
451 symptr->patend = patptr-1;
452 symptr->patptr = lenptr;
453 savsym.length = measure_struct(symptr);
457 symptr->howlen = e_no_len;
462 while (patptr < patend) {
463 if (isSPACE(*patptr))
465 else if (*patptr == '#') {
467 while (patptr < patend && *patptr != '\n')
472 if( *patptr == '/' ){
473 symptr->flags |= FLAG_SLASH;
475 if( patptr < patend &&
476 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '[') )
477 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
478 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
484 /* at end - no count, no / */
485 symptr->howlen = e_no_len;
490 symptr->patptr = patptr;
494 symptr->patptr = patptr;
499 =for apidoc unpack_str
501 The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
502 and ocnt are not used. This call should not be used, use unpackstring instead.
507 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
509 tempsym_t sym = { 0 };
514 return unpack_rec(&sym, s, s, strend, NULL );
518 =for apidoc unpackstring
520 The engine implementing unpack() Perl function. C<unpackstring> puts the
521 extracted list items on the stack and returns the number of elements.
522 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
527 Perl_unpackstring(pTHX_ char *pat, register char *patend, register char *s, char *strend, U32 flags)
529 tempsym_t sym = { 0 };
534 return unpack_rec(&sym, s, s, strend, NULL );
539 S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, char *strend, char **new_s )
543 register I32 len = 0;
544 register I32 bits = 0;
547 I32 start_sp_offset = SP - PL_stack_base;
550 /* These must not be in registers: */
571 const int bits_in_uv = 8 * sizeof(cuv);
574 bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
579 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
580 long double aldouble;
583 while (next_symbol(symptr)) {
584 datumtype = symptr->code;
585 /* do first one only unless in list context
586 / is implemented by unpacking the count, then poping it from the
587 stack, so must check that we're not in the middle of a / */
589 && (SP - PL_stack_base == start_sp_offset + 1)
590 && (datumtype != '/') ) /* XXX can this be omitted */
593 switch( howlen = symptr->howlen ){
596 len = symptr->length;
599 len = strend - strbeg; /* long enough */
604 beyond = s >= strend;
607 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)datumtype );
610 if (howlen == e_no_len)
611 len = 16; /* len is not specified */
619 char *ss = s; /* Move from register */
620 tempsym_t savsym = *symptr;
621 symptr->patend = savsym.grpend;
625 symptr->patptr = savsym.grpbeg;
626 unpack_rec(symptr, ss, strbeg, strend, &ss );
627 if (ss == strend && savsym.howlen == e_star)
628 break; /* No way to continue */
632 savsym.flags = symptr->flags;
637 if (len > strend - strrelbeg)
638 Perl_croak(aTHX_ "'@' outside of string in unpack");
641 case 'X' | TYPE_IS_SHRIEKING:
642 if (!len) /* Avoid division by 0 */
644 len = (s - strbeg) % len;
647 if (len > s - strbeg)
648 Perl_croak(aTHX_ "'X' outside of string in unpack" );
651 case 'x' | TYPE_IS_SHRIEKING:
652 if (!len) /* Avoid division by 0 */
654 aint = (s - strbeg) % len;
655 if (aint) /* Other portable ways? */
661 if (len > strend - s)
662 Perl_croak(aTHX_ "'x' outside of string in unpack");
666 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
671 if (len > strend - s)
676 sv_setpvn(sv, s, len);
677 if (len > 0 && (datumtype == 'A' || datumtype == 'Z')) {
678 aptr = s; /* borrow register */
679 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
683 if (howlen == e_star) /* exact for 'Z*' */
684 len = s - SvPVX(sv) + 1;
686 else { /* 'A' strips both nulls and spaces */
687 s = SvPVX(sv) + len - 1;
688 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
692 SvCUR_set(sv, s - SvPVX(sv));
693 s = aptr; /* unborrow register */
696 XPUSHs(sv_2mortal(sv));
700 if (howlen == e_star || len > (strend - s) * 8)
701 len = (strend - s) * 8;
704 Newz(601, PL_bitcount, 256, char);
705 for (bits = 1; bits < 256; bits++) {
706 if (bits & 1) PL_bitcount[bits]++;
707 if (bits & 2) PL_bitcount[bits]++;
708 if (bits & 4) PL_bitcount[bits]++;
709 if (bits & 8) PL_bitcount[bits]++;
710 if (bits & 16) PL_bitcount[bits]++;
711 if (bits & 32) PL_bitcount[bits]++;
712 if (bits & 64) PL_bitcount[bits]++;
713 if (bits & 128) PL_bitcount[bits]++;
717 cuv += PL_bitcount[*(unsigned char*)s++];
722 if (datumtype == 'b') {
730 if (bits & 128) cuv++;
737 sv = NEWSV(35, len + 1);
741 if (datumtype == 'b') {
743 for (len = 0; len < aint; len++) {
744 if (len & 7) /*SUPPRESS 595*/
748 *str++ = '0' + (bits & 1);
753 for (len = 0; len < aint; len++) {
758 *str++ = '0' + ((bits & 128) != 0);
762 XPUSHs(sv_2mortal(sv));
766 if (howlen == e_star || len > (strend - s) * 2)
767 len = (strend - s) * 2;
768 sv = NEWSV(35, len + 1);
772 if (datumtype == 'h') {
774 for (len = 0; len < aint; len++) {
779 *str++ = PL_hexdigit[bits & 15];
784 for (len = 0; len < aint; len++) {
789 *str++ = PL_hexdigit[(bits >> 4) & 15];
793 XPUSHs(sv_2mortal(sv));
796 if (len > strend - s)
801 if (aint >= 128) /* fake up signed chars */
803 if (checksum > bits_in_uv)
810 if (len && unpack_only_one)
816 if (aint >= 128) /* fake up signed chars */
819 sv_setiv(sv, (IV)aint);
820 PUSHs(sv_2mortal(sv));
825 unpack_C: /* unpack U will jump here if not UTF-8 */
827 symptr->flags &= ~FLAG_UNPACK_DO_UTF8;
830 if (len > strend - s)
840 if (len && unpack_only_one)
847 sv_setiv(sv, (IV)auint);
848 PUSHs(sv_2mortal(sv));
854 symptr->flags |= FLAG_UNPACK_DO_UTF8;
857 if ((symptr->flags & FLAG_UNPACK_DO_UTF8) == 0)
859 if (len > strend - s)
862 while (len-- > 0 && s < strend) {
864 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
867 if (checksum > bits_in_uv)
868 cdouble += (NV)auint;
874 if (len && unpack_only_one)
878 while (len-- > 0 && s < strend) {
880 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
884 sv_setuv(sv, (UV)auint);
885 PUSHs(sv_2mortal(sv));
889 case 's' | TYPE_IS_SHRIEKING:
890 #if SHORTSIZE != SIZE16
891 along = (strend - s) / sizeof(short);
897 COPYNN(s, &ashort, sizeof(short));
899 if (checksum > bits_in_uv)
900 cdouble += (NV)ashort;
908 if (len && unpack_only_one)
913 COPYNN(s, &ashort, sizeof(short));
916 sv_setiv(sv, (IV)ashort);
917 PUSHs(sv_2mortal(sv));
925 along = (strend - s) / SIZE16;
931 #if SHORTSIZE > SIZE16
936 if (checksum > bits_in_uv)
937 cdouble += (NV)ashort;
943 if (len && unpack_only_one)
950 #if SHORTSIZE > SIZE16
956 sv_setiv(sv, (IV)ashort);
957 PUSHs(sv_2mortal(sv));
961 case 'S' | TYPE_IS_SHRIEKING:
962 #if SHORTSIZE != SIZE16
963 along = (strend - s) / sizeof(unsigned short);
967 unsigned short aushort;
969 COPYNN(s, &aushort, sizeof(unsigned short));
970 s += sizeof(unsigned short);
971 if (checksum > bits_in_uv)
972 cdouble += (NV)aushort;
978 if (len && unpack_only_one)
983 unsigned short aushort;
984 COPYNN(s, &aushort, sizeof(unsigned short));
985 s += sizeof(unsigned short);
987 sv_setiv(sv, (UV)aushort);
988 PUSHs(sv_2mortal(sv));
998 along = (strend - s) / SIZE16;
1003 COPY16(s, &aushort);
1006 if (datumtype == 'n')
1007 aushort = PerlSock_ntohs(aushort);
1010 if (datumtype == 'v')
1011 aushort = vtohs(aushort);
1013 if (checksum > bits_in_uv)
1014 cdouble += (NV)aushort;
1020 if (len && unpack_only_one)
1025 COPY16(s, &aushort);
1029 if (datumtype == 'n')
1030 aushort = PerlSock_ntohs(aushort);
1033 if (datumtype == 'v')
1034 aushort = vtohs(aushort);
1036 sv_setiv(sv, (UV)aushort);
1037 PUSHs(sv_2mortal(sv));
1041 case 'v' | TYPE_IS_SHRIEKING:
1042 case 'n' | TYPE_IS_SHRIEKING:
1043 along = (strend - s) / SIZE16;
1048 COPY16(s, &asshort);
1051 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1052 asshort = (I16)PerlSock_ntohs((U16)asshort);
1055 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1056 asshort = (I16)vtohs((U16)asshort);
1058 if (checksum > bits_in_uv)
1059 cdouble += (NV)asshort;
1065 if (len && unpack_only_one)
1070 COPY16(s, &asshort);
1073 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1074 asshort = (I16)PerlSock_ntohs((U16)asshort);
1077 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1078 asshort = (I16)vtohs((U16)asshort);
1081 sv_setiv(sv, (IV)asshort);
1082 PUSHs(sv_2mortal(sv));
1087 case 'i' | TYPE_IS_SHRIEKING:
1088 along = (strend - s) / sizeof(int);
1093 Copy(s, &aint, 1, int);
1095 if (checksum > bits_in_uv)
1096 cdouble += (NV)aint;
1102 if (len && unpack_only_one)
1107 Copy(s, &aint, 1, int);
1111 /* Without the dummy below unpack("i", pack("i",-1))
1112 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
1113 * cc with optimization turned on.
1115 * The bug was detected in
1116 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
1117 * with optimization (-O4) turned on.
1118 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
1119 * does not have this problem even with -O4.
1121 * This bug was reported as DECC_BUGS 1431
1122 * and tracked internally as GEM_BUGS 7775.
1124 * The bug is fixed in
1125 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
1126 * UNIX V4.0F support: DEC C V5.9-006 or later
1127 * UNIX V4.0E support: DEC C V5.8-011 or later
1130 * See also few lines later for the same bug.
1133 sv_setiv(sv, (IV)aint) :
1135 sv_setiv(sv, (IV)aint);
1136 PUSHs(sv_2mortal(sv));
1141 case 'I' | TYPE_IS_SHRIEKING:
1142 along = (strend - s) / sizeof(unsigned int);
1147 Copy(s, &auint, 1, unsigned int);
1148 s += sizeof(unsigned int);
1149 if (checksum > bits_in_uv)
1150 cdouble += (NV)auint;
1156 if (len && unpack_only_one)
1161 Copy(s, &auint, 1, unsigned int);
1162 s += sizeof(unsigned int);
1165 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
1166 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
1167 * See details few lines earlier. */
1169 sv_setuv(sv, (UV)auint) :
1171 sv_setuv(sv, (UV)auint);
1172 PUSHs(sv_2mortal(sv));
1177 along = (strend - s) / IVSIZE;
1182 Copy(s, &aiv, 1, IV);
1184 if (checksum > bits_in_uv)
1191 if (len && unpack_only_one)
1196 Copy(s, &aiv, 1, IV);
1200 PUSHs(sv_2mortal(sv));
1205 along = (strend - s) / UVSIZE;
1210 Copy(s, &auv, 1, UV);
1212 if (checksum > bits_in_uv)
1219 if (len && unpack_only_one)
1224 Copy(s, &auv, 1, UV);
1228 PUSHs(sv_2mortal(sv));
1232 case 'l' | TYPE_IS_SHRIEKING:
1233 #if LONGSIZE != SIZE32
1234 along = (strend - s) / sizeof(long);
1239 COPYNN(s, &along, sizeof(long));
1241 if (checksum > bits_in_uv)
1242 cdouble += (NV)along;
1248 if (len && unpack_only_one)
1253 COPYNN(s, &along, sizeof(long));
1256 sv_setiv(sv, (IV)along);
1257 PUSHs(sv_2mortal(sv));
1265 along = (strend - s) / SIZE32;
1270 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1274 #if LONGSIZE > SIZE32
1275 if (along > 2147483647)
1276 along -= 4294967296;
1279 if (checksum > bits_in_uv)
1280 cdouble += (NV)along;
1286 if (len && unpack_only_one)
1291 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1295 #if LONGSIZE > SIZE32
1296 if (along > 2147483647)
1297 along -= 4294967296;
1301 sv_setiv(sv, (IV)along);
1302 PUSHs(sv_2mortal(sv));
1306 case 'L' | TYPE_IS_SHRIEKING:
1307 #if LONGSIZE != SIZE32
1308 along = (strend - s) / sizeof(unsigned long);
1313 unsigned long aulong;
1314 COPYNN(s, &aulong, sizeof(unsigned long));
1315 s += sizeof(unsigned long);
1316 if (checksum > bits_in_uv)
1317 cdouble += (NV)aulong;
1323 if (len && unpack_only_one)
1328 unsigned long aulong;
1329 COPYNN(s, &aulong, sizeof(unsigned long));
1330 s += sizeof(unsigned long);
1332 sv_setuv(sv, (UV)aulong);
1333 PUSHs(sv_2mortal(sv));
1343 along = (strend - s) / SIZE32;
1351 if (datumtype == 'N')
1352 aulong = PerlSock_ntohl(aulong);
1355 if (datumtype == 'V')
1356 aulong = vtohl(aulong);
1358 if (checksum > bits_in_uv)
1359 cdouble += (NV)aulong;
1365 if (len && unpack_only_one)
1373 if (datumtype == 'N')
1374 aulong = PerlSock_ntohl(aulong);
1377 if (datumtype == 'V')
1378 aulong = vtohl(aulong);
1381 sv_setuv(sv, (UV)aulong);
1382 PUSHs(sv_2mortal(sv));
1386 case 'V' | TYPE_IS_SHRIEKING:
1387 case 'N' | TYPE_IS_SHRIEKING:
1388 along = (strend - s) / SIZE32;
1396 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1397 aslong = (I32)PerlSock_ntohl((U32)aslong);
1400 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1401 aslong = (I32)vtohl((U32)aslong);
1403 if (checksum > bits_in_uv)
1404 cdouble += (NV)aslong;
1410 if (len && unpack_only_one)
1418 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1419 aslong = (I32)PerlSock_ntohl((U32)aslong);
1422 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1423 aslong = (I32)vtohl((U32)aslong);
1426 sv_setiv(sv, (IV)aslong);
1427 PUSHs(sv_2mortal(sv));
1432 along = (strend - s) / sizeof(char*);
1438 if (sizeof(char*) > strend - s)
1441 Copy(s, &aptr, 1, char*);
1447 PUSHs(sv_2mortal(sv));
1451 if (len && unpack_only_one)
1459 while ((len > 0) && (s < strend)) {
1460 auv = (auv << 7) | (*s & 0x7f);
1461 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1462 if ((U8)(*s++) < 0x80) {
1466 PUSHs(sv_2mortal(sv));
1470 else if (++bytes >= sizeof(UV)) { /* promote to string */
1474 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1475 while (s < strend) {
1476 sv = mul128(sv, (U8)(*s & 0x7f));
1477 if (!(*s++ & 0x80)) {
1486 PUSHs(sv_2mortal(sv));
1491 if ((s >= strend) && bytes)
1492 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
1496 if (symptr->howlen == e_star)
1497 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
1499 if (sizeof(char*) > strend - s)
1502 Copy(s, &aptr, 1, char*);
1507 sv_setpvn(sv, aptr, len);
1508 PUSHs(sv_2mortal(sv));
1512 along = (strend - s) / sizeof(Quad_t);
1517 Copy(s, &aquad, 1, Quad_t);
1518 s += sizeof(Quad_t);
1519 if (checksum > bits_in_uv)
1520 cdouble += (NV)aquad;
1526 if (len && unpack_only_one)
1531 if (s + sizeof(Quad_t) > strend)
1534 Copy(s, &aquad, 1, Quad_t);
1535 s += sizeof(Quad_t);
1538 if (aquad >= IV_MIN && aquad <= IV_MAX)
1539 sv_setiv(sv, (IV)aquad);
1541 sv_setnv(sv, (NV)aquad);
1542 PUSHs(sv_2mortal(sv));
1547 along = (strend - s) / sizeof(Uquad_t);
1552 Copy(s, &auquad, 1, Uquad_t);
1553 s += sizeof(Uquad_t);
1554 if (checksum > bits_in_uv)
1555 cdouble += (NV)auquad;
1561 if (len && unpack_only_one)
1566 if (s + sizeof(Uquad_t) > strend)
1569 Copy(s, &auquad, 1, Uquad_t);
1570 s += sizeof(Uquad_t);
1573 if (auquad <= UV_MAX)
1574 sv_setuv(sv, (UV)auquad);
1576 sv_setnv(sv, (NV)auquad);
1577 PUSHs(sv_2mortal(sv));
1582 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1584 along = (strend - s) / sizeof(float);
1589 Copy(s, &afloat, 1, float);
1595 if (len && unpack_only_one)
1600 Copy(s, &afloat, 1, float);
1603 sv_setnv(sv, (NV)afloat);
1604 PUSHs(sv_2mortal(sv));
1609 along = (strend - s) / sizeof(double);
1614 Copy(s, &adouble, 1, double);
1615 s += sizeof(double);
1620 if (len && unpack_only_one)
1625 Copy(s, &adouble, 1, double);
1626 s += sizeof(double);
1628 sv_setnv(sv, (NV)adouble);
1629 PUSHs(sv_2mortal(sv));
1634 along = (strend - s) / NVSIZE;
1639 Copy(s, &anv, 1, NV);
1645 if (len && unpack_only_one)
1650 Copy(s, &anv, 1, NV);
1654 PUSHs(sv_2mortal(sv));
1658 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1660 along = (strend - s) / LONG_DOUBLESIZE;
1665 Copy(s, &aldouble, 1, long double);
1666 s += LONG_DOUBLESIZE;
1667 cdouble += aldouble;
1671 if (len && unpack_only_one)
1676 Copy(s, &aldouble, 1, long double);
1677 s += LONG_DOUBLESIZE;
1679 sv_setnv(sv, (NV)aldouble);
1680 PUSHs(sv_2mortal(sv));
1687 * Initialise the decode mapping. By using a table driven
1688 * algorithm, the code will be character-set independent
1689 * (and just as fast as doing character arithmetic)
1691 if (PL_uudmap['M'] == 0) {
1694 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1695 PL_uudmap[(U8)PL_uuemap[i]] = i;
1697 * Because ' ' and '`' map to the same value,
1698 * we need to decode them both the same.
1703 along = (strend - s) * 3 / 4;
1704 sv = NEWSV(42, along);
1707 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1712 len = PL_uudmap[*(U8*)s++] & 077;
1714 if (s < strend && ISUUCHAR(*s))
1715 a = PL_uudmap[*(U8*)s++] & 077;
1718 if (s < strend && ISUUCHAR(*s))
1719 b = PL_uudmap[*(U8*)s++] & 077;
1722 if (s < strend && ISUUCHAR(*s))
1723 c = PL_uudmap[*(U8*)s++] & 077;
1726 if (s < strend && ISUUCHAR(*s))
1727 d = PL_uudmap[*(U8*)s++] & 077;
1730 hunk[0] = (char)((a << 2) | (b >> 4));
1731 hunk[1] = (char)((b << 4) | (c >> 2));
1732 hunk[2] = (char)((c << 6) | d);
1733 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1738 else /* possible checksum byte */
1739 if (s + 1 < strend && s[1] == '\n')
1742 XPUSHs(sv_2mortal(sv));
1748 if (strchr("fFdD", datumtype) ||
1749 (checksum > bits_in_uv &&
1750 strchr("csSiIlLnNUvVqQjJ", datumtype&0xFF)) ) {
1753 adouble = (NV) (1 << (checksum & 15));
1754 while (checksum >= 16) {
1758 while (cdouble < 0.0)
1760 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1761 sv_setnv(sv, cdouble);
1764 if (checksum < bits_in_uv) {
1765 UV mask = ((UV)1 << checksum) - 1;
1770 XPUSHs(sv_2mortal(sv));
1774 if (symptr->flags & FLAG_SLASH){
1775 if (SP - PL_stack_base - start_sp_offset <= 0)
1776 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1777 if( next_symbol(symptr) ){
1778 if( symptr->howlen == e_number )
1779 Perl_croak(aTHX_ "Count after length/code in unpack" );
1781 /* ...end of char buffer then no decent length available */
1782 Perl_croak(aTHX_ "length/code after end of string in unpack" );
1784 /* take top of stack (hope it's numeric) */
1787 Perl_croak(aTHX_ "Negative '/' count in unpack" );
1790 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
1792 datumtype = symptr->code;
1800 return SP - PL_stack_base - start_sp_offset;
1807 I32 gimme = GIMME_V;
1810 register char *pat = SvPV(left, llen);
1811 #ifdef PACKED_IS_OCTETS
1812 /* Packed side is assumed to be octets - so force downgrade if it
1813 has been UTF-8 encoded by accident
1815 register char *s = SvPVbyte(right, rlen);
1817 register char *s = SvPV(right, rlen);
1819 char *strend = s + rlen;
1820 register char *patend = pat + llen;
1824 cnt = unpackstring(pat, patend, s, strend,
1825 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
1826 | (DO_UTF8(right) ? FLAG_UNPACK_DO_UTF8 : 0));
1829 if ( !cnt && gimme == G_SCALAR )
1830 PUSHs(&PL_sv_undef);
1835 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
1839 *hunk = PL_uuemap[len];
1840 sv_catpvn(sv, hunk, 1);
1843 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1844 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
1845 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
1846 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
1847 sv_catpvn(sv, hunk, 4);
1852 char r = (len > 1 ? s[1] : '\0');
1853 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1854 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
1855 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
1856 hunk[3] = PL_uuemap[0];
1857 sv_catpvn(sv, hunk, 4);
1859 sv_catpvn(sv, "\n", 1);
1863 S_is_an_int(pTHX_ char *s, STRLEN l)
1866 SV *result = newSVpvn(s, l);
1867 char *result_c = SvPV(result, n_a); /* convenience */
1868 char *out = result_c;
1878 SvREFCNT_dec(result);
1901 SvREFCNT_dec(result);
1907 SvCUR_set(result, out - result_c);
1911 /* pnum must be '\0' terminated */
1913 S_div128(pTHX_ SV *pnum, bool *done)
1916 char *s = SvPV(pnum, len);
1925 i = m * 10 + (*t - '0');
1927 r = (i >> 7); /* r < 10 */
1934 SvCUR_set(pnum, (STRLEN) (t - s));
1941 =for apidoc pack_cat
1943 The engine implementing pack() Perl function. Note: parameters next_in_list and
1944 flags are not used. This call should not be used; use packlist instead.
1950 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
1952 tempsym_t sym = { 0 };
1954 sym.patend = patend;
1955 sym.flags = FLAG_PACK;
1957 (void)pack_rec( cat, &sym, beglist, endlist );
1962 =for apidoc packlist
1964 The engine implementing pack() Perl function.
1970 Perl_packlist(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist )
1972 tempsym_t sym = { 0 };
1974 sym.patend = patend;
1975 sym.flags = FLAG_PACK;
1977 (void)pack_rec( cat, &sym, beglist, endlist );
1983 S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV **endlist )
1987 register I32 len = 0;
1990 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
1991 static char *space10 = " ";
1994 /* These must not be in registers: */
2004 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2005 long double aldouble;
2014 int strrelbeg = SvCUR(cat);
2015 tempsym_t lookahead;
2017 items = endlist - beglist;
2018 found = next_symbol( symptr );
2020 #ifndef PACKED_IS_OCTETS
2021 if (symptr->level == 0 && found && symptr->code == 'U' ){
2027 SV *lengthcode = Nullsv;
2028 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
2030 I32 datumtype = symptr->code;
2033 switch( howlen = symptr->howlen ){
2036 len = symptr->length;
2039 len = strchr("@Xxu", datumtype) ? 0 : items;
2043 /* Look ahead for next symbol. Do we have code/code? */
2044 lookahead = *symptr;
2045 found = next_symbol(&lookahead);
2046 if ( symptr->flags & FLAG_SLASH ) {
2048 if ( 0 == strchr( "aAZ", lookahead.code ) ||
2049 e_star != lookahead.howlen )
2050 Perl_croak(aTHX_ "'/' must be followed by 'a*', 'A*' or 'Z*' in pack");
2051 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
2052 ? *beglist : &PL_sv_no)
2053 + (lookahead.code == 'Z' ? 1 : 0)));
2055 Perl_croak(aTHX_ "Code missing after '/' in pack");
2061 Perl_croak(aTHX_ "Invalid type '%c' in pack", (int)datumtype);
2063 Perl_croak(aTHX_ "'%%' may not be used in pack");
2065 len += strrelbeg - SvCUR(cat);
2074 tempsym_t savsym = *symptr;
2075 symptr->patend = savsym.grpend;
2078 symptr->patptr = savsym.grpbeg;
2079 beglist = pack_rec(cat, symptr, beglist, endlist );
2080 if (savsym.howlen == e_star && beglist == endlist)
2081 break; /* No way to continue */
2083 lookahead.flags = symptr->flags;
2087 case 'X' | TYPE_IS_SHRIEKING:
2088 if (!len) /* Avoid division by 0 */
2090 len = (SvCUR(cat)) % len;
2094 if ((I32)SvCUR(cat) < len)
2095 Perl_croak(aTHX_ "'X' outside of string in pack");
2099 case 'x' | TYPE_IS_SHRIEKING:
2100 if (!len) /* Avoid division by 0 */
2102 aint = (SvCUR(cat)) % len;
2103 if (aint) /* Other portable ways? */
2112 sv_catpvn(cat, null10, 10);
2115 sv_catpvn(cat, null10, len);
2121 aptr = SvPV(fromstr, fromlen);
2122 if (howlen == e_star) {
2124 if (datumtype == 'Z')
2127 if ((I32)fromlen >= len) {
2128 sv_catpvn(cat, aptr, len);
2129 if (datumtype == 'Z')
2130 *(SvEND(cat)-1) = '\0';
2133 sv_catpvn(cat, aptr, fromlen);
2135 if (datumtype == 'A') {
2137 sv_catpvn(cat, space10, 10);
2140 sv_catpvn(cat, space10, len);
2144 sv_catpvn(cat, null10, 10);
2147 sv_catpvn(cat, null10, len);
2159 str = SvPV(fromstr, fromlen);
2160 if (howlen == e_star)
2163 SvCUR(cat) += (len+7)/8;
2164 SvGROW(cat, SvCUR(cat) + 1);
2165 aptr = SvPVX(cat) + aint;
2166 if (len > (I32)fromlen)
2170 if (datumtype == 'B') {
2171 for (len = 0; len++ < aint;) {
2172 items |= *str++ & 1;
2176 *aptr++ = items & 0xff;
2182 for (len = 0; len++ < aint;) {
2188 *aptr++ = items & 0xff;
2194 if (datumtype == 'B')
2195 items <<= 7 - (aint & 7);
2197 items >>= 7 - (aint & 7);
2198 *aptr++ = items & 0xff;
2200 str = SvPVX(cat) + SvCUR(cat);
2215 str = SvPV(fromstr, fromlen);
2216 if (howlen == e_star)
2219 SvCUR(cat) += (len+1)/2;
2220 SvGROW(cat, SvCUR(cat) + 1);
2221 aptr = SvPVX(cat) + aint;
2222 if (len > (I32)fromlen)
2226 if (datumtype == 'H') {
2227 for (len = 0; len++ < aint;) {
2229 items |= ((*str++ & 15) + 9) & 15;
2231 items |= *str++ & 15;
2235 *aptr++ = items & 0xff;
2241 for (len = 0; len++ < aint;) {
2243 items |= (((*str++ & 15) + 9) & 15) << 4;
2245 items |= (*str++ & 15) << 4;
2249 *aptr++ = items & 0xff;
2255 *aptr++ = items & 0xff;
2256 str = SvPVX(cat) + SvCUR(cat);
2267 switch (datumtype) {
2269 aint = SvIV(fromstr);
2270 if ((aint < 0 || aint > 255) &&
2272 Perl_warner(aTHX_ packWARN(WARN_PACK),
2273 "Character in 'C' format wrapped in pack");
2275 sv_catpvn(cat, &achar, sizeof(char));
2278 aint = SvIV(fromstr);
2279 if ((aint < -128 || aint > 127) &&
2281 Perl_warner(aTHX_ packWARN(WARN_PACK),
2282 "Character in 'c' format wrapped in pack" );
2284 sv_catpvn(cat, &achar, sizeof(char));
2292 auint = UNI_TO_NATIVE(SvUV(fromstr));
2293 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
2295 (char*)uvchr_to_utf8_flags((U8*)SvEND(cat),
2298 0 : UNICODE_ALLOW_ANY)
2303 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
2308 /* VOS does not automatically map a floating-point overflow
2309 during conversion from double to float into infinity, so we
2310 do it by hand. This code should either be generalized for
2311 any OS that needs it, or removed if and when VOS implements
2312 posix-976 (suggestion to support mapping to infinity).
2313 Paul.Green@stratus.com 02-04-02. */
2314 if (SvNV(fromstr) > FLT_MAX)
2315 afloat = _float_constants[0]; /* single prec. inf. */
2316 else if (SvNV(fromstr) < -FLT_MAX)
2317 afloat = _float_constants[0]; /* single prec. inf. */
2318 else afloat = (float)SvNV(fromstr);
2320 # if defined(VMS) && !defined(__IEEE_FP)
2321 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2322 * on Alpha; fake it if we don't have them.
2324 if (SvNV(fromstr) > FLT_MAX)
2326 else if (SvNV(fromstr) < -FLT_MAX)
2328 else afloat = (float)SvNV(fromstr);
2330 afloat = (float)SvNV(fromstr);
2333 sv_catpvn(cat, (char *)&afloat, sizeof (float));
2340 /* VOS does not automatically map a floating-point overflow
2341 during conversion from long double to double into infinity,
2342 so we do it by hand. This code should either be generalized
2343 for any OS that needs it, or removed if and when VOS
2344 implements posix-976 (suggestion to support mapping to
2345 infinity). Paul.Green@stratus.com 02-04-02. */
2346 if (SvNV(fromstr) > DBL_MAX)
2347 adouble = _double_constants[0]; /* double prec. inf. */
2348 else if (SvNV(fromstr) < -DBL_MAX)
2349 adouble = _double_constants[0]; /* double prec. inf. */
2350 else adouble = (double)SvNV(fromstr);
2352 # if defined(VMS) && !defined(__IEEE_FP)
2353 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2354 * on Alpha; fake it if we don't have them.
2356 if (SvNV(fromstr) > DBL_MAX)
2358 else if (SvNV(fromstr) < -DBL_MAX)
2360 else adouble = (double)SvNV(fromstr);
2362 adouble = (double)SvNV(fromstr);
2365 sv_catpvn(cat, (char *)&adouble, sizeof (double));
2371 anv = SvNV(fromstr);
2372 sv_catpvn(cat, (char *)&anv, NVSIZE);
2375 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2379 aldouble = (long double)SvNV(fromstr);
2380 sv_catpvn(cat, (char *)&aldouble, LONG_DOUBLESIZE);
2384 case 'n' | TYPE_IS_SHRIEKING:
2388 ashort = (I16)SvIV(fromstr);
2390 ashort = PerlSock_htons(ashort);
2392 CAT16(cat, &ashort);
2395 case 'v' | TYPE_IS_SHRIEKING:
2399 ashort = (I16)SvIV(fromstr);
2401 ashort = htovs(ashort);
2403 CAT16(cat, &ashort);
2406 case 'S' | TYPE_IS_SHRIEKING:
2407 #if SHORTSIZE != SIZE16
2409 unsigned short aushort;
2413 aushort = SvUV(fromstr);
2414 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
2427 aushort = (U16)SvUV(fromstr);
2428 CAT16(cat, &aushort);
2433 case 's' | TYPE_IS_SHRIEKING:
2434 #if SHORTSIZE != SIZE16
2440 ashort = SvIV(fromstr);
2441 sv_catpvn(cat, (char *)&ashort, sizeof(short));
2451 ashort = (I16)SvIV(fromstr);
2452 CAT16(cat, &ashort);
2456 case 'I' | TYPE_IS_SHRIEKING:
2459 auint = SvUV(fromstr);
2460 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
2466 aiv = SvIV(fromstr);
2467 sv_catpvn(cat, (char*)&aiv, IVSIZE);
2473 auv = SvUV(fromstr);
2474 sv_catpvn(cat, (char*)&auv, UVSIZE);
2480 anv = SvNV(fromstr);
2483 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
2485 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
2486 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
2487 any negative IVs will have already been got by the croak()
2488 above. IOK is untrue for fractions, so we test them
2489 against UV_MAX_P1. */
2490 if (SvIOK(fromstr) || anv < UV_MAX_P1)
2492 char buf[(sizeof(UV)*8)/7+1];
2493 char *in = buf + sizeof(buf);
2494 UV auv = SvUV(fromstr);
2497 *--in = (char)((auv & 0x7f) | 0x80);
2500 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2501 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2503 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
2504 char *from, *result, *in;
2509 /* Copy string and check for compliance */
2510 from = SvPV(fromstr, len);
2511 if ((norm = is_an_int(from, len)) == NULL)
2512 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2514 New('w', result, len, char);
2518 *--in = div128(norm, &done) | 0x80;
2519 result[len - 1] &= 0x7F; /* clear continue bit */
2520 sv_catpvn(cat, in, (result + len) - in);
2522 SvREFCNT_dec(norm); /* free norm */
2524 else if (SvNOKp(fromstr)) {
2525 /* 10**NV_MAX_10_EXP is the largest power of 10
2526 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
2527 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
2528 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
2529 And with that many bytes only Inf can overflow.
2530 Some C compilers are strict about integral constant
2531 expressions so we conservatively divide by a slightly
2532 smaller integer instead of multiplying by the exact
2533 floating-point value.
2535 #ifdef NV_MAX_10_EXP
2536 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
2537 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
2539 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
2540 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
2542 char *in = buf + sizeof(buf);
2544 anv = Perl_floor(anv);
2546 NV next = Perl_floor(anv / 128);
2547 if (in <= buf) /* this cannot happen ;-) */
2548 Perl_croak(aTHX_ "Cannot compress integer in pack");
2549 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
2552 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2553 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2556 char *from, *result, *in;
2561 /* Copy string and check for compliance */
2562 from = SvPV(fromstr, len);
2563 if ((norm = is_an_int(from, len)) == NULL)
2564 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2566 New('w', result, len, char);
2570 *--in = div128(norm, &done) | 0x80;
2571 result[len - 1] &= 0x7F; /* clear continue bit */
2572 sv_catpvn(cat, in, (result + len) - in);
2574 SvREFCNT_dec(norm); /* free norm */
2579 case 'i' | TYPE_IS_SHRIEKING:
2582 aint = SvIV(fromstr);
2583 sv_catpvn(cat, (char*)&aint, sizeof(int));
2586 case 'N' | TYPE_IS_SHRIEKING:
2590 aulong = SvUV(fromstr);
2592 aulong = PerlSock_htonl(aulong);
2594 CAT32(cat, &aulong);
2597 case 'V' | TYPE_IS_SHRIEKING:
2601 aulong = SvUV(fromstr);
2603 aulong = htovl(aulong);
2605 CAT32(cat, &aulong);
2608 case 'L' | TYPE_IS_SHRIEKING:
2609 #if LONGSIZE != SIZE32
2611 unsigned long aulong;
2615 aulong = SvUV(fromstr);
2616 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2627 aulong = SvUV(fromstr);
2628 CAT32(cat, &aulong);
2632 case 'l' | TYPE_IS_SHRIEKING:
2633 #if LONGSIZE != SIZE32
2639 along = SvIV(fromstr);
2640 sv_catpvn(cat, (char *)&along, sizeof(long));
2650 along = SvIV(fromstr);
2658 auquad = (Uquad_t)SvUV(fromstr);
2659 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2665 aquad = (Quad_t)SvIV(fromstr);
2666 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2671 len = 1; /* assume SV is correct length */
2676 if (fromstr == &PL_sv_undef)
2680 /* XXX better yet, could spirit away the string to
2681 * a safe spot and hang on to it until the result
2682 * of pack() (and all copies of the result) are
2685 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2686 || (SvPADTMP(fromstr)
2687 && !SvREADONLY(fromstr))))
2689 Perl_warner(aTHX_ packWARN(WARN_PACK),
2690 "Attempt to pack pointer to temporary value");
2692 if (SvPOK(fromstr) || SvNIOK(fromstr))
2693 aptr = SvPV(fromstr,n_a);
2695 aptr = SvPV_force(fromstr,n_a);
2697 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2702 aptr = SvPV(fromstr, fromlen);
2703 SvGROW(cat, fromlen * 4 / 3);
2708 while (fromlen > 0) {
2711 if ((I32)fromlen > len)
2715 doencodes(cat, aptr, todo);
2721 *symptr = lookahead;
2730 dSP; dMARK; dORIGMARK; dTARGET;
2731 register SV *cat = TARG;
2733 register char *pat = SvPVx(*++MARK, fromlen);
2734 register char *patend = pat + fromlen;
2737 sv_setpvn(cat, "", 0);
2739 packlist(cat, pat, patend, MARK, SP + 1);