3 * Copyright (c) 1991-2001, 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 #define PERL_IN_PP_PACK_C
15 * The compiler on Concurrent CX/UX systems has a subtle bug which only
16 * seems to show up when compiling pp.c - it generates the wrong double
17 * precision constant value for (double)UV_MAX when used inline in the body
18 * of the code below, so this makes a static variable up front (which the
19 * compiler seems to get correct) and uses it in place of UV_MAX below.
21 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
22 static double UV_MAX_cxux = ((double)UV_MAX);
26 * Offset for integer pack/unpack.
28 * On architectures where I16 and I32 aren't really 16 and 32 bits,
29 * which for now are all Crays, pack and unpack have to play games.
33 * These values are required for portability of pack() output.
34 * If they're not right on your machine, then pack() and unpack()
35 * wouldn't work right anyway; you'll need to apply the Cray hack.
36 * (I'd like to check them with #if, but you can't use sizeof() in
37 * the preprocessor.) --???
40 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
41 defines are now in config.h. --Andy Dougherty April 1998
46 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
49 #if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
50 # define PERL_NATINT_PACK
53 #if LONGSIZE > 4 && defined(_CRAY)
54 # if BYTEORDER == 0x12345678
55 # define OFF16(p) (char*)(p)
56 # define OFF32(p) (char*)(p)
58 # if BYTEORDER == 0x87654321
59 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
60 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
62 }}}} bad cray byte order
65 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
66 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
67 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
68 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
69 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
71 # define COPY16(s,p) Copy(s, p, SIZE16, char)
72 # define COPY32(s,p) Copy(s, p, SIZE32, char)
73 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
74 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
75 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
79 S_mul128(pTHX_ SV *sv, U8 m)
82 char *s = SvPV(sv, len);
86 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
87 SV *tmpNew = newSVpvn("0000000000", 10);
90 SvREFCNT_dec(sv); /* free old sv */
95 while (!*t) /* trailing '\0'? */
98 i = ((*t - '0') << 7) + m;
99 *(t--) = '0' + (i % 10);
105 /* Explosives and implosives. */
107 #if 'I' == 73 && 'J' == 74
108 /* On an ASCII/ISO kind of system */
109 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
112 Some other sort of character set - use memchr() so we don't match
115 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
123 I32 start_sp_offset = SP - PL_stack_base;
128 register char *pat = SvPV(left, llen);
129 #ifdef PACKED_IS_OCTETS
130 /* Packed side is assumed to be octets - so force downgrade if it
131 has been UTF-8 encoded by accident
133 register char *s = SvPVbyte(right, rlen);
135 register char *s = SvPV(right, rlen);
137 char *strend = s + rlen;
139 register char *patend = pat + llen;
142 register I32 bits = 0;
145 /* These must not be in registers: */
164 const int bits_in_uv = 8 * sizeof(culong);
167 #ifdef PERL_NATINT_PACK
168 int natint; /* native integer */
169 int unatint; /* unsigned native integer */
171 bool do_utf8 = DO_UTF8(right);
173 if (gimme != G_ARRAY) { /* arrange to do first one only */
175 /* Skipping spaces will be useful later on. */
176 while (isSPACE(*pat))
178 /* Give up on optimisation of only doing first if the pattern
179 is getting too complex to parse. */
181 /* This pre-parser will let through certain invalid patterns
182 such as rows of !s, but the nothing that would cause multiple
183 conversions to be attempted. */
185 bool seen_percent = FALSE;
188 while (!isALPHA(*here) || *here == 'x')
190 if (strchr("aAZbBhHP", *here) || seen_percent) {
192 while (isDIGIT(*here) || *here == '*' || *here == '!')
200 while (pat < patend) {
202 datumtype = *pat++ & 0xFF;
203 #ifdef PERL_NATINT_PACK
206 if (isSPACE(datumtype))
208 if (datumtype == '#') {
209 while (pat < patend && *pat != '\n')
214 char *natstr = "sSiIlL";
216 if (strchr(natstr, datumtype)) {
217 #ifdef PERL_NATINT_PACK
223 DIE(aTHX_ "'!' allowed only after types %s", natstr);
228 else if (*pat == '*') {
229 len = strend - strbeg; /* long enough */
233 else if (isDIGIT(*pat)) {
235 while (isDIGIT(*pat)) {
236 len = (len * 10) + (*pat++ - '0');
238 DIE(aTHX_ "Repeat count in unpack overflows");
242 len = (datumtype != '@');
246 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
247 case ',': /* grandfather in commas but with a warning */
248 if (commas++ == 0 && ckWARN(WARN_UNPACK))
249 Perl_warner(aTHX_ WARN_UNPACK,
250 "Invalid type in unpack: '%c'", (int)datumtype);
253 if (len == 1 && pat[-1] != '1')
262 if (len > strend - strbeg)
263 DIE(aTHX_ "@ outside of string");
267 if (len > s - strbeg)
268 DIE(aTHX_ "X outside of string");
272 if (len > strend - s)
273 DIE(aTHX_ "x outside of string");
277 if (start_sp_offset >= SP - PL_stack_base)
278 DIE(aTHX_ "/ must follow a numeric type");
281 pat++; /* ignore '*' for compatibility with pack */
283 DIE(aTHX_ "/ cannot take a count" );
290 if (len > strend - s)
295 sv_setpvn(sv, s, len);
297 if (datumtype == 'A' || datumtype == 'Z') {
298 aptr = s; /* borrow register */
299 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
304 else { /* 'A' strips both nulls and spaces */
305 s = SvPVX(sv) + len - 1;
306 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
310 SvCUR_set(sv, s - SvPVX(sv));
311 s = aptr; /* unborrow register */
313 XPUSHs(sv_2mortal(sv));
317 if (star || len > (strend - s) * 8)
318 len = (strend - s) * 8;
321 Newz(601, PL_bitcount, 256, char);
322 for (bits = 1; bits < 256; bits++) {
323 if (bits & 1) PL_bitcount[bits]++;
324 if (bits & 2) PL_bitcount[bits]++;
325 if (bits & 4) PL_bitcount[bits]++;
326 if (bits & 8) PL_bitcount[bits]++;
327 if (bits & 16) PL_bitcount[bits]++;
328 if (bits & 32) PL_bitcount[bits]++;
329 if (bits & 64) PL_bitcount[bits]++;
330 if (bits & 128) PL_bitcount[bits]++;
334 culong += PL_bitcount[*(unsigned char*)s++];
339 if (datumtype == 'b') {
341 if (bits & 1) culong++;
347 if (bits & 128) culong++;
354 sv = NEWSV(35, len + 1);
358 if (datumtype == 'b') {
360 for (len = 0; len < aint; len++) {
361 if (len & 7) /*SUPPRESS 595*/
365 *str++ = '0' + (bits & 1);
370 for (len = 0; len < aint; len++) {
375 *str++ = '0' + ((bits & 128) != 0);
379 XPUSHs(sv_2mortal(sv));
383 if (star || len > (strend - s) * 2)
384 len = (strend - s) * 2;
385 sv = NEWSV(35, len + 1);
389 if (datumtype == 'h') {
391 for (len = 0; len < aint; len++) {
396 *str++ = PL_hexdigit[bits & 15];
401 for (len = 0; len < aint; len++) {
406 *str++ = PL_hexdigit[(bits >> 4) & 15];
410 XPUSHs(sv_2mortal(sv));
413 if (len > strend - s)
418 if (aint >= 128) /* fake up signed chars */
420 if (checksum > bits_in_uv)
431 if (aint >= 128) /* fake up signed chars */
434 sv_setiv(sv, (IV)aint);
435 PUSHs(sv_2mortal(sv));
440 unpack_C: /* unpack U will jump here if not UTF-8 */
445 if (len > strend - s)
460 sv_setiv(sv, (IV)auint);
461 PUSHs(sv_2mortal(sv));
472 if (len > strend - s)
475 while (len-- > 0 && s < strend) {
477 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
480 if (checksum > bits_in_uv)
481 cdouble += (NV)auint;
489 while (len-- > 0 && s < strend) {
491 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
495 sv_setuv(sv, (UV)auint);
496 PUSHs(sv_2mortal(sv));
501 #if SHORTSIZE == SIZE16
502 along = (strend - s) / SIZE16;
504 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
509 #if SHORTSIZE != SIZE16
513 COPYNN(s, &ashort, sizeof(short));
515 if (checksum > bits_in_uv)
516 cdouble += (NV)ashort;
527 #if SHORTSIZE > SIZE16
532 if (checksum > bits_in_uv)
533 cdouble += (NV)ashort;
542 #if SHORTSIZE != SIZE16
546 COPYNN(s, &ashort, sizeof(short));
549 sv_setiv(sv, (IV)ashort);
550 PUSHs(sv_2mortal(sv));
558 #if SHORTSIZE > SIZE16
564 sv_setiv(sv, (IV)ashort);
565 PUSHs(sv_2mortal(sv));
573 #if SHORTSIZE == SIZE16
574 along = (strend - s) / SIZE16;
576 unatint = natint && datumtype == 'S';
577 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
582 #if SHORTSIZE != SIZE16
584 unsigned short aushort;
586 COPYNN(s, &aushort, sizeof(unsigned short));
587 s += sizeof(unsigned short);
588 if (checksum > bits_in_uv)
589 cdouble += (NV)aushort;
601 if (datumtype == 'n')
602 aushort = PerlSock_ntohs(aushort);
605 if (datumtype == 'v')
606 aushort = vtohs(aushort);
608 if (checksum > bits_in_uv)
609 cdouble += (NV)aushort;
618 #if SHORTSIZE != SIZE16
620 unsigned short aushort;
622 COPYNN(s, &aushort, sizeof(unsigned short));
623 s += sizeof(unsigned short);
625 sv_setiv(sv, (UV)aushort);
626 PUSHs(sv_2mortal(sv));
637 if (datumtype == 'n')
638 aushort = PerlSock_ntohs(aushort);
641 if (datumtype == 'v')
642 aushort = vtohs(aushort);
644 sv_setiv(sv, (UV)aushort);
645 PUSHs(sv_2mortal(sv));
651 along = (strend - s) / sizeof(int);
656 Copy(s, &aint, 1, int);
658 if (checksum > bits_in_uv)
668 Copy(s, &aint, 1, int);
672 /* Without the dummy below unpack("i", pack("i",-1))
673 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
674 * cc with optimization turned on.
676 * The bug was detected in
677 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
678 * with optimization (-O4) turned on.
679 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
680 * does not have this problem even with -O4.
682 * This bug was reported as DECC_BUGS 1431
683 * and tracked internally as GEM_BUGS 7775.
685 * The bug is fixed in
686 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
687 * UNIX V4.0F support: DEC C V5.9-006 or later
688 * UNIX V4.0E support: DEC C V5.8-011 or later
691 * See also few lines later for the same bug.
694 sv_setiv(sv, (IV)aint) :
696 sv_setiv(sv, (IV)aint);
697 PUSHs(sv_2mortal(sv));
702 along = (strend - s) / sizeof(unsigned int);
707 Copy(s, &auint, 1, unsigned int);
708 s += sizeof(unsigned int);
709 if (checksum > bits_in_uv)
710 cdouble += (NV)auint;
719 Copy(s, &auint, 1, unsigned int);
720 s += sizeof(unsigned int);
723 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
724 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
725 * See details few lines earlier. */
727 sv_setuv(sv, (UV)auint) :
729 sv_setuv(sv, (UV)auint);
730 PUSHs(sv_2mortal(sv));
735 #if LONGSIZE == SIZE32
736 along = (strend - s) / SIZE32;
738 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
743 #if LONGSIZE != SIZE32
746 COPYNN(s, &along, sizeof(long));
748 if (checksum > bits_in_uv)
749 cdouble += (NV)along;
758 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
762 #if LONGSIZE > SIZE32
763 if (along > 2147483647)
767 if (checksum > bits_in_uv)
768 cdouble += (NV)along;
777 #if LONGSIZE != SIZE32
780 COPYNN(s, &along, sizeof(long));
783 sv_setiv(sv, (IV)along);
784 PUSHs(sv_2mortal(sv));
791 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
795 #if LONGSIZE > SIZE32
796 if (along > 2147483647)
801 sv_setiv(sv, (IV)along);
802 PUSHs(sv_2mortal(sv));
810 #if LONGSIZE == SIZE32
811 along = (strend - s) / SIZE32;
813 unatint = natint && datumtype == 'L';
814 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
819 #if LONGSIZE != SIZE32
821 unsigned long aulong;
823 COPYNN(s, &aulong, sizeof(unsigned long));
824 s += sizeof(unsigned long);
825 if (checksum > bits_in_uv)
826 cdouble += (NV)aulong;
838 if (datumtype == 'N')
839 aulong = PerlSock_ntohl(aulong);
842 if (datumtype == 'V')
843 aulong = vtohl(aulong);
845 if (checksum > bits_in_uv)
846 cdouble += (NV)aulong;
855 #if LONGSIZE != SIZE32
857 unsigned long aulong;
859 COPYNN(s, &aulong, sizeof(unsigned long));
860 s += sizeof(unsigned long);
862 sv_setuv(sv, (UV)aulong);
863 PUSHs(sv_2mortal(sv));
873 if (datumtype == 'N')
874 aulong = PerlSock_ntohl(aulong);
877 if (datumtype == 'V')
878 aulong = vtohl(aulong);
881 sv_setuv(sv, (UV)aulong);
882 PUSHs(sv_2mortal(sv));
888 along = (strend - s) / sizeof(char*);
894 if (sizeof(char*) > strend - s)
897 Copy(s, &aptr, 1, char*);
903 PUSHs(sv_2mortal(sv));
913 while ((len > 0) && (s < strend)) {
914 auv = (auv << 7) | (*s & 0x7f);
915 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
916 if ((U8)(*s++) < 0x80) {
920 PUSHs(sv_2mortal(sv));
924 else if (++bytes >= sizeof(UV)) { /* promote to string */
928 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
930 sv = mul128(sv, *s & 0x7f);
931 if (!(*s++ & 0x80)) {
940 PUSHs(sv_2mortal(sv));
945 if ((s >= strend) && bytes)
946 DIE(aTHX_ "Unterminated compressed integer");
951 if (sizeof(char*) > strend - s)
954 Copy(s, &aptr, 1, char*);
959 sv_setpvn(sv, aptr, len);
960 PUSHs(sv_2mortal(sv));
964 along = (strend - s) / sizeof(Quad_t);
969 Copy(s, &aquad, 1, Quad_t);
971 if (checksum > bits_in_uv)
972 cdouble += (NV)aquad;
981 if (s + sizeof(Quad_t) > strend)
984 Copy(s, &aquad, 1, Quad_t);
988 if (aquad >= IV_MIN && aquad <= IV_MAX)
989 sv_setiv(sv, (IV)aquad);
991 sv_setnv(sv, (NV)aquad);
992 PUSHs(sv_2mortal(sv));
997 along = (strend - s) / sizeof(Quad_t);
1002 Copy(s, &auquad, 1, Uquad_t);
1003 s += sizeof(Uquad_t);
1004 if (checksum > bits_in_uv)
1005 cdouble += (NV)auquad;
1014 if (s + sizeof(Uquad_t) > strend)
1017 Copy(s, &auquad, 1, Uquad_t);
1018 s += sizeof(Uquad_t);
1021 if (auquad <= UV_MAX)
1022 sv_setuv(sv, (UV)auquad);
1024 sv_setnv(sv, (NV)auquad);
1025 PUSHs(sv_2mortal(sv));
1030 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1033 along = (strend - s) / sizeof(float);
1038 Copy(s, &afloat, 1, float);
1047 Copy(s, &afloat, 1, float);
1050 sv_setnv(sv, (NV)afloat);
1051 PUSHs(sv_2mortal(sv));
1057 along = (strend - s) / sizeof(double);
1062 Copy(s, &adouble, 1, double);
1063 s += sizeof(double);
1071 Copy(s, &adouble, 1, double);
1072 s += sizeof(double);
1074 sv_setnv(sv, (NV)adouble);
1075 PUSHs(sv_2mortal(sv));
1081 * Initialise the decode mapping. By using a table driven
1082 * algorithm, the code will be character-set independent
1083 * (and just as fast as doing character arithmetic)
1085 if (PL_uudmap['M'] == 0) {
1088 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1089 PL_uudmap[(U8)PL_uuemap[i]] = i;
1091 * Because ' ' and '`' map to the same value,
1092 * we need to decode them both the same.
1097 along = (strend - s) * 3 / 4;
1098 sv = NEWSV(42, along);
1101 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1106 len = PL_uudmap[*(U8*)s++] & 077;
1108 if (s < strend && ISUUCHAR(*s))
1109 a = PL_uudmap[*(U8*)s++] & 077;
1112 if (s < strend && ISUUCHAR(*s))
1113 b = PL_uudmap[*(U8*)s++] & 077;
1116 if (s < strend && ISUUCHAR(*s))
1117 c = PL_uudmap[*(U8*)s++] & 077;
1120 if (s < strend && ISUUCHAR(*s))
1121 d = PL_uudmap[*(U8*)s++] & 077;
1124 hunk[0] = (a << 2) | (b >> 4);
1125 hunk[1] = (b << 4) | (c >> 2);
1126 hunk[2] = (c << 6) | d;
1127 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1132 else if (s[1] == '\n') /* possible checksum byte */
1135 XPUSHs(sv_2mortal(sv));
1140 if (strchr("fFdD", datumtype) ||
1141 (checksum > bits_in_uv && strchr("csSiIlLnNUvVqQ", datumtype)) ) {
1144 adouble = (NV) (1 << (checksum & 15));
1145 while (checksum >= 16) {
1149 while (cdouble < 0.0)
1151 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1152 sv_setnv(sv, cdouble);
1155 if (checksum < bits_in_uv) {
1156 UV mask = ((UV)1 << checksum) - 1;
1159 sv_setuv(sv, (UV)culong);
1161 XPUSHs(sv_2mortal(sv));
1165 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
1166 PUSHs(&PL_sv_undef);
1171 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
1175 *hunk = PL_uuemap[len];
1176 sv_catpvn(sv, hunk, 1);
1179 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1180 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
1181 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
1182 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
1183 sv_catpvn(sv, hunk, 4);
1188 char r = (len > 1 ? s[1] : '\0');
1189 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
1190 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
1191 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
1192 hunk[3] = PL_uuemap[0];
1193 sv_catpvn(sv, hunk, 4);
1195 sv_catpvn(sv, "\n", 1);
1199 S_is_an_int(pTHX_ char *s, STRLEN l)
1202 SV *result = newSVpvn(s, l);
1203 char *result_c = SvPV(result, n_a); /* convenience */
1204 char *out = result_c;
1214 SvREFCNT_dec(result);
1237 SvREFCNT_dec(result);
1243 SvCUR_set(result, out - result_c);
1247 /* pnum must be '\0' terminated */
1249 S_div128(pTHX_ SV *pnum, bool *done)
1252 char *s = SvPV(pnum, len);
1261 i = m * 10 + (*t - '0');
1263 r = (i >> 7); /* r < 10 */
1270 SvCUR_set(pnum, (STRLEN) (t - s));
1277 dSP; dMARK; dORIGMARK; dTARGET;
1278 register SV *cat = TARG;
1281 register char *pat = SvPVx(*++MARK, fromlen);
1283 register char *patend = pat + fromlen;
1288 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
1289 static char *space10 = " ";
1291 /* These must not be in registers: */
1306 #ifdef PERL_NATINT_PACK
1307 int natint; /* native integer */
1312 sv_setpvn(cat, "", 0);
1314 while (pat < patend) {
1315 SV *lengthcode = Nullsv;
1316 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
1317 datumtype = *pat++ & 0xFF;
1318 #ifdef PERL_NATINT_PACK
1321 if (isSPACE(datumtype)) {
1325 #ifndef PACKED_IS_OCTETS
1326 if (datumtype == 'U' && pat == patcopy+1)
1329 if (datumtype == '#') {
1330 while (pat < patend && *pat != '\n')
1335 char *natstr = "sSiIlL";
1337 if (strchr(natstr, datumtype)) {
1338 #ifdef PERL_NATINT_PACK
1344 DIE(aTHX_ "'!' allowed only after types %s", natstr);
1347 len = strchr("@Xxu", datumtype) ? 0 : items;
1350 else if (isDIGIT(*pat)) {
1352 while (isDIGIT(*pat)) {
1353 len = (len * 10) + (*pat++ - '0');
1355 DIE(aTHX_ "Repeat count in pack overflows");
1362 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
1363 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
1364 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
1365 ? *MARK : &PL_sv_no)
1366 + (*pat == 'Z' ? 1 : 0)));
1370 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
1371 case ',': /* grandfather in commas but with a warning */
1372 if (commas++ == 0 && ckWARN(WARN_PACK))
1373 Perl_warner(aTHX_ WARN_PACK,
1374 "Invalid type in pack: '%c'", (int)datumtype);
1377 DIE(aTHX_ "%% may only be used in unpack");
1388 if (SvCUR(cat) < len)
1389 DIE(aTHX_ "X outside of string");
1396 sv_catpvn(cat, null10, 10);
1399 sv_catpvn(cat, null10, len);
1405 aptr = SvPV(fromstr, fromlen);
1406 if (pat[-1] == '*') {
1408 if (datumtype == 'Z')
1411 if (fromlen >= len) {
1412 sv_catpvn(cat, aptr, len);
1413 if (datumtype == 'Z')
1414 *(SvEND(cat)-1) = '\0';
1417 sv_catpvn(cat, aptr, fromlen);
1419 if (datumtype == 'A') {
1421 sv_catpvn(cat, space10, 10);
1424 sv_catpvn(cat, space10, len);
1428 sv_catpvn(cat, null10, 10);
1431 sv_catpvn(cat, null10, len);
1443 str = SvPV(fromstr, fromlen);
1447 SvCUR(cat) += (len+7)/8;
1448 SvGROW(cat, SvCUR(cat) + 1);
1449 aptr = SvPVX(cat) + aint;
1454 if (datumtype == 'B') {
1455 for (len = 0; len++ < aint;) {
1456 items |= *str++ & 1;
1460 *aptr++ = items & 0xff;
1466 for (len = 0; len++ < aint;) {
1472 *aptr++ = items & 0xff;
1478 if (datumtype == 'B')
1479 items <<= 7 - (aint & 7);
1481 items >>= 7 - (aint & 7);
1482 *aptr++ = items & 0xff;
1484 str = SvPVX(cat) + SvCUR(cat);
1499 str = SvPV(fromstr, fromlen);
1503 SvCUR(cat) += (len+1)/2;
1504 SvGROW(cat, SvCUR(cat) + 1);
1505 aptr = SvPVX(cat) + aint;
1510 if (datumtype == 'H') {
1511 for (len = 0; len++ < aint;) {
1513 items |= ((*str++ & 15) + 9) & 15;
1515 items |= *str++ & 15;
1519 *aptr++ = items & 0xff;
1525 for (len = 0; len++ < aint;) {
1527 items |= (((*str++ & 15) + 9) & 15) << 4;
1529 items |= (*str++ & 15) << 4;
1533 *aptr++ = items & 0xff;
1539 *aptr++ = items & 0xff;
1540 str = SvPVX(cat) + SvCUR(cat);
1551 switch (datumtype) {
1553 aint = SvIV(fromstr);
1554 if ((aint < 0 || aint > 255) &&
1556 Perl_warner(aTHX_ WARN_PACK,
1557 "Character in \"C\" format wrapped");
1559 sv_catpvn(cat, &achar, sizeof(char));
1562 aint = SvIV(fromstr);
1563 if ((aint < -128 || aint > 127) &&
1565 Perl_warner(aTHX_ WARN_PACK,
1566 "Character in \"c\" format wrapped");
1568 sv_catpvn(cat, &achar, sizeof(char));
1576 auint = SvUV(fromstr);
1577 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
1578 SvCUR_set(cat, (char*)uvchr_to_utf8((U8*)SvEND(cat),auint)
1583 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
1588 afloat = (float)SvNV(fromstr);
1589 sv_catpvn(cat, (char *)&afloat, sizeof (float));
1596 adouble = (double)SvNV(fromstr);
1597 sv_catpvn(cat, (char *)&adouble, sizeof (double));
1603 ashort = (I16)SvIV(fromstr);
1605 ashort = PerlSock_htons(ashort);
1607 CAT16(cat, &ashort);
1613 ashort = (I16)SvIV(fromstr);
1615 ashort = htovs(ashort);
1617 CAT16(cat, &ashort);
1621 #if SHORTSIZE != SIZE16
1623 unsigned short aushort;
1627 aushort = SvUV(fromstr);
1628 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
1638 aushort = (U16)SvUV(fromstr);
1639 CAT16(cat, &aushort);
1645 #if SHORTSIZE != SIZE16
1651 ashort = SvIV(fromstr);
1652 sv_catpvn(cat, (char *)&ashort, sizeof(short));
1660 ashort = (I16)SvIV(fromstr);
1661 CAT16(cat, &ashort);
1668 auint = SvUV(fromstr);
1669 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
1675 adouble = Perl_floor(SvNV(fromstr));
1678 DIE(aTHX_ "Cannot compress negative numbers");
1681 #if UVSIZE > 4 && UVSIZE >= NVSIZE
1682 adouble <= 0xffffffff
1684 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
1685 adouble <= UV_MAX_cxux
1692 char buf[1 + sizeof(UV)];
1693 char *in = buf + sizeof(buf);
1694 UV auv = U_V(adouble);
1697 *--in = (auv & 0x7f) | 0x80;
1700 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
1701 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
1703 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
1704 char *from, *result, *in;
1709 /* Copy string and check for compliance */
1710 from = SvPV(fromstr, len);
1711 if ((norm = is_an_int(from, len)) == NULL)
1712 DIE(aTHX_ "can compress only unsigned integer");
1714 New('w', result, len, char);
1718 *--in = div128(norm, &done) | 0x80;
1719 result[len - 1] &= 0x7F; /* clear continue bit */
1720 sv_catpvn(cat, in, (result + len) - in);
1722 SvREFCNT_dec(norm); /* free norm */
1724 else if (SvNOKp(fromstr)) {
1725 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
1726 char *in = buf + sizeof(buf);
1729 double next = floor(adouble / 128);
1730 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
1731 if (in <= buf) /* this cannot happen ;-) */
1732 DIE(aTHX_ "Cannot compress integer");
1734 } while (adouble > 0);
1735 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
1736 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
1739 DIE(aTHX_ "Cannot compress non integer");
1745 aint = SvIV(fromstr);
1746 sv_catpvn(cat, (char*)&aint, sizeof(int));
1752 aulong = SvUV(fromstr);
1754 aulong = PerlSock_htonl(aulong);
1756 CAT32(cat, &aulong);
1762 aulong = SvUV(fromstr);
1764 aulong = htovl(aulong);
1766 CAT32(cat, &aulong);
1770 #if LONGSIZE != SIZE32
1772 unsigned long aulong;
1776 aulong = SvUV(fromstr);
1777 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
1785 aulong = SvUV(fromstr);
1786 CAT32(cat, &aulong);
1791 #if LONGSIZE != SIZE32
1797 along = SvIV(fromstr);
1798 sv_catpvn(cat, (char *)&along, sizeof(long));
1806 along = SvIV(fromstr);
1815 auquad = (Uquad_t)SvUV(fromstr);
1816 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
1822 aquad = (Quad_t)SvIV(fromstr);
1823 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
1828 len = 1; /* assume SV is correct length */
1833 if (fromstr == &PL_sv_undef)
1837 /* XXX better yet, could spirit away the string to
1838 * a safe spot and hang on to it until the result
1839 * of pack() (and all copies of the result) are
1842 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
1843 || (SvPADTMP(fromstr)
1844 && !SvREADONLY(fromstr))))
1846 Perl_warner(aTHX_ WARN_PACK,
1847 "Attempt to pack pointer to temporary value");
1849 if (SvPOK(fromstr) || SvNIOK(fromstr))
1850 aptr = SvPV(fromstr,n_a);
1852 aptr = SvPV_force(fromstr,n_a);
1854 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
1859 aptr = SvPV(fromstr, fromlen);
1860 SvGROW(cat, fromlen * 4 / 3);
1865 while (fromlen > 0) {
1872 doencodes(cat, aptr, todo);