3 * Copyright (c) 1991-2002, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * He still hopefully carried some of his gear in his pack: a small tinder-box,
12 * two small shallow pans, the smaller fitting into the larger; inside them a
13 * wooden spoon, a short two-pronged fork and some skewers were stowed; and
14 * hidden at the bottom of the pack in a flat wooden box a dwindling treasure,
19 #define PERL_IN_PP_PACK_C
23 * The compiler on Concurrent CX/UX systems has a subtle bug which only
24 * seems to show up when compiling pp.c - it generates the wrong double
25 * precision constant value for (double)UV_MAX when used inline in the body
26 * of the code below, so this makes a static variable up front (which the
27 * compiler seems to get correct) and uses it in place of UV_MAX below.
29 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
30 static double UV_MAX_cxux = ((double)UV_MAX);
34 * Offset for integer pack/unpack.
36 * On architectures where I16 and I32 aren't really 16 and 32 bits,
37 * which for now are all Crays, pack and unpack have to play games.
41 * These values are required for portability of pack() output.
42 * If they're not right on your machine, then pack() and unpack()
43 * wouldn't work right anyway; you'll need to apply the Cray hack.
44 * (I'd like to check them with #if, but you can't use sizeof() in
45 * the preprocessor.) --???
48 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
49 defines are now in config.h. --Andy Dougherty April 1998
54 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
57 #if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
58 # define PERL_NATINT_PACK
61 #if LONGSIZE > 4 && defined(_CRAY)
62 # if BYTEORDER == 0x12345678
63 # define OFF16(p) (char*)(p)
64 # define OFF32(p) (char*)(p)
66 # if BYTEORDER == 0x87654321
67 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
68 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
70 }}}} bad cray byte order
73 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
74 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
75 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
76 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
77 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
79 # define COPY16(s,p) Copy(s, p, SIZE16, char)
80 # define COPY32(s,p) Copy(s, p, SIZE32, char)
81 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
82 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
83 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
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' + (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 UNPACK_ONLY_ONE 0x1
127 #define UNPACK_DO_UTF8 0x2
130 S_group_end(pTHX_ register char *pat, register char *patend, char ender)
132 while (pat < patend) {
140 while (pat < patend && *pat != '\n')
144 pat = group_end(pat, patend, ')') + 1;
146 pat = group_end(pat, patend, ']') + 1;
148 Perl_croak(aTHX_ "No group ending character `%c' found", ender);
151 /* Returns the sizeof() struct described by pat */
153 S_measure_struct(pTHX_ char *pat, register char *patend)
157 register I32 total = 0;
159 int star; /* 1 if count is *, -1 if no count given, -2 for / */
160 #ifdef PERL_NATINT_PACK
161 int natint; /* native integer */
162 int unatint; /* unsigned native integer */
167 while ((pat = next_symbol(pat, patend)) < patend) {
168 datumtype = *pat++ & 0xFF;
169 #ifdef PERL_NATINT_PACK
173 static const char *natstr = "sSiIlL";
175 if (strchr(natstr, datumtype)) {
176 #ifdef PERL_NATINT_PACK
182 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
184 len = find_count(&pat, patend, &star);
186 Perl_croak(aTHX_ "%s not allowed in length fields", "count *");
187 else if (star < 0) /* No explicit len */
188 len = datumtype != '@';
192 Perl_croak(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
195 case 'U': /* XXXX Is it correct? */
200 Perl_croak(aTHX_ "%s not allowed in length fields", buf);
201 case ',': /* grandfather in commas but with a warning */
202 if (commas++ == 0 && ckWARN(WARN_UNPACK))
203 Perl_warner(aTHX_ WARN_UNPACK,
204 "Invalid type in unpack: '%c'", (int)datumtype);
211 char *beg = pat, *end;
214 Perl_croak(aTHX_ "()-group starts with a count");
215 end = group_end(beg, patend, ')');
217 len = find_count(&pat, patend, &star);
218 if (star < 0) /* No count */
220 else if (star > 0) /* Star */
221 Perl_croak(aTHX_ "%s not allowed in length fields", "count *");
222 size = measure_struct(beg, end);
228 Perl_croak(aTHX_ "X outside of string");
249 #if SHORTSIZE == SIZE16
252 size = (natint ? sizeof(short) : SIZE16);
258 #if SHORTSIZE == SIZE16
261 unatint = natint && datumtype == 'S';
262 size = (unatint ? sizeof(unsigned short) : SIZE16);
269 size = sizeof(unsigned int);
272 #if LONGSIZE == SIZE32
275 size = (natint ? sizeof(long) : SIZE32);
281 #if LONGSIZE == SIZE32
284 unatint = natint && datumtype == 'L';
285 size = (unatint ? sizeof(unsigned long) : SIZE32);
292 size = sizeof(char*);
296 size = sizeof(Quad_t);
299 size = sizeof(Uquad_t);
304 size = sizeof(float);
308 size = sizeof(double);
316 /* Returns -1 on no count or on star */
318 S_find_count(pTHX_ char **ppat, register char *patend, int *star)
320 register char *pat = *ppat;
326 else if (*pat == '*') {
331 else if (isDIGIT(*pat) || *pat == '[') {
332 bool brackets = *pat == '[';
336 if (!isDIGIT(*pat)) {
337 char *end = group_end(pat, patend, ']');
340 return measure_struct(pat, end);
345 while (isDIGIT(*pat)) {
346 len = (len * 10) + (*pat++ - '0');
348 Perl_croak(aTHX_ "Repeat count in unpack overflows");
350 if (brackets && *pat++ != ']')
351 Perl_croak(aTHX_ "No repeat count ender ] found after digits");
360 S_next_symbol(pTHX_ register char *pat, register char *patend)
362 while (pat < patend) {
365 else if (*pat == '#') {
367 while (pat < patend && *pat != '\n')
379 =for apidoc unpack_str
381 The engine implementing unpack() Perl function.
386 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
391 register I32 bits = 0;
394 I32 start_sp_offset = SP - PL_stack_base;
396 /* These must not be in registers: */
415 const int bits_in_uv = 8 * sizeof(culong);
417 int star; /* 1 if count is *, -1 if no count given, -2 for / */
418 #ifdef PERL_NATINT_PACK
419 int natint; /* native integer */
420 int unatint; /* unsigned native integer */
422 bool do_utf8 = flags & UNPACK_DO_UTF8;
424 while ((pat = next_symbol(pat, patend)) < patend) {
425 datumtype = *pat++ & 0xFF;
426 #ifdef PERL_NATINT_PACK
429 /* do first one only unless in list context
430 / is implemented by unpacking the count, then poping it from the
431 stack, so must check that we're not in the middle of a / */
432 if ( (flags & UNPACK_ONLY_ONE)
433 && (SP - PL_stack_base == start_sp_offset + 1)
434 && (datumtype != '/') )
437 static const char natstr[] = "sSiIlL";
439 if (strchr(natstr, datumtype)) {
440 #ifdef PERL_NATINT_PACK
446 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
448 len = find_count(&pat, patend, &star);
450 len = strend - strbeg; /* long enough */
451 else if (star < 0) /* No explicit len */
452 len = datumtype != '@';
457 Perl_croak(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
458 case ',': /* grandfather in commas but with a warning */
459 if (commas++ == 0 && ckWARN(WARN_UNPACK))
460 Perl_warner(aTHX_ WARN_UNPACK,
461 "Invalid type in unpack: '%c'", (int)datumtype);
464 if (len == 1 && pat[-1] != '1' && pat[-1] != ']')
465 len = 16; /* len is not specified */
474 char *ss = s; /* Move from register */
477 Perl_croak(aTHX_ "()-group starts with a count");
478 aptr = group_end(beg, patend, ')');
481 len = find_count(&pat, patend, &star);
482 if (star < 0) /* No count */
484 else if (star > 0) /* Star */
485 len = strend - strbeg; /* long enough? */
489 unpack_str(beg, aptr, ss, strbeg, strend, &ss,
490 ocnt + SP - PL_stack_base - start_sp_offset, flags);
491 if (star > 0 && ss == strend)
492 break; /* No way to continue */
499 if (len > strend - strbeg)
500 Perl_croak(aTHX_ "@ outside of string");
504 if (len > s - strbeg)
505 Perl_croak(aTHX_ "X outside of string");
509 if (len > strend - s)
510 Perl_croak(aTHX_ "x outside of string");
514 if (ocnt + SP - PL_stack_base - start_sp_offset <= 0)
515 Perl_croak(aTHX_ "/ must follow a numeric type");
518 pat++; /* ignore '*' for compatibility with pack */
520 Perl_croak(aTHX_ "/ cannot take a count" );
527 if (len > strend - s)
532 sv_setpvn(sv, s, len);
533 if (datumtype == 'A' || datumtype == 'Z') {
534 aptr = s; /* borrow register */
535 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
539 if (star > 0) /* exact for 'Z*' */
540 len = s - SvPVX(sv) + 1;
542 else { /* 'A' strips both nulls and spaces */
543 s = SvPVX(sv) + len - 1;
544 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
548 SvCUR_set(sv, s - SvPVX(sv));
549 s = aptr; /* unborrow register */
552 XPUSHs(sv_2mortal(sv));
556 if (star > 0 || len > (strend - s) * 8)
557 len = (strend - s) * 8;
560 Newz(601, PL_bitcount, 256, char);
561 for (bits = 1; bits < 256; bits++) {
562 if (bits & 1) PL_bitcount[bits]++;
563 if (bits & 2) PL_bitcount[bits]++;
564 if (bits & 4) PL_bitcount[bits]++;
565 if (bits & 8) PL_bitcount[bits]++;
566 if (bits & 16) PL_bitcount[bits]++;
567 if (bits & 32) PL_bitcount[bits]++;
568 if (bits & 64) PL_bitcount[bits]++;
569 if (bits & 128) PL_bitcount[bits]++;
573 culong += PL_bitcount[*(unsigned char*)s++];
578 if (datumtype == 'b') {
580 if (bits & 1) culong++;
586 if (bits & 128) culong++;
593 sv = NEWSV(35, len + 1);
597 if (datumtype == 'b') {
599 for (len = 0; len < aint; len++) {
600 if (len & 7) /*SUPPRESS 595*/
604 *str++ = '0' + (bits & 1);
609 for (len = 0; len < aint; len++) {
614 *str++ = '0' + ((bits & 128) != 0);
618 XPUSHs(sv_2mortal(sv));
622 if (star > 0 || len > (strend - s) * 2)
623 len = (strend - s) * 2;
624 sv = NEWSV(35, len + 1);
628 if (datumtype == 'h') {
630 for (len = 0; len < aint; len++) {
635 *str++ = PL_hexdigit[bits & 15];
640 for (len = 0; len < aint; len++) {
645 *str++ = PL_hexdigit[(bits >> 4) & 15];
649 XPUSHs(sv_2mortal(sv));
652 if (len > strend - s)
657 if (aint >= 128) /* fake up signed chars */
659 if (checksum > bits_in_uv)
670 if (aint >= 128) /* fake up signed chars */
673 sv_setiv(sv, (IV)aint);
674 PUSHs(sv_2mortal(sv));
679 unpack_C: /* unpack U will jump here if not UTF-8 */
684 if (len > strend - s)
699 sv_setiv(sv, (IV)auint);
700 PUSHs(sv_2mortal(sv));
711 if (len > strend - s)
714 while (len-- > 0 && s < strend) {
716 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, 0));
719 if (checksum > bits_in_uv)
720 cdouble += (NV)auint;
728 while (len-- > 0 && s < strend) {
730 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, 0));
734 sv_setuv(sv, (UV)auint);
735 PUSHs(sv_2mortal(sv));
740 #if SHORTSIZE == SIZE16
741 along = (strend - s) / SIZE16;
743 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
748 #if SHORTSIZE != SIZE16
752 COPYNN(s, &ashort, sizeof(short));
754 if (checksum > bits_in_uv)
755 cdouble += (NV)ashort;
766 #if SHORTSIZE > SIZE16
771 if (checksum > bits_in_uv)
772 cdouble += (NV)ashort;
781 #if SHORTSIZE != SIZE16
785 COPYNN(s, &ashort, sizeof(short));
788 sv_setiv(sv, (IV)ashort);
789 PUSHs(sv_2mortal(sv));
797 #if SHORTSIZE > SIZE16
803 sv_setiv(sv, (IV)ashort);
804 PUSHs(sv_2mortal(sv));
812 #if SHORTSIZE == SIZE16
813 along = (strend - s) / SIZE16;
815 unatint = natint && datumtype == 'S';
816 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
821 #if SHORTSIZE != SIZE16
823 unsigned short aushort;
825 COPYNN(s, &aushort, sizeof(unsigned short));
826 s += sizeof(unsigned short);
827 if (checksum > bits_in_uv)
828 cdouble += (NV)aushort;
840 if (datumtype == 'n')
841 aushort = PerlSock_ntohs(aushort);
844 if (datumtype == 'v')
845 aushort = vtohs(aushort);
847 if (checksum > bits_in_uv)
848 cdouble += (NV)aushort;
857 #if SHORTSIZE != SIZE16
859 unsigned short aushort;
861 COPYNN(s, &aushort, sizeof(unsigned short));
862 s += sizeof(unsigned short);
864 sv_setiv(sv, (UV)aushort);
865 PUSHs(sv_2mortal(sv));
876 if (datumtype == 'n')
877 aushort = PerlSock_ntohs(aushort);
880 if (datumtype == 'v')
881 aushort = vtohs(aushort);
883 sv_setiv(sv, (UV)aushort);
884 PUSHs(sv_2mortal(sv));
890 along = (strend - s) / sizeof(int);
895 Copy(s, &aint, 1, int);
897 if (checksum > bits_in_uv)
907 Copy(s, &aint, 1, int);
911 /* Without the dummy below unpack("i", pack("i",-1))
912 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
913 * cc with optimization turned on.
915 * The bug was detected in
916 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
917 * with optimization (-O4) turned on.
918 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
919 * does not have this problem even with -O4.
921 * This bug was reported as DECC_BUGS 1431
922 * and tracked internally as GEM_BUGS 7775.
924 * The bug is fixed in
925 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
926 * UNIX V4.0F support: DEC C V5.9-006 or later
927 * UNIX V4.0E support: DEC C V5.8-011 or later
930 * See also few lines later for the same bug.
933 sv_setiv(sv, (IV)aint) :
935 sv_setiv(sv, (IV)aint);
936 PUSHs(sv_2mortal(sv));
941 along = (strend - s) / sizeof(unsigned int);
946 Copy(s, &auint, 1, unsigned int);
947 s += sizeof(unsigned int);
948 if (checksum > bits_in_uv)
949 cdouble += (NV)auint;
958 Copy(s, &auint, 1, unsigned int);
959 s += sizeof(unsigned int);
962 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
963 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
964 * See details few lines earlier. */
966 sv_setuv(sv, (UV)auint) :
968 sv_setuv(sv, (UV)auint);
969 PUSHs(sv_2mortal(sv));
974 #if LONGSIZE == SIZE32
975 along = (strend - s) / SIZE32;
977 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
982 #if LONGSIZE != SIZE32
985 COPYNN(s, &along, sizeof(long));
987 if (checksum > bits_in_uv)
988 cdouble += (NV)along;
997 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1001 #if LONGSIZE > SIZE32
1002 if (along > 2147483647)
1003 along -= 4294967296;
1006 if (checksum > bits_in_uv)
1007 cdouble += (NV)along;
1016 #if LONGSIZE != SIZE32
1019 COPYNN(s, &along, sizeof(long));
1022 sv_setiv(sv, (IV)along);
1023 PUSHs(sv_2mortal(sv));
1030 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1034 #if LONGSIZE > SIZE32
1035 if (along > 2147483647)
1036 along -= 4294967296;
1040 sv_setiv(sv, (IV)along);
1041 PUSHs(sv_2mortal(sv));
1049 #if LONGSIZE == SIZE32
1050 along = (strend - s) / SIZE32;
1052 unatint = natint && datumtype == 'L';
1053 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
1058 #if LONGSIZE != SIZE32
1060 unsigned long aulong;
1062 COPYNN(s, &aulong, sizeof(unsigned long));
1063 s += sizeof(unsigned long);
1064 if (checksum > bits_in_uv)
1065 cdouble += (NV)aulong;
1077 if (datumtype == 'N')
1078 aulong = PerlSock_ntohl(aulong);
1081 if (datumtype == 'V')
1082 aulong = vtohl(aulong);
1084 if (checksum > bits_in_uv)
1085 cdouble += (NV)aulong;
1094 #if LONGSIZE != SIZE32
1096 unsigned long aulong;
1098 COPYNN(s, &aulong, sizeof(unsigned long));
1099 s += sizeof(unsigned long);
1101 sv_setuv(sv, (UV)aulong);
1102 PUSHs(sv_2mortal(sv));
1112 if (datumtype == 'N')
1113 aulong = PerlSock_ntohl(aulong);
1116 if (datumtype == 'V')
1117 aulong = vtohl(aulong);
1120 sv_setuv(sv, (UV)aulong);
1121 PUSHs(sv_2mortal(sv));
1127 along = (strend - s) / sizeof(char*);
1133 if (sizeof(char*) > strend - s)
1136 Copy(s, &aptr, 1, char*);
1142 PUSHs(sv_2mortal(sv));
1152 while ((len > 0) && (s < strend)) {
1153 auv = (auv << 7) | (*s & 0x7f);
1154 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1155 if ((U8)(*s++) < 0x80) {
1159 PUSHs(sv_2mortal(sv));
1163 else if (++bytes >= sizeof(UV)) { /* promote to string */
1167 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1168 while (s < strend) {
1169 sv = mul128(sv, *s & 0x7f);
1170 if (!(*s++ & 0x80)) {
1179 PUSHs(sv_2mortal(sv));
1184 if ((s >= strend) && bytes)
1185 Perl_croak(aTHX_ "Unterminated compressed integer");
1190 Perl_croak(aTHX_ "P must have an explicit size");
1192 if (sizeof(char*) > strend - s)
1195 Copy(s, &aptr, 1, char*);
1200 sv_setpvn(sv, aptr, len);
1201 PUSHs(sv_2mortal(sv));
1205 along = (strend - s) / sizeof(Quad_t);
1210 Copy(s, &aquad, 1, Quad_t);
1211 s += sizeof(Quad_t);
1212 if (checksum > bits_in_uv)
1213 cdouble += (NV)aquad;
1222 if (s + sizeof(Quad_t) > strend)
1225 Copy(s, &aquad, 1, Quad_t);
1226 s += sizeof(Quad_t);
1229 if (aquad >= IV_MIN && aquad <= IV_MAX)
1230 sv_setiv(sv, (IV)aquad);
1232 sv_setnv(sv, (NV)aquad);
1233 PUSHs(sv_2mortal(sv));
1238 along = (strend - s) / sizeof(Uquad_t);
1243 Copy(s, &auquad, 1, Uquad_t);
1244 s += sizeof(Uquad_t);
1245 if (checksum > bits_in_uv)
1246 cdouble += (NV)auquad;
1255 if (s + sizeof(Uquad_t) > strend)
1258 Copy(s, &auquad, 1, Uquad_t);
1259 s += sizeof(Uquad_t);
1262 if (auquad <= UV_MAX)
1263 sv_setuv(sv, (UV)auquad);
1265 sv_setnv(sv, (NV)auquad);
1266 PUSHs(sv_2mortal(sv));
1271 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1274 along = (strend - s) / sizeof(float);
1279 Copy(s, &afloat, 1, float);
1288 Copy(s, &afloat, 1, float);
1291 sv_setnv(sv, (NV)afloat);
1292 PUSHs(sv_2mortal(sv));
1298 along = (strend - s) / sizeof(double);
1303 Copy(s, &adouble, 1, double);
1304 s += sizeof(double);
1312 Copy(s, &adouble, 1, double);
1313 s += sizeof(double);
1315 sv_setnv(sv, (NV)adouble);
1316 PUSHs(sv_2mortal(sv));
1322 * Initialise the decode mapping. By using a table driven
1323 * algorithm, the code will be character-set independent
1324 * (and just as fast as doing character arithmetic)
1326 if (PL_uudmap['M'] == 0) {
1329 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1330 PL_uudmap[(U8)PL_uuemap[i]] = i;
1332 * Because ' ' and '`' map to the same value,
1333 * we need to decode them both the same.
1338 along = (strend - s) * 3 / 4;
1339 sv = NEWSV(42, along);
1342 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1347 len = PL_uudmap[*(U8*)s++] & 077;
1349 if (s < strend && ISUUCHAR(*s))
1350 a = PL_uudmap[*(U8*)s++] & 077;
1353 if (s < strend && ISUUCHAR(*s))
1354 b = PL_uudmap[*(U8*)s++] & 077;
1357 if (s < strend && ISUUCHAR(*s))
1358 c = PL_uudmap[*(U8*)s++] & 077;
1361 if (s < strend && ISUUCHAR(*s))
1362 d = PL_uudmap[*(U8*)s++] & 077;
1365 hunk[0] = (a << 2) | (b >> 4);
1366 hunk[1] = (b << 4) | (c >> 2);
1367 hunk[2] = (c << 6) | d;
1368 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1373 else if (s[1] == '\n') /* possible checksum byte */
1376 XPUSHs(sv_2mortal(sv));
1381 if (strchr("fFdD", datumtype) ||
1382 (checksum > bits_in_uv && strchr("csSiIlLnNUvVqQ", datumtype)) ) {
1385 adouble = (NV) (1 << (checksum & 15));
1386 while (checksum >= 16) {
1390 while (cdouble < 0.0)
1392 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1393 sv_setnv(sv, cdouble);
1396 if (checksum < bits_in_uv) {
1397 UV mask = ((UV)1 << checksum) - 1;
1400 sv_setuv(sv, (UV)culong);
1402 XPUSHs(sv_2mortal(sv));
1409 return SP - PL_stack_base - start_sp_offset;
1416 I32 gimme = GIMME_V;
1419 register char *pat = SvPV(left, llen);
1420 #ifdef PACKED_IS_OCTETS
1421 /* Packed side is assumed to be octets - so force downgrade if it
1422 has been UTF-8 encoded by accident
1424 register char *s = SvPVbyte(right, rlen);
1426 register char *s = SvPV(right, rlen);
1428 char *strend = s + rlen;
1429 register char *patend = pat + llen;
1433 cnt = unpack_str(pat, patend, s, s, strend, NULL, 0,
1434 ((gimme == G_SCALAR) ? UNPACK_ONLY_ONE : 0)
1435 | (DO_UTF8(right) ? UNPACK_DO_UTF8 : 0));
1437 if ( !cnt && gimme == G_SCALAR )
1438 PUSHs(&PL_sv_undef);
1443 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
1447 *hunk = PL_uuemap[len];
1448 sv_catpvn(sv, hunk, 1);
1451 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1452 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
1453 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
1454 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
1455 sv_catpvn(sv, hunk, 4);
1460 char r = (len > 1 ? s[1] : '\0');
1461 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1462 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
1463 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
1464 hunk[3] = PL_uuemap[0];
1465 sv_catpvn(sv, hunk, 4);
1467 sv_catpvn(sv, "\n", 1);
1471 S_is_an_int(pTHX_ char *s, STRLEN l)
1474 SV *result = newSVpvn(s, l);
1475 char *result_c = SvPV(result, n_a); /* convenience */
1476 char *out = result_c;
1486 SvREFCNT_dec(result);
1509 SvREFCNT_dec(result);
1515 SvCUR_set(result, out - result_c);
1519 /* pnum must be '\0' terminated */
1521 S_div128(pTHX_ SV *pnum, bool *done)
1524 char *s = SvPV(pnum, len);
1533 i = m * 10 + (*t - '0');
1535 r = (i >> 7); /* r < 10 */
1542 SvCUR_set(pnum, (STRLEN) (t - s));
1546 #define PACK_CHILD 0x1
1549 =for apidoc pack_cat
1551 The engine implementing pack() Perl function.
1556 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
1564 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
1565 static char *space10 = " ";
1568 /* These must not be in registers: */
1583 #ifdef PERL_NATINT_PACK
1584 int natint; /* native integer */
1587 items = endlist - beglist;
1588 #ifndef PACKED_IS_OCTETS
1589 pat = next_symbol(pat, patend);
1590 if (pat < patend && *pat == 'U' && !flags)
1593 while ((pat = next_symbol(pat, patend)) < patend) {
1594 SV *lengthcode = Nullsv;
1595 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
1596 datumtype = *pat++ & 0xFF;
1597 #ifdef PERL_NATINT_PACK
1601 static const char natstr[] = "sSiIlL";
1603 if (strchr(natstr, datumtype)) {
1604 #ifdef PERL_NATINT_PACK
1610 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
1612 len = find_count(&pat, patend, &star);
1613 if (star > 0) /* Count is '*' */
1614 len = strchr("@Xxu", datumtype) ? 0 : items;
1615 else if (star < 0) /* Default len */
1617 if (*pat == '/') { /* doing lookahead how... */
1619 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
1620 Perl_croak(aTHX_ "/ must be followed by a*, A* or Z*");
1621 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
1622 ? *beglist : &PL_sv_no)
1623 + (*pat == 'Z' ? 1 : 0)));
1627 Perl_croak(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
1628 case ',': /* grandfather in commas but with a warning */
1629 if (commas++ == 0 && ckWARN(WARN_PACK))
1630 Perl_warner(aTHX_ WARN_PACK,
1631 "Invalid type in pack: '%c'", (int)datumtype);
1634 Perl_croak(aTHX_ "%% may only be used in unpack");
1646 SV **savebeglist = beglist; /* beglist de-register-ed */
1649 Perl_croak(aTHX_ "()-group starts with a count");
1650 aptr = group_end(beg, patend, ')');
1653 len = find_count(&pat, patend, &star);
1654 if (star < 0) /* No count */
1656 else if (star > 0) /* Star */
1657 len = items; /* long enough? */
1660 pack_cat(cat, beg, aptr, savebeglist, endlist,
1661 &savebeglist, PACK_CHILD);
1662 if (star > 0 && savebeglist == endlist)
1663 break; /* No way to continue */
1665 beglist = savebeglist;
1670 if (SvCUR(cat) < len)
1671 Perl_croak(aTHX_ "X outside of string");
1678 sv_catpvn(cat, null10, 10);
1681 sv_catpvn(cat, null10, len);
1687 aptr = SvPV(fromstr, fromlen);
1688 if (star > 0) { /* -2 after '/' */
1690 if (datumtype == 'Z')
1693 if (fromlen >= len) {
1694 sv_catpvn(cat, aptr, len);
1695 if (datumtype == 'Z')
1696 *(SvEND(cat)-1) = '\0';
1699 sv_catpvn(cat, aptr, fromlen);
1701 if (datumtype == 'A') {
1703 sv_catpvn(cat, space10, 10);
1706 sv_catpvn(cat, space10, len);
1710 sv_catpvn(cat, null10, 10);
1713 sv_catpvn(cat, null10, len);
1725 str = SvPV(fromstr, fromlen);
1729 SvCUR(cat) += (len+7)/8;
1730 SvGROW(cat, SvCUR(cat) + 1);
1731 aptr = SvPVX(cat) + aint;
1736 if (datumtype == 'B') {
1737 for (len = 0; len++ < aint;) {
1738 items |= *str++ & 1;
1742 *aptr++ = items & 0xff;
1748 for (len = 0; len++ < aint;) {
1754 *aptr++ = items & 0xff;
1760 if (datumtype == 'B')
1761 items <<= 7 - (aint & 7);
1763 items >>= 7 - (aint & 7);
1764 *aptr++ = items & 0xff;
1766 str = SvPVX(cat) + SvCUR(cat);
1781 str = SvPV(fromstr, fromlen);
1785 SvCUR(cat) += (len+1)/2;
1786 SvGROW(cat, SvCUR(cat) + 1);
1787 aptr = SvPVX(cat) + aint;
1792 if (datumtype == 'H') {
1793 for (len = 0; len++ < aint;) {
1795 items |= ((*str++ & 15) + 9) & 15;
1797 items |= *str++ & 15;
1801 *aptr++ = items & 0xff;
1807 for (len = 0; len++ < aint;) {
1809 items |= (((*str++ & 15) + 9) & 15) << 4;
1811 items |= (*str++ & 15) << 4;
1815 *aptr++ = items & 0xff;
1821 *aptr++ = items & 0xff;
1822 str = SvPVX(cat) + SvCUR(cat);
1833 switch (datumtype) {
1835 aint = SvIV(fromstr);
1836 if ((aint < 0 || aint > 255) &&
1838 Perl_warner(aTHX_ WARN_PACK,
1839 "Character in \"C\" format wrapped");
1841 sv_catpvn(cat, &achar, sizeof(char));
1844 aint = SvIV(fromstr);
1845 if ((aint < -128 || aint > 127) &&
1847 Perl_warner(aTHX_ WARN_PACK,
1848 "Character in \"c\" format wrapped");
1850 sv_catpvn(cat, &achar, sizeof(char));
1858 auint = UNI_TO_NATIVE(SvUV(fromstr));
1859 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
1860 SvCUR_set(cat, (char*)uvchr_to_utf8((U8*)SvEND(cat),auint)
1865 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
1870 afloat = (float)SvNV(fromstr);
1871 sv_catpvn(cat, (char *)&afloat, sizeof (float));
1878 adouble = (double)SvNV(fromstr);
1879 sv_catpvn(cat, (char *)&adouble, sizeof (double));
1885 ashort = (I16)SvIV(fromstr);
1887 ashort = PerlSock_htons(ashort);
1889 CAT16(cat, &ashort);
1895 ashort = (I16)SvIV(fromstr);
1897 ashort = htovs(ashort);
1899 CAT16(cat, &ashort);
1903 #if SHORTSIZE != SIZE16
1905 unsigned short aushort;
1909 aushort = SvUV(fromstr);
1910 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
1920 aushort = (U16)SvUV(fromstr);
1921 CAT16(cat, &aushort);
1927 #if SHORTSIZE != SIZE16
1933 ashort = SvIV(fromstr);
1934 sv_catpvn(cat, (char *)&ashort, sizeof(short));
1942 ashort = (I16)SvIV(fromstr);
1943 CAT16(cat, &ashort);
1950 auint = SvUV(fromstr);
1951 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
1957 adouble = Perl_floor(SvNV(fromstr));
1960 Perl_croak(aTHX_ "Cannot compress negative numbers");
1963 #if UVSIZE > 4 && UVSIZE >= NVSIZE
1964 adouble <= 0xffffffff
1966 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
1967 adouble <= UV_MAX_cxux
1974 char buf[1 + sizeof(UV)];
1975 char *in = buf + sizeof(buf);
1976 UV auv = U_V(adouble);
1979 *--in = (auv & 0x7f) | 0x80;
1982 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
1983 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
1985 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
1986 char *from, *result, *in;
1991 /* Copy string and check for compliance */
1992 from = SvPV(fromstr, len);
1993 if ((norm = is_an_int(from, len)) == NULL)
1994 Perl_croak(aTHX_ "can compress only unsigned integer");
1996 New('w', result, len, char);
2000 *--in = div128(norm, &done) | 0x80;
2001 result[len - 1] &= 0x7F; /* clear continue bit */
2002 sv_catpvn(cat, in, (result + len) - in);
2004 SvREFCNT_dec(norm); /* free norm */
2006 else if (SvNOKp(fromstr)) {
2007 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
2008 char *in = buf + sizeof(buf);
2011 double next = floor(adouble / 128);
2012 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
2013 if (in <= buf) /* this cannot happen ;-) */
2014 Perl_croak(aTHX_ "Cannot compress integer");
2016 } while (adouble > 0);
2017 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2018 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2021 char *from, *result, *in;
2026 /* Copy string and check for compliance */
2027 from = SvPV(fromstr, len);
2028 if ((norm = is_an_int(from, len)) == NULL)
2029 Perl_croak(aTHX_ "can compress only unsigned integer");
2031 New('w', result, len, char);
2035 *--in = div128(norm, &done) | 0x80;
2036 result[len - 1] &= 0x7F; /* clear continue bit */
2037 sv_catpvn(cat, in, (result + len) - in);
2039 SvREFCNT_dec(norm); /* free norm */
2046 aint = SvIV(fromstr);
2047 sv_catpvn(cat, (char*)&aint, sizeof(int));
2053 aulong = SvUV(fromstr);
2055 aulong = PerlSock_htonl(aulong);
2057 CAT32(cat, &aulong);
2063 aulong = SvUV(fromstr);
2065 aulong = htovl(aulong);
2067 CAT32(cat, &aulong);
2071 #if LONGSIZE != SIZE32
2073 unsigned long aulong;
2077 aulong = SvUV(fromstr);
2078 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2086 aulong = SvUV(fromstr);
2087 CAT32(cat, &aulong);
2092 #if LONGSIZE != SIZE32
2098 along = SvIV(fromstr);
2099 sv_catpvn(cat, (char *)&along, sizeof(long));
2107 along = SvIV(fromstr);
2116 auquad = (Uquad_t)SvUV(fromstr);
2117 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2123 aquad = (Quad_t)SvIV(fromstr);
2124 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2129 len = 1; /* assume SV is correct length */
2134 if (fromstr == &PL_sv_undef)
2138 /* XXX better yet, could spirit away the string to
2139 * a safe spot and hang on to it until the result
2140 * of pack() (and all copies of the result) are
2143 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2144 || (SvPADTMP(fromstr)
2145 && !SvREADONLY(fromstr))))
2147 Perl_warner(aTHX_ WARN_PACK,
2148 "Attempt to pack pointer to temporary value");
2150 if (SvPOK(fromstr) || SvNIOK(fromstr))
2151 aptr = SvPV(fromstr,n_a);
2153 aptr = SvPV_force(fromstr,n_a);
2155 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2160 aptr = SvPV(fromstr, fromlen);
2161 SvGROW(cat, fromlen * 4 / 3);
2166 while (fromlen > 0) {
2173 doencodes(cat, aptr, todo);
2181 *next_in_list = beglist;
2188 dSP; dMARK; dORIGMARK; dTARGET;
2189 register SV *cat = TARG;
2191 register char *pat = SvPVx(*++MARK, fromlen);
2192 register char *patend = pat + fromlen;
2195 sv_setpvn(cat, "", 0);
2197 pack_cat(cat, pat, patend, MARK, SP + 1, NULL, 0);