3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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,
19 /* This file contains pp ("push/pop") functions that
20 * execute the opcodes that make up a perl program. A typical pp function
21 * expects to find its arguments on the stack, and usually pushes its
22 * results onto the stack, hence the 'pp' terminology. Each OP structure
23 * contains a pointer to the relevant pp_foo() function.
25 * This particular file just contains pp_pack() and pp_unpack(). See the
26 * other pp*.c files for the rest of the pp_ functions.
30 #define PERL_IN_PP_PACK_C
33 /* Types used by pack/unpack */
35 e_no_len, /* no length */
36 e_number, /* number, [] */
40 typedef struct tempsym {
41 const char* patptr; /* current template char */
42 const char* patend; /* one after last char */
43 const char* grpbeg; /* 1st char of ()-group */
44 const char* grpend; /* end of ()-group */
45 I32 code; /* template code (!<>) */
46 I32 length; /* length/repeat count */
47 howlen_t howlen; /* how length is given */
48 int level; /* () nesting level */
49 U32 flags; /* /=4, comma=2, pack=1 */
50 /* and group modifiers */
51 STRLEN strbeg; /* offset of group start */
52 struct tempsym *previous; /* previous group */
55 #define TEMPSYM_INIT(symptr, p, e, f) \
57 (symptr)->patptr = (p); \
58 (symptr)->patend = (e); \
59 (symptr)->grpbeg = NULL; \
60 (symptr)->grpend = NULL; \
61 (symptr)->grpend = NULL; \
63 (symptr)->length = 0; \
64 (symptr)->howlen = e_no_len; \
65 (symptr)->level = 0; \
66 (symptr)->flags = (f); \
67 (symptr)->strbeg = 0; \
68 (symptr)->previous = NULL; \
72 # define PERL_PACK_CAN_BYTEORDER
73 # define PERL_PACK_CAN_SHRIEKSIGN
79 /* Maximum number of bytes to which a byte can grow due to upgrade */
83 * Offset for integer pack/unpack.
85 * On architectures where I16 and I32 aren't really 16 and 32 bits,
86 * which for now are all Crays, pack and unpack have to play games.
90 * These values are required for portability of pack() output.
91 * If they're not right on your machine, then pack() and unpack()
92 * wouldn't work right anyway; you'll need to apply the Cray hack.
93 * (I'd like to check them with #if, but you can't use sizeof() in
94 * the preprocessor.) --???
97 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
98 defines are now in config.h. --Andy Dougherty April 1998
103 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
106 #if U16SIZE > SIZE16 || U32SIZE > SIZE32
107 # if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 /* little-endian */
108 # define OFF16(p) ((char*)(p))
109 # define OFF32(p) ((char*)(p))
111 # if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 /* big-endian */
112 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
113 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
115 ++++ bad cray byte order
119 # define OFF16(p) ((char *) (p))
120 # define OFF32(p) ((char *) (p))
123 /* Only to be used inside a loop (see the break) */
124 #define SHIFT16(utf8, s, strend, p, datumtype) STMT_START { \
126 if (!uni_to_bytes(aTHX_ &(s), strend, OFF16(p), SIZE16, datumtype)) break; \
128 Copy(s, OFF16(p), SIZE16, char); \
133 /* Only to be used inside a loop (see the break) */
134 #define SHIFT32(utf8, s, strend, p, datumtype) STMT_START { \
136 if (!uni_to_bytes(aTHX_ &(s), strend, OFF32(p), SIZE32, datumtype)) break; \
138 Copy(s, OFF32(p), SIZE32, char); \
143 #define PUSH16(utf8, cur, p) PUSH_BYTES(utf8, cur, OFF16(p), SIZE16)
144 #define PUSH32(utf8, cur, p) PUSH_BYTES(utf8, cur, OFF32(p), SIZE32)
146 /* Only to be used inside a loop (see the break) */
147 #define SHIFT_VAR(utf8, s, strend, var, datumtype) \
150 if (!uni_to_bytes(aTHX_ &s, strend, \
151 (char *) &var, sizeof(var), datumtype)) break;\
153 Copy(s, (char *) &var, sizeof(var), char); \
158 #define PUSH_VAR(utf8, aptr, var) \
159 PUSH_BYTES(utf8, aptr, &(var), sizeof(var))
161 /* Avoid stack overflow due to pathological templates. 100 should be plenty. */
162 #define MAX_SUB_TEMPLATE_LEVEL 100
164 /* flags (note that type modifiers can also be used as flags!) */
165 #define FLAG_WAS_UTF8 0x40
166 #define FLAG_PARSE_UTF8 0x20 /* Parse as utf8 */
167 #define FLAG_UNPACK_ONLY_ONE 0x10
168 #define FLAG_DO_UTF8 0x08 /* The underlying string is utf8 */
169 #define FLAG_SLASH 0x04
170 #define FLAG_COMMA 0x02
171 #define FLAG_PACK 0x01
174 S_mul128(pTHX_ SV *sv, U8 m)
177 char *s = SvPV(sv, len);
180 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
181 SV * const tmpNew = newSVpvs("0000000000");
183 sv_catsv(tmpNew, sv);
184 SvREFCNT_dec(sv); /* free old sv */
189 while (!*t) /* trailing '\0'? */
192 const U32 i = ((*t - '0') << 7) + m;
193 *(t--) = '0' + (char)(i % 10);
199 /* Explosives and implosives. */
201 #if 'I' == 73 && 'J' == 74
202 /* On an ASCII/ISO kind of system */
203 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
206 Some other sort of character set - use memchr() so we don't match
209 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
213 #define TYPE_IS_SHRIEKING 0x100
214 #define TYPE_IS_BIG_ENDIAN 0x200
215 #define TYPE_IS_LITTLE_ENDIAN 0x400
216 #define TYPE_IS_PACK 0x800
217 #define TYPE_ENDIANNESS_MASK (TYPE_IS_BIG_ENDIAN|TYPE_IS_LITTLE_ENDIAN)
218 #define TYPE_MODIFIERS(t) ((t) & ~0xFF)
219 #define TYPE_NO_MODIFIERS(t) ((t) & 0xFF)
221 #ifdef PERL_PACK_CAN_SHRIEKSIGN
222 # define SHRIEKING_ALLOWED_TYPES "sSiIlLxXnNvV@."
224 # define SHRIEKING_ALLOWED_TYPES "sSiIlLxX"
227 #ifndef PERL_PACK_CAN_BYTEORDER
228 /* Put "can't" first because it is shorter */
229 # define TYPE_ENDIANNESS(t) 0
230 # define TYPE_NO_ENDIANNESS(t) (t)
232 # define ENDIANNESS_ALLOWED_TYPES ""
234 # define DO_BO_UNPACK(var, type)
235 # define DO_BO_PACK(var, type)
236 # define DO_BO_UNPACK_PTR(var, type, pre_cast, post_cast)
237 # define DO_BO_PACK_PTR(var, type, pre_cast, post_cast)
238 # define DO_BO_UNPACK_N(var, type)
239 # define DO_BO_PACK_N(var, type)
240 # define DO_BO_UNPACK_P(var)
241 # define DO_BO_PACK_P(var)
242 # define DO_BO_UNPACK_PC(var)
243 # define DO_BO_PACK_PC(var)
245 #else /* PERL_PACK_CAN_BYTEORDER */
247 # define TYPE_ENDIANNESS(t) ((t) & TYPE_ENDIANNESS_MASK)
248 # define TYPE_NO_ENDIANNESS(t) ((t) & ~TYPE_ENDIANNESS_MASK)
250 # define ENDIANNESS_ALLOWED_TYPES "sSiIlLqQjJfFdDpP("
252 # define DO_BO_UNPACK(var, type) \
254 switch (TYPE_ENDIANNESS(datumtype)) { \
255 case TYPE_IS_BIG_ENDIAN: var = my_betoh ## type (var); break; \
256 case TYPE_IS_LITTLE_ENDIAN: var = my_letoh ## type (var); break; \
261 # define DO_BO_PACK(var, type) \
263 switch (TYPE_ENDIANNESS(datumtype)) { \
264 case TYPE_IS_BIG_ENDIAN: var = my_htobe ## type (var); break; \
265 case TYPE_IS_LITTLE_ENDIAN: var = my_htole ## type (var); break; \
270 # define DO_BO_UNPACK_PTR(var, type, pre_cast, post_cast) \
272 switch (TYPE_ENDIANNESS(datumtype)) { \
273 case TYPE_IS_BIG_ENDIAN: \
274 var = (post_cast*) my_betoh ## type ((pre_cast) var); \
276 case TYPE_IS_LITTLE_ENDIAN: \
277 var = (post_cast *) my_letoh ## type ((pre_cast) var); \
284 # define DO_BO_PACK_PTR(var, type, pre_cast, post_cast) \
286 switch (TYPE_ENDIANNESS(datumtype)) { \
287 case TYPE_IS_BIG_ENDIAN: \
288 var = (post_cast *) my_htobe ## type ((pre_cast) var); \
290 case TYPE_IS_LITTLE_ENDIAN: \
291 var = (post_cast *) my_htole ## type ((pre_cast) var); \
298 # define BO_CANT_DOIT(action, type) \
300 switch (TYPE_ENDIANNESS(datumtype)) { \
301 case TYPE_IS_BIG_ENDIAN: \
302 Perl_croak(aTHX_ "Can't %s big-endian %ss on this " \
303 "platform", #action, #type); \
305 case TYPE_IS_LITTLE_ENDIAN: \
306 Perl_croak(aTHX_ "Can't %s little-endian %ss on this " \
307 "platform", #action, #type); \
314 # if PTRSIZE == INTSIZE
315 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, i, int, void)
316 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, i, int, void)
317 # define DO_BO_UNPACK_PC(var) DO_BO_UNPACK_PTR(var, i, int, char)
318 # define DO_BO_PACK_PC(var) DO_BO_PACK_PTR(var, i, int, char)
319 # elif PTRSIZE == LONGSIZE
320 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, l, long, void)
321 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, l, long, void)
322 # define DO_BO_UNPACK_PC(var) DO_BO_UNPACK_PTR(var, l, long, char)
323 # define DO_BO_PACK_PC(var) DO_BO_PACK_PTR(var, l, long, char)
324 # elif PTRSIZE == IVSIZE
325 # define DO_BO_UNPACK_P(var) DO_BO_UNPACK_PTR(var, l, IV, void)
326 # define DO_BO_PACK_P(var) DO_BO_PACK_PTR(var, l, IV, void)
327 # define DO_BO_UNPACK_PC(var) DO_BO_UNPACK_PTR(var, l, IV, char)
328 # define DO_BO_PACK_PC(var) DO_BO_PACK_PTR(var, l, IV, char)
330 # define DO_BO_UNPACK_P(var) BO_CANT_DOIT(unpack, pointer)
331 # define DO_BO_PACK_P(var) BO_CANT_DOIT(pack, pointer)
332 # define DO_BO_UNPACK_PC(var) BO_CANT_DOIT(unpack, pointer)
333 # define DO_BO_PACK_PC(var) BO_CANT_DOIT(pack, pointer)
336 # if defined(my_htolen) && defined(my_letohn) && \
337 defined(my_htoben) && defined(my_betohn)
338 # define DO_BO_UNPACK_N(var, type) \
340 switch (TYPE_ENDIANNESS(datumtype)) { \
341 case TYPE_IS_BIG_ENDIAN: my_betohn(&var, sizeof(type)); break;\
342 case TYPE_IS_LITTLE_ENDIAN: my_letohn(&var, sizeof(type)); break;\
347 # define DO_BO_PACK_N(var, type) \
349 switch (TYPE_ENDIANNESS(datumtype)) { \
350 case TYPE_IS_BIG_ENDIAN: my_htoben(&var, sizeof(type)); break;\
351 case TYPE_IS_LITTLE_ENDIAN: my_htolen(&var, sizeof(type)); break;\
356 # define DO_BO_UNPACK_N(var, type) BO_CANT_DOIT(unpack, type)
357 # define DO_BO_PACK_N(var, type) BO_CANT_DOIT(pack, type)
360 #endif /* PERL_PACK_CAN_BYTEORDER */
362 #define PACK_SIZE_CANNOT_CSUM 0x80
363 #define PACK_SIZE_UNPREDICTABLE 0x40 /* Not a fixed size element */
364 #define PACK_SIZE_MASK 0x3F
366 /* These tables are regenerated by genpacksizetables.pl (and then hand pasted
367 in). You're unlikely ever to need to regenerate them. */
369 #if TYPE_IS_SHRIEKING != 0x100
370 ++++shriek offset should be 256
373 typedef U8 packprops_t;
376 STATIC const packprops_t packprops[512] = {
378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
379 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383 /* C */ sizeof(unsigned char),
384 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
385 /* D */ LONG_DOUBLESIZE,
392 /* I */ sizeof(unsigned int),
399 #if defined(HAS_QUAD)
400 /* Q */ sizeof(Uquad_t),
407 /* U */ sizeof(char) | PACK_SIZE_UNPREDICTABLE,
409 /* W */ sizeof(unsigned char) | PACK_SIZE_UNPREDICTABLE,
410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
411 /* c */ sizeof(char),
412 /* d */ sizeof(double),
414 /* f */ sizeof(float),
423 /* p */ sizeof(char *) | PACK_SIZE_CANNOT_CSUM,
424 #if defined(HAS_QUAD)
425 /* q */ sizeof(Quad_t),
433 /* w */ sizeof(char) | PACK_SIZE_UNPREDICTABLE | PACK_SIZE_CANNOT_CSUM,
434 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
435 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
436 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
437 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
438 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
439 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
440 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
441 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
442 0, 0, 0, 0, 0, 0, 0, 0,
444 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0, 0,
449 /* I */ sizeof(unsigned int),
451 /* L */ sizeof(unsigned long),
453 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
459 /* S */ sizeof(unsigned short),
461 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
466 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
470 /* l */ sizeof(long),
472 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
478 /* s */ sizeof(short),
480 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
485 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
486 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
487 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
488 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
489 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
490 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
491 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
492 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
493 0, 0, 0, 0, 0, 0, 0, 0, 0
496 /* EBCDIC (or bust) */
497 STATIC const packprops_t packprops[512] = {
499 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
500 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
501 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
503 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
505 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
506 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
508 /* c */ sizeof(char),
509 /* d */ sizeof(double),
511 /* f */ sizeof(float),
521 /* p */ sizeof(char *) | PACK_SIZE_CANNOT_CSUM,
522 #if defined(HAS_QUAD)
523 /* q */ sizeof(Quad_t),
527 0, 0, 0, 0, 0, 0, 0, 0, 0,
531 /* w */ sizeof(char) | PACK_SIZE_UNPREDICTABLE | PACK_SIZE_CANNOT_CSUM,
532 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
533 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
534 /* C */ sizeof(unsigned char),
535 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
536 /* D */ LONG_DOUBLESIZE,
543 /* I */ sizeof(unsigned int),
551 #if defined(HAS_QUAD)
552 /* Q */ sizeof(Uquad_t),
556 0, 0, 0, 0, 0, 0, 0, 0, 0,
559 /* U */ sizeof(char) | PACK_SIZE_UNPREDICTABLE,
561 /* W */ sizeof(unsigned char) | PACK_SIZE_UNPREDICTABLE,
562 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
563 0, 0, 0, 0, 0, 0, 0, 0, 0,
565 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
566 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
567 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
568 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
569 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
571 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
572 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
573 0, 0, 0, 0, 0, 0, 0, 0, 0,
575 0, 0, 0, 0, 0, 0, 0, 0, 0,
576 /* l */ sizeof(long),
578 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
583 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
584 /* s */ sizeof(short),
586 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
591 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
592 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
594 /* I */ sizeof(unsigned int),
595 0, 0, 0, 0, 0, 0, 0, 0, 0,
596 /* L */ sizeof(unsigned long),
598 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
603 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
604 /* S */ sizeof(unsigned short),
606 #if defined(PERL_PACK_CAN_SHRIEKSIGN)
611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
617 uni_to_byte(pTHX_ const char **s, const char *end, I32 datumtype)
620 UV val = utf8n_to_uvchr((U8 *) *s, end-*s, &retlen,
621 ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
622 /* We try to process malformed UTF-8 as much as possible (preferrably with
623 warnings), but these two mean we make no progress in the string and
624 might enter an infinite loop */
625 if (retlen == (STRLEN) -1 || retlen == 0)
626 Perl_croak(aTHX_ "Malformed UTF-8 string in '%c' format in unpack",
627 (int) TYPE_NO_MODIFIERS(datumtype));
629 if (ckWARN(WARN_UNPACK))
630 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
631 "Character in '%c' format wrapped in unpack",
632 (int) TYPE_NO_MODIFIERS(datumtype));
639 #define SHIFT_BYTE(utf8, s, strend, datumtype) ((utf8) ? \
640 uni_to_byte(aTHX_ &(s), (strend), (datumtype)) : \
644 uni_to_bytes(pTHX_ const char **s, const char *end, const char *buf, int buf_len, I32 datumtype)
648 const char *from = *s;
650 const U32 flags = ckWARN(WARN_UTF8) ?
651 UTF8_CHECK_ONLY : (UTF8_CHECK_ONLY | UTF8_ALLOW_ANY);
652 for (;buf_len > 0; buf_len--) {
653 if (from >= end) return FALSE;
654 val = utf8n_to_uvchr((U8 *) from, end-from, &retlen, flags);
655 if (retlen == (STRLEN) -1 || retlen == 0) {
656 from += UTF8SKIP(from);
658 } else from += retlen;
663 *(U8 *)buf++ = (U8)val;
665 /* We have enough characters for the buffer. Did we have problems ? */
668 /* Rewalk the string fragment while warning */
670 const int flags = ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY;
671 for (ptr = *s; ptr < from; ptr += UTF8SKIP(ptr)) {
672 if (ptr >= end) break;
673 utf8n_to_uvuni((U8 *) ptr, end-ptr, &retlen, flags);
675 if (from > end) from = end;
677 if ((bad & 2) && ckWARN(WARN_UNPACK))
678 Perl_warner(aTHX_ packWARN(datumtype & TYPE_IS_PACK ?
679 WARN_PACK : WARN_UNPACK),
680 "Character(s) in '%c' format wrapped in %s",
681 (int) TYPE_NO_MODIFIERS(datumtype),
682 datumtype & TYPE_IS_PACK ? "pack" : "unpack");
689 next_uni_uu(pTHX_ const char **s, const char *end, I32 *out)
693 const UV val = utf8n_to_uvchr((U8 *) *s, end-*s, &retlen, UTF8_CHECK_ONLY);
694 if (val >= 0x100 || !ISUUCHAR(val) ||
695 retlen == (STRLEN) -1 || retlen == 0) {
699 *out = PL_uudmap[val] & 077;
705 S_bytes_to_uni(const U8 *start, STRLEN len, char *dest) {
706 const U8 * const end = start + len;
708 while (start < end) {
709 const UV uv = NATIVE_TO_ASCII(*start);
710 if (UNI_IS_INVARIANT(uv))
711 *dest++ = (char)(U8)UTF_TO_NATIVE(uv);
713 *dest++ = (char)(U8)UTF8_EIGHT_BIT_HI(uv);
714 *dest++ = (char)(U8)UTF8_EIGHT_BIT_LO(uv);
721 #define PUSH_BYTES(utf8, cur, buf, len) \
724 (cur) = bytes_to_uni((U8 *) buf, len, (cur)); \
726 Copy(buf, cur, len, char); \
731 #define GROWING(utf8, cat, start, cur, in_len) \
733 STRLEN glen = (in_len); \
734 if (utf8) glen *= UTF8_EXPAND; \
735 if ((cur) + glen >= (start) + SvLEN(cat)) { \
736 (start) = sv_exp_grow(cat, glen); \
737 (cur) = (start) + SvCUR(cat); \
741 #define PUSH_GROWING_BYTES(utf8, cat, start, cur, buf, in_len) \
743 const STRLEN glen = (in_len); \
745 if (utf8) gl *= UTF8_EXPAND; \
746 if ((cur) + gl >= (start) + SvLEN(cat)) { \
748 SvCUR_set((cat), (cur) - (start)); \
749 (start) = sv_exp_grow(cat, gl); \
750 (cur) = (start) + SvCUR(cat); \
752 PUSH_BYTES(utf8, cur, buf, glen); \
755 #define PUSH_BYTE(utf8, s, byte) \
758 const U8 au8 = (byte); \
759 (s) = bytes_to_uni(&au8, 1, (s)); \
760 } else *(U8 *)(s)++ = (byte); \
763 /* Only to be used inside a loop (see the break) */
764 #define NEXT_UNI_VAL(val, cur, str, end, utf8_flags) \
767 if (str >= end) break; \
768 val = utf8n_to_uvchr((U8 *) str, end-str, &retlen, utf8_flags); \
769 if (retlen == (STRLEN) -1 || retlen == 0) { \
771 Perl_croak(aTHX_ "Malformed UTF-8 string in pack"); \
776 static const char *_action( const tempsym_t* symptr )
778 return (const char *)(( symptr->flags & FLAG_PACK ) ? "pack" : "unpack");
781 /* Returns the sizeof() struct described by pat */
783 S_measure_struct(pTHX_ tempsym_t* symptr)
787 while (next_symbol(symptr)) {
791 switch (symptr->howlen) {
793 Perl_croak(aTHX_ "Within []-length '*' not allowed in %s",
797 /* e_no_len and e_number */
798 len = symptr->length;
802 size = packprops[TYPE_NO_ENDIANNESS(symptr->code)] & PACK_SIZE_MASK;
805 /* endianness doesn't influence the size of a type */
806 switch(TYPE_NO_ENDIANNESS(symptr->code)) {
808 Perl_croak(aTHX_ "Invalid type '%c' in %s",
809 (int)TYPE_NO_MODIFIERS(symptr->code),
811 #ifdef PERL_PACK_CAN_SHRIEKSIGN
812 case '.' | TYPE_IS_SHRIEKING:
813 case '@' | TYPE_IS_SHRIEKING:
818 case 'U': /* XXXX Is it correct? */
821 Perl_croak(aTHX_ "Within []-length '%c' not allowed in %s",
822 (int) TYPE_NO_MODIFIERS(symptr->code),
829 tempsym_t savsym = *symptr;
830 symptr->patptr = savsym.grpbeg;
831 symptr->patend = savsym.grpend;
832 /* XXXX Theoretically, we need to measure many times at
833 different positions, since the subexpression may contain
834 alignment commands, but be not of aligned length.
835 Need to detect this and croak(). */
836 size = measure_struct(symptr);
840 case 'X' | TYPE_IS_SHRIEKING:
841 /* XXXX Is this useful? Then need to treat MEASURE_BACKWARDS.
843 if (!len) /* Avoid division by 0 */
845 len = total % len; /* Assumed: the start is aligned. */
850 Perl_croak(aTHX_ "'X' outside of string in %s", _action( symptr ) );
852 case 'x' | TYPE_IS_SHRIEKING:
853 if (!len) /* Avoid division by 0 */
855 star = total % len; /* Assumed: the start is aligned. */
856 if (star) /* Other portable ways? */
880 size = sizeof(char*);
890 /* locate matching closing parenthesis or bracket
891 * returns char pointer to char after match, or NULL
894 S_group_end(pTHX_ register const char *patptr, register const char *patend, char ender)
896 while (patptr < patend) {
897 const char c = *patptr++;
904 while (patptr < patend && *patptr != '\n')
908 patptr = group_end(patptr, patend, ')') + 1;
910 patptr = group_end(patptr, patend, ']') + 1;
912 Perl_croak(aTHX_ "No group ending character '%c' found in template",
918 /* Convert unsigned decimal number to binary.
919 * Expects a pointer to the first digit and address of length variable
920 * Advances char pointer to 1st non-digit char and returns number
923 S_get_num(pTHX_ register const char *patptr, I32 *lenptr )
925 I32 len = *patptr++ - '0';
926 while (isDIGIT(*patptr)) {
927 if (len >= 0x7FFFFFFF/10)
928 Perl_croak(aTHX_ "pack/unpack repeat count overflow");
929 len = (len * 10) + (*patptr++ - '0');
935 /* The marvellous template parsing routine: Using state stored in *symptr,
936 * locates next template code and count
939 S_next_symbol(pTHX_ tempsym_t* symptr )
941 const char* patptr = symptr->patptr;
942 const char* const patend = symptr->patend;
944 symptr->flags &= ~FLAG_SLASH;
946 while (patptr < patend) {
947 if (isSPACE(*patptr))
949 else if (*patptr == '#') {
951 while (patptr < patend && *patptr != '\n')
956 /* We should have found a template code */
957 I32 code = *patptr++ & 0xFF;
958 U32 inherited_modifiers = 0;
960 if (code == ','){ /* grandfather in commas but with a warning */
961 if (((symptr->flags & FLAG_COMMA) == 0) && ckWARN(WARN_UNPACK)){
962 symptr->flags |= FLAG_COMMA;
963 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
964 "Invalid type ',' in %s", _action( symptr ) );
969 /* for '(', skip to ')' */
971 if( isDIGIT(*patptr) || *patptr == '*' || *patptr == '[' )
972 Perl_croak(aTHX_ "()-group starts with a count in %s",
974 symptr->grpbeg = patptr;
975 patptr = 1 + ( symptr->grpend = group_end(patptr, patend, ')') );
976 if( symptr->level >= MAX_SUB_TEMPLATE_LEVEL )
977 Perl_croak(aTHX_ "Too deeply nested ()-groups in %s",
981 /* look for group modifiers to inherit */
982 if (TYPE_ENDIANNESS(symptr->flags)) {
983 if (strchr(ENDIANNESS_ALLOWED_TYPES, TYPE_NO_MODIFIERS(code)))
984 inherited_modifiers |= TYPE_ENDIANNESS(symptr->flags);
987 /* look for modifiers */
988 while (patptr < patend) {
993 modifier = TYPE_IS_SHRIEKING;
994 allowed = SHRIEKING_ALLOWED_TYPES;
996 #ifdef PERL_PACK_CAN_BYTEORDER
998 modifier = TYPE_IS_BIG_ENDIAN;
999 allowed = ENDIANNESS_ALLOWED_TYPES;
1002 modifier = TYPE_IS_LITTLE_ENDIAN;
1003 allowed = ENDIANNESS_ALLOWED_TYPES;
1005 #endif /* PERL_PACK_CAN_BYTEORDER */
1015 if (!strchr(allowed, TYPE_NO_MODIFIERS(code)))
1016 Perl_croak(aTHX_ "'%c' allowed only after types %s in %s", *patptr,
1017 allowed, _action( symptr ) );
1019 if (TYPE_ENDIANNESS(code | modifier) == TYPE_ENDIANNESS_MASK)
1020 Perl_croak(aTHX_ "Can't use both '<' and '>' after type '%c' in %s",
1021 (int) TYPE_NO_MODIFIERS(code), _action( symptr ) );
1022 else if (TYPE_ENDIANNESS(code | modifier | inherited_modifiers) ==
1023 TYPE_ENDIANNESS_MASK)
1024 Perl_croak(aTHX_ "Can't use '%c' in a group with different byte-order in %s",
1025 *patptr, _action( symptr ) );
1027 if ((code & modifier) && ckWARN(WARN_UNPACK)) {
1028 Perl_warner(aTHX_ packWARN(WARN_UNPACK),
1029 "Duplicate modifier '%c' after '%c' in %s",
1030 *patptr, (int) TYPE_NO_MODIFIERS(code),
1031 _action( symptr ) );
1038 /* inherit modifiers */
1039 code |= inherited_modifiers;
1041 /* look for count and/or / */
1042 if (patptr < patend) {
1043 if (isDIGIT(*patptr)) {
1044 patptr = get_num( patptr, &symptr->length );
1045 symptr->howlen = e_number;
1047 } else if (*patptr == '*') {
1049 symptr->howlen = e_star;
1051 } else if (*patptr == '[') {
1052 const char* lenptr = ++patptr;
1053 symptr->howlen = e_number;
1054 patptr = group_end( patptr, patend, ']' ) + 1;
1055 /* what kind of [] is it? */
1056 if (isDIGIT(*lenptr)) {
1057 lenptr = get_num( lenptr, &symptr->length );
1058 if( *lenptr != ']' )
1059 Perl_croak(aTHX_ "Malformed integer in [] in %s",
1060 _action( symptr ) );
1062 tempsym_t savsym = *symptr;
1063 symptr->patend = patptr-1;
1064 symptr->patptr = lenptr;
1065 savsym.length = measure_struct(symptr);
1069 symptr->howlen = e_no_len;
1074 while (patptr < patend) {
1075 if (isSPACE(*patptr))
1077 else if (*patptr == '#') {
1079 while (patptr < patend && *patptr != '\n')
1081 if (patptr < patend)
1084 if (*patptr == '/') {
1085 symptr->flags |= FLAG_SLASH;
1087 if (patptr < patend &&
1088 (isDIGIT(*patptr) || *patptr == '*' || *patptr == '['))
1089 Perl_croak(aTHX_ "'/' does not take a repeat count in %s",
1090 _action( symptr ) );
1096 /* at end - no count, no / */
1097 symptr->howlen = e_no_len;
1101 symptr->code = code;
1102 symptr->patptr = patptr;
1106 symptr->patptr = patptr;
1111 There is no way to cleanly handle the case where we should process the
1112 string per byte in its upgraded form while it's really in downgraded form
1113 (e.g. estimates like strend-s as an upper bound for the number of
1114 characters left wouldn't work). So if we foresee the need of this
1115 (pattern starts with U or contains U0), we want to work on the encoded
1116 version of the string. Users are advised to upgrade their pack string
1117 themselves if they need to do a lot of unpacks like this on it
1120 need_utf8(const char *pat, const char *patend)
1123 while (pat < patend) {
1124 if (pat[0] == '#') {
1126 pat = (const char *) memchr(pat, '\n', patend-pat);
1127 if (!pat) return FALSE;
1128 } else if (pat[0] == 'U') {
1129 if (first || pat[1] == '0') return TRUE;
1130 } else first = FALSE;
1137 first_symbol(const char *pat, const char *patend) {
1138 while (pat < patend) {
1139 if (pat[0] != '#') return pat[0];
1141 pat = (const char *) memchr(pat, '\n', patend-pat);
1149 =for apidoc unpackstring
1151 The engine implementing unpack() Perl function. C<unpackstring> puts the
1152 extracted list items on the stack and returns the number of elements.
1153 Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
1158 Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags)
1162 if (flags & FLAG_DO_UTF8) flags |= FLAG_WAS_UTF8;
1163 else if (need_utf8(pat, patend)) {
1164 /* We probably should try to avoid this in case a scalar context call
1165 wouldn't get to the "U0" */
1166 STRLEN len = strend - s;
1167 s = (char *) bytes_to_utf8((U8 *) s, &len);
1170 flags |= FLAG_DO_UTF8;
1173 if (first_symbol(pat, patend) != 'U' && (flags & FLAG_DO_UTF8))
1174 flags |= FLAG_PARSE_UTF8;
1176 TEMPSYM_INIT(&sym, pat, patend, flags);
1178 return unpack_rec(&sym, s, s, strend, NULL );
1182 S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const char *strend, const char **new_s )
1186 const I32 start_sp_offset = SP - PL_stack_base;
1192 const int bits_in_uv = CHAR_BIT * sizeof(cuv);
1193 bool beyond = FALSE;
1194 bool explicit_length;
1195 const bool unpack_only_one = (symptr->flags & FLAG_UNPACK_ONLY_ONE) != 0;
1196 bool utf8 = (symptr->flags & FLAG_PARSE_UTF8) ? 1 : 0;
1197 symptr->strbeg = s - strbeg;
1199 while (next_symbol(symptr)) {
1202 I32 datumtype = symptr->code;
1203 /* do first one only unless in list context
1204 / is implemented by unpacking the count, then popping it from the
1205 stack, so must check that we're not in the middle of a / */
1206 if ( unpack_only_one
1207 && (SP - PL_stack_base == start_sp_offset + 1)
1208 && (datumtype != '/') ) /* XXX can this be omitted */
1211 switch (howlen = symptr->howlen) {
1213 len = strend - strbeg; /* long enough */
1216 /* e_no_len and e_number */
1217 len = symptr->length;
1221 explicit_length = TRUE;
1223 beyond = s >= strend;
1225 props = packprops[TYPE_NO_ENDIANNESS(datumtype)];
1227 /* props nonzero means we can process this letter. */
1228 const long size = props & PACK_SIZE_MASK;
1229 const long howmany = (strend - s) / size;
1233 if (!checksum || (props & PACK_SIZE_CANNOT_CSUM)) {
1234 if (len && unpack_only_one) len = 1;
1240 switch(TYPE_NO_ENDIANNESS(datumtype)) {
1242 Perl_croak(aTHX_ "Invalid type '%c' in unpack", (int)TYPE_NO_MODIFIERS(datumtype) );
1245 if (howlen == e_no_len)
1246 len = 16; /* len is not specified */
1254 tempsym_t savsym = *symptr;
1255 const U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags);
1256 symptr->flags |= group_modifiers;
1257 symptr->patend = savsym.grpend;
1258 symptr->previous = &savsym;
1261 if (len && unpack_only_one) len = 1;
1263 symptr->patptr = savsym.grpbeg;
1264 if (utf8) symptr->flags |= FLAG_PARSE_UTF8;
1265 else symptr->flags &= ~FLAG_PARSE_UTF8;
1266 unpack_rec(symptr, s, strbeg, strend, &s);
1267 if (s == strend && savsym.howlen == e_star)
1268 break; /* No way to continue */
1271 savsym.flags = symptr->flags & ~group_modifiers;
1275 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1276 case '.' | TYPE_IS_SHRIEKING:
1281 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1282 const bool u8 = utf8 && !(datumtype & TYPE_IS_SHRIEKING);
1283 #else /* PERL_PACK_CAN_SHRIEKSIGN */
1284 const bool u8 = utf8;
1286 if (howlen == e_star) from = strbeg;
1287 else if (len <= 0) from = s;
1289 tempsym_t *group = symptr;
1291 while (--len && group) group = group->previous;
1292 from = group ? strbeg + group->strbeg : strbeg;
1295 newSVuv( u8 ? (UV) utf8_length((const U8*)from, (const U8*)s) : (UV) (s-from)) :
1296 newSViv(-(u8 ? (IV) utf8_length((const U8*)s, (const U8*)from) : (IV) (from-s)));
1300 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1301 case '@' | TYPE_IS_SHRIEKING:
1304 s = strbeg + symptr->strbeg;
1305 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1306 if (utf8 && !(datumtype & TYPE_IS_SHRIEKING))
1307 #else /* PERL_PACK_CAN_SHRIEKSIGN */
1313 Perl_croak(aTHX_ "'@' outside of string in unpack");
1318 Perl_croak(aTHX_ "'@' outside of string with malformed UTF-8 in unpack");
1321 Perl_croak(aTHX_ "'@' outside of string in unpack");
1325 case 'X' | TYPE_IS_SHRIEKING:
1326 if (!len) /* Avoid division by 0 */
1329 const char *hop, *last;
1331 hop = last = strbeg;
1333 hop += UTF8SKIP(hop);
1340 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1344 len = (s - strbeg) % len;
1350 Perl_croak(aTHX_ "'X' outside of string in unpack");
1351 while (--s, UTF8_IS_CONTINUATION(*s)) {
1353 Perl_croak(aTHX_ "'X' outside of string in unpack");
1358 if (len > s - strbeg)
1359 Perl_croak(aTHX_ "'X' outside of string in unpack" );
1363 case 'x' | TYPE_IS_SHRIEKING: {
1365 if (!len) /* Avoid division by 0 */
1367 if (utf8) ai32 = utf8_length((U8 *) strbeg, (U8 *) s) % len;
1368 else ai32 = (s - strbeg) % len;
1369 if (ai32 == 0) break;
1377 Perl_croak(aTHX_ "'x' outside of string in unpack");
1382 if (len > strend - s)
1383 Perl_croak(aTHX_ "'x' outside of string in unpack");
1388 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
1394 /* Preliminary length estimate is assumed done in 'W' */
1395 if (len > strend - s) len = strend - s;
1401 for (l=len, hop=s; l>0; l--, hop += UTF8SKIP(hop)) {
1402 if (hop >= strend) {
1404 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1409 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1411 } else if (len > strend - s)
1414 if (datumtype == 'Z') {
1415 /* 'Z' strips stuff after first null */
1416 const char *ptr, *end;
1418 for (ptr = s; ptr < end; ptr++) if (*ptr == 0) break;
1419 sv = newSVpvn(s, ptr-s);
1420 if (howlen == e_star) /* exact for 'Z*' */
1421 len = ptr-s + (ptr != strend ? 1 : 0);
1422 } else if (datumtype == 'A') {
1423 /* 'A' strips both nulls and spaces */
1425 if (utf8 && (symptr->flags & FLAG_WAS_UTF8)) {
1426 for (ptr = s+len-1; ptr >= s; ptr--)
1427 if (*ptr != 0 && !UTF8_IS_CONTINUATION(*ptr) &&
1428 !is_utf8_space((U8 *) ptr)) break;
1429 if (ptr >= s) ptr += UTF8SKIP(ptr);
1432 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1434 for (ptr = s+len-1; ptr >= s; ptr--)
1435 if (*ptr != 0 && !isSPACE(*ptr)) break;
1438 sv = newSVpvn(s, ptr-s);
1439 } else sv = newSVpvn(s, len);
1443 /* Undo any upgrade done due to need_utf8() */
1444 if (!(symptr->flags & FLAG_WAS_UTF8))
1445 sv_utf8_downgrade(sv, 0);
1453 if (howlen == e_star || len > (strend - s) * 8)
1454 len = (strend - s) * 8;
1458 Newxz(PL_bitcount, 256, char);
1459 for (bits = 1; bits < 256; bits++) {
1460 if (bits & 1) PL_bitcount[bits]++;
1461 if (bits & 2) PL_bitcount[bits]++;
1462 if (bits & 4) PL_bitcount[bits]++;
1463 if (bits & 8) PL_bitcount[bits]++;
1464 if (bits & 16) PL_bitcount[bits]++;
1465 if (bits & 32) PL_bitcount[bits]++;
1466 if (bits & 64) PL_bitcount[bits]++;
1467 if (bits & 128) PL_bitcount[bits]++;
1471 while (len >= 8 && s < strend) {
1472 cuv += PL_bitcount[uni_to_byte(aTHX_ &s, strend, datumtype)];
1477 cuv += PL_bitcount[*(U8 *)s++];
1480 if (len && s < strend) {
1482 bits = SHIFT_BYTE(utf8, s, strend, datumtype);
1483 if (datumtype == 'b')
1485 if (bits & 1) cuv++;
1490 if (bits & 0x80) cuv++;
1497 sv = sv_2mortal(newSV(len ? len : 1));
1500 if (datumtype == 'b') {
1502 const I32 ai32 = len;
1503 for (len = 0; len < ai32; len++) {
1504 if (len & 7) bits >>= 1;
1506 if (s >= strend) break;
1507 bits = uni_to_byte(aTHX_ &s, strend, datumtype);
1508 } else bits = *(U8 *) s++;
1509 *str++ = bits & 1 ? '1' : '0';
1513 const I32 ai32 = len;
1514 for (len = 0; len < ai32; len++) {
1515 if (len & 7) bits <<= 1;
1517 if (s >= strend) break;
1518 bits = uni_to_byte(aTHX_ &s, strend, datumtype);
1519 } else bits = *(U8 *) s++;
1520 *str++ = bits & 0x80 ? '1' : '0';
1524 SvCUR_set(sv, str - SvPVX_const(sv));
1531 /* Preliminary length estimate, acceptable for utf8 too */
1532 if (howlen == e_star || len > (strend - s) * 2)
1533 len = (strend - s) * 2;
1534 sv = sv_2mortal(newSV(len ? len : 1));
1537 if (datumtype == 'h') {
1540 for (len = 0; len < ai32; len++) {
1541 if (len & 1) bits >>= 4;
1543 if (s >= strend) break;
1544 bits = uni_to_byte(aTHX_ &s, strend, datumtype);
1545 } else bits = * (U8 *) s++;
1546 *str++ = PL_hexdigit[bits & 15];
1550 const I32 ai32 = len;
1551 for (len = 0; len < ai32; len++) {
1552 if (len & 1) bits <<= 4;
1554 if (s >= strend) break;
1555 bits = uni_to_byte(aTHX_ &s, strend, datumtype);
1556 } else bits = *(U8 *) s++;
1557 *str++ = PL_hexdigit[(bits >> 4) & 15];
1561 SvCUR_set(sv, str - SvPVX_const(sv));
1567 if (explicit_length)
1568 /* Switch to "character" mode */
1569 utf8 = (symptr->flags & FLAG_DO_UTF8) ? 1 : 0;
1574 while (len-- > 0 && s < strend) {
1579 aint = utf8n_to_uvchr((U8 *) s, strend-s, &retlen,
1580 ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
1581 if (retlen == (STRLEN) -1 || retlen == 0)
1582 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1586 aint = *(U8 *)(s)++;
1587 if (aint >= 128 && datumtype != 'C') /* fake up signed chars */
1591 else if (checksum > bits_in_uv)
1592 cdouble += (NV)aint;
1600 while (len-- > 0 && s < strend) {
1602 const UV val = utf8n_to_uvchr((U8 *) s, strend-s, &retlen,
1603 ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
1604 if (retlen == (STRLEN) -1 || retlen == 0)
1605 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1609 else if (checksum > bits_in_uv)
1610 cdouble += (NV) val;
1614 } else if (!checksum)
1616 const U8 ch = *(U8 *) s++;
1619 else if (checksum > bits_in_uv)
1620 while (len-- > 0) cdouble += (NV) *(U8 *) s++;
1622 while (len-- > 0) cuv += *(U8 *) s++;
1626 if (explicit_length) {
1627 /* Switch to "bytes in UTF-8" mode */
1628 if (symptr->flags & FLAG_DO_UTF8) utf8 = 0;
1630 /* Should be impossible due to the need_utf8() test */
1631 Perl_croak(aTHX_ "U0 mode on a byte string");
1635 if (len > strend - s) len = strend - s;
1637 if (len && unpack_only_one) len = 1;
1641 while (len-- > 0 && s < strend) {
1645 U8 result[UTF8_MAXLEN];
1646 const char *ptr = s;
1648 /* Bug: warns about bad utf8 even if we are short on bytes
1649 and will break out of the loop */
1650 if (!uni_to_bytes(aTHX_ &ptr, strend, (char *) result, 1,
1653 len = UTF8SKIP(result);
1654 if (!uni_to_bytes(aTHX_ &ptr, strend,
1655 (char *) &result[1], len-1, 'U')) break;
1656 auv = utf8n_to_uvuni(result, len, &retlen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV);
1659 auv = utf8n_to_uvuni((U8*)s, strend - s, &retlen, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANYUV);
1660 if (retlen == (STRLEN) -1 || retlen == 0)
1661 Perl_croak(aTHX_ "Malformed UTF-8 string in unpack");
1666 else if (checksum > bits_in_uv)
1667 cdouble += (NV) auv;
1672 case 's' | TYPE_IS_SHRIEKING:
1673 #if SHORTSIZE != SIZE16
1676 SHIFT_VAR(utf8, s, strend, ashort, datumtype);
1677 DO_BO_UNPACK(ashort, s);
1680 else if (checksum > bits_in_uv)
1681 cdouble += (NV)ashort;
1693 #if U16SIZE > SIZE16
1696 SHIFT16(utf8, s, strend, &ai16, datumtype);
1697 DO_BO_UNPACK(ai16, 16);
1698 #if U16SIZE > SIZE16
1704 else if (checksum > bits_in_uv)
1705 cdouble += (NV)ai16;
1710 case 'S' | TYPE_IS_SHRIEKING:
1711 #if SHORTSIZE != SIZE16
1713 unsigned short aushort;
1714 SHIFT_VAR(utf8, s, strend, aushort, datumtype);
1715 DO_BO_UNPACK(aushort, s);
1718 else if (checksum > bits_in_uv)
1719 cdouble += (NV)aushort;
1732 #if U16SIZE > SIZE16
1735 SHIFT16(utf8, s, strend, &au16, datumtype);
1736 DO_BO_UNPACK(au16, 16);
1738 if (datumtype == 'n')
1739 au16 = PerlSock_ntohs(au16);
1742 if (datumtype == 'v')
1747 else if (checksum > bits_in_uv)
1748 cdouble += (NV) au16;
1753 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1754 case 'v' | TYPE_IS_SHRIEKING:
1755 case 'n' | TYPE_IS_SHRIEKING:
1758 # if U16SIZE > SIZE16
1761 SHIFT16(utf8, s, strend, &ai16, datumtype);
1763 if (datumtype == ('n' | TYPE_IS_SHRIEKING))
1764 ai16 = (I16) PerlSock_ntohs((U16) ai16);
1765 # endif /* HAS_NTOHS */
1767 if (datumtype == ('v' | TYPE_IS_SHRIEKING))
1768 ai16 = (I16) vtohs((U16) ai16);
1769 # endif /* HAS_VTOHS */
1772 else if (checksum > bits_in_uv)
1773 cdouble += (NV) ai16;
1778 #endif /* PERL_PACK_CAN_SHRIEKSIGN */
1780 case 'i' | TYPE_IS_SHRIEKING:
1783 SHIFT_VAR(utf8, s, strend, aint, datumtype);
1784 DO_BO_UNPACK(aint, i);
1787 else if (checksum > bits_in_uv)
1788 cdouble += (NV)aint;
1794 case 'I' | TYPE_IS_SHRIEKING:
1797 SHIFT_VAR(utf8, s, strend, auint, datumtype);
1798 DO_BO_UNPACK(auint, i);
1801 else if (checksum > bits_in_uv)
1802 cdouble += (NV)auint;
1810 SHIFT_VAR(utf8, s, strend, aiv, datumtype);
1811 #if IVSIZE == INTSIZE
1812 DO_BO_UNPACK(aiv, i);
1813 #elif IVSIZE == LONGSIZE
1814 DO_BO_UNPACK(aiv, l);
1815 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1816 DO_BO_UNPACK(aiv, 64);
1818 Perl_croak(aTHX_ "'j' not supported on this platform");
1822 else if (checksum > bits_in_uv)
1831 SHIFT_VAR(utf8, s, strend, auv, datumtype);
1832 #if IVSIZE == INTSIZE
1833 DO_BO_UNPACK(auv, i);
1834 #elif IVSIZE == LONGSIZE
1835 DO_BO_UNPACK(auv, l);
1836 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
1837 DO_BO_UNPACK(auv, 64);
1839 Perl_croak(aTHX_ "'J' not supported on this platform");
1843 else if (checksum > bits_in_uv)
1849 case 'l' | TYPE_IS_SHRIEKING:
1850 #if LONGSIZE != SIZE32
1853 SHIFT_VAR(utf8, s, strend, along, datumtype);
1854 DO_BO_UNPACK(along, l);
1857 else if (checksum > bits_in_uv)
1858 cdouble += (NV)along;
1869 #if U32SIZE > SIZE32
1872 SHIFT32(utf8, s, strend, &ai32, datumtype);
1873 DO_BO_UNPACK(ai32, 32);
1874 #if U32SIZE > SIZE32
1875 if (ai32 > 2147483647) ai32 -= 4294967296;
1879 else if (checksum > bits_in_uv)
1880 cdouble += (NV)ai32;
1885 case 'L' | TYPE_IS_SHRIEKING:
1886 #if LONGSIZE != SIZE32
1888 unsigned long aulong;
1889 SHIFT_VAR(utf8, s, strend, aulong, datumtype);
1890 DO_BO_UNPACK(aulong, l);
1893 else if (checksum > bits_in_uv)
1894 cdouble += (NV)aulong;
1907 #if U32SIZE > SIZE32
1910 SHIFT32(utf8, s, strend, &au32, datumtype);
1911 DO_BO_UNPACK(au32, 32);
1913 if (datumtype == 'N')
1914 au32 = PerlSock_ntohl(au32);
1917 if (datumtype == 'V')
1922 else if (checksum > bits_in_uv)
1923 cdouble += (NV)au32;
1928 #ifdef PERL_PACK_CAN_SHRIEKSIGN
1929 case 'V' | TYPE_IS_SHRIEKING:
1930 case 'N' | TYPE_IS_SHRIEKING:
1933 # if U32SIZE > SIZE32
1936 SHIFT32(utf8, s, strend, &ai32, datumtype);
1938 if (datumtype == ('N' | TYPE_IS_SHRIEKING))
1939 ai32 = (I32)PerlSock_ntohl((U32)ai32);
1942 if (datumtype == ('V' | TYPE_IS_SHRIEKING))
1943 ai32 = (I32)vtohl((U32)ai32);
1947 else if (checksum > bits_in_uv)
1948 cdouble += (NV)ai32;
1953 #endif /* PERL_PACK_CAN_SHRIEKSIGN */
1957 SHIFT_VAR(utf8, s, strend, aptr, datumtype);
1958 DO_BO_UNPACK_PC(aptr);
1959 /* newSVpv generates undef if aptr is NULL */
1960 mPUSHs(newSVpv(aptr, 0));
1968 while (len > 0 && s < strend) {
1970 ch = SHIFT_BYTE(utf8, s, strend, datumtype);
1971 auv = (auv << 7) | (ch & 0x7f);
1972 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
1980 if (++bytes >= sizeof(UV)) { /* promote to string */
1983 sv = Perl_newSVpvf(aTHX_ "%.*"UVuf, (int)TYPE_DIGITS(UV), auv);
1984 while (s < strend) {
1985 ch = SHIFT_BYTE(utf8, s, strend, datumtype);
1986 sv = mul128(sv, (U8)(ch & 0x7f));
1992 t = SvPV_nolen_const(sv);
2001 if ((s >= strend) && bytes)
2002 Perl_croak(aTHX_ "Unterminated compressed integer in unpack");
2006 if (symptr->howlen == e_star)
2007 Perl_croak(aTHX_ "'P' must have an explicit size in unpack");
2009 if (s + sizeof(char*) <= strend) {
2011 SHIFT_VAR(utf8, s, strend, aptr, datumtype);
2012 DO_BO_UNPACK_PC(aptr);
2013 /* newSVpvn generates undef if aptr is NULL */
2014 PUSHs(newSVpvn_flags(aptr, len, SVs_TEMP));
2021 SHIFT_VAR(utf8, s, strend, aquad, datumtype);
2022 DO_BO_UNPACK(aquad, 64);
2024 mPUSHs(aquad >= IV_MIN && aquad <= IV_MAX ?
2025 newSViv((IV)aquad) : newSVnv((NV)aquad));
2026 else if (checksum > bits_in_uv)
2027 cdouble += (NV)aquad;
2035 SHIFT_VAR(utf8, s, strend, auquad, datumtype);
2036 DO_BO_UNPACK(auquad, 64);
2038 mPUSHs(auquad <= UV_MAX ?
2039 newSVuv((UV)auquad) : newSVnv((NV)auquad));
2040 else if (checksum > bits_in_uv)
2041 cdouble += (NV)auquad;
2046 #endif /* HAS_QUAD */
2047 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
2051 SHIFT_VAR(utf8, s, strend, afloat, datumtype);
2052 DO_BO_UNPACK_N(afloat, float);
2062 SHIFT_VAR(utf8, s, strend, adouble, datumtype);
2063 DO_BO_UNPACK_N(adouble, double);
2073 SHIFT_VAR(utf8, s, strend, anv, datumtype);
2074 DO_BO_UNPACK_N(anv, NV);
2081 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
2084 long double aldouble;
2085 SHIFT_VAR(utf8, s, strend, aldouble, datumtype);
2086 DO_BO_UNPACK_N(aldouble, long double);
2090 cdouble += aldouble;
2096 const STRLEN l = (STRLEN) (strend - s) * 3 / 4;
2097 sv = sv_2mortal(newSV(l));
2098 if (l) SvPOK_on(sv);
2101 while (next_uni_uu(aTHX_ &s, strend, &len)) {
2106 next_uni_uu(aTHX_ &s, strend, &a);
2107 next_uni_uu(aTHX_ &s, strend, &b);
2108 next_uni_uu(aTHX_ &s, strend, &c);
2109 next_uni_uu(aTHX_ &s, strend, &d);
2110 hunk[0] = (char)((a << 2) | (b >> 4));
2111 hunk[1] = (char)((b << 4) | (c >> 2));
2112 hunk[2] = (char)((c << 6) | d);
2113 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
2121 /* possible checksum byte */
2122 const char *skip = s+UTF8SKIP(s);
2123 if (skip < strend && *skip == '\n')
2129 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
2133 len = PL_uudmap[*(U8*)s++] & 077;
2135 if (s < strend && ISUUCHAR(*s))
2136 a = PL_uudmap[*(U8*)s++] & 077;
2139 if (s < strend && ISUUCHAR(*s))
2140 b = PL_uudmap[*(U8*)s++] & 077;
2143 if (s < strend && ISUUCHAR(*s))
2144 c = PL_uudmap[*(U8*)s++] & 077;
2147 if (s < strend && ISUUCHAR(*s))
2148 d = PL_uudmap[*(U8*)s++] & 077;
2151 hunk[0] = (char)((a << 2) | (b >> 4));
2152 hunk[1] = (char)((b << 4) | (c >> 2));
2153 hunk[2] = (char)((c << 6) | d);
2154 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
2159 else /* possible checksum byte */
2160 if (s + 1 < strend && s[1] == '\n')
2169 if (strchr("fFdD", TYPE_NO_MODIFIERS(datumtype)) ||
2170 (checksum > bits_in_uv &&
2171 strchr("cCsSiIlLnNUWvVqQjJ", TYPE_NO_MODIFIERS(datumtype))) ) {
2174 anv = (NV) (1 << (checksum & 15));
2175 while (checksum >= 16) {
2179 while (cdouble < 0.0)
2181 cdouble = Perl_modf(cdouble / anv, &trouble) * anv;
2182 sv = newSVnv(cdouble);
2185 if (checksum < bits_in_uv) {
2186 UV mask = ((UV)1 << checksum) - 1;
2195 if (symptr->flags & FLAG_SLASH){
2196 if (SP - PL_stack_base - start_sp_offset <= 0)
2197 Perl_croak(aTHX_ "'/' must follow a numeric type in unpack");
2198 if( next_symbol(symptr) ){
2199 if( symptr->howlen == e_number )
2200 Perl_croak(aTHX_ "Count after length/code in unpack" );
2202 /* ...end of char buffer then no decent length available */
2203 Perl_croak(aTHX_ "length/code after end of string in unpack" );
2205 /* take top of stack (hope it's numeric) */
2208 Perl_croak(aTHX_ "Negative '/' count in unpack" );
2211 Perl_croak(aTHX_ "Code missing after '/' in unpack" );
2213 datumtype = symptr->code;
2214 explicit_length = FALSE;
2222 return SP - PL_stack_base - start_sp_offset;
2230 I32 gimme = GIMME_V;
2233 const char *pat = SvPV_const(left, llen);
2234 const char *s = SvPV_const(right, rlen);
2235 const char *strend = s + rlen;
2236 const char *patend = pat + llen;
2240 cnt = unpackstring(pat, patend, s, strend,
2241 ((gimme == G_SCALAR) ? FLAG_UNPACK_ONLY_ONE : 0)
2242 | (DO_UTF8(right) ? FLAG_DO_UTF8 : 0));
2245 if ( !cnt && gimme == G_SCALAR )
2246 PUSHs(&PL_sv_undef);
2251 doencodes(U8 *h, const char *s, I32 len)
2253 *h++ = PL_uuemap[len];
2255 *h++ = PL_uuemap[(077 & (s[0] >> 2))];
2256 *h++ = PL_uuemap[(077 & (((s[0] << 4) & 060) | ((s[1] >> 4) & 017)))];
2257 *h++ = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
2258 *h++ = PL_uuemap[(077 & (s[2] & 077))];
2263 const char r = (len > 1 ? s[1] : '\0');
2264 *h++ = PL_uuemap[(077 & (s[0] >> 2))];
2265 *h++ = PL_uuemap[(077 & (((s[0] << 4) & 060) | ((r >> 4) & 017)))];
2266 *h++ = PL_uuemap[(077 & ((r << 2) & 074))];
2267 *h++ = PL_uuemap[0];
2274 S_is_an_int(pTHX_ const char *s, STRLEN l)
2276 SV *result = newSVpvn(s, l);
2277 char *const result_c = SvPV_nolen(result); /* convenience */
2278 char *out = result_c;
2288 SvREFCNT_dec(result);
2311 SvREFCNT_dec(result);
2317 SvCUR_set(result, out - result_c);
2321 /* pnum must be '\0' terminated */
2323 S_div128(pTHX_ SV *pnum, bool *done)
2326 char * const s = SvPV(pnum, len);
2332 const int i = m * 10 + (*t - '0');
2333 const int r = (i >> 7); /* r < 10 */
2341 SvCUR_set(pnum, (STRLEN) (t - s));
2346 =for apidoc packlist
2348 The engine implementing pack() Perl function.
2354 Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, register SV **beglist, SV **endlist )
2359 TEMPSYM_INIT(&sym, pat, patend, FLAG_PACK);
2361 /* We're going to do changes through SvPVX(cat). Make sure it's valid.
2362 Also make sure any UTF8 flag is loaded */
2363 SvPV_force_nolen(cat);
2365 sym.flags |= FLAG_PARSE_UTF8 | FLAG_DO_UTF8;
2367 (void)pack_rec( cat, &sym, beglist, endlist );
2370 /* like sv_utf8_upgrade, but also repoint the group start markers */
2372 marked_upgrade(pTHX_ SV *sv, tempsym_t *sym_ptr) {
2375 const char *from_ptr, *from_start, *from_end, **marks, **m;
2376 char *to_start, *to_ptr;
2378 if (SvUTF8(sv)) return;
2380 from_start = SvPVX_const(sv);
2381 from_end = from_start + SvCUR(sv);
2382 for (from_ptr = from_start; from_ptr < from_end; from_ptr++)
2383 if (!NATIVE_IS_INVARIANT(*from_ptr)) break;
2384 if (from_ptr == from_end) {
2385 /* Simple case: no character needs to be changed */
2390 len = (from_end-from_ptr)*UTF8_EXPAND+(from_ptr-from_start)+1;
2391 Newx(to_start, len, char);
2392 Copy(from_start, to_start, from_ptr-from_start, char);
2393 to_ptr = to_start + (from_ptr-from_start);
2395 Newx(marks, sym_ptr->level+2, const char *);
2396 for (group=sym_ptr; group; group = group->previous)
2397 marks[group->level] = from_start + group->strbeg;
2398 marks[sym_ptr->level+1] = from_end+1;
2399 for (m = marks; *m < from_ptr; m++)
2400 *m = to_start + (*m-from_start);
2402 for (;from_ptr < from_end; from_ptr++) {
2403 while (*m == from_ptr) *m++ = to_ptr;
2404 to_ptr = (char *) uvchr_to_utf8((U8 *) to_ptr, *(U8 *) from_ptr);
2408 while (*m == from_ptr) *m++ = to_ptr;
2409 if (m != marks + sym_ptr->level+1) {
2412 Perl_croak(aTHX_ "Assertion: marks beyond string end");
2414 for (group=sym_ptr; group; group = group->previous)
2415 group->strbeg = marks[group->level] - to_start;
2420 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
2421 from_start -= SvIVX(sv);
2424 SvFLAGS(sv) &= ~SVf_OOK;
2427 Safefree(from_start);
2428 SvPV_set(sv, to_start);
2429 SvCUR_set(sv, to_ptr - to_start);
2434 /* Exponential string grower. Makes string extension effectively O(n)
2435 needed says how many extra bytes we need (not counting the final '\0')
2436 Only grows the string if there is an actual lack of space
2439 S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed) {
2440 const STRLEN cur = SvCUR(sv);
2441 const STRLEN len = SvLEN(sv);
2443 if (len - cur > needed) return SvPVX(sv);
2444 extend = needed > len ? needed : len;
2445 return SvGROW(sv, len+extend+1);
2450 S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist )
2453 tempsym_t lookahead;
2454 I32 items = endlist - beglist;
2455 bool found = next_symbol(symptr);
2456 bool utf8 = (symptr->flags & FLAG_PARSE_UTF8) ? 1 : 0;
2457 bool warn_utf8 = ckWARN(WARN_UTF8);
2459 if (symptr->level == 0 && found && symptr->code == 'U') {
2460 marked_upgrade(aTHX_ cat, symptr);
2461 symptr->flags |= FLAG_DO_UTF8;
2464 symptr->strbeg = SvCUR(cat);
2470 SV *lengthcode = NULL;
2471 I32 datumtype = symptr->code;
2472 howlen_t howlen = symptr->howlen;
2473 char *start = SvPVX(cat);
2474 char *cur = start + SvCUR(cat);
2476 #define NEXTFROM (lengthcode ? lengthcode : items-- > 0 ? *beglist++ : &PL_sv_no)
2480 len = strchr("@Xxu", TYPE_NO_MODIFIERS(datumtype)) ?
2484 /* e_no_len and e_number */
2485 len = symptr->length;
2490 packprops_t props = packprops[TYPE_NO_ENDIANNESS(datumtype)];
2492 if (props && !(props & PACK_SIZE_UNPREDICTABLE)) {
2493 /* We can process this letter. */
2494 STRLEN size = props & PACK_SIZE_MASK;
2495 GROWING(utf8, cat, start, cur, (STRLEN) len * size);
2499 /* Look ahead for next symbol. Do we have code/code? */
2500 lookahead = *symptr;
2501 found = next_symbol(&lookahead);
2502 if (symptr->flags & FLAG_SLASH) {
2504 if (!found) Perl_croak(aTHX_ "Code missing after '/' in pack");
2505 if (strchr("aAZ", lookahead.code)) {
2506 if (lookahead.howlen == e_number) count = lookahead.length;
2509 if (SvGAMAGIC(*beglist)) {
2510 /* Avoid reading the active data more than once
2511 by copying it to a temporary. */
2513 const char *const pv = SvPV_const(*beglist, len);
2515 = newSVpvn_flags(pv, len,
2516 SVs_TEMP | SvUTF8(*beglist));
2519 count = DO_UTF8(*beglist) ?
2520 sv_len_utf8(*beglist) : sv_len(*beglist);
2523 if (lookahead.code == 'Z') count++;
2526 if (lookahead.howlen == e_number && lookahead.length < items)
2527 count = lookahead.length;
2530 lookahead.howlen = e_number;
2531 lookahead.length = count;
2532 lengthcode = sv_2mortal(newSViv(count));
2535 /* Code inside the switch must take care to properly update
2536 cat (CUR length and '\0' termination) if it updated *cur and
2537 doesn't simply leave using break */
2538 switch(TYPE_NO_ENDIANNESS(datumtype)) {
2540 Perl_croak(aTHX_ "Invalid type '%c' in pack",
2541 (int) TYPE_NO_MODIFIERS(datumtype));
2543 Perl_croak(aTHX_ "'%%' may not be used in pack");
2546 #ifdef PERL_PACK_CAN_SHRIEKSIGN
2547 case '.' | TYPE_IS_SHRIEKING:
2550 if (howlen == e_star) from = start;
2551 else if (len == 0) from = cur;
2553 tempsym_t *group = symptr;
2555 while (--len && group) group = group->previous;
2556 from = group ? start + group->strbeg : start;
2559 len = SvIV(fromstr);
2561 #ifdef PERL_PACK_CAN_SHRIEKSIGN
2562 case '@' | TYPE_IS_SHRIEKING:
2565 from = start + symptr->strbeg;
2567 #ifdef PERL_PACK_CAN_SHRIEKSIGN
2568 if (utf8 && !(datumtype & TYPE_IS_SHRIEKING))
2569 #else /* PERL_PACK_CAN_SHRIEKSIGN */
2573 while (len && from < cur) {
2574 from += UTF8SKIP(from);
2578 Perl_croak(aTHX_ "Malformed UTF-8 string in pack");
2580 /* Here we know from == cur */
2582 GROWING(0, cat, start, cur, len);
2583 Zero(cur, len, char);
2585 } else if (from < cur) {
2588 } else goto no_change;
2596 if (len > 0) goto grow;
2597 if (len == 0) goto no_change;
2604 tempsym_t savsym = *symptr;
2605 U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags);
2606 symptr->flags |= group_modifiers;
2607 symptr->patend = savsym.grpend;
2609 symptr->previous = &lookahead;
2612 if (utf8) symptr->flags |= FLAG_PARSE_UTF8;
2613 else symptr->flags &= ~FLAG_PARSE_UTF8;
2614 was_utf8 = SvUTF8(cat);
2615 symptr->patptr = savsym.grpbeg;
2616 beglist = pack_rec(cat, symptr, beglist, endlist);
2617 if (SvUTF8(cat) != was_utf8)
2618 /* This had better be an upgrade while in utf8==0 mode */
2621 if (savsym.howlen == e_star && beglist == endlist)
2622 break; /* No way to continue */
2624 items = endlist - beglist;
2625 lookahead.flags = symptr->flags & ~group_modifiers;
2628 case 'X' | TYPE_IS_SHRIEKING:
2629 if (!len) /* Avoid division by 0 */
2636 hop += UTF8SKIP(hop);
2643 Perl_croak(aTHX_ "Malformed UTF-8 string in pack");
2647 len = (cur-start) % len;
2651 if (len < 1) goto no_change;
2655 Perl_croak(aTHX_ "'%c' outside of string in pack",
2656 (int) TYPE_NO_MODIFIERS(datumtype));
2657 while (--cur, UTF8_IS_CONTINUATION(*cur)) {
2659 Perl_croak(aTHX_ "'%c' outside of string in pack",
2660 (int) TYPE_NO_MODIFIERS(datumtype));
2666 if (cur - start < len)
2667 Perl_croak(aTHX_ "'%c' outside of string in pack",
2668 (int) TYPE_NO_MODIFIERS(datumtype));
2671 if (cur < start+symptr->strbeg) {
2672 /* Make sure group starts don't point into the void */
2674 const STRLEN length = cur-start;
2675 for (group = symptr;
2676 group && length < group->strbeg;
2677 group = group->previous) group->strbeg = length;
2678 lookahead.strbeg = length;
2681 case 'x' | TYPE_IS_SHRIEKING: {
2683 if (!len) /* Avoid division by 0 */
2685 if (utf8) ai32 = utf8_length((U8 *) start, (U8 *) cur) % len;
2686 else ai32 = (cur - start) % len;
2687 if (ai32 == 0) goto no_change;
2699 aptr = SvPV_const(fromstr, fromlen);
2700 if (DO_UTF8(fromstr)) {
2701 const char *end, *s;
2703 if (!utf8 && !SvUTF8(cat)) {
2704 marked_upgrade(aTHX_ cat, symptr);
2705 lookahead.flags |= FLAG_DO_UTF8;
2706 lookahead.strbeg = symptr->strbeg;
2709 cur = start + SvCUR(cat);
2711 if (howlen == e_star) {
2712 if (utf8) goto string_copy;
2716 end = aptr + fromlen;
2717 fromlen = datumtype == 'Z' ? len-1 : len;
2718 while ((I32) fromlen > 0 && s < end) {
2723 Perl_croak(aTHX_ "Malformed UTF-8 string in pack");
2726 if (datumtype == 'Z') len++;
2732 fromlen = len - fromlen;
2733 if (datumtype == 'Z') fromlen--;
2734 if (howlen == e_star) {
2736 if (datumtype == 'Z') len++;
2738 GROWING(0, cat, start, cur, len);
2739 if (!uni_to_bytes(aTHX_ &aptr, end, cur, fromlen,
2740 datumtype | TYPE_IS_PACK))
2741 Perl_croak(aTHX_ "Perl bug: predicted utf8 length not available");
2745 if (howlen == e_star) {
2747 if (datumtype == 'Z') len++;
2749 if (len <= (I32) fromlen) {
2751 if (datumtype == 'Z' && fromlen > 0) fromlen--;
2753 /* assumes a byte expands to at most UTF8_EXPAND bytes on
2755 expected_length <= from_len*UTF8_EXPAND + (len-from_len) */
2756 GROWING(0, cat, start, cur, fromlen*(UTF8_EXPAND-1)+len);
2758 while (fromlen > 0) {
2759 cur = (char *) uvchr_to_utf8((U8 *) cur, * (U8 *) aptr);
2765 if (howlen == e_star) {
2767 if (datumtype == 'Z') len++;
2769 if (len <= (I32) fromlen) {
2771 if (datumtype == 'Z' && fromlen > 0) fromlen--;
2773 GROWING(0, cat, start, cur, len);
2774 Copy(aptr, cur, fromlen, char);
2778 memset(cur, datumtype == 'A' ? ' ' : '\0', len);
2784 const char *str, *end;
2791 str = SvPV_const(fromstr, fromlen);
2792 end = str + fromlen;
2793 if (DO_UTF8(fromstr)) {
2795 utf8_flags = warn_utf8 ? 0 : UTF8_ALLOW_ANY;
2797 utf8_source = FALSE;
2798 utf8_flags = 0; /* Unused, but keep compilers happy */
2800 if (howlen == e_star) len = fromlen;
2801 field_len = (len+7)/8;
2802 GROWING(utf8, cat, start, cur, field_len);
2803 if (len > (I32)fromlen) len = fromlen;
2806 if (datumtype == 'B')
2810 NEXT_UNI_VAL(val, cur, str, end, utf8_flags);
2812 } else bits |= *str++ & 1;
2813 if (l & 7) bits <<= 1;
2815 PUSH_BYTE(utf8, cur, bits);
2820 /* datumtype == 'b' */
2824 NEXT_UNI_VAL(val, cur, str, end, utf8_flags);
2825 if (val & 1) bits |= 0x80;
2826 } else if (*str++ & 1)
2828 if (l & 7) bits >>= 1;
2830 PUSH_BYTE(utf8, cur, bits);
2836 if (datumtype == 'B')
2837 bits <<= 7 - (l & 7);
2839 bits >>= 7 - (l & 7);
2840 PUSH_BYTE(utf8, cur, bits);
2843 /* Determine how many chars are left in the requested field */
2845 if (howlen == e_star) field_len = 0;
2846 else field_len -= l;
2847 Zero(cur, field_len, char);
2853 const char *str, *end;
2860 str = SvPV_const(fromstr, fromlen);
2861 end = str + fromlen;
2862 if (DO_UTF8(fromstr)) {
2864 utf8_flags = warn_utf8 ? 0 : UTF8_ALLOW_ANY;
2866 utf8_source = FALSE;
2867 utf8_flags = 0; /* Unused, but keep compilers happy */
2869 if (howlen == e_star) len = fromlen;
2870 field_len = (len+1)/2;
2871 GROWING(utf8, cat, start, cur, field_len);
2872 if (!utf8 && len > (I32)fromlen) len = fromlen;
2875 if (datumtype == 'H')
2879 NEXT_UNI_VAL(val, cur, str, end, utf8_flags);
2880 if (val < 256 && isALPHA(val))
2881 bits |= (val + 9) & 0xf;
2884 } else if (isALPHA(*str))
2885 bits |= (*str++ + 9) & 0xf;
2887 bits |= *str++ & 0xf;
2888 if (l & 1) bits <<= 4;
2890 PUSH_BYTE(utf8, cur, bits);
2898 NEXT_UNI_VAL(val, cur, str, end, utf8_flags);
2899 if (val < 256 && isALPHA(val))
2900 bits |= ((val + 9) & 0xf) << 4;
2902 bits |= (val & 0xf) << 4;
2903 } else if (isALPHA(*str))
2904 bits |= ((*str++ + 9) & 0xf) << 4;
2906 bits |= (*str++ & 0xf) << 4;
2907 if (l & 1) bits >>= 4;
2909 PUSH_BYTE(utf8, cur, bits);
2915 PUSH_BYTE(utf8, cur, bits);
2918 /* Determine how many chars are left in the requested field */
2920 if (howlen == e_star) field_len = 0;
2921 else field_len -= l;
2922 Zero(cur, field_len, char);
2930 aiv = SvIV(fromstr);
2931 if ((-128 > aiv || aiv > 127) &&
2933 Perl_warner(aTHX_ packWARN(WARN_PACK),
2934 "Character in 'c' format wrapped in pack");
2935 PUSH_BYTE(utf8, cur, (U8)(aiv & 0xff));
2940 utf8 = (symptr->flags & FLAG_DO_UTF8) ? 1 : 0;
2946 aiv = SvIV(fromstr);
2947 if ((0 > aiv || aiv > 0xff) &&
2949 Perl_warner(aTHX_ packWARN(WARN_PACK),
2950 "Character in 'C' format wrapped in pack");
2951 PUSH_BYTE(utf8, cur, (U8)(aiv & 0xff));
2956 U8 in_bytes = (U8)IN_BYTES;
2958 end = start+SvLEN(cat)-1;
2959 if (utf8) end -= UTF8_MAXLEN-1;
2963 auv = SvUV(fromstr);
2964 if (in_bytes) auv = auv % 0x100;
2969 SvCUR_set(cat, cur - start);
2971 GROWING(0, cat, start, cur, len+UTF8_MAXLEN);
2972 end = start+SvLEN(cat)-UTF8_MAXLEN;
2974 cur = (char *) uvuni_to_utf8_flags((U8 *) cur,
2977 0 : UNICODE_ALLOW_ANY);
2982 SvCUR_set(cat, cur - start);
2983 marked_upgrade(aTHX_ cat, symptr);
2984 lookahead.flags |= FLAG_DO_UTF8;
2985 lookahead.strbeg = symptr->strbeg;
2988 cur = start + SvCUR(cat);
2989 end = start+SvLEN(cat)-UTF8_MAXLEN;
2992 if (ckWARN(WARN_PACK))
2993 Perl_warner(aTHX_ packWARN(WARN_PACK),
2994 "Character in 'W' format wrapped in pack");
2999 SvCUR_set(cat, cur - start);
3000 GROWING(0, cat, start, cur, len+1);
3001 end = start+SvLEN(cat)-1;
3003 *(U8 *) cur++ = (U8)auv;
3012 if (!(symptr->flags & FLAG_DO_UTF8)) {
3013 marked_upgrade(aTHX_ cat, symptr);
3014 lookahead.flags |= FLAG_DO_UTF8;
3015 lookahead.strbeg = symptr->strbeg;
3021 end = start+SvLEN(cat);
3022 if (!utf8) end -= UTF8_MAXLEN;
3026 auv = SvUV(fromstr);
3028 U8 buffer[UTF8_MAXLEN], *endb;
3029 endb = uvuni_to_utf8_flags(buffer, auv,
3031 0 : UNICODE_ALLOW_ANY);
3032 if (cur+(endb-buffer)*UTF8_EXPAND >= end) {
3034 SvCUR_set(cat, cur - start);
3035 GROWING(0, cat, start, cur,
3036 len+(endb-buffer)*UTF8_EXPAND);
3037 end = start+SvLEN(cat);
3039 cur = bytes_to_uni(buffer, endb-buffer, cur);
3043 SvCUR_set(cat, cur - start);
3044 GROWING(0, cat, start, cur, len+UTF8_MAXLEN);
3045 end = start+SvLEN(cat)-UTF8_MAXLEN;
3047 cur = (char *) uvuni_to_utf8_flags((U8 *) cur, auv,
3049 0 : UNICODE_ALLOW_ANY);
3054 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
3060 anv = SvNV(fromstr);
3062 /* VOS does not automatically map a floating-point overflow
3063 during conversion from double to float into infinity, so we
3064 do it by hand. This code should either be generalized for
3065 any OS that needs it, or removed if and when VOS implements
3066 posix-976 (suggestion to support mapping to infinity).
3067 Paul.Green@stratus.com 02-04-02. */
3069 extern const float _float_constants[];
3071 afloat = _float_constants[0]; /* single prec. inf. */
3072 else if (anv < -FLT_MAX)
3073 afloat = _float_constants[0]; /* single prec. inf. */
3074 else afloat = (float) anv;
3077 # if defined(VMS) && !defined(__IEEE_FP)
3078 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
3079 * on Alpha; fake it if we don't have them.
3083 else if (anv < -FLT_MAX)
3085 else afloat = (float)anv;
3087 afloat = (float)anv;
3089 #endif /* __VOS__ */
3090 DO_BO_PACK_N(afloat, float);
3091 PUSH_VAR(utf8, cur, afloat);
3099 anv = SvNV(fromstr);
3101 /* VOS does not automatically map a floating-point overflow
3102 during conversion from long double to double into infinity,
3103 so we do it by hand. This code should either be generalized
3104 for any OS that needs it, or removed if and when VOS
3105 implements posix-976 (suggestion to support mapping to
3106 infinity). Paul.Green@stratus.com 02-04-02. */
3108 extern const double _double_constants[];
3110 adouble = _double_constants[0]; /* double prec. inf. */
3111 else if (anv < -DBL_MAX)
3112 adouble = _double_constants[0]; /* double prec. inf. */
3113 else adouble = (double) anv;
3116 # if defined(VMS) && !defined(__IEEE_FP)
3117 /* IEEE fp overflow shenanigans are unavailable on VAX and optional
3118 * on Alpha; fake it if we don't have them.
3122 else if (anv < -DBL_MAX)
3124 else adouble = (double)anv;
3126 adouble = (double)anv;
3128 #endif /* __VOS__ */
3129 DO_BO_PACK_N(adouble, double);
3130 PUSH_VAR(utf8, cur, adouble);
3135 Zero(&anv, 1, NV); /* can be long double with unused bits */
3138 anv = SvNV(fromstr);
3139 DO_BO_PACK_N(anv, NV);
3140 PUSH_VAR(utf8, cur, anv);
3144 #if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE)
3146 long double aldouble;
3147 /* long doubles can have unused bits, which may be nonzero */
3148 Zero(&aldouble, 1, long double);
3151 aldouble = (long double)SvNV(fromstr);
3152 DO_BO_PACK_N(aldouble, long double);
3153 PUSH_VAR(utf8, cur, aldouble);
3158 #ifdef PERL_PACK_CAN_SHRIEKSIGN
3159 case 'n' | TYPE_IS_SHRIEKING:
3165 ai16 = (I16)SvIV(fromstr);
3167 ai16 = PerlSock_htons(ai16);
3169 PUSH16(utf8, cur, &ai16);
3172 #ifdef PERL_PACK_CAN_SHRIEKSIGN
3173 case 'v' | TYPE_IS_SHRIEKING:
3179 ai16 = (I16)SvIV(fromstr);
3183 PUSH16(utf8, cur, &ai16);
3186 case 'S' | TYPE_IS_SHRIEKING:
3187 #if SHORTSIZE != SIZE16
3189 unsigned short aushort;
3191 aushort = SvUV(fromstr);
3192 DO_BO_PACK(aushort, s);
3193 PUSH_VAR(utf8, cur, aushort);
3203 au16 = (U16)SvUV(fromstr);
3204 DO_BO_PACK(au16, 16);
3205 PUSH16(utf8, cur, &au16);
3208 case 's' | TYPE_IS_SHRIEKING:
3209 #if SHORTSIZE != SIZE16
3213 ashort = SvIV(fromstr);
3214 DO_BO_PACK(ashort, s);
3215 PUSH_VAR(utf8, cur, ashort);
3225 ai16 = (I16)SvIV(fromstr);
3226 DO_BO_PACK(ai16, 16);
3227 PUSH16(utf8, cur, &ai16);
3231 case 'I' | TYPE_IS_SHRIEKING:
3235 auint = SvUV(fromstr);
3236 DO_BO_PACK(auint, i);
3237 PUSH_VAR(utf8, cur, auint);
3244 aiv = SvIV(fromstr);
3245 #if IVSIZE == INTSIZE
3247 #elif IVSIZE == LONGSIZE
3249 #elif defined(HAS_QUAD) && IVSIZE == U64SIZE
3250 DO_BO_PACK(aiv, 64);
3252 Perl_croak(aTHX_ "'j' not supported on this platform");
3254 PUSH_VAR(utf8, cur, aiv);
3261 auv = SvUV(fromstr);
3262 #if UVSIZE == INTSIZE
3264 #elif UVSIZE == LONGSIZE
3266 #elif defined(HAS_QUAD) && UVSIZE == U64SIZE
3267 DO_BO_PACK(auv, 64);
3269 Perl_croak(aTHX_ "'J' not supported on this platform");
3271 PUSH_VAR(utf8, cur, auv);
3278 anv = SvNV(fromstr);
3282 SvCUR_set(cat, cur - start);
3283 Perl_croak(aTHX_ "Cannot compress negative numbers in pack");
3286 /* 0xFFFFFFFFFFFFFFFF may cast to 18446744073709551616.0,
3287 which is == UV_MAX_P1. IOK is fine (instead of UV_only), as
3288 any negative IVs will have already been got by the croak()
3289 above. IOK is untrue for fractions, so we test them
3290 against UV_MAX_P1. */
3291 if (SvIOK(fromstr) || anv < UV_MAX_P1) {
3292 char buf[(sizeof(UV)*CHAR_BIT)/7+1];
3293 char *in = buf + sizeof(buf);
3294 UV auv = SvUV(fromstr);
3297 *--in = (char)((auv & 0x7f) | 0x80);
3300 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
3301 PUSH_GROWING_BYTES(utf8, cat, start, cur,
3302 in, (buf + sizeof(buf)) - in);
3303 } else if (SvPOKp(fromstr))
3305 else if (SvNOKp(fromstr)) {
3306 /* 10**NV_MAX_10_EXP is the largest power of 10
3307 so 10**(NV_MAX_10_EXP+1) is definately unrepresentable
3308 given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
3309 x = (NV_MAX_10_EXP+1) * log (10) / log (128)
3310 And with that many bytes only Inf can overflow.
3311 Some C compilers are strict about integral constant
3312 expressions so we conservatively divide by a slightly
3313 smaller integer instead of multiplying by the exact
3314 floating-point value.
3316 #ifdef NV_MAX_10_EXP
3317 /* char buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
3318 char buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
3320 /* char buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
3321 char buf[1 + (int)((308 + 1) / 2)]; /* valid C */
3323 char *in = buf + sizeof(buf);
3325 anv = Perl_floor(anv);
3327 const NV next = Perl_floor(anv / 128);
3328 if (in <= buf) /* this cannot happen ;-) */
3329 Perl_croak(aTHX_ "Cannot compress integer in pack");
3330 *--in = (unsigned char)(anv - (next * 128)) | 0x80;
3333 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
3334 PUSH_GROWING_BYTES(utf8, cat, start, cur,
3335 in, (buf + sizeof(buf)) - in);
3344 /* Copy string and check for compliance */
3345 from = SvPV_const(fromstr, len);
3346 if ((norm = is_an_int(from, len)) == NULL)
3347 Perl_croak(aTHX_ "Can only compress unsigned integers in pack");
3349 Newx(result, len, char);
3352 while (!done) *--in = div128(norm, &done) | 0x80;
3353 result[len - 1] &= 0x7F; /* clear continue bit */
3354 PUSH_GROWING_BYTES(utf8, cat, start, cur,
3355 in, (result + len) - in);
3357 SvREFCNT_dec(norm); /* free norm */
3362 case 'i' | TYPE_IS_SHRIEKING:
3366 aint = SvIV(fromstr);
3367 DO_BO_PACK(aint, i);
3368 PUSH_VAR(utf8, cur, aint);
3371 #ifdef PERL_PACK_CAN_SHRIEKSIGN
3372 case 'N' | TYPE_IS_SHRIEKING:
3378 au32 = SvUV(fromstr);
3380 au32 = PerlSock_htonl(au32);
3382 PUSH32(utf8, cur, &au32);
3385 #ifdef PERL_PACK_CAN_SHRIEKSIGN
3386 case 'V' | TYPE_IS_SHRIEKING:
3392 au32 = SvUV(fromstr);
3396 PUSH32(utf8, cur, &au32);
3399 case 'L' | TYPE_IS_SHRIEKING:
3400 #if LONGSIZE != SIZE32
3402 unsigned long aulong;
3404 aulong = SvUV(fromstr);
3405 DO_BO_PACK(aulong, l);
3406 PUSH_VAR(utf8, cur, aulong);
3416 au32 = SvUV(fromstr);
3417 DO_BO_PACK(au32, 32);
3418 PUSH32(utf8, cur, &au32);
3421 case 'l' | TYPE_IS_SHRIEKING:
3422 #if LONGSIZE != SIZE32
3426 along = SvIV(fromstr);
3427 DO_BO_PACK(along, l);
3428 PUSH_VAR(utf8, cur, along);
3438 ai32 = SvIV(fromstr);
3439 DO_BO_PACK(ai32, 32);
3440 PUSH32(utf8, cur, &ai32);
3448 auquad = (Uquad_t) SvUV(fromstr);
3449 DO_BO_PACK(auquad, 64);
3450 PUSH_VAR(utf8, cur, auquad);
3457 aquad = (Quad_t)SvIV(fromstr);
3458 DO_BO_PACK(aquad, 64);
3459 PUSH_VAR(utf8, cur, aquad);
3462 #endif /* HAS_QUAD */
3464 len = 1; /* assume SV is correct length */
3465 GROWING(utf8, cat, start, cur, sizeof(char *));
3472 SvGETMAGIC(fromstr);
3473 if (!SvOK(fromstr)) aptr = NULL;
3475 /* XXX better yet, could spirit away the string to
3476 * a safe spot and hang on to it until the result
3477 * of pack() (and all copies of the result) are
3480 if ((SvTEMP(fromstr) || (SvPADTMP(fromstr) &&
3481 !SvREADONLY(fromstr))) && ckWARN(WARN_PACK)) {
3482 Perl_warner(aTHX_ packWARN(WARN_PACK),
3483 "Attempt to pack pointer to temporary value");
3485 if (SvPOK(fromstr) || SvNIOK(fromstr))
3486 aptr = SvPV_nomg_const_nolen(fromstr);
3488 aptr = SvPV_force_flags_nolen(fromstr, 0);
3490 DO_BO_PACK_PC(aptr);
3491 PUSH_VAR(utf8, cur, aptr);
3495 const char *aptr, *aend;
3499 if (len <= 2) len = 45;
3500 else len = len / 3 * 3;
3502 if (ckWARN(WARN_PACK))
3503 Perl_warner(aTHX_ packWARN(WARN_PACK),
3504 "Field too wide in 'u' format in pack");
3507 aptr = SvPV_const(fromstr, fromlen);
3508 from_utf8 = DO_UTF8(fromstr);
3510 aend = aptr + fromlen;
3511 fromlen = sv_len_utf8(fromstr);
3512 } else aend = NULL; /* Unused, but keep compilers happy */
3513 GROWING(utf8, cat, start, cur, (fromlen+2) / 3 * 4 + (fromlen+len-1)/len * 2);
3514 while (fromlen > 0) {
3517 U8 hunk[1+63/3*4+1];
3519 if ((I32)fromlen > len)
3525 if (!uni_to_bytes(aTHX_ &aptr, aend, buffer, todo,
3526 'u' | TYPE_IS_PACK)) {
3528 SvCUR_set(cat, cur - start);
3529 Perl_croak(aTHX_ "Assertion: string is shorter than advertised");
3531 end = doencodes(hunk, buffer, todo);
3533 end = doencodes(hunk, aptr, todo);
3536 PUSH_BYTES(utf8, cur, hunk, end-hunk);
3543 SvCUR_set(cat, cur - start);
3545 *symptr = lookahead;
3554 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
3555 register SV *cat = TARG;
3557 SV *pat_sv = *++MARK;
3558 register const char *pat = SvPV_const(pat_sv, fromlen);
3559 register const char *patend = pat + fromlen;
3562 sv_setpvn(cat, "", 0);
3565 packlist(cat, pat, patend, MARK, SP + 1);
3575 * c-indentation-style: bsd
3577 * indent-tabs-mode: t
3580 * ex: set ts=8 sts=4 sw=4 noet: