3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * He still hopefully carried some of his gear in his pack: a small tinder-box,
13 * two small shallow pans, the smaller fitting into the larger; inside them a
14 * wooden spoon, a short two-pronged fork and some skewers were stowed; and
15 * hidden at the bottom of the pack in a flat wooden box a dwindling treasure,
20 #define PERL_IN_PP_PACK_C
24 * Offset for integer pack/unpack.
26 * On architectures where I16 and I32 aren't really 16 and 32 bits,
27 * which for now are all Crays, pack and unpack have to play games.
31 * These values are required for portability of pack() output.
32 * If they're not right on your machine, then pack() and unpack()
33 * wouldn't work right anyway; you'll need to apply the Cray hack.
34 * (I'd like to check them with #if, but you can't use sizeof() in
35 * the preprocessor.) --???
38 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
39 defines are now in config.h. --Andy Dougherty April 1998
44 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
47 #if U16SIZE > SIZE16 || U32SIZE > SIZE32
48 # if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 /* little-endian */
49 # define OFF16(p) (char*)(p)
50 # define OFF32(p) (char*)(p)
52 # if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 /* big-endian */
53 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
54 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
56 }}}} bad cray byte order
59 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
60 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
61 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
62 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
63 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
65 # define COPY16(s,p) Copy(s, p, SIZE16, char)
66 # define COPY32(s,p) Copy(s, p, SIZE32, char)
67 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
68 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
69 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
72 /* Avoid stack overflow due to pathological templates. 100 should be plenty. */
73 #define MAX_SUB_TEMPLATE_LEVEL 100
76 #define FLAG_UNPACK_ONLY_ONE 0x10
77 #define FLAG_UNPACK_DO_UTF8 0x08
78 #define FLAG_SLASH 0x04
79 #define FLAG_COMMA 0x02
80 #define FLAG_PACK 0x01
83 S_mul128(pTHX_ SV *sv, U8 m)
86 char *s = SvPV(sv, len);
90 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
91 SV *tmpNew = newSVpvn("0000000000", 10);
94 SvREFCNT_dec(sv); /* free old sv */
99 while (!*t) /* trailing '\0'? */
102 i = ((*t - '0') << 7) + m;
103 *(t--) = '0' + (char)(i % 10);
109 /* Explosives and implosives. */
111 #if 'I' == 73 && 'J' == 74
112 /* On an ASCII/ISO kind of system */
113 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
116 Some other sort of character set - use memchr() so we don't match
119 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
122 #define TYPE_IS_SHRIEKING 0x100
123 #define TYPE_IS_BIG_ENDIAN 0x200
124 #define TYPE_IS_LITTLE_ENDIAN 0x400
125 #define TYPE_ENDIANNESS_MASK (TYPE_IS_BIG_ENDIAN|TYPE_IS_LITTLE_ENDIAN)
126 #define TYPE_NO_ENDIANNESS(t) ((t) & ~TYPE_ENDIANNESS_MASK)
127 #define TYPE_NO_MODIFIERS(t) ((t) & 0xFF)
129 #define DO_BO_UNPACK(var, type) \
131 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
132 case TYPE_IS_BIG_ENDIAN: var = my_betoh ## type (var); break; \
133 case TYPE_IS_LITTLE_ENDIAN: var = my_letoh ## type (var); break; \
138 #define DO_BO_PACK(var, type) \
140 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
141 case TYPE_IS_BIG_ENDIAN: var = my_htobe ## type (var); break; \
142 case TYPE_IS_LITTLE_ENDIAN: var = my_htole ## type (var); break; \
147 #define DO_BO_UNPACK_PTR(var, type, pre_cast) \
149 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
150 case TYPE_IS_BIG_ENDIAN: \
151 var = (void *) my_betoh ## type ((pre_cast) var); \
153 case TYPE_IS_LITTLE_ENDIAN: \
154 var = (void *) my_letoh ## type ((pre_cast) var); \
161 #define DO_BO_PACK_PTR(var, type, pre_cast) \
163 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
164 case TYPE_IS_BIG_ENDIAN: \
165 var = (void *) my_htobe ## type ((pre_cast) var); \
167 case TYPE_IS_LITTLE_ENDIAN: \
168 var = (void *) my_htole ## type ((pre_cast) var); \
175 #define BO_CANT_DOIT(action, type) \
177 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
178 case TYPE_IS_BIG_ENDIAN: \
179 Perl_croak(aTHX_ "Can't %s big-endian %ss on this " \
180 "platform", #action, #type); \
182 case TYPE_IS_LITTLE_ENDIAN: \
183 Perl_croak(aTHX_ "Can't %s little-endian %ss on this " \
184 "platform", #action, #type); \
191 #if PTRSIZE == INTSIZE
192 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, i, int)
193 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, i, int)
194 #elif PTRSIZE == LONGSIZE
195 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, l, long)
196 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, l, long)
198 # define DO_BO_UNPACK_P(var) BO_CANT_DOIT(unpack, pointer)
199 # define DO_BO_PACK_P(var) BO_CANT_DOIT(pack, pointer)
202 #if defined(my_htolen) && defined(my_letohn) && \
203 defined(my_htoben) && defined(my_betohn)
204 # define DO_BO_UNPACK_N(var, type) \
206 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
207 case TYPE_IS_BIG_ENDIAN: my_betohn(&var, sizeof(type)); break;\
208 case TYPE_IS_LITTLE_ENDIAN: my_letohn(&var, sizeof(type)); break;\
213 # define DO_BO_PACK_N(var, type) \
215 switch (datumtype & TYPE_ENDIANNESS_MASK) { \
216 case TYPE_IS_BIG_ENDIAN: my_htoben(&var, sizeof(type)); break;\
217 case TYPE_IS_LITTLE_ENDIAN: my_htolen(&var, sizeof(type)); break;\
222 # define DO_BO_UNPACK_N(var, type) BO_CANT_DOIT(unpack, type)
223 # define DO_BO_PACK_N(var, type) BO_CANT_DOIT(pack, type)
226 /* Returns the sizeof() struct described by pat */
228 S_measure_struct(pTHX_ register tempsym_t* symptr)
230 register I32 len = 0;
231 register I32 total = 0;
236 while (next_symbol(symptr)) {
238 switch( symptr->howlen ){
241 len = symptr->length;
244 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
245 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
249 /* endianness doesn't influence the size of a type */
250 switch(TYPE_NO_ENDIANNESS(symptr->code)) {
252 Perl_croak(aTHX_ "Invalid type '%c' in %s",
253 (int)TYPE_NO_MODIFIERS(symptr->code),
254 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
257 case 'U': /* XXXX Is it correct? */
260 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
262 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
268 tempsym_t savsym = *symptr;
269 symptr->patptr = savsym.grpbeg;
270 symptr->patend = savsym.grpend;
271 /* XXXX Theoretically, we need to measure many times at different
272 positions, since the subexpression may contain
273 alignment commands, but be not of aligned length.
274 Need to detect this and croak(). */
275 size = measure_struct(symptr);
279 case 'X' | TYPE_IS_SHRIEKING:
280 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS. */
281 if (!len) /* Avoid division by 0 */
283 len = total % len; /* Assumed: the start is aligned. */
288 Perl_croak(aTHX_ "'X' outside of string in %s",
289 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
291 case 'x' | TYPE_IS_SHRIEKING:
292 if (!len) /* Avoid division by 0 */
294 star = total % len; /* Assumed: the start is aligned. */
295 if (star) /* Other portable ways? */
318 case 's' | TYPE_IS_SHRIEKING:
319 #if SHORTSIZE != SIZE16
320 size = sizeof(short);
328 case 'S' | TYPE_IS_SHRIEKING:
329 #if SHORTSIZE != SIZE16
330 size = sizeof(unsigned short);
335 case 'v' | TYPE_IS_SHRIEKING:
336 case 'n' | TYPE_IS_SHRIEKING:
342 case 'i' | TYPE_IS_SHRIEKING:
346 case 'I' | TYPE_IS_SHRIEKING:
348 size = sizeof(unsigned int);
356 case 'l' | TYPE_IS_SHRIEKING:
357 #if LONGSIZE != SIZE32
366 case 'L' | TYPE_IS_SHRIEKING:
367 #if LONGSIZE != SIZE32
368 size = sizeof(unsigned long);
373 case 'V' | TYPE_IS_SHRIEKING:
374 case 'N' | TYPE_IS_SHRIEKING:
384 size = sizeof(char*);
388 size = sizeof(Quad_t);
391 size = sizeof(Uquad_t);
395 size = sizeof(float);
398 size = sizeof(double);
403 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
405 size = LONG_DOUBLESIZE;
415 /* locate matching closing parenthesis or bracket
416 * returns char pointer to char after match, or NULL
419 S_group_end(pTHX_ register char *patptr, register char *patend, char ender)
421 while (patptr < patend) {
429 while (patptr < patend && *patptr != '\n')
433 patptr = group_end(patptr, patend, ')') + 1;
435 patptr = group_end(patptr, patend, ']') + 1;
437 Perl_croak(aTHX_ "No group ending character '%c' found in template",
443 /* Convert unsigned decimal number to binary.
444 * Expects a pointer to the first digit and address of length variable
445 * Advances char pointer to 1st non-digit char and returns number
448 S_get_num(pTHX_ register char *patptr, I32 *lenptr )
450 I32 len = *patptr++ - '0';
451 while (isDIGIT(*patptr)) {
452 if (len >= 0x7FFFFFFF/10)
453 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
454 len = (len * 10) + (*patptr++ - '0');
460 /* The marvellous template parsing routine: Using state stored in *symptr,
461 * locates next template code and count
464 S_next_symbol(pTHX_ register tempsym_t* symptr )
466 register char* patptr = symptr->patptr;
467 register char* patend = symptr->patend;
469 symptr->flags &= ~FLAG_SLASH;
471 while (patptr < patend) {
472 if (isSPACE(*patptr))
474 else if (*patptr == '#') {
476 while (patptr < patend && *patptr != '\n')
481 /* We should have found a template code */
482 I32 code = *patptr++ & 0xFF;
484 if (code == ','){ /* grandfather in commas but with a warning */
485 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
486 symptr->flags |= FLAG_COMMA;
487 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
488 "Invalid type ',' in %s",
489 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
494 /* for '(', skip to ')' */
496 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
497 Perl_croak(aTHX_ "()-group starts with a count in %s",
498 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
499 symptr->grpbeg = patptr;
500 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
501 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
502 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
503 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
506 /* look for modifiers */
507 while (patptr < patend) {
512 modifier = TYPE_IS_SHRIEKING;
513 allowed = "sSiIlLxXnNvV";
516 modifier = TYPE_IS_BIG_ENDIAN;
517 allowed = "sSiIlLqQjJfFdDpP";
520 modifier = TYPE_IS_LITTLE_ENDIAN;
521 allowed = "sSiIlLqQjJfFdDpP";
528 if (!strchr(allowed, TYPE_NO_MODIFIERS(code)))
529 Perl_croak(aTHX_ "'%c' allowed only after types %s in %s", *patptr,
530 allowed, symptr->flags & FLAG_PACK ? "pack" : "unpack" );
531 if ((code | modifier) == (code | TYPE_IS_BIG_ENDIAN | TYPE_IS_LITTLE_ENDIAN))
532 Perl_croak(aTHX_ "Can't use both '<' and '>' after type '%c' in %s",
533 (int) TYPE_NO_MODIFIERS(code),
534 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
535 if (ckWARN(WARN_UNPACK)) {
537 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
538 "Duplicate modifier '%c' after '%c' in %s",
539 *patptr, (int) TYPE_NO_MODIFIERS(code),
540 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
546 /* look for count and/or / */
547 if (patptr < patend) {
548 if (isDIGIT(*patptr)) {
549 patptr = get_num( patptr, &symptr->length );
550 symptr->howlen = e_number;
552 } else if (*patptr == '*') {
554 symptr->howlen = e_star;
556 } else if (*patptr == '[') {
557 char* lenptr = ++patptr;
558 symptr->howlen = e_number;
559 patptr = group_end( patptr, patend, ']' ) + 1;
560 /* what kind of [] is it? */
561 if (isDIGIT(*lenptr)) {
562 lenptr = get_num( lenptr, &symptr->length );
564 Perl_croak(aTHX_ "Malformed integer in [] in %s",
565 symptr->flags & FLAG_PACK ? "pack" : "unpack");
567 tempsym_t savsym = *symptr;
568 symptr->patend = patptr-1;
569 symptr->patptr = lenptr;
570 savsym.length = measure_struct(symptr);
574 symptr->howlen = e_no_len;
579 while (patptr < patend) {
580 if (isSPACE(*patptr))
582 else if (*patptr == '#') {
584 while (patptr < patend && *patptr != '\n')
589 if( *patptr == '/' ){
590 symptr->flags |= FLAG_SLASH;
592 if( patptr < patend &&
593 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '[') )
594 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
595 symptr->flags & FLAG_PACK ? "pack" : "unpack" );
601 /* at end - no count, no / */
602 symptr->howlen = e_no_len;
607 symptr->patptr = patptr;
611 symptr->patptr = patptr;
616 =for apidoc unpack_str
618 The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
619 and ocnt are not used. This call should not be used, use unpackstring instead.
624 Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *strbeg, char *strend, char **new_s, I32 ocnt, U32 flags)
626 tempsym_t sym = { 0 };
631 return unpack_rec(&sym, s, s, strend, NULL );
635 =for apidoc unpackstring
637 The engine implementing unpack() Perl function. C<unpackstring> puts the
638 extracted list items on the stack and returns the number of elements.
639 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
644 Perl_unpackstring(pTHX_ char *pat, register char *patend, register char *s, char *strend, U32 flags)
646 tempsym_t sym = { 0 };
651 return unpack_rec(&sym, s, s, strend, NULL );
656 S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, char *strend, char **new_s )
660 register I32 len = 0;
661 register I32 bits = 0;
664 I32 start_sp_offset = SP - PL_stack_base;
667 /* These must not be in registers: */
676 #if SHORTSIZE != SIZE16
678 unsigned short aushort;
683 #if LONGSIZE != SIZE32
684 unsigned long aulong;
689 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
690 long double aldouble;
699 const int bits_in_uv = 8 * sizeof(cuv);
702 bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
704 while (next_symbol(symptr)) {
705 datumtype = symptr->code;
706 /* do first one only unless in list context
707 / is implemented by unpacking the count, then poping it from the
708 stack, so must check that we're not in the middle of a / */
710 && (SP - PL_stack_base == start_sp_offset + 1)
711 && (datumtype != '/') ) /* XXX can this be omitted */
714 switch( howlen = symptr->howlen ){
717 len = symptr->length;
720 len = strend - strbeg; /* long enough */
725 beyond = s >= strend;
726 switch(TYPE_NO_ENDIANNESS(datumtype)) {
728 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)TYPE_NO_MODIFIERS(datumtype) );
731 if (howlen == e_no_len)
732 len = 16; /* len is not specified */
740 char *ss = s; /* Move from register */
741 tempsym_t savsym = *symptr;
742 symptr->patend = savsym.grpend;
746 symptr->patptr = savsym.grpbeg;
747 unpack_rec(symptr, ss, strbeg, strend, &ss );
748 if (ss == strend && savsym.howlen == e_star)
749 break; /* No way to continue */
753 savsym.flags = symptr->flags;
758 if (len > strend - strrelbeg)
759 Perl_croak(aTHX_ "'@' outside of string in unpack");
762 case 'X' | TYPE_IS_SHRIEKING:
763 if (!len) /* Avoid division by 0 */
765 len = (s - strbeg) % len;
768 if (len > s - strbeg)
769 Perl_croak(aTHX_ "'X' outside of string in unpack" );
772 case 'x' | TYPE_IS_SHRIEKING:
773 if (!len) /* Avoid division by 0 */
775 aint = (s - strbeg) % len;
776 if (aint) /* Other portable ways? */
782 if (len > strend - s)
783 Perl_croak(aTHX_ "'x' outside of string in unpack");
787 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
792 if (len > strend - s)
797 sv_setpvn(sv, s, len);
798 if (len > 0 && (datumtype == 'A' || datumtype == 'Z')) {
799 aptr = s; /* borrow register */
800 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
804 if (howlen == e_star) /* exact for 'Z*' */
805 len = s - SvPVX(sv) + 1;
807 else { /* 'A' strips both nulls and spaces */
808 s = SvPVX(sv) + len - 1;
809 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
813 SvCUR_set(sv, s - SvPVX(sv));
814 s = aptr; /* unborrow register */
817 XPUSHs(sv_2mortal(sv));
821 if (howlen == e_star || len > (strend - s) * 8)
822 len = (strend - s) * 8;
825 Newz(601, PL_bitcount, 256, char);
826 for (bits = 1; bits < 256; bits++) {
827 if (bits & 1) PL_bitcount[bits]++;
828 if (bits & 2) PL_bitcount[bits]++;
829 if (bits & 4) PL_bitcount[bits]++;
830 if (bits & 8) PL_bitcount[bits]++;
831 if (bits & 16) PL_bitcount[bits]++;
832 if (bits & 32) PL_bitcount[bits]++;
833 if (bits & 64) PL_bitcount[bits]++;
834 if (bits & 128) PL_bitcount[bits]++;
838 cuv += PL_bitcount[*(unsigned char*)s++];
843 if (datumtype == 'b') {
851 if (bits & 128) cuv++;
858 sv = NEWSV(35, len + 1);
862 if (datumtype == 'b') {
864 for (len = 0; len < aint; len++) {
865 if (len & 7) /*SUPPRESS 595*/
869 *str++ = '0' + (bits & 1);
874 for (len = 0; len < aint; len++) {
879 *str++ = '0' + ((bits & 128) != 0);
883 XPUSHs(sv_2mortal(sv));
887 if (howlen == e_star || len > (strend - s) * 2)
888 len = (strend - s) * 2;
889 sv = NEWSV(35, len + 1);
893 if (datumtype == 'h') {
895 for (len = 0; len < aint; len++) {
900 *str++ = PL_hexdigit[bits & 15];
905 for (len = 0; len < aint; len++) {
910 *str++ = PL_hexdigit[(bits >> 4) & 15];
914 XPUSHs(sv_2mortal(sv));
917 if (len > strend - s)
922 if (aint >= 128) /* fake up signed chars */
924 if (checksum > bits_in_uv)
931 if (len && unpack_only_one)
937 if (aint >= 128) /* fake up signed chars */
940 sv_setiv(sv, (IV)aint);
941 PUSHs(sv_2mortal(sv));
946 unpack_C: /* unpack U will jump here if not UTF-8 */
948 symptr->flags &= ~FLAG_UNPACK_DO_UTF8;
951 if (len > strend - s)
961 if (len && unpack_only_one)
968 sv_setiv(sv, (IV)auint);
969 PUSHs(sv_2mortal(sv));
975 symptr->flags |= FLAG_UNPACK_DO_UTF8;
978 if ((symptr->flags & FLAG_UNPACK_DO_UTF8) == 0)
980 if (len > strend - s)
983 while (len-- > 0 && s < strend) {
985 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
988 if (checksum > bits_in_uv)
989 cdouble += (NV)auint;
995 if (len && unpack_only_one)
999 while (len-- > 0 && s < strend) {
1001 auint = NATIVE_TO_UNI(utf8n_to_uvchr((U8*)s, strend - s, &alen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV));
1005 sv_setuv(sv, (UV)auint);
1006 PUSHs(sv_2mortal(sv));
1010 case 's' | TYPE_IS_SHRIEKING:
1011 #if SHORTSIZE != SIZE16
1012 along = (strend - s) / sizeof(short);
1017 COPYNN(s, &ashort, sizeof(short));
1018 DO_BO_UNPACK(ashort, s);
1020 if (checksum > bits_in_uv)
1021 cdouble += (NV)ashort;
1027 if (len && unpack_only_one)
1032 COPYNN(s, &ashort, sizeof(short));
1033 DO_BO_UNPACK(ashort, s);
1036 sv_setiv(sv, (IV)ashort);
1037 PUSHs(sv_2mortal(sv));
1045 along = (strend - s) / SIZE16;
1051 DO_BO_UNPACK(ai16, 16);
1052 #if U16SIZE > SIZE16
1057 if (checksum > bits_in_uv)
1058 cdouble += (NV)ai16;
1064 if (len && unpack_only_one)
1071 DO_BO_UNPACK(ai16, 16);
1072 #if U16SIZE > SIZE16
1078 sv_setiv(sv, (IV)ai16);
1079 PUSHs(sv_2mortal(sv));
1083 case 'S' | TYPE_IS_SHRIEKING:
1084 #if SHORTSIZE != SIZE16
1085 along = (strend - s) / sizeof(unsigned short);
1090 COPYNN(s, &aushort, sizeof(unsigned short));
1091 DO_BO_UNPACK(aushort, s);
1092 s += sizeof(unsigned short);
1093 if (checksum > bits_in_uv)
1094 cdouble += (NV)aushort;
1100 if (len && unpack_only_one)
1105 COPYNN(s, &aushort, sizeof(unsigned short));
1106 DO_BO_UNPACK(aushort, s);
1107 s += sizeof(unsigned short);
1109 sv_setiv(sv, (UV)aushort);
1110 PUSHs(sv_2mortal(sv));
1120 along = (strend - s) / SIZE16;
1126 DO_BO_UNPACK(au16, 16);
1129 if (datumtype == 'n')
1130 au16 = PerlSock_ntohs(au16);
1133 if (datumtype == 'v')
1136 if (checksum > bits_in_uv)
1137 cdouble += (NV)au16;
1143 if (len && unpack_only_one)
1149 DO_BO_UNPACK(au16, 16);
1153 if (datumtype == 'n')
1154 au16 = PerlSock_ntohs(au16);
1157 if (datumtype == 'v')
1160 sv_setiv(sv, (UV)au16);
1161 PUSHs(sv_2mortal(sv));
1165 case 'v' | TYPE_IS_SHRIEKING:
1166 case 'n' | TYPE_IS_SHRIEKING:
1167 along = (strend - s) / SIZE16;
1175 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1176 ai16 = (I16)PerlSock_ntohs((U16)ai16);
1179 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1180 ai16 = (I16)vtohs((U16)ai16);
1182 if (checksum > bits_in_uv)
1183 cdouble += (NV)ai16;
1189 if (len && unpack_only_one)
1197 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1198 ai16 = (I16)PerlSock_ntohs((U16)ai16);
1201 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1202 ai16 = (I16)vtohs((U16)ai16);
1205 sv_setiv(sv, (IV)ai16);
1206 PUSHs(sv_2mortal(sv));
1211 case 'i' | TYPE_IS_SHRIEKING:
1212 along = (strend - s) / sizeof(int);
1217 Copy(s, &aint, 1, int);
1218 DO_BO_UNPACK(aint, i);
1220 if (checksum > bits_in_uv)
1221 cdouble += (NV)aint;
1227 if (len && unpack_only_one)
1232 Copy(s, &aint, 1, int);
1233 DO_BO_UNPACK(aint, i);
1237 /* Without the dummy below unpack("i", pack("i",-1))
1238 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
1239 * cc with optimization turned on.
1241 * The bug was detected in
1242 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
1243 * with optimization (-O4) turned on.
1244 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
1245 * does not have this problem even with -O4.
1247 * This bug was reported as DECC_BUGS 1431
1248 * and tracked internally as GEM_BUGS 7775.
1250 * The bug is fixed in
1251 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
1252 * UNIX V4.0F support: DEC C V5.9-006 or later
1253 * UNIX V4.0E support: DEC C V5.8-011 or later
1256 * See also few lines later for the same bug.
1259 sv_setiv(sv, (IV)aint) :
1261 sv_setiv(sv, (IV)aint);
1262 PUSHs(sv_2mortal(sv));
1267 case 'I' | TYPE_IS_SHRIEKING:
1268 along = (strend - s) / sizeof(unsigned int);
1273 Copy(s, &auint, 1, unsigned int);
1274 DO_BO_UNPACK(auint, i);
1275 s += sizeof(unsigned int);
1276 if (checksum > bits_in_uv)
1277 cdouble += (NV)auint;
1283 if (len && unpack_only_one)
1288 Copy(s, &auint, 1, unsigned int);
1289 DO_BO_UNPACK(auint, i);
1290 s += sizeof(unsigned int);
1293 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
1294 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
1295 * See details few lines earlier. */
1297 sv_setuv(sv, (UV)auint) :
1299 sv_setuv(sv, (UV)auint);
1300 PUSHs(sv_2mortal(sv));
1305 along = (strend - s) / IVSIZE;
1310 Copy(s, &aiv, 1, IV);
1311 #if IVSIZE == INTSIZE
1312 DO_BO_UNPACK(aiv, i);
1313 #elif IVSIZE == LONGSIZE
1314 DO_BO_UNPACK(aiv, l);
1315 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1316 DO_BO_UNPACK(aiv, 64);
1319 if (checksum > bits_in_uv)
1326 if (len && unpack_only_one)
1331 Copy(s, &aiv, 1, IV);
1332 #if IVSIZE == INTSIZE
1333 DO_BO_UNPACK(aiv, i);
1334 #elif IVSIZE == LONGSIZE
1335 DO_BO_UNPACK(aiv, l);
1336 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1337 DO_BO_UNPACK(aiv, 64);
1342 PUSHs(sv_2mortal(sv));
1347 along = (strend - s) / UVSIZE;
1352 Copy(s, &auv, 1, UV);
1353 #if UVSIZE == INTSIZE
1354 DO_BO_UNPACK(auv, i);
1355 #elif UVSIZE == LONGSIZE
1356 DO_BO_UNPACK(auv, l);
1357 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
1358 DO_BO_UNPACK(auv, 64);
1361 if (checksum > bits_in_uv)
1368 if (len && unpack_only_one)
1373 Copy(s, &auv, 1, UV);
1374 #if UVSIZE == INTSIZE
1375 DO_BO_UNPACK(auv, i);
1376 #elif UVSIZE == LONGSIZE
1377 DO_BO_UNPACK(auv, l);
1378 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
1379 DO_BO_UNPACK(auv, 64);
1384 PUSHs(sv_2mortal(sv));
1388 case 'l' | TYPE_IS_SHRIEKING:
1389 #if LONGSIZE != SIZE32
1390 along = (strend - s) / sizeof(long);
1395 COPYNN(s, &along, sizeof(long));
1396 DO_BO_UNPACK(along, l);
1398 if (checksum > bits_in_uv)
1399 cdouble += (NV)along;
1405 if (len && unpack_only_one)
1410 COPYNN(s, &along, sizeof(long));
1411 DO_BO_UNPACK(along, l);
1414 sv_setiv(sv, (IV)along);
1415 PUSHs(sv_2mortal(sv));
1423 along = (strend - s) / SIZE32;
1428 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1432 DO_BO_UNPACK(along, 32);
1433 #if LONGSIZE > SIZE32
1434 if (along > 2147483647)
1435 along -= 4294967296;
1438 if (checksum > bits_in_uv)
1439 cdouble += (NV)along;
1445 if (len && unpack_only_one)
1450 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
1454 DO_BO_UNPACK(along, 32);
1455 #if LONGSIZE > SIZE32
1456 if (along > 2147483647)
1457 along -= 4294967296;
1461 sv_setiv(sv, (IV)along);
1462 PUSHs(sv_2mortal(sv));
1466 case 'L' | TYPE_IS_SHRIEKING:
1467 #if LONGSIZE != SIZE32
1468 along = (strend - s) / sizeof(unsigned long);
1473 COPYNN(s, &aulong, sizeof(unsigned long));
1474 DO_BO_UNPACK(aulong, l);
1475 s += sizeof(unsigned long);
1476 if (checksum > bits_in_uv)
1477 cdouble += (NV)aulong;
1483 if (len && unpack_only_one)
1488 COPYNN(s, &aulong, sizeof(unsigned long));
1489 DO_BO_UNPACK(aulong, l);
1490 s += sizeof(unsigned long);
1492 sv_setuv(sv, (UV)aulong);
1493 PUSHs(sv_2mortal(sv));
1503 along = (strend - s) / SIZE32;
1509 DO_BO_UNPACK(au32, 32);
1512 if (datumtype == 'N')
1513 au32 = PerlSock_ntohl(au32);
1516 if (datumtype == 'V')
1519 if (checksum > bits_in_uv)
1520 cdouble += (NV)au32;
1526 if (len && unpack_only_one)
1532 DO_BO_UNPACK(au32, 32);
1535 if (datumtype == 'N')
1536 au32 = PerlSock_ntohl(au32);
1539 if (datumtype == 'V')
1543 sv_setuv(sv, (UV)au32);
1544 PUSHs(sv_2mortal(sv));
1548 case 'V' | TYPE_IS_SHRIEKING:
1549 case 'N' | TYPE_IS_SHRIEKING:
1550 along = (strend - s) / SIZE32;
1558 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1559 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1562 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1563 ai32 = (I32)vtohl((U32)ai32);
1565 if (checksum > bits_in_uv)
1566 cdouble += (NV)ai32;
1572 if (len && unpack_only_one)
1580 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1581 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1584 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1585 ai32 = (I32)vtohl((U32)ai32);
1588 sv_setiv(sv, (IV)ai32);
1589 PUSHs(sv_2mortal(sv));
1594 along = (strend - s) / sizeof(char*);
1600 if (sizeof(char*) > strend - s)
1603 Copy(s, &aptr, 1, char*);
1604 DO_BO_UNPACK_P(aptr);
1610 PUSHs(sv_2mortal(sv));
1614 if (len && unpack_only_one)
1622 while ((len > 0) && (s < strend)) {
1623 auv = (auv << 7) | (*s & 0x7f);
1624 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1625 if ((U8)(*s++) < 0x80) {
1629 PUSHs(sv_2mortal(sv));
1633 else if (++bytes >= sizeof(UV)) { /* promote to string */
1637 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
1638 while (s < strend) {
1639 sv = mul128(sv, (U8)(*s & 0x7f));
1640 if (!(*s++ & 0x80)) {
1649 PUSHs(sv_2mortal(sv));
1654 if ((s >= strend) && bytes)
1655 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
1659 if (symptr->howlen == e_star)
1660 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
1662 if (sizeof(char*) > strend - s)
1665 Copy(s, &aptr, 1, char*);
1666 DO_BO_UNPACK_P(aptr);
1671 sv_setpvn(sv, aptr, len);
1672 PUSHs(sv_2mortal(sv));
1676 along = (strend - s) / sizeof(Quad_t);
1681 Copy(s, &aquad, 1, Quad_t);
1682 DO_BO_UNPACK(aquad, 64);
1683 s += sizeof(Quad_t);
1684 if (checksum > bits_in_uv)
1685 cdouble += (NV)aquad;
1691 if (len && unpack_only_one)
1696 if (s + sizeof(Quad_t) > strend)
1699 Copy(s, &aquad, 1, Quad_t);
1700 DO_BO_UNPACK(aquad, 64);
1701 s += sizeof(Quad_t);
1704 if (aquad >= IV_MIN && aquad <= IV_MAX)
1705 sv_setiv(sv, (IV)aquad);
1707 sv_setnv(sv, (NV)aquad);
1708 PUSHs(sv_2mortal(sv));
1713 along = (strend - s) / sizeof(Uquad_t);
1718 Copy(s, &auquad, 1, Uquad_t);
1719 DO_BO_UNPACK(auquad, 64);
1720 s += sizeof(Uquad_t);
1721 if (checksum > bits_in_uv)
1722 cdouble += (NV)auquad;
1728 if (len && unpack_only_one)
1733 if (s + sizeof(Uquad_t) > strend)
1736 Copy(s, &auquad, 1, Uquad_t);
1737 DO_BO_UNPACK(auquad, 64);
1738 s += sizeof(Uquad_t);
1741 if (auquad <= UV_MAX)
1742 sv_setuv(sv, (UV)auquad);
1744 sv_setnv(sv, (NV)auquad);
1745 PUSHs(sv_2mortal(sv));
1750 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
1752 along = (strend - s) / sizeof(float);
1757 Copy(s, &afloat, 1, float);
1758 DO_BO_UNPACK_N(afloat, float);
1764 if (len && unpack_only_one)
1769 Copy(s, &afloat, 1, float);
1770 DO_BO_UNPACK_N(afloat, float);
1773 sv_setnv(sv, (NV)afloat);
1774 PUSHs(sv_2mortal(sv));
1779 along = (strend - s) / sizeof(double);
1784 Copy(s, &adouble, 1, double);
1785 DO_BO_UNPACK_N(adouble, double);
1786 s += sizeof(double);
1791 if (len && unpack_only_one)
1796 Copy(s, &adouble, 1, double);
1797 DO_BO_UNPACK_N(adouble, double);
1798 s += sizeof(double);
1800 sv_setnv(sv, (NV)adouble);
1801 PUSHs(sv_2mortal(sv));
1806 along = (strend - s) / NVSIZE;
1811 Copy(s, &anv, 1, NV);
1812 DO_BO_UNPACK_N(anv, NV);
1818 if (len && unpack_only_one)
1823 Copy(s, &anv, 1, NV);
1824 DO_BO_UNPACK_N(anv, NV);
1828 PUSHs(sv_2mortal(sv));
1832 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
1834 along = (strend - s) / LONG_DOUBLESIZE;
1839 Copy(s, &aldouble, 1, long double);
1840 DO_BO_UNPACK_N(aldouble, long double);
1841 s += LONG_DOUBLESIZE;
1842 cdouble += aldouble;
1846 if (len && unpack_only_one)
1851 Copy(s, &aldouble, 1, long double);
1852 DO_BO_UNPACK_N(aldouble, long double);
1853 s += LONG_DOUBLESIZE;
1855 sv_setnv(sv, (NV)aldouble);
1856 PUSHs(sv_2mortal(sv));
1863 * Initialise the decode mapping. By using a table driven
1864 * algorithm, the code will be character-set independent
1865 * (and just as fast as doing character arithmetic)
1867 if (PL_uudmap['M'] == 0) {
1870 for (i = 0; i < sizeof(PL_uuemap); i += 1)
1871 PL_uudmap[(U8)PL_uuemap[i]] = i;
1873 * Because ' ' and '`' map to the same value,
1874 * we need to decode them both the same.
1879 along = (strend - s) * 3 / 4;
1880 sv = NEWSV(42, along);
1883 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
1888 len = PL_uudmap[*(U8*)s++] & 077;
1890 if (s < strend && ISUUCHAR(*s))
1891 a = PL_uudmap[*(U8*)s++] & 077;
1894 if (s < strend && ISUUCHAR(*s))
1895 b = PL_uudmap[*(U8*)s++] & 077;
1898 if (s < strend && ISUUCHAR(*s))
1899 c = PL_uudmap[*(U8*)s++] & 077;
1902 if (s < strend && ISUUCHAR(*s))
1903 d = PL_uudmap[*(U8*)s++] & 077;
1906 hunk[0] = (char)((a << 2) | (b >> 4));
1907 hunk[1] = (char)((b << 4) | (c >> 2));
1908 hunk[2] = (char)((c << 6) | d);
1909 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
1914 else /* possible checksum byte */
1915 if (s + 1 < strend && s[1] == '\n')
1918 XPUSHs(sv_2mortal(sv));
1924 if (strchr("fFdD", TYPE_NO_MODIFIERS(datumtype)) ||
1925 (checksum > bits_in_uv &&
1926 strchr("csSiIlLnNUvVqQjJ", TYPE_NO_MODIFIERS(datumtype))) ) {
1929 adouble = (NV) (1 << (checksum & 15));
1930 while (checksum >= 16) {
1934 while (cdouble < 0.0)
1936 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
1937 sv_setnv(sv, cdouble);
1940 if (checksum < bits_in_uv) {
1941 UV mask = ((UV)1 << checksum) - 1;
1946 XPUSHs(sv_2mortal(sv));
1950 if (symptr->flags & FLAG_SLASH){
1951 if (SP - PL_stack_base - start_sp_offset <= 0)
1952 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1953 if( next_symbol(symptr) ){
1954 if( symptr->howlen == e_number )
1955 Perl_croak(aTHX_ "Count after length/code in unpack" );
1957 /* ...end of char buffer then no decent length available */
1958 Perl_croak(aTHX_ "length/code after end of string in unpack" );
1960 /* take top of stack (hope it's numeric) */
1963 Perl_croak(aTHX_ "Negative '/' count in unpack" );
1966 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
1968 datumtype = symptr->code;
1976 return SP - PL_stack_base - start_sp_offset;
1983 I32 gimme = GIMME_V;
1986 register char *pat = SvPV(left, llen);
1987 #ifdef PACKED_IS_OCTETS
1988 /* Packed side is assumed to be octets - so force downgrade if it
1989 has been UTF-8 encoded by accident
1991 register char *s = SvPVbyte(right, rlen);
1993 register char *s = SvPV(right, rlen);
1995 char *strend = s + rlen;
1996 register char *patend = pat + llen;
2000 cnt = unpackstring(pat, patend, s, strend,
2001 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
2002 | (DO_UTF8(right) ? FLAG_UNPACK_DO_UTF8 : 0));
2005 if ( !cnt && gimme == G_SCALAR )
2006 PUSHs(&PL_sv_undef);
2011 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
2015 *hunk = PL_uuemap[len];
2016 sv_catpvn(sv, hunk, 1);
2019 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
2020 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
2021 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
2022 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
2023 sv_catpvn(sv, hunk, 4);
2028 char r = (len > 1 ? s[1] : '\0');
2029 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
2030 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
2031 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
2032 hunk[3] = PL_uuemap[0];
2033 sv_catpvn(sv, hunk, 4);
2035 sv_catpvn(sv, "\n", 1);
2039 S_is_an_int(pTHX_ char *s, STRLEN l)
2042 SV *result = newSVpvn(s, l);
2043 char *result_c = SvPV(result, n_a); /* convenience */
2044 char *out = result_c;
2054 SvREFCNT_dec(result);
2077 SvREFCNT_dec(result);
2083 SvCUR_set(result, out - result_c);
2087 /* pnum must be '\0' terminated */
2089 S_div128(pTHX_ SV *pnum, bool *done)
2092 char *s = SvPV(pnum, len);
2101 i = m * 10 + (*t - '0');
2103 r = (i >> 7); /* r < 10 */
2110 SvCUR_set(pnum, (STRLEN) (t - s));
2117 =for apidoc pack_cat
2119 The engine implementing pack() Perl function. Note: parameters next_in_list and
2120 flags are not used. This call should not be used; use packlist instead.
2126 Perl_pack_cat(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
2128 tempsym_t sym = { 0 };
2130 sym.patend = patend;
2131 sym.flags = FLAG_PACK;
2133 (void)pack_rec( cat, &sym, beglist, endlist );
2138 =for apidoc packlist
2140 The engine implementing pack() Perl function.
2146 Perl_packlist(pTHX_ SV *cat, char *pat, register char *patend, register SV **beglist, SV **endlist )
2148 tempsym_t sym = { 0 };
2150 sym.patend = patend;
2151 sym.flags = FLAG_PACK;
2153 (void)pack_rec( cat, &sym, beglist, endlist );
2159 S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV **endlist )
2163 register I32 len = 0;
2166 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
2167 static char *space10 = " ";
2170 /* These must not be in registers: */
2180 #if SHORTSIZE != SIZE16
2182 unsigned short aushort;
2186 #if LONGSIZE != SIZE32
2188 unsigned long aulong;
2193 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2194 long double aldouble;
2200 int strrelbeg = SvCUR(cat);
2201 tempsym_t lookahead;
2203 items = endlist - beglist;
2204 found = next_symbol( symptr );
2206 #ifndef PACKED_IS_OCTETS
2207 if (symptr->level == 0 && found && symptr->code == 'U' ){
2213 SV *lengthcode = Nullsv;
2214 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
2216 I32 datumtype = symptr->code;
2219 switch( howlen = symptr->howlen ){
2222 len = symptr->length;
2225 len = strchr("@Xxu", TYPE_NO_MODIFIERS(datumtype)) ? 0 : items;
2229 /* Look ahead for next symbol. Do we have code/code? */
2230 lookahead = *symptr;
2231 found = next_symbol(&lookahead);
2232 if ( symptr->flags & FLAG_SLASH ) {
2234 if ( 0 == strchr( "aAZ", lookahead.code ) ||
2235 e_star != lookahead.howlen )
2236 Perl_croak(aTHX_ "'/' must be followed by 'a*', 'A*' or 'Z*' in pack");
2237 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
2238 ? *beglist : &PL_sv_no)
2239 + (lookahead.code == 'Z' ? 1 : 0)));
2241 Perl_croak(aTHX_ "Code missing after '/' in pack");
2245 switch(TYPE_NO_ENDIANNESS(datumtype)) {
2247 Perl_croak(aTHX_ "Invalid type '%c' in pack", (int)TYPE_NO_MODIFIERS(datumtype));
2249 Perl_croak(aTHX_ "'%%' may not be used in pack");
2251 len += strrelbeg - SvCUR(cat);
2260 tempsym_t savsym = *symptr;
2261 symptr->patend = savsym.grpend;
2264 symptr->patptr = savsym.grpbeg;
2265 beglist = pack_rec(cat, symptr, beglist, endlist );
2266 if (savsym.howlen == e_star && beglist == endlist)
2267 break; /* No way to continue */
2269 lookahead.flags = symptr->flags;
2273 case 'X' | TYPE_IS_SHRIEKING:
2274 if (!len) /* Avoid division by 0 */
2276 len = (SvCUR(cat)) % len;
2280 if ((I32)SvCUR(cat) < len)
2281 Perl_croak(aTHX_ "'X' outside of string in pack");
2285 case 'x' | TYPE_IS_SHRIEKING:
2286 if (!len) /* Avoid division by 0 */
2288 aint = (SvCUR(cat)) % len;
2289 if (aint) /* Other portable ways? */
2298 sv_catpvn(cat, null10, 10);
2301 sv_catpvn(cat, null10, len);
2307 aptr = SvPV(fromstr, fromlen);
2308 if (howlen == e_star) {
2310 if (datumtype == 'Z')
2313 if ((I32)fromlen >= len) {
2314 sv_catpvn(cat, aptr, len);
2315 if (datumtype == 'Z')
2316 *(SvEND(cat)-1) = '\0';
2319 sv_catpvn(cat, aptr, fromlen);
2321 if (datumtype == 'A') {
2323 sv_catpvn(cat, space10, 10);
2326 sv_catpvn(cat, space10, len);
2330 sv_catpvn(cat, null10, 10);
2333 sv_catpvn(cat, null10, len);
2345 str = SvPV(fromstr, fromlen);
2346 if (howlen == e_star)
2349 SvCUR(cat) += (len+7)/8;
2350 SvGROW(cat, SvCUR(cat) + 1);
2351 aptr = SvPVX(cat) + aint;
2352 if (len > (I32)fromlen)
2356 if (datumtype == 'B') {
2357 for (len = 0; len++ < aint;) {
2358 items |= *str++ & 1;
2362 *aptr++ = items & 0xff;
2368 for (len = 0; len++ < aint;) {
2374 *aptr++ = items & 0xff;
2380 if (datumtype == 'B')
2381 items <<= 7 - (aint & 7);
2383 items >>= 7 - (aint & 7);
2384 *aptr++ = items & 0xff;
2386 str = SvPVX(cat) + SvCUR(cat);
2401 str = SvPV(fromstr, fromlen);
2402 if (howlen == e_star)
2405 SvCUR(cat) += (len+1)/2;
2406 SvGROW(cat, SvCUR(cat) + 1);
2407 aptr = SvPVX(cat) + aint;
2408 if (len > (I32)fromlen)
2412 if (datumtype == 'H') {
2413 for (len = 0; len++ < aint;) {
2415 items |= ((*str++ & 15) + 9) & 15;
2417 items |= *str++ & 15;
2421 *aptr++ = items & 0xff;
2427 for (len = 0; len++ < aint;) {
2429 items |= (((*str++ & 15) + 9) & 15) << 4;
2431 items |= (*str++ & 15) << 4;
2435 *aptr++ = items & 0xff;
2441 *aptr++ = items & 0xff;
2442 str = SvPVX(cat) + SvCUR(cat);
2453 switch (TYPE_NO_MODIFIERS(datumtype)) {
2455 aint = SvIV(fromstr);
2456 if ((aint < 0 || aint > 255) &&
2458 Perl_warner(aTHX_ packWARN(WARN_PACK),
2459 "Character in 'C' format wrapped in pack");
2461 sv_catpvn(cat, &achar, sizeof(char));
2464 aint = SvIV(fromstr);
2465 if ((aint < -128 || aint > 127) &&
2467 Perl_warner(aTHX_ packWARN(WARN_PACK),
2468 "Character in 'c' format wrapped in pack" );
2470 sv_catpvn(cat, &achar, sizeof(char));
2478 auint = UNI_TO_NATIVE(SvUV(fromstr));
2479 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
2481 (char*)uvchr_to_utf8_flags((U8*)SvEND(cat),
2484 0 : UNICODE_ALLOW_ANY)
2489 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
2494 /* VOS does not automatically map a floating-point overflow
2495 during conversion from double to float into infinity, so we
2496 do it by hand. This code should either be generalized for
2497 any OS that needs it, or removed if and when VOS implements
2498 posix-976 (suggestion to support mapping to infinity).
2499 Paul.Green@stratus.com 02-04-02. */
2500 if (SvNV(fromstr) > FLT_MAX)
2501 afloat = _float_constants[0]; /* single prec. inf. */
2502 else if (SvNV(fromstr) < -FLT_MAX)
2503 afloat = _float_constants[0]; /* single prec. inf. */
2504 else afloat = (float)SvNV(fromstr);
2506 # if defined(VMS) && !defined(__IEEE_FP)
2507 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2508 * on Alpha; fake it if we don't have them.
2510 if (SvNV(fromstr) > FLT_MAX)
2512 else if (SvNV(fromstr) < -FLT_MAX)
2514 else afloat = (float)SvNV(fromstr);
2516 afloat = (float)SvNV(fromstr);
2519 DO_BO_PACK_N(afloat, float);
2520 sv_catpvn(cat, (char *)&afloat, sizeof (float));
2527 /* VOS does not automatically map a floating-point overflow
2528 during conversion from long double to double into infinity,
2529 so we do it by hand. This code should either be generalized
2530 for any OS that needs it, or removed if and when VOS
2531 implements posix-976 (suggestion to support mapping to
2532 infinity). Paul.Green@stratus.com 02-04-02. */
2533 if (SvNV(fromstr) > DBL_MAX)
2534 adouble = _double_constants[0]; /* double prec. inf. */
2535 else if (SvNV(fromstr) < -DBL_MAX)
2536 adouble = _double_constants[0]; /* double prec. inf. */
2537 else adouble = (double)SvNV(fromstr);
2539 # if defined(VMS) && !defined(__IEEE_FP)
2540 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
2541 * on Alpha; fake it if we don't have them.
2543 if (SvNV(fromstr) > DBL_MAX)
2545 else if (SvNV(fromstr) < -DBL_MAX)
2547 else adouble = (double)SvNV(fromstr);
2549 adouble = (double)SvNV(fromstr);
2552 DO_BO_PACK_N(adouble, double);
2553 sv_catpvn(cat, (char *)&adouble, sizeof (double));
2557 Zero(&anv, 1, NV); /* can be long double with unused bits */
2560 anv = SvNV(fromstr);
2561 DO_BO_PACK_N(anv, NV);
2562 sv_catpvn(cat, (char *)&anv, NVSIZE);
2565 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2567 /* long doubles can have unused bits, which may be nonzero */
2568 Zero(&aldouble, 1, long double);
2571 aldouble = (long double)SvNV(fromstr);
2572 DO_BO_PACK_N(aldouble, long double);
2573 sv_catpvn(cat, (char *)&aldouble, LONG_DOUBLESIZE);
2577 case 'n' | TYPE_IS_SHRIEKING:
2581 ai16 = (I16)SvIV(fromstr);
2583 ai16 = PerlSock_htons(ai16);
2588 case 'v' | TYPE_IS_SHRIEKING:
2592 ai16 = (I16)SvIV(fromstr);
2599 case 'S' | TYPE_IS_SHRIEKING:
2600 #if SHORTSIZE != SIZE16
2604 aushort = SvUV(fromstr);
2605 DO_BO_PACK(aushort, s);
2606 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
2617 au16 = (U16)SvUV(fromstr);
2618 DO_BO_PACK(au16, 16);
2624 case 's' | TYPE_IS_SHRIEKING:
2625 #if SHORTSIZE != SIZE16
2629 ashort = SvIV(fromstr);
2630 DO_BO_PACK(ashort, s);
2631 sv_catpvn(cat, (char *)&ashort, sizeof(short));
2641 ai16 = (I16)SvIV(fromstr);
2642 DO_BO_PACK(ai16, 16);
2647 case 'I' | TYPE_IS_SHRIEKING:
2650 auint = SvUV(fromstr);
2651 DO_BO_PACK(auint, i);
2652 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
2658 aiv = SvIV(fromstr);
2659 #if IVSIZE == INTSIZE
2661 #elif IVSIZE == LONGSIZE
2663 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
2664 DO_BO_PACK(aiv, 64);
2666 sv_catpvn(cat, (char*)&aiv, IVSIZE);
2672 auv = SvUV(fromstr);
2673 #if UVSIZE == INTSIZE
2675 #elif UVSIZE == LONGSIZE
2677 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
2678 DO_BO_PACK(auv, 64);
2680 sv_catpvn(cat, (char*)&auv, UVSIZE);
2686 anv = SvNV(fromstr);
2689 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
2691 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
2692 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
2693 any negative IVs will have already been got by the croak()
2694 above. IOK is untrue for fractions, so we test them
2695 against UV_MAX_P1. */
2696 if (SvIOK(fromstr) || anv < UV_MAX_P1)
2698 char buf[(sizeof(UV)*8)/7+1];
2699 char *in = buf + sizeof(buf);
2700 UV auv = SvUV(fromstr);
2703 *--in = (char)((auv & 0x7f) | 0x80);
2706 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2707 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2709 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
2710 char *from, *result, *in;
2715 /* Copy string and check for compliance */
2716 from = SvPV(fromstr, len);
2717 if ((norm = is_an_int(from, len)) == NULL)
2718 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2720 New('w', result, len, char);
2724 *--in = div128(norm, &done) | 0x80;
2725 result[len - 1] &= 0x7F; /* clear continue bit */
2726 sv_catpvn(cat, in, (result + len) - in);
2728 SvREFCNT_dec(norm); /* free norm */
2730 else if (SvNOKp(fromstr)) {
2731 /* 10**NV_MAX_10_EXP is the largest power of 10
2732 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
2733 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
2734 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
2735 And with that many bytes only Inf can overflow.
2736 Some C compilers are strict about integral constant
2737 expressions so we conservatively divide by a slightly
2738 smaller integer instead of multiplying by the exact
2739 floating-point value.
2741 #ifdef NV_MAX_10_EXP
2742 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
2743 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
2745 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
2746 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
2748 char *in = buf + sizeof(buf);
2750 anv = Perl_floor(anv);
2752 NV next = Perl_floor(anv / 128);
2753 if (in <= buf) /* this cannot happen ;-) */
2754 Perl_croak(aTHX_ "Cannot compress integer in pack");
2755 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
2758 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
2759 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
2762 char *from, *result, *in;
2767 /* Copy string and check for compliance */
2768 from = SvPV(fromstr, len);
2769 if ((norm = is_an_int(from, len)) == NULL)
2770 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
2772 New('w', result, len, char);
2776 *--in = div128(norm, &done) | 0x80;
2777 result[len - 1] &= 0x7F; /* clear continue bit */
2778 sv_catpvn(cat, in, (result + len) - in);
2780 SvREFCNT_dec(norm); /* free norm */
2785 case 'i' | TYPE_IS_SHRIEKING:
2788 aint = SvIV(fromstr);
2789 DO_BO_PACK(aint, i);
2790 sv_catpvn(cat, (char*)&aint, sizeof(int));
2793 case 'N' | TYPE_IS_SHRIEKING:
2797 au32 = SvUV(fromstr);
2799 au32 = PerlSock_htonl(au32);
2804 case 'V' | TYPE_IS_SHRIEKING:
2808 au32 = SvUV(fromstr);
2815 case 'L' | TYPE_IS_SHRIEKING:
2816 #if LONGSIZE != SIZE32
2820 aulong = SvUV(fromstr);
2821 DO_BO_PACK(aulong, l);
2822 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
2833 au32 = SvUV(fromstr);
2834 DO_BO_PACK(au32, 32);
2839 case 'l' | TYPE_IS_SHRIEKING:
2840 #if LONGSIZE != SIZE32
2844 along = SvIV(fromstr);
2845 DO_BO_PACK(along, l);
2846 sv_catpvn(cat, (char *)&along, sizeof(long));
2856 ai32 = SvIV(fromstr);
2857 DO_BO_PACK(ai32, 32);
2865 auquad = (Uquad_t)SvUV(fromstr);
2866 DO_BO_PACK(auquad, 64);
2867 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
2873 aquad = (Quad_t)SvIV(fromstr);
2874 DO_BO_PACK(aquad, 64);
2875 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
2880 len = 1; /* assume SV is correct length */
2885 if (fromstr == &PL_sv_undef)
2889 /* XXX better yet, could spirit away the string to
2890 * a safe spot and hang on to it until the result
2891 * of pack() (and all copies of the result) are
2894 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
2895 || (SvPADTMP(fromstr)
2896 && !SvREADONLY(fromstr))))
2898 Perl_warner(aTHX_ packWARN(WARN_PACK),
2899 "Attempt to pack pointer to temporary value");
2901 if (SvPOK(fromstr) || SvNIOK(fromstr))
2902 aptr = SvPV(fromstr,n_a);
2904 aptr = SvPV_force(fromstr,n_a);
2907 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
2912 aptr = SvPV(fromstr, fromlen);
2913 SvGROW(cat, fromlen * 4 / 3);
2918 while (fromlen > 0) {
2921 if ((I32)fromlen > len)
2925 doencodes(cat, aptr, todo);
2931 *symptr = lookahead;
2940 dSP; dMARK; dORIGMARK; dTARGET;
2941 register SV *cat = TARG;
2943 register char *pat = SvPVx(*++MARK, fromlen);
2944 register char *patend = pat + fromlen;
2947 sv_setpvn(cat, "", 0);
2949 packlist(cat, pat, patend, MARK, SP + 1);