xref: /openbsd-src/gnu/usr.bin/perl/util.c (revision 897fc685943471cf985a0fe38ba076ea6fe74fa5)
1 /*    util.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
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.
8  *
9  */
10 
11 /*
12  * 'Very useful, no doubt, that was to Saruman; yet it seems that he was
13  *  not content.'                                    --Gandalf to Pippin
14  *
15  *     [p.598 of _The Lord of the Rings_, III/xi: "The Palantír"]
16  */
17 
18 /* This file contains assorted utility routines.
19  * Which is a polite way of saying any stuff that people couldn't think of
20  * a better place for. Amongst other things, it includes the warning and
21  * dieing stuff, plus wrappers for malloc code.
22  */
23 
24 #include "EXTERN.h"
25 #define PERL_IN_UTIL_C
26 #include "perl.h"
27 #include "reentr.h"
28 
29 #if defined(USE_PERLIO)
30 #include "perliol.h" /* For PerlIOUnix_refcnt */
31 #endif
32 
33 #ifndef PERL_MICRO
34 #include <signal.h>
35 #ifndef SIG_ERR
36 # define SIG_ERR ((Sighandler_t) -1)
37 #endif
38 #endif
39 
40 #include <math.h>
41 #include <stdlib.h>
42 
43 #ifdef __Lynx__
44 /* Missing protos on LynxOS */
45 int putenv(char *);
46 #endif
47 
48 #ifdef __amigaos__
49 # include "amigaos4/amigaio.h"
50 #endif
51 
52 #ifdef HAS_SELECT
53 # ifdef I_SYS_SELECT
54 #  include <sys/select.h>
55 # endif
56 #endif
57 
58 #ifdef USE_C_BACKTRACE
59 #  ifdef I_BFD
60 #    define USE_BFD
61 #    ifdef PERL_DARWIN
62 #      undef USE_BFD /* BFD is useless in OS X. */
63 #    endif
64 #    ifdef USE_BFD
65 #      include <bfd.h>
66 #    endif
67 #  endif
68 #  ifdef I_DLFCN
69 #    include <dlfcn.h>
70 #  endif
71 #  ifdef I_EXECINFO
72 #    include <execinfo.h>
73 #  endif
74 #endif
75 
76 #ifdef PERL_DEBUG_READONLY_COW
77 # include <sys/mman.h>
78 #endif
79 
80 #define FLUSH
81 
82 /* NOTE:  Do not call the next three routines directly.  Use the macros
83  * in handy.h, so that we can easily redefine everything to do tracking of
84  * allocated hunks back to the original New to track down any memory leaks.
85  * XXX This advice seems to be widely ignored :-(   --AD  August 1996.
86  */
87 
88 #if defined (DEBUGGING) || defined(PERL_IMPLICIT_SYS) || defined (PERL_TRACK_MEMPOOL)
89 #  define ALWAYS_NEED_THX
90 #endif
91 
92 #if defined(PERL_TRACK_MEMPOOL) && defined(PERL_DEBUG_READONLY_COW)
93 static void
94 S_maybe_protect_rw(pTHX_ struct perl_memory_debug_header *header)
95 {
96     if (header->readonly
97      && mprotect(header, header->size, PROT_READ|PROT_WRITE))
98 	Perl_warn(aTHX_ "mprotect for COW string %p %lu failed with %d",
99 			 header, header->size, errno);
100 }
101 
102 static void
103 S_maybe_protect_ro(pTHX_ struct perl_memory_debug_header *header)
104 {
105     if (header->readonly
106      && mprotect(header, header->size, PROT_READ))
107 	Perl_warn(aTHX_ "mprotect RW for COW string %p %lu failed with %d",
108 			 header, header->size, errno);
109 }
110 # define maybe_protect_rw(foo) S_maybe_protect_rw(aTHX_ foo)
111 # define maybe_protect_ro(foo) S_maybe_protect_ro(aTHX_ foo)
112 #else
113 # define maybe_protect_rw(foo) NOOP
114 # define maybe_protect_ro(foo) NOOP
115 #endif
116 
117 #if defined(PERL_TRACK_MEMPOOL) || defined(PERL_DEBUG_READONLY_COW)
118  /* Use memory_debug_header */
119 # define USE_MDH
120 # if (defined(PERL_POISON) && defined(PERL_TRACK_MEMPOOL)) \
121    || defined(PERL_DEBUG_READONLY_COW)
122 #  define MDH_HAS_SIZE
123 # endif
124 #endif
125 
126 /* paranoid version of system's malloc() */
127 
128 Malloc_t
129 Perl_safesysmalloc(MEM_SIZE size)
130 {
131 #ifdef ALWAYS_NEED_THX
132     dTHX;
133 #endif
134     Malloc_t ptr;
135 
136 #ifdef USE_MDH
137     if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
138         goto out_of_memory;
139     size += PERL_MEMORY_DEBUG_HEADER_SIZE;
140 #endif
141 #ifdef DEBUGGING
142     if ((SSize_t)size < 0)
143 	Perl_croak_nocontext("panic: malloc, size=%"UVuf, (UV) size);
144 #endif
145     if (!size) size = 1;	/* malloc(0) is NASTY on our system */
146 #ifdef PERL_DEBUG_READONLY_COW
147     if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
148 		    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
149 	perror("mmap failed");
150 	abort();
151     }
152 #else
153     ptr = (Malloc_t)PerlMem_malloc(size?size:1);
154 #endif
155     PERL_ALLOC_CHECK(ptr);
156     if (ptr != NULL) {
157 #ifdef USE_MDH
158 	struct perl_memory_debug_header *const header
159 	    = (struct perl_memory_debug_header *)ptr;
160 #endif
161 
162 #ifdef PERL_POISON
163 	PoisonNew(((char *)ptr), size, char);
164 #endif
165 
166 #ifdef PERL_TRACK_MEMPOOL
167 	header->interpreter = aTHX;
168 	/* Link us into the list.  */
169 	header->prev = &PL_memory_debug_header;
170 	header->next = PL_memory_debug_header.next;
171 	PL_memory_debug_header.next = header;
172 	maybe_protect_rw(header->next);
173 	header->next->prev = header;
174 	maybe_protect_ro(header->next);
175 #  ifdef PERL_DEBUG_READONLY_COW
176 	header->readonly = 0;
177 #  endif
178 #endif
179 #ifdef MDH_HAS_SIZE
180 	header->size = size;
181 #endif
182 	ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
183 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
184 
185     }
186     else {
187 #ifdef USE_MDH
188       out_of_memory:
189 #endif
190         {
191 #ifndef ALWAYS_NEED_THX
192             dTHX;
193 #endif
194             if (PL_nomemok)
195                 ptr =  NULL;
196             else
197                 croak_no_mem();
198         }
199     }
200     return ptr;
201 }
202 
203 /* paranoid version of system's realloc() */
204 
205 Malloc_t
206 Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
207 {
208 #ifdef ALWAYS_NEED_THX
209     dTHX;
210 #endif
211     Malloc_t ptr;
212 #ifdef PERL_DEBUG_READONLY_COW
213     const MEM_SIZE oldsize = where
214 	? ((struct perl_memory_debug_header *)((char *)where - PERL_MEMORY_DEBUG_HEADER_SIZE))->size
215 	: 0;
216 #endif
217 #if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
218     Malloc_t PerlMem_realloc();
219 #endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
220 
221     if (!size) {
222 	safesysfree(where);
223 	ptr = NULL;
224     }
225     else if (!where) {
226 	ptr = safesysmalloc(size);
227     }
228     else {
229 #ifdef USE_MDH
230 	where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
231         if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size)
232             goto out_of_memory;
233 	size += PERL_MEMORY_DEBUG_HEADER_SIZE;
234 	{
235 	    struct perl_memory_debug_header *const header
236 		= (struct perl_memory_debug_header *)where;
237 
238 # ifdef PERL_TRACK_MEMPOOL
239 	    if (header->interpreter != aTHX) {
240 		Perl_croak_nocontext("panic: realloc from wrong pool, %p!=%p",
241 				     header->interpreter, aTHX);
242 	    }
243 	    assert(header->next->prev == header);
244 	    assert(header->prev->next == header);
245 #  ifdef PERL_POISON
246 	    if (header->size > size) {
247 		const MEM_SIZE freed_up = header->size - size;
248 		char *start_of_freed = ((char *)where) + size;
249 		PoisonFree(start_of_freed, freed_up, char);
250 	    }
251 #  endif
252 # endif
253 # ifdef MDH_HAS_SIZE
254 	    header->size = size;
255 # endif
256 	}
257 #endif
258 #ifdef DEBUGGING
259 	if ((SSize_t)size < 0)
260 	    Perl_croak_nocontext("panic: realloc, size=%"UVuf, (UV)size);
261 #endif
262 #ifdef PERL_DEBUG_READONLY_COW
263 	if ((ptr = mmap(0, size, PROT_READ|PROT_WRITE,
264 			MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
265 	    perror("mmap failed");
266 	    abort();
267 	}
268 	Copy(where,ptr,oldsize < size ? oldsize : size,char);
269 	if (munmap(where, oldsize)) {
270 	    perror("munmap failed");
271 	    abort();
272 	}
273 #else
274 	ptr = (Malloc_t)PerlMem_realloc(where,size);
275 #endif
276 	PERL_ALLOC_CHECK(ptr);
277 
278     /* MUST do this fixup first, before doing ANYTHING else, as anything else
279        might allocate memory/free/move memory, and until we do the fixup, it
280        may well be chasing (and writing to) free memory.  */
281 	if (ptr != NULL) {
282 #ifdef PERL_TRACK_MEMPOOL
283 	    struct perl_memory_debug_header *const header
284 		= (struct perl_memory_debug_header *)ptr;
285 
286 #  ifdef PERL_POISON
287 	    if (header->size < size) {
288 		const MEM_SIZE fresh = size - header->size;
289 		char *start_of_fresh = ((char *)ptr) + size;
290 		PoisonNew(start_of_fresh, fresh, char);
291 	    }
292 #  endif
293 
294 	    maybe_protect_rw(header->next);
295 	    header->next->prev = header;
296 	    maybe_protect_ro(header->next);
297 	    maybe_protect_rw(header->prev);
298 	    header->prev->next = header;
299 	    maybe_protect_ro(header->prev);
300 #endif
301 	    ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
302 	}
303 
304     /* In particular, must do that fixup above before logging anything via
305      *printf(), as it can reallocate memory, which can cause SEGVs.  */
306 
307 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
308 	DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
309 
310 	if (ptr == NULL) {
311 #ifdef USE_MDH
312           out_of_memory:
313 #endif
314             {
315 #ifndef ALWAYS_NEED_THX
316                 dTHX;
317 #endif
318                 if (PL_nomemok)
319                     ptr = NULL;
320                 else
321                     croak_no_mem();
322             }
323 	}
324     }
325     return ptr;
326 }
327 
328 /* safe version of system's free() */
329 
330 Free_t
331 Perl_safesysfree(Malloc_t where)
332 {
333 #ifdef ALWAYS_NEED_THX
334     dTHX;
335 #endif
336     DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
337     if (where) {
338 #ifdef USE_MDH
339 	Malloc_t where_intrn = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE);
340 	{
341 	    struct perl_memory_debug_header *const header
342 		= (struct perl_memory_debug_header *)where_intrn;
343 
344 # ifdef MDH_HAS_SIZE
345 	    const MEM_SIZE size = header->size;
346 # endif
347 # ifdef PERL_TRACK_MEMPOOL
348 	    if (header->interpreter != aTHX) {
349 		Perl_croak_nocontext("panic: free from wrong pool, %p!=%p",
350 				     header->interpreter, aTHX);
351 	    }
352 	    if (!header->prev) {
353 		Perl_croak_nocontext("panic: duplicate free");
354 	    }
355 	    if (!(header->next))
356 		Perl_croak_nocontext("panic: bad free, header->next==NULL");
357 	    if (header->next->prev != header || header->prev->next != header) {
358 		Perl_croak_nocontext("panic: bad free, ->next->prev=%p, "
359 				     "header=%p, ->prev->next=%p",
360 				     header->next->prev, header,
361 				     header->prev->next);
362 	    }
363 	    /* Unlink us from the chain.  */
364 	    maybe_protect_rw(header->next);
365 	    header->next->prev = header->prev;
366 	    maybe_protect_ro(header->next);
367 	    maybe_protect_rw(header->prev);
368 	    header->prev->next = header->next;
369 	    maybe_protect_ro(header->prev);
370 	    maybe_protect_rw(header);
371 #  ifdef PERL_POISON
372 	    PoisonNew(where_intrn, size, char);
373 #  endif
374 	    /* Trigger the duplicate free warning.  */
375 	    header->next = NULL;
376 # endif
377 # ifdef PERL_DEBUG_READONLY_COW
378 	    if (munmap(where_intrn, size)) {
379 		perror("munmap failed");
380 		abort();
381 	    }
382 # endif
383 	}
384 #else
385 	Malloc_t where_intrn = where;
386 #endif /* USE_MDH */
387 #ifndef PERL_DEBUG_READONLY_COW
388 	PerlMem_free(where_intrn);
389 #endif
390     }
391 }
392 
393 /* safe version of system's calloc() */
394 
395 Malloc_t
396 Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
397 {
398 #ifdef ALWAYS_NEED_THX
399     dTHX;
400 #endif
401     Malloc_t ptr;
402 #if defined(USE_MDH) || defined(DEBUGGING)
403     MEM_SIZE total_size = 0;
404 #endif
405 
406     /* Even though calloc() for zero bytes is strange, be robust. */
407     if (size && (count <= MEM_SIZE_MAX / size)) {
408 #if defined(USE_MDH) || defined(DEBUGGING)
409 	total_size = size * count;
410 #endif
411     }
412     else
413 	croak_memory_wrap();
414 #ifdef USE_MDH
415     if (PERL_MEMORY_DEBUG_HEADER_SIZE <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
416 	total_size += PERL_MEMORY_DEBUG_HEADER_SIZE;
417     else
418 	croak_memory_wrap();
419 #endif
420 #ifdef DEBUGGING
421     if ((SSize_t)size < 0 || (SSize_t)count < 0)
422 	Perl_croak_nocontext("panic: calloc, size=%"UVuf", count=%"UVuf,
423 			     (UV)size, (UV)count);
424 #endif
425 #ifdef PERL_DEBUG_READONLY_COW
426     if ((ptr = mmap(0, total_size ? total_size : 1, PROT_READ|PROT_WRITE,
427 		    MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
428 	perror("mmap failed");
429 	abort();
430     }
431 #elif defined(PERL_TRACK_MEMPOOL)
432     /* Have to use malloc() because we've added some space for our tracking
433        header.  */
434     /* malloc(0) is non-portable. */
435     ptr = (Malloc_t)PerlMem_malloc(total_size ? total_size : 1);
436 #else
437     /* Use calloc() because it might save a memset() if the memory is fresh
438        and clean from the OS.  */
439     if (count && size)
440 	ptr = (Malloc_t)PerlMem_calloc(count, size);
441     else /* calloc(0) is non-portable. */
442 	ptr = (Malloc_t)PerlMem_calloc(count ? count : 1, size ? size : 1);
443 #endif
444     PERL_ALLOC_CHECK(ptr);
445     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)total_size));
446     if (ptr != NULL) {
447 #ifdef USE_MDH
448 	{
449 	    struct perl_memory_debug_header *const header
450 		= (struct perl_memory_debug_header *)ptr;
451 
452 #  ifndef PERL_DEBUG_READONLY_COW
453 	    memset((void*)ptr, 0, total_size);
454 #  endif
455 #  ifdef PERL_TRACK_MEMPOOL
456 	    header->interpreter = aTHX;
457 	    /* Link us into the list.  */
458 	    header->prev = &PL_memory_debug_header;
459 	    header->next = PL_memory_debug_header.next;
460 	    PL_memory_debug_header.next = header;
461 	    maybe_protect_rw(header->next);
462 	    header->next->prev = header;
463 	    maybe_protect_ro(header->next);
464 #    ifdef PERL_DEBUG_READONLY_COW
465 	    header->readonly = 0;
466 #    endif
467 #  endif
468 #  ifdef MDH_HAS_SIZE
469 	    header->size = total_size;
470 #  endif
471 	    ptr = (Malloc_t)((char*)ptr+PERL_MEMORY_DEBUG_HEADER_SIZE);
472 	}
473 #endif
474 	return ptr;
475     }
476     else {
477 #ifndef ALWAYS_NEED_THX
478 	dTHX;
479 #endif
480 	if (PL_nomemok)
481 	    return NULL;
482 	croak_no_mem();
483     }
484 }
485 
486 /* These must be defined when not using Perl's malloc for binary
487  * compatibility */
488 
489 #ifndef MYMALLOC
490 
491 Malloc_t Perl_malloc (MEM_SIZE nbytes)
492 {
493 #ifdef PERL_IMPLICIT_SYS
494     dTHX;
495 #endif
496     return (Malloc_t)PerlMem_malloc(nbytes);
497 }
498 
499 Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
500 {
501 #ifdef PERL_IMPLICIT_SYS
502     dTHX;
503 #endif
504     return (Malloc_t)PerlMem_calloc(elements, size);
505 }
506 
507 Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
508 {
509 #ifdef PERL_IMPLICIT_SYS
510     dTHX;
511 #endif
512     return (Malloc_t)PerlMem_realloc(where, nbytes);
513 }
514 
515 Free_t   Perl_mfree (Malloc_t where)
516 {
517 #ifdef PERL_IMPLICIT_SYS
518     dTHX;
519 #endif
520     PerlMem_free(where);
521 }
522 
523 #endif
524 
525 /* copy a string up to some (non-backslashed) delimiter, if any */
526 
527 static char *
528 S_delimcpy(char *to, const char *toend, const char *from,
529 	   const char *fromend, int delim, I32 *retlen,
530 	   const bool allow_escape)
531 {
532     I32 tolen;
533 
534     PERL_ARGS_ASSERT_DELIMCPY;
535 
536     for (tolen = 0; from < fromend; from++, tolen++) {
537 	if (allow_escape && *from == '\\') {
538 	    if (from[1] != delim) {
539 		if (to < toend)
540 		    *to++ = *from;
541 		tolen++;
542 	    }
543 	    from++;
544 	}
545 	else if (*from == delim)
546 	    break;
547 	if (to < toend)
548 	    *to++ = *from;
549     }
550     if (to < toend)
551 	*to = '\0';
552     *retlen = tolen;
553     return (char *)from;
554 }
555 
556 char *
557 Perl_delimcpy(char *to, const char *toend, const char *from, const char *fromend, int delim, I32 *retlen)
558 {
559     PERL_ARGS_ASSERT_DELIMCPY;
560 
561     return S_delimcpy(to, toend, from, fromend, delim, retlen, 1);
562 }
563 
564 char *
565 Perl_delimcpy_no_escape(char *to, const char *toend, const char *from,
566 			const char *fromend, int delim, I32 *retlen)
567 {
568     PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE;
569 
570     return S_delimcpy(to, toend, from, fromend, delim, retlen, 0);
571 }
572 
573 /* return ptr to little string in big string, NULL if not found */
574 /* This routine was donated by Corey Satten. */
575 
576 char *
577 Perl_instr(const char *big, const char *little)
578 {
579 
580     PERL_ARGS_ASSERT_INSTR;
581 
582     return strstr((char*)big, (char*)little);
583 }
584 
585 /*
586 =head1 Miscellaneous Functions
587 
588 =for apidoc Am|char *|ninstr|char * big|char * bigend|char * little|char * little_end
589 
590 Find the first (leftmost) occurrence of a sequence of bytes within another
591 sequence.  This is the Perl version of C<strstr()>, extended to handle
592 arbitrary sequences, potentially containing embedded C<NUL> characters (C<NUL>
593 is what the initial C<n> in the function name stands for; some systems have an
594 equivalent, C<memmem()>, but with a somewhat different API).
595 
596 Another way of thinking about this function is finding a needle in a haystack.
597 C<big> points to the first byte in the haystack.  C<big_end> points to one byte
598 beyond the final byte in the haystack.  C<little> points to the first byte in
599 the needle.  C<little_end> points to one byte beyond the final byte in the
600 needle.  All the parameters must be non-C<NULL>.
601 
602 The function returns C<NULL> if there is no occurrence of C<little> within
603 C<big>.  If C<little> is the empty string, C<big> is returned.
604 
605 Because this function operates at the byte level, and because of the inherent
606 characteristics of UTF-8 (or UTF-EBCDIC), it will work properly if both the
607 needle and the haystack are strings with the same UTF-8ness, but not if the
608 UTF-8ness differs.
609 
610 =cut
611 
612 */
613 
614 char *
615 Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
616 {
617     PERL_ARGS_ASSERT_NINSTR;
618     if (little >= lend)
619         return (char*)big;
620     {
621         const char first = *little;
622         const char *s, *x;
623         bigend -= lend - little++;
624     OUTER:
625         while (big <= bigend) {
626             if (*big++ == first) {
627                 for (x=big,s=little; s < lend; x++,s++) {
628                     if (*s != *x)
629                         goto OUTER;
630                 }
631                 return (char*)(big-1);
632             }
633         }
634     }
635     return NULL;
636 }
637 
638 /*
639 =head1 Miscellaneous Functions
640 
641 =for apidoc Am|char *|rninstr|char * big|char * bigend|char * little|char * little_end
642 
643 Like C<L</ninstr>>, but instead finds the final (rightmost) occurrence of a
644 sequence of bytes within another sequence, returning C<NULL> if there is no
645 such occurrence.
646 
647 =cut
648 
649 */
650 
651 char *
652 Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend)
653 {
654     const char *bigbeg;
655     const I32 first = *little;
656     const char * const littleend = lend;
657 
658     PERL_ARGS_ASSERT_RNINSTR;
659 
660     if (little >= littleend)
661 	return (char*)bigend;
662     bigbeg = big;
663     big = bigend - (littleend - little++);
664     while (big >= bigbeg) {
665 	const char *s, *x;
666 	if (*big-- != first)
667 	    continue;
668 	for (x=big+2,s=little; s < littleend; /**/ ) {
669 	    if (*s != *x)
670 		break;
671 	    else {
672 		x++;
673 		s++;
674 	    }
675 	}
676 	if (s >= littleend)
677 	    return (char*)(big+1);
678     }
679     return NULL;
680 }
681 
682 /* As a space optimization, we do not compile tables for strings of length
683    0 and 1, and for strings of length 2 unless FBMcf_TAIL.  These are
684    special-cased in fbm_instr().
685 
686    If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
687 
688 /*
689 =head1 Miscellaneous Functions
690 
691 =for apidoc fbm_compile
692 
693 Analyses the string in order to make fast searches on it using C<fbm_instr()>
694 -- the Boyer-Moore algorithm.
695 
696 =cut
697 */
698 
699 void
700 Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
701 {
702     const U8 *s;
703     STRLEN i;
704     STRLEN len;
705     U32 frequency = 256;
706     MAGIC *mg;
707     PERL_DEB( STRLEN rarest = 0 );
708 
709     PERL_ARGS_ASSERT_FBM_COMPILE;
710 
711     if (isGV_with_GP(sv) || SvROK(sv))
712 	return;
713 
714     if (SvVALID(sv))
715 	return;
716 
717     if (flags & FBMcf_TAIL) {
718 	MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
719 	sv_catpvs(sv, "\n");		/* Taken into account in fbm_instr() */
720 	if (mg && mg->mg_len >= 0)
721 	    mg->mg_len++;
722     }
723     if (!SvPOK(sv) || SvNIOKp(sv))
724 	s = (U8*)SvPV_force_mutable(sv, len);
725     else s = (U8 *)SvPV_mutable(sv, len);
726     if (len == 0)		/* TAIL might be on a zero-length string. */
727 	return;
728     SvUPGRADE(sv, SVt_PVMG);
729     SvIOK_off(sv);
730     SvNOK_off(sv);
731     SvVALID_on(sv);
732 
733     /* "deep magic", the comment used to add. The use of MAGIC itself isn't
734        really. MAGIC was originally added in 79072805bf63abe5 (perl 5.0 alpha 2)
735        to call SvVALID_off() if the scalar was assigned to.
736 
737        The comment itself (and "deeper magic" below) date back to
738        378cc40b38293ffc (perl 2.0). "deep magic" was an annotation on
739        str->str_pok |= 2;
740        where the magic (presumably) was that the scalar had a BM table hidden
741        inside itself.
742 
743        As MAGIC is always present on BMs [in Perl 5 :-)], we can use it to store
744        the table instead of the previous (somewhat hacky) approach of co-opting
745        the string buffer and storing it after the string.  */
746 
747     assert(!mg_find(sv, PERL_MAGIC_bm));
748     mg = sv_magicext(sv, NULL, PERL_MAGIC_bm, &PL_vtbl_bm, NULL, 0);
749     assert(mg);
750 
751     if (len > 2) {
752 	/* Shorter strings are special-cased in Perl_fbm_instr(), and don't use
753 	   the BM table.  */
754 	const U8 mlen = (len>255) ? 255 : (U8)len;
755 	const unsigned char *const sb = s + len - mlen; /* first char (maybe) */
756 	U8 *table;
757 
758 	Newx(table, 256, U8);
759 	memset((void*)table, mlen, 256);
760 	mg->mg_ptr = (char *)table;
761 	mg->mg_len = 256;
762 
763 	s += len - 1; /* last char */
764 	i = 0;
765 	while (s >= sb) {
766 	    if (table[*s] == mlen)
767 		table[*s] = (U8)i;
768 	    s--, i++;
769 	}
770     }
771 
772     s = (const unsigned char*)(SvPVX_const(sv));	/* deeper magic */
773     for (i = 0; i < len; i++) {
774 	if (PL_freq[s[i]] < frequency) {
775 	    PERL_DEB( rarest = i );
776 	    frequency = PL_freq[s[i]];
777 	}
778     }
779     BmUSEFUL(sv) = 100;			/* Initial value */
780     if (flags & FBMcf_TAIL)
781 	SvTAIL_on(sv);
782     DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %"UVuf"\n",
783 			  s[rarest], (UV)rarest));
784 }
785 
786 
787 /*
788 =for apidoc fbm_instr
789 
790 Returns the location of the SV in the string delimited by C<big> and
791 C<bigend> (C<bigend>) is the char following the last char).
792 It returns C<NULL> if the string can't be found.  The C<sv>
793 does not have to be C<fbm_compiled>, but the search will not be as fast
794 then.
795 
796 =cut
797 
798 If SvTAIL(littlestr) is true, a fake "\n" was appended to to the string
799 during FBM compilation due to FBMcf_TAIL in flags. It indicates that
800 the littlestr must be anchored to the end of bigstr (or to any \n if
801 FBMrf_MULTILINE).
802 
803 E.g. The regex compiler would compile /abc/ to a littlestr of "abc",
804 while /abc$/ compiles to "abc\n" with SvTAIL() true.
805 
806 A littlestr of "abc", !SvTAIL matches as /abc/;
807 a littlestr of "ab\n", SvTAIL matches as:
808    without FBMrf_MULTILINE: /ab\n?\z/
809    with    FBMrf_MULTILINE: /ab\n/ || /ab\z/;
810 
811 (According to Ilya from 1999; I don't know if this is still true, DAPM 2015):
812   "If SvTAIL is actually due to \Z or \z, this gives false positives
813   if multiline".
814 */
815 
816 
817 char *
818 Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U32 flags)
819 {
820     unsigned char *s;
821     STRLEN l;
822     const unsigned char *little = (const unsigned char *)SvPV_const(littlestr,l);
823     STRLEN littlelen = l;
824     const I32 multiline = flags & FBMrf_MULTILINE;
825 
826     PERL_ARGS_ASSERT_FBM_INSTR;
827 
828     if ((STRLEN)(bigend - big) < littlelen) {
829 	if ( SvTAIL(littlestr)
830 	     && ((STRLEN)(bigend - big) == littlelen - 1)
831 	     && (littlelen == 1
832 		 || (*big == *little &&
833 		     memEQ((char *)big, (char *)little, littlelen - 1))))
834 	    return (char*)big;
835 	return NULL;
836     }
837 
838     switch (littlelen) { /* Special cases for 0, 1 and 2  */
839     case 0:
840 	return (char*)big;		/* Cannot be SvTAIL! */
841 
842     case 1:
843 	    if (SvTAIL(littlestr) && !multiline) /* Anchor only! */
844 		/* [-1] is safe because we know that bigend != big.  */
845 		return (char *) (bigend - (bigend[-1] == '\n'));
846 
847 	    s = (unsigned char *)memchr((void*)big, *little, bigend-big);
848             if (s)
849                 return (char *)s;
850 	    if (SvTAIL(littlestr))
851 		return (char *) bigend;
852 	    return NULL;
853 
854     case 2:
855 	if (SvTAIL(littlestr) && !multiline) {
856             /* a littlestr with SvTAIL must be of the form "X\n" (where X
857              * is a single char). It is anchored, and can only match
858              * "....X\n"  or  "....X" */
859             if (bigend[-2] == *little && bigend[-1] == '\n')
860 		return (char*)bigend - 2;
861 	    if (bigend[-1] == *little)
862 		return (char*)bigend - 1;
863 	    return NULL;
864 	}
865 
866 	{
867             /* memchr() is likely to be very fast, possibly using whatever
868              * hardware support is available, such as checking a whole
869              * cache line in one instruction.
870              * So for a 2 char pattern, calling memchr() is likely to be
871              * faster than running FBM, or rolling our own. The previous
872              * version of this code was roll-your-own which typically
873              * only needed to read every 2nd char, which was good back in
874              * the day, but no longer.
875              */
876 	    unsigned char c1 = little[0];
877 	    unsigned char c2 = little[1];
878 
879             /* *** for all this case, bigend points to the last char,
880              * not the trailing \0: this makes the conditions slightly
881              * simpler */
882             bigend--;
883 	    s = big;
884             if (c1 != c2) {
885                 while (s < bigend) {
886                     /* do a quick test for c1 before calling memchr();
887                      * this avoids the expensive fn call overhead when
888                      * there are lots of c1's */
889                     if (LIKELY(*s != c1)) {
890                         s++;
891                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
892                         if (!s)
893                             break;
894                     }
895                     if (s[1] == c2)
896                         return (char*)s;
897 
898                     /* failed; try searching for c2 this time; that way
899                      * we don't go pathologically slow when the string
900                      * consists mostly of c1's or vice versa.
901                      */
902                     s += 2;
903                     if (s > bigend)
904                         break;
905                     s = (unsigned char *)memchr((void*)s, c2, bigend - s + 1);
906                     if (!s)
907                         break;
908                     if (s[-1] == c1)
909                         return (char*)s - 1;
910                 }
911             }
912             else {
913                 /* c1, c2 the same */
914                 while (s < bigend) {
915                     if (s[0] == c1) {
916                       got_1char:
917                         if (s[1] == c1)
918                             return (char*)s;
919                         s += 2;
920                     }
921                     else {
922                         s++;
923                         s = (unsigned char *)memchr((void*)s, c1, bigend - s);
924                         if (!s || s >= bigend)
925                             break;
926                         goto got_1char;
927                     }
928                 }
929             }
930 
931             /* failed to find 2 chars; try anchored match at end without
932              * the \n */
933             if (SvTAIL(littlestr) && bigend[0] == little[0])
934                 return (char *)bigend;
935             return NULL;
936         }
937 
938     default:
939 	break; /* Only lengths 0 1 and 2 have special-case code.  */
940     }
941 
942     if (SvTAIL(littlestr) && !multiline) {	/* tail anchored? */
943 	s = bigend - littlelen;
944 	if (s >= big && bigend[-1] == '\n' && *s == *little
945 	    /* Automatically of length > 2 */
946 	    && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
947 	{
948 	    return (char*)s;		/* how sweet it is */
949 	}
950 	if (s[1] == *little
951 	    && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
952 	{
953 	    return (char*)s + 1;	/* how sweet it is */
954 	}
955 	return NULL;
956     }
957 
958     if (!SvVALID(littlestr)) {
959         /* not compiled; use Perl_ninstr() instead */
960 	char * const b = ninstr((char*)big,(char*)bigend,
961 			 (char*)little, (char*)little + littlelen);
962 
963 	if (!b && SvTAIL(littlestr)) {	/* Automatically multiline!  */
964 	    /* Chop \n from littlestr: */
965 	    s = bigend - littlelen + 1;
966 	    if (*s == *little
967 		&& memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
968 	    {
969 		return (char*)s;
970 	    }
971 	    return NULL;
972 	}
973 	return b;
974     }
975 
976     /* Do actual FBM.  */
977     if (littlelen > (STRLEN)(bigend - big))
978 	return NULL;
979 
980     {
981 	const MAGIC *const mg = mg_find(littlestr, PERL_MAGIC_bm);
982 	const unsigned char *oldlittle;
983 
984 	assert(mg);
985 
986 	--littlelen;			/* Last char found by table lookup */
987 
988 	s = big + littlelen;
989 	little += littlelen;		/* last char */
990 	oldlittle = little;
991 	if (s < bigend) {
992 	    const unsigned char * const table = (const unsigned char *) mg->mg_ptr;
993             const unsigned char lastc = *little;
994 	    I32 tmp;
995 
996 	  top2:
997 	    if ((tmp = table[*s])) {
998                 /* *s != lastc; earliest position it could match now is
999                  * tmp slots further on */
1000 		if ((s += tmp) >= bigend)
1001                     goto check_end;
1002                 if (LIKELY(*s != lastc)) {
1003                     s++;
1004                     s = (unsigned char *)memchr((void*)s, lastc, bigend - s);
1005                     if (!s) {
1006                         s = bigend;
1007                         goto check_end;
1008                     }
1009                     goto top2;
1010                 }
1011 	    }
1012 
1013 
1014             /* hand-rolled strncmp(): less expensive than calling the
1015              * real function (maybe???) */
1016 	    {
1017 		unsigned char * const olds = s;
1018 
1019 		tmp = littlelen;
1020 
1021 		while (tmp--) {
1022 		    if (*--s == *--little)
1023 			continue;
1024 		    s = olds + 1;	/* here we pay the price for failure */
1025 		    little = oldlittle;
1026 		    if (s < bigend)	/* fake up continue to outer loop */
1027 			goto top2;
1028 		    goto check_end;
1029 		}
1030 		return (char *)s;
1031 	    }
1032 	}
1033       check_end:
1034 	if ( s == bigend
1035 	     && SvTAIL(littlestr)
1036 	     && memEQ((char *)(bigend - littlelen),
1037 		      (char *)(oldlittle - littlelen), littlelen) )
1038 	    return (char*)bigend - littlelen;
1039 	return NULL;
1040     }
1041 }
1042 
1043 
1044 /*
1045 =for apidoc foldEQ
1046 
1047 Returns true if the leading C<len> bytes of the strings C<s1> and C<s2> are the
1048 same
1049 case-insensitively; false otherwise.  Uppercase and lowercase ASCII range bytes
1050 match themselves and their opposite case counterparts.  Non-cased and non-ASCII
1051 range bytes match only themselves.
1052 
1053 =cut
1054 */
1055 
1056 
1057 I32
1058 Perl_foldEQ(const char *s1, const char *s2, I32 len)
1059 {
1060     const U8 *a = (const U8 *)s1;
1061     const U8 *b = (const U8 *)s2;
1062 
1063     PERL_ARGS_ASSERT_FOLDEQ;
1064 
1065     assert(len >= 0);
1066 
1067     while (len--) {
1068 	if (*a != *b && *a != PL_fold[*b])
1069 	    return 0;
1070 	a++,b++;
1071     }
1072     return 1;
1073 }
1074 I32
1075 Perl_foldEQ_latin1(const char *s1, const char *s2, I32 len)
1076 {
1077     /* Compare non-utf8 using Unicode (Latin1) semantics.  Does not work on
1078      * MICRO_SIGN, LATIN_SMALL_LETTER_SHARP_S, nor
1079      * LATIN_SMALL_LETTER_Y_WITH_DIAERESIS, and does not check for these.  Nor
1080      * does it check that the strings each have at least 'len' characters */
1081 
1082     const U8 *a = (const U8 *)s1;
1083     const U8 *b = (const U8 *)s2;
1084 
1085     PERL_ARGS_ASSERT_FOLDEQ_LATIN1;
1086 
1087     assert(len >= 0);
1088 
1089     while (len--) {
1090 	if (*a != *b && *a != PL_fold_latin1[*b]) {
1091 	    return 0;
1092 	}
1093 	a++, b++;
1094     }
1095     return 1;
1096 }
1097 
1098 /*
1099 =for apidoc foldEQ_locale
1100 
1101 Returns true if the leading C<len> bytes of the strings C<s1> and C<s2> are the
1102 same case-insensitively in the current locale; false otherwise.
1103 
1104 =cut
1105 */
1106 
1107 I32
1108 Perl_foldEQ_locale(const char *s1, const char *s2, I32 len)
1109 {
1110     dVAR;
1111     const U8 *a = (const U8 *)s1;
1112     const U8 *b = (const U8 *)s2;
1113 
1114     PERL_ARGS_ASSERT_FOLDEQ_LOCALE;
1115 
1116     assert(len >= 0);
1117 
1118     while (len--) {
1119 	if (*a != *b && *a != PL_fold_locale[*b])
1120 	    return 0;
1121 	a++,b++;
1122     }
1123     return 1;
1124 }
1125 
1126 /* copy a string to a safe spot */
1127 
1128 /*
1129 =head1 Memory Management
1130 
1131 =for apidoc savepv
1132 
1133 Perl's version of C<strdup()>.  Returns a pointer to a newly allocated
1134 string which is a duplicate of C<pv>.  The size of the string is
1135 determined by C<strlen()>, which means it may not contain embedded C<NUL>
1136 characters and must have a trailing C<NUL>.  The memory allocated for the new
1137 string can be freed with the C<Safefree()> function.
1138 
1139 On some platforms, Windows for example, all allocated memory owned by a thread
1140 is deallocated when that thread ends.  So if you need that not to happen, you
1141 need to use the shared memory functions, such as C<L</savesharedpv>>.
1142 
1143 =cut
1144 */
1145 
1146 char *
1147 Perl_savepv(pTHX_ const char *pv)
1148 {
1149     PERL_UNUSED_CONTEXT;
1150     if (!pv)
1151 	return NULL;
1152     else {
1153 	char *newaddr;
1154 	const STRLEN pvlen = strlen(pv)+1;
1155 	Newx(newaddr, pvlen, char);
1156 	return (char*)memcpy(newaddr, pv, pvlen);
1157     }
1158 }
1159 
1160 /* same thing but with a known length */
1161 
1162 /*
1163 =for apidoc savepvn
1164 
1165 Perl's version of what C<strndup()> would be if it existed.  Returns a
1166 pointer to a newly allocated string which is a duplicate of the first
1167 C<len> bytes from C<pv>, plus a trailing
1168 C<NUL> byte.  The memory allocated for
1169 the new string can be freed with the C<Safefree()> function.
1170 
1171 On some platforms, Windows for example, all allocated memory owned by a thread
1172 is deallocated when that thread ends.  So if you need that not to happen, you
1173 need to use the shared memory functions, such as C<L</savesharedpvn>>.
1174 
1175 =cut
1176 */
1177 
1178 char *
1179 Perl_savepvn(pTHX_ const char *pv, I32 len)
1180 {
1181     char *newaddr;
1182     PERL_UNUSED_CONTEXT;
1183 
1184     assert(len >= 0);
1185 
1186     Newx(newaddr,len+1,char);
1187     /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
1188     if (pv) {
1189 	/* might not be null terminated */
1190     	newaddr[len] = '\0';
1191     	return (char *) CopyD(pv,newaddr,len,char);
1192     }
1193     else {
1194 	return (char *) ZeroD(newaddr,len+1,char);
1195     }
1196 }
1197 
1198 /*
1199 =for apidoc savesharedpv
1200 
1201 A version of C<savepv()> which allocates the duplicate string in memory
1202 which is shared between threads.
1203 
1204 =cut
1205 */
1206 char *
1207 Perl_savesharedpv(pTHX_ const char *pv)
1208 {
1209     char *newaddr;
1210     STRLEN pvlen;
1211 
1212     PERL_UNUSED_CONTEXT;
1213 
1214     if (!pv)
1215 	return NULL;
1216 
1217     pvlen = strlen(pv)+1;
1218     newaddr = (char*)PerlMemShared_malloc(pvlen);
1219     if (!newaddr) {
1220 	croak_no_mem();
1221     }
1222     return (char*)memcpy(newaddr, pv, pvlen);
1223 }
1224 
1225 /*
1226 =for apidoc savesharedpvn
1227 
1228 A version of C<savepvn()> which allocates the duplicate string in memory
1229 which is shared between threads.  (With the specific difference that a C<NULL>
1230 pointer is not acceptable)
1231 
1232 =cut
1233 */
1234 char *
1235 Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
1236 {
1237     char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
1238 
1239     PERL_UNUSED_CONTEXT;
1240     /* PERL_ARGS_ASSERT_SAVESHAREDPVN; */
1241 
1242     if (!newaddr) {
1243 	croak_no_mem();
1244     }
1245     newaddr[len] = '\0';
1246     return (char*)memcpy(newaddr, pv, len);
1247 }
1248 
1249 /*
1250 =for apidoc savesvpv
1251 
1252 A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
1253 the passed in SV using C<SvPV()>
1254 
1255 On some platforms, Windows for example, all allocated memory owned by a thread
1256 is deallocated when that thread ends.  So if you need that not to happen, you
1257 need to use the shared memory functions, such as C<L</savesharedsvpv>>.
1258 
1259 =cut
1260 */
1261 
1262 char *
1263 Perl_savesvpv(pTHX_ SV *sv)
1264 {
1265     STRLEN len;
1266     const char * const pv = SvPV_const(sv, len);
1267     char *newaddr;
1268 
1269     PERL_ARGS_ASSERT_SAVESVPV;
1270 
1271     ++len;
1272     Newx(newaddr,len,char);
1273     return (char *) CopyD(pv,newaddr,len,char);
1274 }
1275 
1276 /*
1277 =for apidoc savesharedsvpv
1278 
1279 A version of C<savesharedpv()> which allocates the duplicate string in
1280 memory which is shared between threads.
1281 
1282 =cut
1283 */
1284 
1285 char *
1286 Perl_savesharedsvpv(pTHX_ SV *sv)
1287 {
1288     STRLEN len;
1289     const char * const pv = SvPV_const(sv, len);
1290 
1291     PERL_ARGS_ASSERT_SAVESHAREDSVPV;
1292 
1293     return savesharedpvn(pv, len);
1294 }
1295 
1296 /* the SV for Perl_form() and mess() is not kept in an arena */
1297 
1298 STATIC SV *
1299 S_mess_alloc(pTHX)
1300 {
1301     SV *sv;
1302     XPVMG *any;
1303 
1304     if (PL_phase != PERL_PHASE_DESTRUCT)
1305 	return newSVpvs_flags("", SVs_TEMP);
1306 
1307     if (PL_mess_sv)
1308 	return PL_mess_sv;
1309 
1310     /* Create as PVMG now, to avoid any upgrading later */
1311     Newx(sv, 1, SV);
1312     Newxz(any, 1, XPVMG);
1313     SvFLAGS(sv) = SVt_PVMG;
1314     SvANY(sv) = (void*)any;
1315     SvPV_set(sv, NULL);
1316     SvREFCNT(sv) = 1 << 30; /* practically infinite */
1317     PL_mess_sv = sv;
1318     return sv;
1319 }
1320 
1321 #if defined(PERL_IMPLICIT_CONTEXT)
1322 char *
1323 Perl_form_nocontext(const char* pat, ...)
1324 {
1325     dTHX;
1326     char *retval;
1327     va_list args;
1328     PERL_ARGS_ASSERT_FORM_NOCONTEXT;
1329     va_start(args, pat);
1330     retval = vform(pat, &args);
1331     va_end(args);
1332     return retval;
1333 }
1334 #endif /* PERL_IMPLICIT_CONTEXT */
1335 
1336 /*
1337 =head1 Miscellaneous Functions
1338 =for apidoc form
1339 
1340 Takes a sprintf-style format pattern and conventional
1341 (non-SV) arguments and returns the formatted string.
1342 
1343     (char *) Perl_form(pTHX_ const char* pat, ...)
1344 
1345 can be used any place a string (char *) is required:
1346 
1347     char * s = Perl_form("%d.%d",major,minor);
1348 
1349 Uses a single private buffer so if you want to format several strings you
1350 must explicitly copy the earlier strings away (and free the copies when you
1351 are done).
1352 
1353 =cut
1354 */
1355 
1356 char *
1357 Perl_form(pTHX_ const char* pat, ...)
1358 {
1359     char *retval;
1360     va_list args;
1361     PERL_ARGS_ASSERT_FORM;
1362     va_start(args, pat);
1363     retval = vform(pat, &args);
1364     va_end(args);
1365     return retval;
1366 }
1367 
1368 char *
1369 Perl_vform(pTHX_ const char *pat, va_list *args)
1370 {
1371     SV * const sv = mess_alloc();
1372     PERL_ARGS_ASSERT_VFORM;
1373     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1374     return SvPVX(sv);
1375 }
1376 
1377 /*
1378 =for apidoc Am|SV *|mess|const char *pat|...
1379 
1380 Take a sprintf-style format pattern and argument list.  These are used to
1381 generate a string message.  If the message does not end with a newline,
1382 then it will be extended with some indication of the current location
1383 in the code, as described for L</mess_sv>.
1384 
1385 Normally, the resulting message is returned in a new mortal SV.
1386 During global destruction a single SV may be shared between uses of
1387 this function.
1388 
1389 =cut
1390 */
1391 
1392 #if defined(PERL_IMPLICIT_CONTEXT)
1393 SV *
1394 Perl_mess_nocontext(const char *pat, ...)
1395 {
1396     dTHX;
1397     SV *retval;
1398     va_list args;
1399     PERL_ARGS_ASSERT_MESS_NOCONTEXT;
1400     va_start(args, pat);
1401     retval = vmess(pat, &args);
1402     va_end(args);
1403     return retval;
1404 }
1405 #endif /* PERL_IMPLICIT_CONTEXT */
1406 
1407 SV *
1408 Perl_mess(pTHX_ const char *pat, ...)
1409 {
1410     SV *retval;
1411     va_list args;
1412     PERL_ARGS_ASSERT_MESS;
1413     va_start(args, pat);
1414     retval = vmess(pat, &args);
1415     va_end(args);
1416     return retval;
1417 }
1418 
1419 const COP*
1420 Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop,
1421 		       bool opnext)
1422 {
1423     /* Look for curop starting from o.  cop is the last COP we've seen. */
1424     /* opnext means that curop is actually the ->op_next of the op we are
1425        seeking. */
1426 
1427     PERL_ARGS_ASSERT_CLOSEST_COP;
1428 
1429     if (!o || !curop || (
1430 	opnext ? o->op_next == curop && o->op_type != OP_SCOPE : o == curop
1431     ))
1432 	return cop;
1433 
1434     if (o->op_flags & OPf_KIDS) {
1435 	const OP *kid;
1436 	for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
1437 	    const COP *new_cop;
1438 
1439 	    /* If the OP_NEXTSTATE has been optimised away we can still use it
1440 	     * the get the file and line number. */
1441 
1442 	    if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1443 		cop = (const COP *)kid;
1444 
1445 	    /* Keep searching, and return when we've found something. */
1446 
1447 	    new_cop = closest_cop(cop, kid, curop, opnext);
1448 	    if (new_cop)
1449 		return new_cop;
1450 	}
1451     }
1452 
1453     /* Nothing found. */
1454 
1455     return NULL;
1456 }
1457 
1458 /*
1459 =for apidoc Am|SV *|mess_sv|SV *basemsg|bool consume
1460 
1461 Expands a message, intended for the user, to include an indication of
1462 the current location in the code, if the message does not already appear
1463 to be complete.
1464 
1465 C<basemsg> is the initial message or object.  If it is a reference, it
1466 will be used as-is and will be the result of this function.  Otherwise it
1467 is used as a string, and if it already ends with a newline, it is taken
1468 to be complete, and the result of this function will be the same string.
1469 If the message does not end with a newline, then a segment such as C<at
1470 foo.pl line 37> will be appended, and possibly other clauses indicating
1471 the current state of execution.  The resulting message will end with a
1472 dot and a newline.
1473 
1474 Normally, the resulting message is returned in a new mortal SV.
1475 During global destruction a single SV may be shared between uses of this
1476 function.  If C<consume> is true, then the function is permitted (but not
1477 required) to modify and return C<basemsg> instead of allocating a new SV.
1478 
1479 =cut
1480 */
1481 
1482 SV *
1483 Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
1484 {
1485     SV *sv;
1486 
1487 #if defined(USE_C_BACKTRACE) && defined(USE_C_BACKTRACE_ON_ERROR)
1488     {
1489         char *ws;
1490         UV wi;
1491         /* The PERL_C_BACKTRACE_ON_WARN must be an integer of one or more. */
1492         if ((ws = PerlEnv_getenv("PERL_C_BACKTRACE_ON_ERROR"))
1493             && grok_atoUV(ws, &wi, NULL)
1494             && wi <= PERL_INT_MAX
1495         ) {
1496             Perl_dump_c_backtrace(aTHX_ Perl_debug_log, (int)wi, 1);
1497         }
1498     }
1499 #endif
1500 
1501     PERL_ARGS_ASSERT_MESS_SV;
1502 
1503     if (SvROK(basemsg)) {
1504 	if (consume) {
1505 	    sv = basemsg;
1506 	}
1507 	else {
1508 	    sv = mess_alloc();
1509 	    sv_setsv(sv, basemsg);
1510 	}
1511 	return sv;
1512     }
1513 
1514     if (SvPOK(basemsg) && consume) {
1515 	sv = basemsg;
1516     }
1517     else {
1518 	sv = mess_alloc();
1519 	sv_copypv(sv, basemsg);
1520     }
1521 
1522     if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
1523 	/*
1524 	 * Try and find the file and line for PL_op.  This will usually be
1525 	 * PL_curcop, but it might be a cop that has been optimised away.  We
1526 	 * can try to find such a cop by searching through the optree starting
1527 	 * from the sibling of PL_curcop.
1528 	 */
1529 
1530 	const COP *cop =
1531 	    closest_cop(PL_curcop, OpSIBLING(PL_curcop), PL_op, FALSE);
1532 	if (!cop)
1533 	    cop = PL_curcop;
1534 
1535 	if (CopLINE(cop))
1536 	    Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
1537 	    OutCopFILE(cop), (IV)CopLINE(cop));
1538 	/* Seems that GvIO() can be untrustworthy during global destruction. */
1539 	if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
1540 		&& IoLINES(GvIOp(PL_last_in_gv)))
1541 	{
1542 	    STRLEN l;
1543 	    const bool line_mode = (RsSIMPLE(PL_rs) &&
1544 				   *SvPV_const(PL_rs,l) == '\n' && l == 1);
1545 	    Perl_sv_catpvf(aTHX_ sv, ", <%"SVf"> %s %"IVdf,
1546 			   SVfARG(PL_last_in_gv == PL_argvgv
1547                                  ? &PL_sv_no
1548                                  : sv_2mortal(newSVhek(GvNAME_HEK(PL_last_in_gv)))),
1549 			   line_mode ? "line" : "chunk",
1550 			   (IV)IoLINES(GvIOp(PL_last_in_gv)));
1551 	}
1552 	if (PL_phase == PERL_PHASE_DESTRUCT)
1553 	    sv_catpvs(sv, " during global destruction");
1554 	sv_catpvs(sv, ".\n");
1555     }
1556     return sv;
1557 }
1558 
1559 /*
1560 =for apidoc Am|SV *|vmess|const char *pat|va_list *args
1561 
1562 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1563 argument list, respectively.  These are used to generate a string message.  If
1564 the
1565 message does not end with a newline, then it will be extended with
1566 some indication of the current location in the code, as described for
1567 L</mess_sv>.
1568 
1569 Normally, the resulting message is returned in a new mortal SV.
1570 During global destruction a single SV may be shared between uses of
1571 this function.
1572 
1573 =cut
1574 */
1575 
1576 SV *
1577 Perl_vmess(pTHX_ const char *pat, va_list *args)
1578 {
1579     SV * const sv = mess_alloc();
1580 
1581     PERL_ARGS_ASSERT_VMESS;
1582 
1583     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1584     return mess_sv(sv, 1);
1585 }
1586 
1587 void
1588 Perl_write_to_stderr(pTHX_ SV* msv)
1589 {
1590     IO *io;
1591     MAGIC *mg;
1592 
1593     PERL_ARGS_ASSERT_WRITE_TO_STDERR;
1594 
1595     if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1596 	&& (io = GvIO(PL_stderrgv))
1597 	&& (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
1598 	Perl_magic_methcall(aTHX_ MUTABLE_SV(io), mg, SV_CONST(PRINT),
1599 			    G_SCALAR | G_DISCARD | G_WRITING_TO_STDERR, 1, msv);
1600     else {
1601 	PerlIO * const serr = Perl_error_log;
1602 
1603 	do_print(msv, serr);
1604 	(void)PerlIO_flush(serr);
1605     }
1606 }
1607 
1608 /*
1609 =head1 Warning and Dieing
1610 */
1611 
1612 /* Common code used in dieing and warning */
1613 
1614 STATIC SV *
1615 S_with_queued_errors(pTHX_ SV *ex)
1616 {
1617     PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS;
1618     if (PL_errors && SvCUR(PL_errors) && !SvROK(ex)) {
1619 	sv_catsv(PL_errors, ex);
1620 	ex = sv_mortalcopy(PL_errors);
1621 	SvCUR_set(PL_errors, 0);
1622     }
1623     return ex;
1624 }
1625 
1626 STATIC bool
1627 S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
1628 {
1629     HV *stash;
1630     GV *gv;
1631     CV *cv;
1632     SV **const hook = warn ? &PL_warnhook : &PL_diehook;
1633     /* sv_2cv might call Perl_croak() or Perl_warner() */
1634     SV * const oldhook = *hook;
1635 
1636     if (!oldhook)
1637 	return FALSE;
1638 
1639     ENTER;
1640     SAVESPTR(*hook);
1641     *hook = NULL;
1642     cv = sv_2cv(oldhook, &stash, &gv, 0);
1643     LEAVE;
1644     if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1645 	dSP;
1646 	SV *exarg;
1647 
1648 	ENTER;
1649 	save_re_context();
1650 	if (warn) {
1651 	    SAVESPTR(*hook);
1652 	    *hook = NULL;
1653 	}
1654 	exarg = newSVsv(ex);
1655 	SvREADONLY_on(exarg);
1656 	SAVEFREESV(exarg);
1657 
1658 	PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
1659 	PUSHMARK(SP);
1660 	XPUSHs(exarg);
1661 	PUTBACK;
1662 	call_sv(MUTABLE_SV(cv), G_DISCARD);
1663 	POPSTACK;
1664 	LEAVE;
1665 	return TRUE;
1666     }
1667     return FALSE;
1668 }
1669 
1670 /*
1671 =for apidoc Am|OP *|die_sv|SV *baseex
1672 
1673 Behaves the same as L</croak_sv>, except for the return type.
1674 It should be used only where the C<OP *> return type is required.
1675 The function never actually returns.
1676 
1677 =cut
1678 */
1679 
1680 #ifdef _MSC_VER
1681 #  pragma warning( push )
1682 #  pragma warning( disable : 4646 ) /* warning C4646: function declared with
1683     __declspec(noreturn) has non-void return type */
1684 #  pragma warning( disable : 4645 ) /* warning C4645: function declared with
1685 __declspec(noreturn) has a return statement */
1686 #endif
1687 OP *
1688 Perl_die_sv(pTHX_ SV *baseex)
1689 {
1690     PERL_ARGS_ASSERT_DIE_SV;
1691     croak_sv(baseex);
1692     /* NOTREACHED */
1693     NORETURN_FUNCTION_END;
1694 }
1695 #ifdef _MSC_VER
1696 #  pragma warning( pop )
1697 #endif
1698 
1699 /*
1700 =for apidoc Am|OP *|die|const char *pat|...
1701 
1702 Behaves the same as L</croak>, except for the return type.
1703 It should be used only where the C<OP *> return type is required.
1704 The function never actually returns.
1705 
1706 =cut
1707 */
1708 
1709 #if defined(PERL_IMPLICIT_CONTEXT)
1710 #ifdef _MSC_VER
1711 #  pragma warning( push )
1712 #  pragma warning( disable : 4646 ) /* warning C4646: function declared with
1713     __declspec(noreturn) has non-void return type */
1714 #  pragma warning( disable : 4645 ) /* warning C4645: function declared with
1715 __declspec(noreturn) has a return statement */
1716 #endif
1717 OP *
1718 Perl_die_nocontext(const char* pat, ...)
1719 {
1720     dTHX;
1721     va_list args;
1722     va_start(args, pat);
1723     vcroak(pat, &args);
1724     NOT_REACHED; /* NOTREACHED */
1725     va_end(args);
1726     NORETURN_FUNCTION_END;
1727 }
1728 #ifdef _MSC_VER
1729 #  pragma warning( pop )
1730 #endif
1731 #endif /* PERL_IMPLICIT_CONTEXT */
1732 
1733 #ifdef _MSC_VER
1734 #  pragma warning( push )
1735 #  pragma warning( disable : 4646 ) /* warning C4646: function declared with
1736     __declspec(noreturn) has non-void return type */
1737 #  pragma warning( disable : 4645 ) /* warning C4645: function declared with
1738 __declspec(noreturn) has a return statement */
1739 #endif
1740 OP *
1741 Perl_die(pTHX_ const char* pat, ...)
1742 {
1743     va_list args;
1744     va_start(args, pat);
1745     vcroak(pat, &args);
1746     NOT_REACHED; /* NOTREACHED */
1747     va_end(args);
1748     NORETURN_FUNCTION_END;
1749 }
1750 #ifdef _MSC_VER
1751 #  pragma warning( pop )
1752 #endif
1753 
1754 /*
1755 =for apidoc Am|void|croak_sv|SV *baseex
1756 
1757 This is an XS interface to Perl's C<die> function.
1758 
1759 C<baseex> is the error message or object.  If it is a reference, it
1760 will be used as-is.  Otherwise it is used as a string, and if it does
1761 not end with a newline then it will be extended with some indication of
1762 the current location in the code, as described for L</mess_sv>.
1763 
1764 The error message or object will be used as an exception, by default
1765 returning control to the nearest enclosing C<eval>, but subject to
1766 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak_sv>
1767 function never returns normally.
1768 
1769 To die with a simple string message, the L</croak> function may be
1770 more convenient.
1771 
1772 =cut
1773 */
1774 
1775 void
1776 Perl_croak_sv(pTHX_ SV *baseex)
1777 {
1778     SV *ex = with_queued_errors(mess_sv(baseex, 0));
1779     PERL_ARGS_ASSERT_CROAK_SV;
1780     invoke_exception_hook(ex, FALSE);
1781     die_unwind(ex);
1782 }
1783 
1784 /*
1785 =for apidoc Am|void|vcroak|const char *pat|va_list *args
1786 
1787 This is an XS interface to Perl's C<die> function.
1788 
1789 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1790 argument list.  These are used to generate a string message.  If the
1791 message does not end with a newline, then it will be extended with
1792 some indication of the current location in the code, as described for
1793 L</mess_sv>.
1794 
1795 The error message will be used as an exception, by default
1796 returning control to the nearest enclosing C<eval>, but subject to
1797 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1798 function never returns normally.
1799 
1800 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1801 (C<$@>) will be used as an error message or object instead of building an
1802 error message from arguments.  If you want to throw a non-string object,
1803 or build an error message in an SV yourself, it is preferable to use
1804 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1805 
1806 =cut
1807 */
1808 
1809 void
1810 Perl_vcroak(pTHX_ const char* pat, va_list *args)
1811 {
1812     SV *ex = with_queued_errors(pat ? vmess(pat, args) : mess_sv(ERRSV, 0));
1813     invoke_exception_hook(ex, FALSE);
1814     die_unwind(ex);
1815 }
1816 
1817 /*
1818 =for apidoc Am|void|croak|const char *pat|...
1819 
1820 This is an XS interface to Perl's C<die> function.
1821 
1822 Take a sprintf-style format pattern and argument list.  These are used to
1823 generate a string message.  If the message does not end with a newline,
1824 then it will be extended with some indication of the current location
1825 in the code, as described for L</mess_sv>.
1826 
1827 The error message will be used as an exception, by default
1828 returning control to the nearest enclosing C<eval>, but subject to
1829 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1830 function never returns normally.
1831 
1832 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1833 (C<$@>) will be used as an error message or object instead of building an
1834 error message from arguments.  If you want to throw a non-string object,
1835 or build an error message in an SV yourself, it is preferable to use
1836 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1837 
1838 =cut
1839 */
1840 
1841 #if defined(PERL_IMPLICIT_CONTEXT)
1842 void
1843 Perl_croak_nocontext(const char *pat, ...)
1844 {
1845     dTHX;
1846     va_list args;
1847     va_start(args, pat);
1848     vcroak(pat, &args);
1849     NOT_REACHED; /* NOTREACHED */
1850     va_end(args);
1851 }
1852 #endif /* PERL_IMPLICIT_CONTEXT */
1853 
1854 void
1855 Perl_croak(pTHX_ const char *pat, ...)
1856 {
1857     va_list args;
1858     va_start(args, pat);
1859     vcroak(pat, &args);
1860     NOT_REACHED; /* NOTREACHED */
1861     va_end(args);
1862 }
1863 
1864 /*
1865 =for apidoc Am|void|croak_no_modify
1866 
1867 Exactly equivalent to C<Perl_croak(aTHX_ "%s", PL_no_modify)>, but generates
1868 terser object code than using C<Perl_croak>.  Less code used on exception code
1869 paths reduces CPU cache pressure.
1870 
1871 =cut
1872 */
1873 
1874 void
1875 Perl_croak_no_modify(void)
1876 {
1877     Perl_croak_nocontext( "%s", PL_no_modify);
1878 }
1879 
1880 /* does not return, used in util.c perlio.c and win32.c
1881    This is typically called when malloc returns NULL.
1882 */
1883 void
1884 Perl_croak_no_mem(void)
1885 {
1886     dTHX;
1887 
1888     int fd = PerlIO_fileno(Perl_error_log);
1889     if (fd < 0)
1890         SETERRNO(EBADF,RMS_IFI);
1891     else {
1892         /* Can't use PerlIO to write as it allocates memory */
1893         PERL_UNUSED_RESULT(PerlLIO_write(fd, PL_no_mem, sizeof(PL_no_mem)-1));
1894     }
1895     my_exit(1);
1896 }
1897 
1898 /* does not return, used only in POPSTACK */
1899 void
1900 Perl_croak_popstack(void)
1901 {
1902     dTHX;
1903     PerlIO_printf(Perl_error_log, "panic: POPSTACK\n");
1904     my_exit(1);
1905 }
1906 
1907 /*
1908 =for apidoc Am|void|warn_sv|SV *baseex
1909 
1910 This is an XS interface to Perl's C<warn> function.
1911 
1912 C<baseex> is the error message or object.  If it is a reference, it
1913 will be used as-is.  Otherwise it is used as a string, and if it does
1914 not end with a newline then it will be extended with some indication of
1915 the current location in the code, as described for L</mess_sv>.
1916 
1917 The error message or object will by default be written to standard error,
1918 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1919 
1920 To warn with a simple string message, the L</warn> function may be
1921 more convenient.
1922 
1923 =cut
1924 */
1925 
1926 void
1927 Perl_warn_sv(pTHX_ SV *baseex)
1928 {
1929     SV *ex = mess_sv(baseex, 0);
1930     PERL_ARGS_ASSERT_WARN_SV;
1931     if (!invoke_exception_hook(ex, TRUE))
1932 	write_to_stderr(ex);
1933 }
1934 
1935 /*
1936 =for apidoc Am|void|vwarn|const char *pat|va_list *args
1937 
1938 This is an XS interface to Perl's C<warn> function.
1939 
1940 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1941 argument list.  These are used to generate a string message.  If the
1942 message does not end with a newline, then it will be extended with
1943 some indication of the current location in the code, as described for
1944 L</mess_sv>.
1945 
1946 The error message or object will by default be written to standard error,
1947 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1948 
1949 Unlike with L</vcroak>, C<pat> is not permitted to be null.
1950 
1951 =cut
1952 */
1953 
1954 void
1955 Perl_vwarn(pTHX_ const char* pat, va_list *args)
1956 {
1957     SV *ex = vmess(pat, args);
1958     PERL_ARGS_ASSERT_VWARN;
1959     if (!invoke_exception_hook(ex, TRUE))
1960 	write_to_stderr(ex);
1961 }
1962 
1963 /*
1964 =for apidoc Am|void|warn|const char *pat|...
1965 
1966 This is an XS interface to Perl's C<warn> function.
1967 
1968 Take a sprintf-style format pattern and argument list.  These are used to
1969 generate a string message.  If the message does not end with a newline,
1970 then it will be extended with some indication of the current location
1971 in the code, as described for L</mess_sv>.
1972 
1973 The error message or object will by default be written to standard error,
1974 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1975 
1976 Unlike with L</croak>, C<pat> is not permitted to be null.
1977 
1978 =cut
1979 */
1980 
1981 #if defined(PERL_IMPLICIT_CONTEXT)
1982 void
1983 Perl_warn_nocontext(const char *pat, ...)
1984 {
1985     dTHX;
1986     va_list args;
1987     PERL_ARGS_ASSERT_WARN_NOCONTEXT;
1988     va_start(args, pat);
1989     vwarn(pat, &args);
1990     va_end(args);
1991 }
1992 #endif /* PERL_IMPLICIT_CONTEXT */
1993 
1994 void
1995 Perl_warn(pTHX_ const char *pat, ...)
1996 {
1997     va_list args;
1998     PERL_ARGS_ASSERT_WARN;
1999     va_start(args, pat);
2000     vwarn(pat, &args);
2001     va_end(args);
2002 }
2003 
2004 #if defined(PERL_IMPLICIT_CONTEXT)
2005 void
2006 Perl_warner_nocontext(U32 err, const char *pat, ...)
2007 {
2008     dTHX;
2009     va_list args;
2010     PERL_ARGS_ASSERT_WARNER_NOCONTEXT;
2011     va_start(args, pat);
2012     vwarner(err, pat, &args);
2013     va_end(args);
2014 }
2015 #endif /* PERL_IMPLICIT_CONTEXT */
2016 
2017 void
2018 Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
2019 {
2020     PERL_ARGS_ASSERT_CK_WARNER_D;
2021 
2022     if (Perl_ckwarn_d(aTHX_ err)) {
2023 	va_list args;
2024 	va_start(args, pat);
2025 	vwarner(err, pat, &args);
2026 	va_end(args);
2027     }
2028 }
2029 
2030 void
2031 Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
2032 {
2033     PERL_ARGS_ASSERT_CK_WARNER;
2034 
2035     if (Perl_ckwarn(aTHX_ err)) {
2036 	va_list args;
2037 	va_start(args, pat);
2038 	vwarner(err, pat, &args);
2039 	va_end(args);
2040     }
2041 }
2042 
2043 void
2044 Perl_warner(pTHX_ U32  err, const char* pat,...)
2045 {
2046     va_list args;
2047     PERL_ARGS_ASSERT_WARNER;
2048     va_start(args, pat);
2049     vwarner(err, pat, &args);
2050     va_end(args);
2051 }
2052 
2053 void
2054 Perl_vwarner(pTHX_ U32  err, const char* pat, va_list* args)
2055 {
2056     dVAR;
2057     PERL_ARGS_ASSERT_VWARNER;
2058     if (
2059         (PL_warnhook == PERL_WARNHOOK_FATAL || ckDEAD(err)) &&
2060         !(PL_in_eval & EVAL_KEEPERR)
2061     ) {
2062 	SV * const msv = vmess(pat, args);
2063 
2064 	if (PL_parser && PL_parser->error_count) {
2065 	    qerror(msv);
2066 	}
2067 	else {
2068 	    invoke_exception_hook(msv, FALSE);
2069 	    die_unwind(msv);
2070 	}
2071     }
2072     else {
2073 	Perl_vwarn(aTHX_ pat, args);
2074     }
2075 }
2076 
2077 /* implements the ckWARN? macros */
2078 
2079 bool
2080 Perl_ckwarn(pTHX_ U32 w)
2081 {
2082     /* If lexical warnings have not been set, use $^W.  */
2083     if (isLEXWARN_off)
2084 	return PL_dowarn & G_WARN_ON;
2085 
2086     return ckwarn_common(w);
2087 }
2088 
2089 /* implements the ckWARN?_d macro */
2090 
2091 bool
2092 Perl_ckwarn_d(pTHX_ U32 w)
2093 {
2094     /* If lexical warnings have not been set then default classes warn.  */
2095     if (isLEXWARN_off)
2096 	return TRUE;
2097 
2098     return ckwarn_common(w);
2099 }
2100 
2101 static bool
2102 S_ckwarn_common(pTHX_ U32 w)
2103 {
2104     if (PL_curcop->cop_warnings == pWARN_ALL)
2105 	return TRUE;
2106 
2107     if (PL_curcop->cop_warnings == pWARN_NONE)
2108 	return FALSE;
2109 
2110     /* Check the assumption that at least the first slot is non-zero.  */
2111     assert(unpackWARN1(w));
2112 
2113     /* Check the assumption that it is valid to stop as soon as a zero slot is
2114        seen.  */
2115     if (!unpackWARN2(w)) {
2116 	assert(!unpackWARN3(w));
2117 	assert(!unpackWARN4(w));
2118     } else if (!unpackWARN3(w)) {
2119 	assert(!unpackWARN4(w));
2120     }
2121 
2122     /* Right, dealt with all the special cases, which are implemented as non-
2123        pointers, so there is a pointer to a real warnings mask.  */
2124     do {
2125 	if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)))
2126 	    return TRUE;
2127     } while (w >>= WARNshift);
2128 
2129     return FALSE;
2130 }
2131 
2132 /* Set buffer=NULL to get a new one.  */
2133 STRLEN *
2134 Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
2135 			   STRLEN size) {
2136     const MEM_SIZE len_wanted =
2137 	sizeof(STRLEN) + (size > WARNsize ? size : WARNsize);
2138     PERL_UNUSED_CONTEXT;
2139     PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
2140 
2141     buffer = (STRLEN*)
2142 	(specialWARN(buffer) ?
2143 	 PerlMemShared_malloc(len_wanted) :
2144 	 PerlMemShared_realloc(buffer, len_wanted));
2145     buffer[0] = size;
2146     Copy(bits, (buffer + 1), size, char);
2147     if (size < WARNsize)
2148 	Zero((char *)(buffer + 1) + size, WARNsize - size, char);
2149     return buffer;
2150 }
2151 
2152 /* since we've already done strlen() for both nam and val
2153  * we can use that info to make things faster than
2154  * sprintf(s, "%s=%s", nam, val)
2155  */
2156 #define my_setenv_format(s, nam, nlen, val, vlen) \
2157    Copy(nam, s, nlen, char); \
2158    *(s+nlen) = '='; \
2159    Copy(val, s+(nlen+1), vlen, char); \
2160    *(s+(nlen+1+vlen)) = '\0'
2161 
2162 #ifdef USE_ENVIRON_ARRAY
2163        /* VMS' my_setenv() is in vms.c */
2164 #if !defined(WIN32) && !defined(NETWARE)
2165 void
2166 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2167 {
2168   dVAR;
2169 #ifdef __amigaos4__
2170   amigaos4_obtain_environ(__FUNCTION__);
2171 #endif
2172 #ifdef USE_ITHREADS
2173   /* only parent thread can modify process environment */
2174   if (PL_curinterp == aTHX)
2175 #endif
2176   {
2177 #ifndef PERL_USE_SAFE_PUTENV
2178     if (!PL_use_safe_putenv) {
2179         /* most putenv()s leak, so we manipulate environ directly */
2180         I32 i;
2181         const I32 len = strlen(nam);
2182         int nlen, vlen;
2183 
2184         /* where does it go? */
2185         for (i = 0; environ[i]; i++) {
2186             if (strnEQ(environ[i],nam,len) && environ[i][len] == '=')
2187                 break;
2188         }
2189 
2190         if (environ == PL_origenviron) {   /* need we copy environment? */
2191             I32 j;
2192             I32 max;
2193             char **tmpenv;
2194 
2195             max = i;
2196             while (environ[max])
2197                 max++;
2198             tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
2199             for (j=0; j<max; j++) {         /* copy environment */
2200                 const int len = strlen(environ[j]);
2201                 tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
2202                 Copy(environ[j], tmpenv[j], len+1, char);
2203             }
2204             tmpenv[max] = NULL;
2205             environ = tmpenv;               /* tell exec where it is now */
2206         }
2207         if (!val) {
2208             safesysfree(environ[i]);
2209             while (environ[i]) {
2210                 environ[i] = environ[i+1];
2211                 i++;
2212             }
2213 #ifdef __amigaos4__
2214             goto my_setenv_out;
2215 #else
2216             return;
2217 #endif
2218         }
2219         if (!environ[i]) {                 /* does not exist yet */
2220             environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
2221             environ[i+1] = NULL;    /* make sure it's null terminated */
2222         }
2223         else
2224             safesysfree(environ[i]);
2225         nlen = strlen(nam);
2226         vlen = strlen(val);
2227 
2228         environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
2229         /* all that work just for this */
2230         my_setenv_format(environ[i], nam, nlen, val, vlen);
2231     } else {
2232 # endif
2233     /* This next branch should only be called #if defined(HAS_SETENV), but
2234        Configure doesn't test for that yet.  For Solaris, setenv() and unsetenv()
2235        were introduced in Solaris 9, so testing for HAS UNSETENV is sufficient.
2236     */
2237 #   if defined(__CYGWIN__)|| defined(__SYMBIAN32__) || defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV)) || defined(PERL_DARWIN)
2238 #       if defined(HAS_UNSETENV)
2239         if (val == NULL) {
2240             (void)unsetenv(nam);
2241         } else {
2242             (void)setenv(nam, val, 1);
2243         }
2244 #       else /* ! HAS_UNSETENV */
2245         (void)setenv(nam, val, 1);
2246 #       endif /* HAS_UNSETENV */
2247 #   else
2248 #       if defined(HAS_UNSETENV)
2249         if (val == NULL) {
2250             if (environ) /* old glibc can crash with null environ */
2251                 (void)unsetenv(nam);
2252         } else {
2253 	    const int nlen = strlen(nam);
2254 	    const int vlen = strlen(val);
2255 	    char * const new_env =
2256                 (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
2257             my_setenv_format(new_env, nam, nlen, val, vlen);
2258             (void)putenv(new_env);
2259         }
2260 #       else /* ! HAS_UNSETENV */
2261         char *new_env;
2262 	const int nlen = strlen(nam);
2263 	int vlen;
2264         if (!val) {
2265 	   val = "";
2266         }
2267         vlen = strlen(val);
2268         new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
2269         /* all that work just for this */
2270         my_setenv_format(new_env, nam, nlen, val, vlen);
2271         (void)putenv(new_env);
2272 #       endif /* HAS_UNSETENV */
2273 #   endif /* __CYGWIN__ */
2274 #ifndef PERL_USE_SAFE_PUTENV
2275     }
2276 #endif
2277   }
2278 #ifdef __amigaos4__
2279 my_setenv_out:
2280   amigaos4_release_environ(__FUNCTION__);
2281 #endif
2282 }
2283 
2284 #else /* WIN32 || NETWARE */
2285 
2286 void
2287 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2288 {
2289     dVAR;
2290     char *envstr;
2291     const int nlen = strlen(nam);
2292     int vlen;
2293 
2294     if (!val) {
2295        val = "";
2296     }
2297     vlen = strlen(val);
2298     Newx(envstr, nlen+vlen+2, char);
2299     my_setenv_format(envstr, nam, nlen, val, vlen);
2300     (void)PerlEnv_putenv(envstr);
2301     Safefree(envstr);
2302 }
2303 
2304 #endif /* WIN32 || NETWARE */
2305 
2306 #endif /* !VMS */
2307 
2308 #ifdef UNLINK_ALL_VERSIONS
2309 I32
2310 Perl_unlnk(pTHX_ const char *f)	/* unlink all versions of a file */
2311 {
2312     I32 retries = 0;
2313 
2314     PERL_ARGS_ASSERT_UNLNK;
2315 
2316     while (PerlLIO_unlink(f) >= 0)
2317 	retries++;
2318     return retries ? 0 : -1;
2319 }
2320 #endif
2321 
2322 /* this is a drop-in replacement for bcopy(), except for the return
2323  * value, which we need to be able to emulate memcpy()  */
2324 #if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
2325 void *
2326 Perl_my_bcopy(const void *vfrom, void *vto, size_t len)
2327 {
2328 #if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
2329     bcopy(vfrom, vto, len);
2330 #else
2331     const unsigned char *from = (const unsigned char *)vfrom;
2332     unsigned char *to = (unsigned char *)vto;
2333 
2334     PERL_ARGS_ASSERT_MY_BCOPY;
2335 
2336     if (from - to >= 0) {
2337 	while (len--)
2338 	    *to++ = *from++;
2339     }
2340     else {
2341 	to += len;
2342 	from += len;
2343 	while (len--)
2344 	    *(--to) = *(--from);
2345     }
2346 #endif
2347 
2348     return vto;
2349 }
2350 #endif
2351 
2352 /* this is a drop-in replacement for memset() */
2353 #ifndef HAS_MEMSET
2354 void *
2355 Perl_my_memset(void *vloc, int ch, size_t len)
2356 {
2357     unsigned char *loc = (unsigned char *)vloc;
2358 
2359     PERL_ARGS_ASSERT_MY_MEMSET;
2360 
2361     while (len--)
2362 	*loc++ = ch;
2363     return vloc;
2364 }
2365 #endif
2366 
2367 /* this is a drop-in replacement for bzero() */
2368 #if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
2369 void *
2370 Perl_my_bzero(void *vloc, size_t len)
2371 {
2372     unsigned char *loc = (unsigned char *)vloc;
2373 
2374     PERL_ARGS_ASSERT_MY_BZERO;
2375 
2376     while (len--)
2377 	*loc++ = 0;
2378     return vloc;
2379 }
2380 #endif
2381 
2382 /* this is a drop-in replacement for memcmp() */
2383 #if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
2384 int
2385 Perl_my_memcmp(const void *vs1, const void *vs2, size_t len)
2386 {
2387     const U8 *a = (const U8 *)vs1;
2388     const U8 *b = (const U8 *)vs2;
2389     int tmp;
2390 
2391     PERL_ARGS_ASSERT_MY_MEMCMP;
2392 
2393     while (len--) {
2394         if ((tmp = *a++ - *b++))
2395 	    return tmp;
2396     }
2397     return 0;
2398 }
2399 #endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
2400 
2401 #ifndef HAS_VPRINTF
2402 /* This vsprintf replacement should generally never get used, since
2403    vsprintf was available in both System V and BSD 2.11.  (There may
2404    be some cross-compilation or embedded set-ups where it is needed,
2405    however.)
2406 
2407    If you encounter a problem in this function, it's probably a symptom
2408    that Configure failed to detect your system's vprintf() function.
2409    See the section on "item vsprintf" in the INSTALL file.
2410 
2411    This version may compile on systems with BSD-ish <stdio.h>,
2412    but probably won't on others.
2413 */
2414 
2415 #ifdef USE_CHAR_VSPRINTF
2416 char *
2417 #else
2418 int
2419 #endif
2420 vsprintf(char *dest, const char *pat, void *args)
2421 {
2422     FILE fakebuf;
2423 
2424 #if defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
2425     FILE_ptr(&fakebuf) = (STDCHAR *) dest;
2426     FILE_cnt(&fakebuf) = 32767;
2427 #else
2428     /* These probably won't compile -- If you really need
2429        this, you'll have to figure out some other method. */
2430     fakebuf._ptr = dest;
2431     fakebuf._cnt = 32767;
2432 #endif
2433 #ifndef _IOSTRG
2434 #define _IOSTRG 0
2435 #endif
2436     fakebuf._flag = _IOWRT|_IOSTRG;
2437     _doprnt(pat, args, &fakebuf);	/* what a kludge */
2438 #if defined(STDIO_PTR_LVALUE)
2439     *(FILE_ptr(&fakebuf)++) = '\0';
2440 #else
2441     /* PerlIO has probably #defined away fputc, but we want it here. */
2442 #  ifdef fputc
2443 #    undef fputc  /* XXX Should really restore it later */
2444 #  endif
2445     (void)fputc('\0', &fakebuf);
2446 #endif
2447 #ifdef USE_CHAR_VSPRINTF
2448     return(dest);
2449 #else
2450     return 0;		/* perl doesn't use return value */
2451 #endif
2452 }
2453 
2454 #endif /* HAS_VPRINTF */
2455 
2456 PerlIO *
2457 Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
2458 {
2459 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(OS2) && !defined(VMS) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2460     int p[2];
2461     I32 This, that;
2462     Pid_t pid;
2463     SV *sv;
2464     I32 did_pipes = 0;
2465     int pp[2];
2466 
2467     PERL_ARGS_ASSERT_MY_POPEN_LIST;
2468 
2469     PERL_FLUSHALL_FOR_CHILD;
2470     This = (*mode == 'w');
2471     that = !This;
2472     if (TAINTING_get) {
2473 	taint_env();
2474 	taint_proper("Insecure %s%s", "EXEC");
2475     }
2476     if (PerlProc_pipe(p) < 0)
2477 	return NULL;
2478     /* Try for another pipe pair for error return */
2479     if (PerlProc_pipe(pp) >= 0)
2480 	did_pipes = 1;
2481     while ((pid = PerlProc_fork()) < 0) {
2482 	if (errno != EAGAIN) {
2483 	    PerlLIO_close(p[This]);
2484 	    PerlLIO_close(p[that]);
2485 	    if (did_pipes) {
2486 		PerlLIO_close(pp[0]);
2487 		PerlLIO_close(pp[1]);
2488 	    }
2489 	    return NULL;
2490 	}
2491 	Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2492 	sleep(5);
2493     }
2494     if (pid == 0) {
2495 	/* Child */
2496 #undef THIS
2497 #undef THAT
2498 #define THIS that
2499 #define THAT This
2500 	/* Close parent's end of error status pipe (if any) */
2501 	if (did_pipes) {
2502 	    PerlLIO_close(pp[0]);
2503 #if defined(HAS_FCNTL) && defined(F_SETFD) && defined(FD_CLOEXEC)
2504 	    /* Close error pipe automatically if exec works */
2505 	    if (fcntl(pp[1], F_SETFD, FD_CLOEXEC) < 0)
2506                 return NULL;
2507 #endif
2508 	}
2509 	/* Now dup our end of _the_ pipe to right position */
2510 	if (p[THIS] != (*mode == 'r')) {
2511 	    PerlLIO_dup2(p[THIS], *mode == 'r');
2512 	    PerlLIO_close(p[THIS]);
2513 	    if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2514 		PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2515 	}
2516 	else
2517 	    PerlLIO_close(p[THAT]);	/* close parent's end of _the_ pipe */
2518 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2519 	/* No automatic close - do it by hand */
2520 #  ifndef NOFILE
2521 #  define NOFILE 20
2522 #  endif
2523 	{
2524 	    int fd;
2525 
2526 	    for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
2527 		if (fd != pp[1])
2528 		    PerlLIO_close(fd);
2529 	    }
2530 	}
2531 #endif
2532 	do_aexec5(NULL, args-1, args-1+n, pp[1], did_pipes);
2533 	PerlProc__exit(1);
2534 #undef THIS
2535 #undef THAT
2536     }
2537     /* Parent */
2538     do_execfree();	/* free any memory malloced by child on fork */
2539     if (did_pipes)
2540 	PerlLIO_close(pp[1]);
2541     /* Keep the lower of the two fd numbers */
2542     if (p[that] < p[This]) {
2543 	PerlLIO_dup2(p[This], p[that]);
2544 	PerlLIO_close(p[This]);
2545 	p[This] = p[that];
2546     }
2547     else
2548 	PerlLIO_close(p[that]);		/* close child's end of pipe */
2549 
2550     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2551     SvUPGRADE(sv,SVt_IV);
2552     SvIV_set(sv, pid);
2553     PL_forkprocess = pid;
2554     /* If we managed to get status pipe check for exec fail */
2555     if (did_pipes && pid > 0) {
2556 	int errkid;
2557 	unsigned n = 0;
2558 	SSize_t n1;
2559 
2560 	while (n < sizeof(int)) {
2561 	    n1 = PerlLIO_read(pp[0],
2562 			      (void*)(((char*)&errkid)+n),
2563 			      (sizeof(int)) - n);
2564 	    if (n1 <= 0)
2565 		break;
2566 	    n += n1;
2567 	}
2568 	PerlLIO_close(pp[0]);
2569 	did_pipes = 0;
2570 	if (n) {			/* Error */
2571 	    int pid2, status;
2572 	    PerlLIO_close(p[This]);
2573 	    if (n != sizeof(int))
2574 		Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2575 	    do {
2576 		pid2 = wait4pid(pid, &status, 0);
2577 	    } while (pid2 == -1 && errno == EINTR);
2578 	    errno = errkid;		/* Propagate errno from kid */
2579 	    return NULL;
2580 	}
2581     }
2582     if (did_pipes)
2583 	 PerlLIO_close(pp[0]);
2584     return PerlIO_fdopen(p[This], mode);
2585 #else
2586 #  if defined(OS2)	/* Same, without fork()ing and all extra overhead... */
2587     return my_syspopen4(aTHX_ NULL, mode, n, args);
2588 #  elif defined(WIN32)
2589     return win32_popenlist(mode, n, args);
2590 #  else
2591     Perl_croak(aTHX_ "List form of piped open not implemented");
2592     return (PerlIO *) NULL;
2593 #  endif
2594 #endif
2595 }
2596 
2597     /* VMS' my_popen() is in VMS.c, same with OS/2 and AmigaOS 4. */
2598 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
2599 PerlIO *
2600 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2601 {
2602     int p[2];
2603     I32 This, that;
2604     Pid_t pid;
2605     SV *sv;
2606     const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
2607     I32 did_pipes = 0;
2608     int pp[2];
2609 
2610     PERL_ARGS_ASSERT_MY_POPEN;
2611 
2612     PERL_FLUSHALL_FOR_CHILD;
2613 #ifdef OS2
2614     if (doexec) {
2615 	return my_syspopen(aTHX_ cmd,mode);
2616     }
2617 #endif
2618     This = (*mode == 'w');
2619     that = !This;
2620     if (doexec && TAINTING_get) {
2621 	taint_env();
2622 	taint_proper("Insecure %s%s", "EXEC");
2623     }
2624     if (PerlProc_pipe(p) < 0)
2625 	return NULL;
2626     if (doexec && PerlProc_pipe(pp) >= 0)
2627 	did_pipes = 1;
2628     while ((pid = PerlProc_fork()) < 0) {
2629 	if (errno != EAGAIN) {
2630 	    PerlLIO_close(p[This]);
2631 	    PerlLIO_close(p[that]);
2632 	    if (did_pipes) {
2633 		PerlLIO_close(pp[0]);
2634 		PerlLIO_close(pp[1]);
2635 	    }
2636 	    if (!doexec)
2637 		Perl_croak(aTHX_ "Can't fork: %s", Strerror(errno));
2638 	    return NULL;
2639 	}
2640 	Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2641 	sleep(5);
2642     }
2643     if (pid == 0) {
2644 
2645 #undef THIS
2646 #undef THAT
2647 #define THIS that
2648 #define THAT This
2649 	if (did_pipes) {
2650 	    PerlLIO_close(pp[0]);
2651 #if defined(HAS_FCNTL) && defined(F_SETFD)
2652             if (fcntl(pp[1], F_SETFD, FD_CLOEXEC) < 0)
2653                 return NULL;
2654 #endif
2655 	}
2656 	if (p[THIS] != (*mode == 'r')) {
2657 	    PerlLIO_dup2(p[THIS], *mode == 'r');
2658 	    PerlLIO_close(p[THIS]);
2659 	    if (p[THAT] != (*mode == 'r'))	/* if dup2() didn't close it */
2660 		PerlLIO_close(p[THAT]);
2661 	}
2662 	else
2663 	    PerlLIO_close(p[THAT]);
2664 #ifndef OS2
2665 	if (doexec) {
2666 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2667 #ifndef NOFILE
2668 #define NOFILE 20
2669 #endif
2670 	    {
2671 		int fd;
2672 
2673 		for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2674 		    if (fd != pp[1])
2675 			PerlLIO_close(fd);
2676 	    }
2677 #endif
2678 	    /* may or may not use the shell */
2679 	    do_exec3(cmd, pp[1], did_pipes);
2680 	    PerlProc__exit(1);
2681 	}
2682 #endif	/* defined OS2 */
2683 
2684 #ifdef PERLIO_USING_CRLF
2685    /* Since we circumvent IO layers when we manipulate low-level
2686       filedescriptors directly, need to manually switch to the
2687       default, binary, low-level mode; see PerlIOBuf_open(). */
2688    PerlLIO_setmode((*mode == 'r'), O_BINARY);
2689 #endif
2690 	PL_forkprocess = 0;
2691 #ifdef PERL_USES_PL_PIDSTATUS
2692 	hv_clear(PL_pidstatus);	/* we have no children */
2693 #endif
2694 	return NULL;
2695 #undef THIS
2696 #undef THAT
2697     }
2698     do_execfree();	/* free any memory malloced by child on vfork */
2699     if (did_pipes)
2700 	PerlLIO_close(pp[1]);
2701     if (p[that] < p[This]) {
2702 	PerlLIO_dup2(p[This], p[that]);
2703 	PerlLIO_close(p[This]);
2704 	p[This] = p[that];
2705     }
2706     else
2707 	PerlLIO_close(p[that]);
2708 
2709     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2710     SvUPGRADE(sv,SVt_IV);
2711     SvIV_set(sv, pid);
2712     PL_forkprocess = pid;
2713     if (did_pipes && pid > 0) {
2714 	int errkid;
2715 	unsigned n = 0;
2716 	SSize_t n1;
2717 
2718 	while (n < sizeof(int)) {
2719 	    n1 = PerlLIO_read(pp[0],
2720 			      (void*)(((char*)&errkid)+n),
2721 			      (sizeof(int)) - n);
2722 	    if (n1 <= 0)
2723 		break;
2724 	    n += n1;
2725 	}
2726 	PerlLIO_close(pp[0]);
2727 	did_pipes = 0;
2728 	if (n) {			/* Error */
2729 	    int pid2, status;
2730 	    PerlLIO_close(p[This]);
2731 	    if (n != sizeof(int))
2732 		Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2733 	    do {
2734 		pid2 = wait4pid(pid, &status, 0);
2735 	    } while (pid2 == -1 && errno == EINTR);
2736 	    errno = errkid;		/* Propagate errno from kid */
2737 	    return NULL;
2738 	}
2739     }
2740     if (did_pipes)
2741 	 PerlLIO_close(pp[0]);
2742     return PerlIO_fdopen(p[This], mode);
2743 }
2744 #else
2745 #if defined(DJGPP)
2746 FILE *djgpp_popen();
2747 PerlIO *
2748 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2749 {
2750     PERL_FLUSHALL_FOR_CHILD;
2751     /* Call system's popen() to get a FILE *, then import it.
2752        used 0 for 2nd parameter to PerlIO_importFILE;
2753        apparently not used
2754     */
2755     return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2756 }
2757 #else
2758 #if defined(__LIBCATAMOUNT__)
2759 PerlIO *
2760 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2761 {
2762     return NULL;
2763 }
2764 #endif
2765 #endif
2766 
2767 #endif /* !DOSISH */
2768 
2769 /* this is called in parent before the fork() */
2770 void
2771 Perl_atfork_lock(void)
2772 #if defined(USE_ITHREADS)
2773 #  ifdef USE_PERLIO
2774   PERL_TSA_ACQUIRE(PL_perlio_mutex)
2775 #  endif
2776 #  ifdef MYMALLOC
2777   PERL_TSA_ACQUIRE(PL_malloc_mutex)
2778 #  endif
2779   PERL_TSA_ACQUIRE(PL_op_mutex)
2780 #endif
2781 {
2782 #if defined(USE_ITHREADS)
2783     dVAR;
2784     /* locks must be held in locking order (if any) */
2785 #  ifdef USE_PERLIO
2786     MUTEX_LOCK(&PL_perlio_mutex);
2787 #  endif
2788 #  ifdef MYMALLOC
2789     MUTEX_LOCK(&PL_malloc_mutex);
2790 #  endif
2791     OP_REFCNT_LOCK;
2792 #endif
2793 }
2794 
2795 /* this is called in both parent and child after the fork() */
2796 void
2797 Perl_atfork_unlock(void)
2798 #if defined(USE_ITHREADS)
2799 #  ifdef USE_PERLIO
2800   PERL_TSA_RELEASE(PL_perlio_mutex)
2801 #  endif
2802 #  ifdef MYMALLOC
2803   PERL_TSA_RELEASE(PL_malloc_mutex)
2804 #  endif
2805   PERL_TSA_RELEASE(PL_op_mutex)
2806 #endif
2807 {
2808 #if defined(USE_ITHREADS)
2809     dVAR;
2810     /* locks must be released in same order as in atfork_lock() */
2811 #  ifdef USE_PERLIO
2812     MUTEX_UNLOCK(&PL_perlio_mutex);
2813 #  endif
2814 #  ifdef MYMALLOC
2815     MUTEX_UNLOCK(&PL_malloc_mutex);
2816 #  endif
2817     OP_REFCNT_UNLOCK;
2818 #endif
2819 }
2820 
2821 Pid_t
2822 Perl_my_fork(void)
2823 {
2824 #if defined(HAS_FORK)
2825     Pid_t pid;
2826 #if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
2827     atfork_lock();
2828     pid = fork();
2829     atfork_unlock();
2830 #else
2831     /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2832      * handlers elsewhere in the code */
2833     pid = fork();
2834 #endif
2835     return pid;
2836 #elif defined(__amigaos4__)
2837     return amigaos_fork();
2838 #else
2839     /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2840     Perl_croak_nocontext("fork() not available");
2841     return 0;
2842 #endif /* HAS_FORK */
2843 }
2844 
2845 #ifndef HAS_DUP2
2846 int
2847 dup2(int oldfd, int newfd)
2848 {
2849 #if defined(HAS_FCNTL) && defined(F_DUPFD)
2850     if (oldfd == newfd)
2851 	return oldfd;
2852     PerlLIO_close(newfd);
2853     return fcntl(oldfd, F_DUPFD, newfd);
2854 #else
2855 #define DUP2_MAX_FDS 256
2856     int fdtmp[DUP2_MAX_FDS];
2857     I32 fdx = 0;
2858     int fd;
2859 
2860     if (oldfd == newfd)
2861 	return oldfd;
2862     PerlLIO_close(newfd);
2863     /* good enough for low fd's... */
2864     while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
2865 	if (fdx >= DUP2_MAX_FDS) {
2866 	    PerlLIO_close(fd);
2867 	    fd = -1;
2868 	    break;
2869 	}
2870 	fdtmp[fdx++] = fd;
2871     }
2872     while (fdx > 0)
2873 	PerlLIO_close(fdtmp[--fdx]);
2874     return fd;
2875 #endif
2876 }
2877 #endif
2878 
2879 #ifndef PERL_MICRO
2880 #ifdef HAS_SIGACTION
2881 
2882 Sighandler_t
2883 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2884 {
2885     struct sigaction act, oact;
2886 
2887 #ifdef USE_ITHREADS
2888     dVAR;
2889     /* only "parent" interpreter can diddle signals */
2890     if (PL_curinterp != aTHX)
2891 	return (Sighandler_t) SIG_ERR;
2892 #endif
2893 
2894     act.sa_handler = (void(*)(int))handler;
2895     sigemptyset(&act.sa_mask);
2896     act.sa_flags = 0;
2897 #ifdef SA_RESTART
2898     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2899         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2900 #endif
2901 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2902     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2903 	act.sa_flags |= SA_NOCLDWAIT;
2904 #endif
2905     if (sigaction(signo, &act, &oact) == -1)
2906     	return (Sighandler_t) SIG_ERR;
2907     else
2908     	return (Sighandler_t) oact.sa_handler;
2909 }
2910 
2911 Sighandler_t
2912 Perl_rsignal_state(pTHX_ int signo)
2913 {
2914     struct sigaction oact;
2915     PERL_UNUSED_CONTEXT;
2916 
2917     if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
2918 	return (Sighandler_t) SIG_ERR;
2919     else
2920 	return (Sighandler_t) oact.sa_handler;
2921 }
2922 
2923 int
2924 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
2925 {
2926 #ifdef USE_ITHREADS
2927     dVAR;
2928 #endif
2929     struct sigaction act;
2930 
2931     PERL_ARGS_ASSERT_RSIGNAL_SAVE;
2932 
2933 #ifdef USE_ITHREADS
2934     /* only "parent" interpreter can diddle signals */
2935     if (PL_curinterp != aTHX)
2936 	return -1;
2937 #endif
2938 
2939     act.sa_handler = (void(*)(int))handler;
2940     sigemptyset(&act.sa_mask);
2941     act.sa_flags = 0;
2942 #ifdef SA_RESTART
2943     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2944         act.sa_flags |= SA_RESTART;	/* SVR4, 4.3+BSD */
2945 #endif
2946 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2947     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2948 	act.sa_flags |= SA_NOCLDWAIT;
2949 #endif
2950     return sigaction(signo, &act, save);
2951 }
2952 
2953 int
2954 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
2955 {
2956 #ifdef USE_ITHREADS
2957     dVAR;
2958 #endif
2959     PERL_UNUSED_CONTEXT;
2960 #ifdef USE_ITHREADS
2961     /* only "parent" interpreter can diddle signals */
2962     if (PL_curinterp != aTHX)
2963 	return -1;
2964 #endif
2965 
2966     return sigaction(signo, save, (struct sigaction *)NULL);
2967 }
2968 
2969 #else /* !HAS_SIGACTION */
2970 
2971 Sighandler_t
2972 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2973 {
2974 #if defined(USE_ITHREADS) && !defined(WIN32)
2975     /* only "parent" interpreter can diddle signals */
2976     if (PL_curinterp != aTHX)
2977 	return (Sighandler_t) SIG_ERR;
2978 #endif
2979 
2980     return PerlProc_signal(signo, handler);
2981 }
2982 
2983 static Signal_t
2984 sig_trap(int signo)
2985 {
2986     dVAR;
2987     PL_sig_trapped++;
2988 }
2989 
2990 Sighandler_t
2991 Perl_rsignal_state(pTHX_ int signo)
2992 {
2993     dVAR;
2994     Sighandler_t oldsig;
2995 
2996 #if defined(USE_ITHREADS) && !defined(WIN32)
2997     /* only "parent" interpreter can diddle signals */
2998     if (PL_curinterp != aTHX)
2999 	return (Sighandler_t) SIG_ERR;
3000 #endif
3001 
3002     PL_sig_trapped = 0;
3003     oldsig = PerlProc_signal(signo, sig_trap);
3004     PerlProc_signal(signo, oldsig);
3005     if (PL_sig_trapped)
3006 	PerlProc_kill(PerlProc_getpid(), signo);
3007     return oldsig;
3008 }
3009 
3010 int
3011 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
3012 {
3013 #if defined(USE_ITHREADS) && !defined(WIN32)
3014     /* only "parent" interpreter can diddle signals */
3015     if (PL_curinterp != aTHX)
3016 	return -1;
3017 #endif
3018     *save = PerlProc_signal(signo, handler);
3019     return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
3020 }
3021 
3022 int
3023 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
3024 {
3025 #if defined(USE_ITHREADS) && !defined(WIN32)
3026     /* only "parent" interpreter can diddle signals */
3027     if (PL_curinterp != aTHX)
3028 	return -1;
3029 #endif
3030     return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
3031 }
3032 
3033 #endif /* !HAS_SIGACTION */
3034 #endif /* !PERL_MICRO */
3035 
3036     /* VMS' my_pclose() is in VMS.c; same with OS/2 */
3037 #if (!defined(DOSISH) || defined(HAS_FORK)) && !defined(VMS) && !defined(__LIBCATAMOUNT__) && !defined(__amigaos4__)
3038 I32
3039 Perl_my_pclose(pTHX_ PerlIO *ptr)
3040 {
3041     int status;
3042     SV **svp;
3043     Pid_t pid;
3044     Pid_t pid2 = 0;
3045     bool close_failed;
3046     dSAVEDERRNO;
3047     const int fd = PerlIO_fileno(ptr);
3048     bool should_wait;
3049 
3050     svp = av_fetch(PL_fdpid,fd,TRUE);
3051     pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
3052     SvREFCNT_dec(*svp);
3053     *svp = NULL;
3054 
3055 #if defined(USE_PERLIO)
3056     /* Find out whether the refcount is low enough for us to wait for the
3057        child proc without blocking. */
3058     should_wait = PerlIOUnix_refcnt(fd) == 1 && pid > 0;
3059 #else
3060     should_wait = pid > 0;
3061 #endif
3062 
3063 #ifdef OS2
3064     if (pid == -1) {			/* Opened by popen. */
3065 	return my_syspclose(ptr);
3066     }
3067 #endif
3068     close_failed = (PerlIO_close(ptr) == EOF);
3069     SAVE_ERRNO;
3070     if (should_wait) do {
3071 	pid2 = wait4pid(pid, &status, 0);
3072     } while (pid2 == -1 && errno == EINTR);
3073     if (close_failed) {
3074 	RESTORE_ERRNO;
3075 	return -1;
3076     }
3077     return(
3078       should_wait
3079        ? pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status)
3080        : 0
3081     );
3082 }
3083 #else
3084 #if defined(__LIBCATAMOUNT__)
3085 I32
3086 Perl_my_pclose(pTHX_ PerlIO *ptr)
3087 {
3088     return -1;
3089 }
3090 #endif
3091 #endif /* !DOSISH */
3092 
3093 #if  (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(__LIBCATAMOUNT__)
3094 I32
3095 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
3096 {
3097     I32 result = 0;
3098     PERL_ARGS_ASSERT_WAIT4PID;
3099 #ifdef PERL_USES_PL_PIDSTATUS
3100     if (!pid) {
3101         /* PERL_USES_PL_PIDSTATUS is only defined when neither
3102            waitpid() nor wait4() is available, or on OS/2, which
3103            doesn't appear to support waiting for a progress group
3104            member, so we can only treat a 0 pid as an unknown child.
3105         */
3106         errno = ECHILD;
3107         return -1;
3108     }
3109     {
3110 	if (pid > 0) {
3111 	    /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
3112 	       pid, rather than a string form.  */
3113 	    SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
3114 	    if (svp && *svp != &PL_sv_undef) {
3115 		*statusp = SvIVX(*svp);
3116 		(void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
3117 				G_DISCARD);
3118 		return pid;
3119 	    }
3120 	}
3121 	else {
3122 	    HE *entry;
3123 
3124 	    hv_iterinit(PL_pidstatus);
3125 	    if ((entry = hv_iternext(PL_pidstatus))) {
3126 		SV * const sv = hv_iterval(PL_pidstatus,entry);
3127 		I32 len;
3128 		const char * const spid = hv_iterkey(entry,&len);
3129 
3130 		assert (len == sizeof(Pid_t));
3131 		memcpy((char *)&pid, spid, len);
3132 		*statusp = SvIVX(sv);
3133 		/* The hash iterator is currently on this entry, so simply
3134 		   calling hv_delete would trigger the lazy delete, which on
3135 		   aggregate does more work, because next call to hv_iterinit()
3136 		   would spot the flag, and have to call the delete routine,
3137 		   while in the meantime any new entries can't re-use that
3138 		   memory.  */
3139 		hv_iterinit(PL_pidstatus);
3140 		(void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
3141 		return pid;
3142 	    }
3143 	}
3144     }
3145 #endif
3146 #ifdef HAS_WAITPID
3147 #  ifdef HAS_WAITPID_RUNTIME
3148     if (!HAS_WAITPID_RUNTIME)
3149 	goto hard_way;
3150 #  endif
3151     result = PerlProc_waitpid(pid,statusp,flags);
3152     goto finish;
3153 #endif
3154 #if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
3155     result = wait4(pid,statusp,flags,NULL);
3156     goto finish;
3157 #endif
3158 #ifdef PERL_USES_PL_PIDSTATUS
3159 #if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
3160   hard_way:
3161 #endif
3162     {
3163 	if (flags)
3164 	    Perl_croak(aTHX_ "Can't do waitpid with flags");
3165 	else {
3166 	    while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
3167 		pidgone(result,*statusp);
3168 	    if (result < 0)
3169 		*statusp = -1;
3170 	}
3171     }
3172 #endif
3173 #if defined(HAS_WAITPID) || defined(HAS_WAIT4)
3174   finish:
3175 #endif
3176     if (result < 0 && errno == EINTR) {
3177 	PERL_ASYNC_CHECK();
3178 	errno = EINTR; /* reset in case a signal handler changed $! */
3179     }
3180     return result;
3181 }
3182 #endif /* !DOSISH || OS2 || WIN32 || NETWARE */
3183 
3184 #ifdef PERL_USES_PL_PIDSTATUS
3185 void
3186 S_pidgone(pTHX_ Pid_t pid, int status)
3187 {
3188     SV *sv;
3189 
3190     sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
3191     SvUPGRADE(sv,SVt_IV);
3192     SvIV_set(sv, status);
3193     return;
3194 }
3195 #endif
3196 
3197 #if defined(OS2)
3198 int pclose();
3199 #ifdef HAS_FORK
3200 int					/* Cannot prototype with I32
3201 					   in os2ish.h. */
3202 my_syspclose(PerlIO *ptr)
3203 #else
3204 I32
3205 Perl_my_pclose(pTHX_ PerlIO *ptr)
3206 #endif
3207 {
3208     /* Needs work for PerlIO ! */
3209     FILE * const f = PerlIO_findFILE(ptr);
3210     const I32 result = pclose(f);
3211     PerlIO_releaseFILE(ptr,f);
3212     return result;
3213 }
3214 #endif
3215 
3216 #if defined(DJGPP)
3217 int djgpp_pclose();
3218 I32
3219 Perl_my_pclose(pTHX_ PerlIO *ptr)
3220 {
3221     /* Needs work for PerlIO ! */
3222     FILE * const f = PerlIO_findFILE(ptr);
3223     I32 result = djgpp_pclose(f);
3224     result = (result << 8) & 0xff00;
3225     PerlIO_releaseFILE(ptr,f);
3226     return result;
3227 }
3228 #endif
3229 
3230 #define PERL_REPEATCPY_LINEAR 4
3231 void
3232 Perl_repeatcpy(char *to, const char *from, I32 len, IV count)
3233 {
3234     PERL_ARGS_ASSERT_REPEATCPY;
3235 
3236     assert(len >= 0);
3237 
3238     if (count < 0)
3239 	croak_memory_wrap();
3240 
3241     if (len == 1)
3242 	memset(to, *from, count);
3243     else if (count) {
3244 	char *p = to;
3245 	IV items, linear, half;
3246 
3247 	linear = count < PERL_REPEATCPY_LINEAR ? count : PERL_REPEATCPY_LINEAR;
3248 	for (items = 0; items < linear; ++items) {
3249 	    const char *q = from;
3250 	    IV todo;
3251 	    for (todo = len; todo > 0; todo--)
3252 		*p++ = *q++;
3253         }
3254 
3255 	half = count / 2;
3256 	while (items <= half) {
3257 	    IV size = items * len;
3258 	    memcpy(p, to, size);
3259 	    p     += size;
3260 	    items *= 2;
3261 	}
3262 
3263 	if (count > items)
3264 	    memcpy(p, to, (count - items) * len);
3265     }
3266 }
3267 
3268 #ifndef HAS_RENAME
3269 I32
3270 Perl_same_dirent(pTHX_ const char *a, const char *b)
3271 {
3272     char *fa = strrchr(a,'/');
3273     char *fb = strrchr(b,'/');
3274     Stat_t tmpstatbuf1;
3275     Stat_t tmpstatbuf2;
3276     SV * const tmpsv = sv_newmortal();
3277 
3278     PERL_ARGS_ASSERT_SAME_DIRENT;
3279 
3280     if (fa)
3281 	fa++;
3282     else
3283 	fa = a;
3284     if (fb)
3285 	fb++;
3286     else
3287 	fb = b;
3288     if (strNE(a,b))
3289 	return FALSE;
3290     if (fa == a)
3291 	sv_setpvs(tmpsv, ".");
3292     else
3293 	sv_setpvn(tmpsv, a, fa - a);
3294     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
3295 	return FALSE;
3296     if (fb == b)
3297 	sv_setpvs(tmpsv, ".");
3298     else
3299 	sv_setpvn(tmpsv, b, fb - b);
3300     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
3301 	return FALSE;
3302     return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
3303 	   tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
3304 }
3305 #endif /* !HAS_RENAME */
3306 
3307 char*
3308 Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
3309 		 const char *const *const search_ext, I32 flags)
3310 {
3311     const char *xfound = NULL;
3312     char *xfailed = NULL;
3313     char tmpbuf[MAXPATHLEN];
3314     char *s;
3315     I32 len = 0;
3316     int retval;
3317     char *bufend;
3318 #if defined(DOSISH) && !defined(OS2)
3319 #  define SEARCH_EXTS ".bat", ".cmd", NULL
3320 #  define MAX_EXT_LEN 4
3321 #endif
3322 #ifdef OS2
3323 #  define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
3324 #  define MAX_EXT_LEN 4
3325 #endif
3326 #ifdef VMS
3327 #  define SEARCH_EXTS ".pl", ".com", NULL
3328 #  define MAX_EXT_LEN 4
3329 #endif
3330     /* additional extensions to try in each dir if scriptname not found */
3331 #ifdef SEARCH_EXTS
3332     static const char *const exts[] = { SEARCH_EXTS };
3333     const char *const *const ext = search_ext ? search_ext : exts;
3334     int extidx = 0, i = 0;
3335     const char *curext = NULL;
3336 #else
3337     PERL_UNUSED_ARG(search_ext);
3338 #  define MAX_EXT_LEN 0
3339 #endif
3340 
3341     PERL_ARGS_ASSERT_FIND_SCRIPT;
3342 
3343     /*
3344      * If dosearch is true and if scriptname does not contain path
3345      * delimiters, search the PATH for scriptname.
3346      *
3347      * If SEARCH_EXTS is also defined, will look for each
3348      * scriptname{SEARCH_EXTS} whenever scriptname is not found
3349      * while searching the PATH.
3350      *
3351      * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
3352      * proceeds as follows:
3353      *   If DOSISH or VMSISH:
3354      *     + look for ./scriptname{,.foo,.bar}
3355      *     + search the PATH for scriptname{,.foo,.bar}
3356      *
3357      *   If !DOSISH:
3358      *     + look *only* in the PATH for scriptname{,.foo,.bar} (note
3359      *       this will not look in '.' if it's not in the PATH)
3360      */
3361     tmpbuf[0] = '\0';
3362 
3363 #ifdef VMS
3364 #  ifdef ALWAYS_DEFTYPES
3365     len = strlen(scriptname);
3366     if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
3367 	int idx = 0, deftypes = 1;
3368 	bool seen_dot = 1;
3369 
3370 	const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != NULL);
3371 #  else
3372     if (dosearch) {
3373 	int idx = 0, deftypes = 1;
3374 	bool seen_dot = 1;
3375 
3376 	const int hasdir = (strpbrk(scriptname,":[</") != NULL);
3377 #  endif
3378 	/* The first time through, just add SEARCH_EXTS to whatever we
3379 	 * already have, so we can check for default file types. */
3380 	while (deftypes ||
3381 	       (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
3382 	{
3383 	    Stat_t statbuf;
3384 	    if (deftypes) {
3385 		deftypes = 0;
3386 		*tmpbuf = '\0';
3387 	    }
3388 	    if ((strlen(tmpbuf) + strlen(scriptname)
3389 		 + MAX_EXT_LEN) >= sizeof tmpbuf)
3390 		continue;	/* don't search dir with too-long name */
3391 	    my_strlcat(tmpbuf, scriptname, sizeof(tmpbuf));
3392 #else  /* !VMS */
3393 
3394 #ifdef DOSISH
3395     if (strEQ(scriptname, "-"))
3396  	dosearch = 0;
3397     if (dosearch) {		/* Look in '.' first. */
3398 	const char *cur = scriptname;
3399 #ifdef SEARCH_EXTS
3400 	if ((curext = strrchr(scriptname,'.')))	/* possible current ext */
3401 	    while (ext[i])
3402 		if (strEQ(ext[i++],curext)) {
3403 		    extidx = -1;		/* already has an ext */
3404 		    break;
3405 		}
3406 	do {
3407 #endif
3408 	    DEBUG_p(PerlIO_printf(Perl_debug_log,
3409 				  "Looking for %s\n",cur));
3410 	    {
3411 		Stat_t statbuf;
3412 		if (PerlLIO_stat(cur,&statbuf) >= 0
3413 		    && !S_ISDIR(statbuf.st_mode)) {
3414 		    dosearch = 0;
3415 		    scriptname = cur;
3416 #ifdef SEARCH_EXTS
3417 		    break;
3418 #endif
3419 		}
3420 	    }
3421 #ifdef SEARCH_EXTS
3422 	    if (cur == scriptname) {
3423 		len = strlen(scriptname);
3424 		if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
3425 		    break;
3426 		my_strlcpy(tmpbuf, scriptname, sizeof(tmpbuf));
3427 		cur = tmpbuf;
3428 	    }
3429 	} while (extidx >= 0 && ext[extidx]	/* try an extension? */
3430 		 && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len));
3431 #endif
3432     }
3433 #endif
3434 
3435     if (dosearch && !strchr(scriptname, '/')
3436 #ifdef DOSISH
3437 		 && !strchr(scriptname, '\\')
3438 #endif
3439 		 && (s = PerlEnv_getenv("PATH")))
3440     {
3441 	bool seen_dot = 0;
3442 
3443 	bufend = s + strlen(s);
3444 	while (s < bufend) {
3445 	    Stat_t statbuf;
3446 #  ifdef DOSISH
3447 	    for (len = 0; *s
3448 		    && *s != ';'; len++, s++) {
3449 		if (len < sizeof tmpbuf)
3450 		    tmpbuf[len] = *s;
3451 	    }
3452 	    if (len < sizeof tmpbuf)
3453 		tmpbuf[len] = '\0';
3454 #  else
3455 	    s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
3456 			':',
3457 			&len);
3458 #  endif
3459 	    if (s < bufend)
3460 		s++;
3461 	    if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
3462 		continue;	/* don't search dir with too-long name */
3463 	    if (len
3464 #  ifdef DOSISH
3465 		&& tmpbuf[len - 1] != '/'
3466 		&& tmpbuf[len - 1] != '\\'
3467 #  endif
3468 	       )
3469 		tmpbuf[len++] = '/';
3470 	    if (len == 2 && tmpbuf[0] == '.')
3471 		seen_dot = 1;
3472 	    (void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
3473 #endif  /* !VMS */
3474 
3475 #ifdef SEARCH_EXTS
3476 	    len = strlen(tmpbuf);
3477 	    if (extidx > 0)	/* reset after previous loop */
3478 		extidx = 0;
3479 	    do {
3480 #endif
3481 	    	DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3482 		retval = PerlLIO_stat(tmpbuf,&statbuf);
3483 		if (S_ISDIR(statbuf.st_mode)) {
3484 		    retval = -1;
3485 		}
3486 #ifdef SEARCH_EXTS
3487 	    } while (  retval < 0		/* not there */
3488 		    && extidx>=0 && ext[extidx]	/* try an extension? */
3489 		    && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len)
3490 		);
3491 #endif
3492 	    if (retval < 0)
3493 		continue;
3494 	    if (S_ISREG(statbuf.st_mode)
3495 		&& cando(S_IRUSR,TRUE,&statbuf)
3496 #if !defined(DOSISH)
3497 		&& cando(S_IXUSR,TRUE,&statbuf)
3498 #endif
3499 		)
3500 	    {
3501 		xfound = tmpbuf;		/* bingo! */
3502 		break;
3503 	    }
3504 	    if (!xfailed)
3505 		xfailed = savepv(tmpbuf);
3506 	}
3507 #ifndef DOSISH
3508 	{
3509 	    Stat_t statbuf;
3510 	    if (!xfound && !seen_dot && !xfailed &&
3511 		(PerlLIO_stat(scriptname,&statbuf) < 0
3512 		 || S_ISDIR(statbuf.st_mode)))
3513 #endif
3514 		seen_dot = 1;			/* Disable message. */
3515 #ifndef DOSISH
3516 	}
3517 #endif
3518 	if (!xfound) {
3519 	    if (flags & 1) {			/* do or die? */
3520 		/* diag_listed_as: Can't execute %s */
3521 		Perl_croak(aTHX_ "Can't %s %s%s%s",
3522 		      (xfailed ? "execute" : "find"),
3523 		      (xfailed ? xfailed : scriptname),
3524 		      (xfailed ? "" : " on PATH"),
3525 		      (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3526 	    }
3527 	    scriptname = NULL;
3528 	}
3529 	Safefree(xfailed);
3530 	scriptname = xfound;
3531     }
3532     return (scriptname ? savepv(scriptname) : NULL);
3533 }
3534 
3535 #ifndef PERL_GET_CONTEXT_DEFINED
3536 
3537 void *
3538 Perl_get_context(void)
3539 {
3540 #if defined(USE_ITHREADS)
3541     dVAR;
3542 #  ifdef OLD_PTHREADS_API
3543     pthread_addr_t t;
3544     int error = pthread_getspecific(PL_thr_key, &t)
3545     if (error)
3546 	Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error);
3547     return (void*)t;
3548 #  else
3549 #    ifdef I_MACH_CTHREADS
3550     return (void*)cthread_data(cthread_self());
3551 #    else
3552     return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3553 #    endif
3554 #  endif
3555 #else
3556     return (void*)NULL;
3557 #endif
3558 }
3559 
3560 void
3561 Perl_set_context(void *t)
3562 {
3563 #if defined(USE_ITHREADS)
3564     dVAR;
3565 #endif
3566     PERL_ARGS_ASSERT_SET_CONTEXT;
3567 #if defined(USE_ITHREADS)
3568 #  ifdef I_MACH_CTHREADS
3569     cthread_set_data(cthread_self(), t);
3570 #  else
3571     {
3572 	const int error = pthread_setspecific(PL_thr_key, t);
3573 	if (error)
3574 	    Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error);
3575     }
3576 #  endif
3577 #else
3578     PERL_UNUSED_ARG(t);
3579 #endif
3580 }
3581 
3582 #endif /* !PERL_GET_CONTEXT_DEFINED */
3583 
3584 #if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
3585 struct perl_vars *
3586 Perl_GetVars(pTHX)
3587 {
3588     PERL_UNUSED_CONTEXT;
3589     return &PL_Vars;
3590 }
3591 #endif
3592 
3593 char **
3594 Perl_get_op_names(pTHX)
3595 {
3596     PERL_UNUSED_CONTEXT;
3597     return (char **)PL_op_name;
3598 }
3599 
3600 char **
3601 Perl_get_op_descs(pTHX)
3602 {
3603     PERL_UNUSED_CONTEXT;
3604     return (char **)PL_op_desc;
3605 }
3606 
3607 const char *
3608 Perl_get_no_modify(pTHX)
3609 {
3610     PERL_UNUSED_CONTEXT;
3611     return PL_no_modify;
3612 }
3613 
3614 U32 *
3615 Perl_get_opargs(pTHX)
3616 {
3617     PERL_UNUSED_CONTEXT;
3618     return (U32 *)PL_opargs;
3619 }
3620 
3621 PPADDR_t*
3622 Perl_get_ppaddr(pTHX)
3623 {
3624     dVAR;
3625     PERL_UNUSED_CONTEXT;
3626     return (PPADDR_t*)PL_ppaddr;
3627 }
3628 
3629 #ifndef HAS_GETENV_LEN
3630 char *
3631 Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
3632 {
3633     char * const env_trans = PerlEnv_getenv(env_elem);
3634     PERL_UNUSED_CONTEXT;
3635     PERL_ARGS_ASSERT_GETENV_LEN;
3636     if (env_trans)
3637 	*len = strlen(env_trans);
3638     return env_trans;
3639 }
3640 #endif
3641 
3642 
3643 MGVTBL*
3644 Perl_get_vtbl(pTHX_ int vtbl_id)
3645 {
3646     PERL_UNUSED_CONTEXT;
3647 
3648     return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
3649 	? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id;
3650 }
3651 
3652 I32
3653 Perl_my_fflush_all(pTHX)
3654 {
3655 #if defined(USE_PERLIO) || defined(FFLUSH_NULL)
3656     return PerlIO_flush(NULL);
3657 #else
3658 # if defined(HAS__FWALK)
3659     extern int fflush(FILE *);
3660     /* undocumented, unprototyped, but very useful BSDism */
3661     extern void _fwalk(int (*)(FILE *));
3662     _fwalk(&fflush);
3663     return 0;
3664 # else
3665 #  if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
3666     long open_max = -1;
3667 #   ifdef PERL_FFLUSH_ALL_FOPEN_MAX
3668     open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
3669 #   else
3670 #    if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
3671     open_max = sysconf(_SC_OPEN_MAX);
3672 #     else
3673 #      ifdef FOPEN_MAX
3674     open_max = FOPEN_MAX;
3675 #      else
3676 #       ifdef OPEN_MAX
3677     open_max = OPEN_MAX;
3678 #       else
3679 #        ifdef _NFILE
3680     open_max = _NFILE;
3681 #        endif
3682 #       endif
3683 #      endif
3684 #     endif
3685 #    endif
3686     if (open_max > 0) {
3687       long i;
3688       for (i = 0; i < open_max; i++)
3689 	    if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3690 		STDIO_STREAM_ARRAY[i]._file < open_max &&
3691 		STDIO_STREAM_ARRAY[i]._flag)
3692 		PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
3693       return 0;
3694     }
3695 #  endif
3696     SETERRNO(EBADF,RMS_IFI);
3697     return EOF;
3698 # endif
3699 #endif
3700 }
3701 
3702 void
3703 Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
3704 {
3705     if (ckWARN(WARN_IO)) {
3706         HEK * const name
3707            = gv && (isGV_with_GP(gv))
3708                 ? GvENAME_HEK((gv))
3709                 : NULL;
3710 	const char * const direction = have == '>' ? "out" : "in";
3711 
3712 	if (name && HEK_LEN(name))
3713 	    Perl_warner(aTHX_ packWARN(WARN_IO),
3714 			"Filehandle %"HEKf" opened only for %sput",
3715 			HEKfARG(name), direction);
3716 	else
3717 	    Perl_warner(aTHX_ packWARN(WARN_IO),
3718 			"Filehandle opened only for %sput", direction);
3719     }
3720 }
3721 
3722 void
3723 Perl_report_evil_fh(pTHX_ const GV *gv)
3724 {
3725     const IO *io = gv ? GvIO(gv) : NULL;
3726     const PERL_BITFIELD16 op = PL_op->op_type;
3727     const char *vile;
3728     I32 warn_type;
3729 
3730     if (io && IoTYPE(io) == IoTYPE_CLOSED) {
3731 	vile = "closed";
3732 	warn_type = WARN_CLOSED;
3733     }
3734     else {
3735 	vile = "unopened";
3736 	warn_type = WARN_UNOPENED;
3737     }
3738 
3739     if (ckWARN(warn_type)) {
3740         SV * const name
3741             = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ?
3742                                      sv_2mortal(newSVhek(GvENAME_HEK(gv))) : NULL;
3743 	const char * const pars =
3744 	    (const char *)(OP_IS_FILETEST(op) ? "" : "()");
3745 	const char * const func =
3746 	    (const char *)
3747 	    (op == OP_READLINE || op == OP_RCATLINE
3748 				 ? "readline"  :	/* "<HANDLE>" not nice */
3749 	     op == OP_LEAVEWRITE ? "write" :		/* "write exit" not nice */
3750 	     PL_op_desc[op]);
3751 	const char * const type =
3752 	    (const char *)
3753 	    (OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET)
3754 	     ? "socket" : "filehandle");
3755 	const bool have_name = name && SvCUR(name);
3756 	Perl_warner(aTHX_ packWARN(warn_type),
3757 		   "%s%s on %s %s%s%"SVf, func, pars, vile, type,
3758 		    have_name ? " " : "",
3759 		    SVfARG(have_name ? name : &PL_sv_no));
3760 	if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3761 		Perl_warner(
3762 			    aTHX_ packWARN(warn_type),
3763 			"\t(Are you trying to call %s%s on dirhandle%s%"SVf"?)\n",
3764 			func, pars, have_name ? " " : "",
3765 			SVfARG(have_name ? name : &PL_sv_no)
3766 			    );
3767     }
3768 }
3769 
3770 /* To workaround core dumps from the uninitialised tm_zone we get the
3771  * system to give us a reasonable struct to copy.  This fix means that
3772  * strftime uses the tm_zone and tm_gmtoff values returned by
3773  * localtime(time()). That should give the desired result most of the
3774  * time. But probably not always!
3775  *
3776  * This does not address tzname aspects of NETaa14816.
3777  *
3778  */
3779 
3780 #ifdef __GLIBC__
3781 # ifndef STRUCT_TM_HASZONE
3782 #    define STRUCT_TM_HASZONE
3783 # endif
3784 #endif
3785 
3786 #ifdef STRUCT_TM_HASZONE /* Backward compat */
3787 # ifndef HAS_TM_TM_ZONE
3788 #    define HAS_TM_TM_ZONE
3789 # endif
3790 #endif
3791 
3792 void
3793 Perl_init_tm(pTHX_ struct tm *ptm)	/* see mktime, strftime and asctime */
3794 {
3795 #ifdef HAS_TM_TM_ZONE
3796     Time_t now;
3797     const struct tm* my_tm;
3798     PERL_UNUSED_CONTEXT;
3799     PERL_ARGS_ASSERT_INIT_TM;
3800     (void)time(&now);
3801     my_tm = localtime(&now);
3802     if (my_tm)
3803         Copy(my_tm, ptm, 1, struct tm);
3804 #else
3805     PERL_UNUSED_CONTEXT;
3806     PERL_ARGS_ASSERT_INIT_TM;
3807     PERL_UNUSED_ARG(ptm);
3808 #endif
3809 }
3810 
3811 /*
3812  * mini_mktime - normalise struct tm values without the localtime()
3813  * semantics (and overhead) of mktime().
3814  */
3815 void
3816 Perl_mini_mktime(struct tm *ptm)
3817 {
3818     int yearday;
3819     int secs;
3820     int month, mday, year, jday;
3821     int odd_cent, odd_year;
3822 
3823     PERL_ARGS_ASSERT_MINI_MKTIME;
3824 
3825 #define	DAYS_PER_YEAR	365
3826 #define	DAYS_PER_QYEAR	(4*DAYS_PER_YEAR+1)
3827 #define	DAYS_PER_CENT	(25*DAYS_PER_QYEAR-1)
3828 #define	DAYS_PER_QCENT	(4*DAYS_PER_CENT+1)
3829 #define	SECS_PER_HOUR	(60*60)
3830 #define	SECS_PER_DAY	(24*SECS_PER_HOUR)
3831 /* parentheses deliberately absent on these two, otherwise they don't work */
3832 #define	MONTH_TO_DAYS	153/5
3833 #define	DAYS_TO_MONTH	5/153
3834 /* offset to bias by March (month 4) 1st between month/mday & year finding */
3835 #define	YEAR_ADJUST	(4*MONTH_TO_DAYS+1)
3836 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3837 #define	WEEKDAY_BIAS	6	/* (1+6)%7 makes Sunday 0 again */
3838 
3839 /*
3840  * Year/day algorithm notes:
3841  *
3842  * With a suitable offset for numeric value of the month, one can find
3843  * an offset into the year by considering months to have 30.6 (153/5) days,
3844  * using integer arithmetic (i.e., with truncation).  To avoid too much
3845  * messing about with leap days, we consider January and February to be
3846  * the 13th and 14th month of the previous year.  After that transformation,
3847  * we need the month index we use to be high by 1 from 'normal human' usage,
3848  * so the month index values we use run from 4 through 15.
3849  *
3850  * Given that, and the rules for the Gregorian calendar (leap years are those
3851  * divisible by 4 unless also divisible by 100, when they must be divisible
3852  * by 400 instead), we can simply calculate the number of days since some
3853  * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3854  * the days we derive from our month index, and adding in the day of the
3855  * month.  The value used here is not adjusted for the actual origin which
3856  * it normally would use (1 January A.D. 1), since we're not exposing it.
3857  * We're only building the value so we can turn around and get the
3858  * normalised values for the year, month, day-of-month, and day-of-year.
3859  *
3860  * For going backward, we need to bias the value we're using so that we find
3861  * the right year value.  (Basically, we don't want the contribution of
3862  * March 1st to the number to apply while deriving the year).  Having done
3863  * that, we 'count up' the contribution to the year number by accounting for
3864  * full quadracenturies (400-year periods) with their extra leap days, plus
3865  * the contribution from full centuries (to avoid counting in the lost leap
3866  * days), plus the contribution from full quad-years (to count in the normal
3867  * leap days), plus the leftover contribution from any non-leap years.
3868  * At this point, if we were working with an actual leap day, we'll have 0
3869  * days left over.  This is also true for March 1st, however.  So, we have
3870  * to special-case that result, and (earlier) keep track of the 'odd'
3871  * century and year contributions.  If we got 4 extra centuries in a qcent,
3872  * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3873  * Otherwise, we add back in the earlier bias we removed (the 123 from
3874  * figuring in March 1st), find the month index (integer division by 30.6),
3875  * and the remainder is the day-of-month.  We then have to convert back to
3876  * 'real' months (including fixing January and February from being 14/15 in
3877  * the previous year to being in the proper year).  After that, to get
3878  * tm_yday, we work with the normalised year and get a new yearday value for
3879  * January 1st, which we subtract from the yearday value we had earlier,
3880  * representing the date we've re-built.  This is done from January 1
3881  * because tm_yday is 0-origin.
3882  *
3883  * Since POSIX time routines are only guaranteed to work for times since the
3884  * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3885  * applies Gregorian calendar rules even to dates before the 16th century
3886  * doesn't bother me.  Besides, you'd need cultural context for a given
3887  * date to know whether it was Julian or Gregorian calendar, and that's
3888  * outside the scope for this routine.  Since we convert back based on the
3889  * same rules we used to build the yearday, you'll only get strange results
3890  * for input which needed normalising, or for the 'odd' century years which
3891  * were leap years in the Julian calendar but not in the Gregorian one.
3892  * I can live with that.
3893  *
3894  * This algorithm also fails to handle years before A.D. 1 gracefully, but
3895  * that's still outside the scope for POSIX time manipulation, so I don't
3896  * care.
3897  */
3898 
3899     year = 1900 + ptm->tm_year;
3900     month = ptm->tm_mon;
3901     mday = ptm->tm_mday;
3902     jday = 0;
3903     if (month >= 2)
3904 	month+=2;
3905     else
3906 	month+=14, year--;
3907     yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3908     yearday += month*MONTH_TO_DAYS + mday + jday;
3909     /*
3910      * Note that we don't know when leap-seconds were or will be,
3911      * so we have to trust the user if we get something which looks
3912      * like a sensible leap-second.  Wild values for seconds will
3913      * be rationalised, however.
3914      */
3915     if ((unsigned) ptm->tm_sec <= 60) {
3916 	secs = 0;
3917     }
3918     else {
3919 	secs = ptm->tm_sec;
3920 	ptm->tm_sec = 0;
3921     }
3922     secs += 60 * ptm->tm_min;
3923     secs += SECS_PER_HOUR * ptm->tm_hour;
3924     if (secs < 0) {
3925 	if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3926 	    /* got negative remainder, but need positive time */
3927 	    /* back off an extra day to compensate */
3928 	    yearday += (secs/SECS_PER_DAY)-1;
3929 	    secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3930 	}
3931 	else {
3932 	    yearday += (secs/SECS_PER_DAY);
3933 	    secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3934 	}
3935     }
3936     else if (secs >= SECS_PER_DAY) {
3937 	yearday += (secs/SECS_PER_DAY);
3938 	secs %= SECS_PER_DAY;
3939     }
3940     ptm->tm_hour = secs/SECS_PER_HOUR;
3941     secs %= SECS_PER_HOUR;
3942     ptm->tm_min = secs/60;
3943     secs %= 60;
3944     ptm->tm_sec += secs;
3945     /* done with time of day effects */
3946     /*
3947      * The algorithm for yearday has (so far) left it high by 428.
3948      * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3949      * bias it by 123 while trying to figure out what year it
3950      * really represents.  Even with this tweak, the reverse
3951      * translation fails for years before A.D. 0001.
3952      * It would still fail for Feb 29, but we catch that one below.
3953      */
3954     jday = yearday;	/* save for later fixup vis-a-vis Jan 1 */
3955     yearday -= YEAR_ADJUST;
3956     year = (yearday / DAYS_PER_QCENT) * 400;
3957     yearday %= DAYS_PER_QCENT;
3958     odd_cent = yearday / DAYS_PER_CENT;
3959     year += odd_cent * 100;
3960     yearday %= DAYS_PER_CENT;
3961     year += (yearday / DAYS_PER_QYEAR) * 4;
3962     yearday %= DAYS_PER_QYEAR;
3963     odd_year = yearday / DAYS_PER_YEAR;
3964     year += odd_year;
3965     yearday %= DAYS_PER_YEAR;
3966     if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3967 	month = 1;
3968 	yearday = 29;
3969     }
3970     else {
3971 	yearday += YEAR_ADJUST;	/* recover March 1st crock */
3972 	month = yearday*DAYS_TO_MONTH;
3973 	yearday -= month*MONTH_TO_DAYS;
3974 	/* recover other leap-year adjustment */
3975 	if (month > 13) {
3976 	    month-=14;
3977 	    year++;
3978 	}
3979 	else {
3980 	    month-=2;
3981 	}
3982     }
3983     ptm->tm_year = year - 1900;
3984     if (yearday) {
3985       ptm->tm_mday = yearday;
3986       ptm->tm_mon = month;
3987     }
3988     else {
3989       ptm->tm_mday = 31;
3990       ptm->tm_mon = month - 1;
3991     }
3992     /* re-build yearday based on Jan 1 to get tm_yday */
3993     year--;
3994     yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
3995     yearday += 14*MONTH_TO_DAYS + 1;
3996     ptm->tm_yday = jday - yearday;
3997     ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
3998 }
3999 
4000 char *
4001 Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
4002 {
4003 #ifdef HAS_STRFTIME
4004 
4005   /* Note that yday and wday effectively are ignored by this function, as mini_mktime() overwrites them */
4006 
4007   char *buf;
4008   int buflen;
4009   struct tm mytm;
4010   int len;
4011 
4012   PERL_ARGS_ASSERT_MY_STRFTIME;
4013 
4014   init_tm(&mytm);	/* XXX workaround - see init_tm() above */
4015   mytm.tm_sec = sec;
4016   mytm.tm_min = min;
4017   mytm.tm_hour = hour;
4018   mytm.tm_mday = mday;
4019   mytm.tm_mon = mon;
4020   mytm.tm_year = year;
4021   mytm.tm_wday = wday;
4022   mytm.tm_yday = yday;
4023   mytm.tm_isdst = isdst;
4024   mini_mktime(&mytm);
4025   /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
4026 #if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
4027   STMT_START {
4028     struct tm mytm2;
4029     mytm2 = mytm;
4030     mktime(&mytm2);
4031 #ifdef HAS_TM_TM_GMTOFF
4032     mytm.tm_gmtoff = mytm2.tm_gmtoff;
4033 #endif
4034 #ifdef HAS_TM_TM_ZONE
4035     mytm.tm_zone = mytm2.tm_zone;
4036 #endif
4037   } STMT_END;
4038 #endif
4039   buflen = 64;
4040   Newx(buf, buflen, char);
4041 
4042   GCC_DIAG_IGNORE(-Wformat-nonliteral); /* fmt checked by caller */
4043   len = strftime(buf, buflen, fmt, &mytm);
4044   GCC_DIAG_RESTORE;
4045 
4046   /*
4047   ** The following is needed to handle to the situation where
4048   ** tmpbuf overflows.  Basically we want to allocate a buffer
4049   ** and try repeatedly.  The reason why it is so complicated
4050   ** is that getting a return value of 0 from strftime can indicate
4051   ** one of the following:
4052   ** 1. buffer overflowed,
4053   ** 2. illegal conversion specifier, or
4054   ** 3. the format string specifies nothing to be returned(not
4055   **	  an error).  This could be because format is an empty string
4056   **    or it specifies %p that yields an empty string in some locale.
4057   ** If there is a better way to make it portable, go ahead by
4058   ** all means.
4059   */
4060   if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
4061     return buf;
4062   else {
4063     /* Possibly buf overflowed - try again with a bigger buf */
4064     const int fmtlen = strlen(fmt);
4065     int bufsize = fmtlen + buflen;
4066 
4067     Renew(buf, bufsize, char);
4068     while (buf) {
4069 
4070       GCC_DIAG_IGNORE(-Wformat-nonliteral); /* fmt checked by caller */
4071       buflen = strftime(buf, bufsize, fmt, &mytm);
4072       GCC_DIAG_RESTORE;
4073 
4074       if (buflen > 0 && buflen < bufsize)
4075 	break;
4076       /* heuristic to prevent out-of-memory errors */
4077       if (bufsize > 100*fmtlen) {
4078 	Safefree(buf);
4079 	buf = NULL;
4080 	break;
4081       }
4082       bufsize *= 2;
4083       Renew(buf, bufsize, char);
4084     }
4085     return buf;
4086   }
4087 #else
4088   Perl_croak(aTHX_ "panic: no strftime");
4089   return NULL;
4090 #endif
4091 }
4092 
4093 
4094 #define SV_CWD_RETURN_UNDEF \
4095 sv_setsv(sv, &PL_sv_undef); \
4096 return FALSE
4097 
4098 #define SV_CWD_ISDOT(dp) \
4099     (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
4100 	(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
4101 
4102 /*
4103 =head1 Miscellaneous Functions
4104 
4105 =for apidoc getcwd_sv
4106 
4107 Fill C<sv> with current working directory
4108 
4109 =cut
4110 */
4111 
4112 /* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
4113  * rewritten again by dougm, optimized for use with xs TARG, and to prefer
4114  * getcwd(3) if available
4115  * Comments from the original:
4116  *     This is a faster version of getcwd.  It's also more dangerous
4117  *     because you might chdir out of a directory that you can't chdir
4118  *     back into. */
4119 
4120 int
4121 Perl_getcwd_sv(pTHX_ SV *sv)
4122 {
4123 #ifndef PERL_MICRO
4124     SvTAINTED_on(sv);
4125 
4126     PERL_ARGS_ASSERT_GETCWD_SV;
4127 
4128 #ifdef HAS_GETCWD
4129     {
4130 	char buf[MAXPATHLEN];
4131 
4132 	/* Some getcwd()s automatically allocate a buffer of the given
4133 	 * size from the heap if they are given a NULL buffer pointer.
4134 	 * The problem is that this behaviour is not portable. */
4135 	if (getcwd(buf, sizeof(buf) - 1)) {
4136 	    sv_setpv(sv, buf);
4137 	    return TRUE;
4138 	}
4139 	else {
4140 	    sv_setsv(sv, &PL_sv_undef);
4141 	    return FALSE;
4142 	}
4143     }
4144 
4145 #else
4146 
4147     Stat_t statbuf;
4148     int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4149     int pathlen=0;
4150     Direntry_t *dp;
4151 
4152     SvUPGRADE(sv, SVt_PV);
4153 
4154     if (PerlLIO_lstat(".", &statbuf) < 0) {
4155 	SV_CWD_RETURN_UNDEF;
4156     }
4157 
4158     orig_cdev = statbuf.st_dev;
4159     orig_cino = statbuf.st_ino;
4160     cdev = orig_cdev;
4161     cino = orig_cino;
4162 
4163     for (;;) {
4164 	DIR *dir;
4165 	int namelen;
4166 	odev = cdev;
4167 	oino = cino;
4168 
4169 	if (PerlDir_chdir("..") < 0) {
4170 	    SV_CWD_RETURN_UNDEF;
4171 	}
4172 	if (PerlLIO_stat(".", &statbuf) < 0) {
4173 	    SV_CWD_RETURN_UNDEF;
4174 	}
4175 
4176 	cdev = statbuf.st_dev;
4177 	cino = statbuf.st_ino;
4178 
4179 	if (odev == cdev && oino == cino) {
4180 	    break;
4181 	}
4182 	if (!(dir = PerlDir_open("."))) {
4183 	    SV_CWD_RETURN_UNDEF;
4184 	}
4185 
4186 	while ((dp = PerlDir_read(dir)) != NULL) {
4187 #ifdef DIRNAMLEN
4188 	    namelen = dp->d_namlen;
4189 #else
4190 	    namelen = strlen(dp->d_name);
4191 #endif
4192 	    /* skip . and .. */
4193 	    if (SV_CWD_ISDOT(dp)) {
4194 		continue;
4195 	    }
4196 
4197 	    if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
4198 		SV_CWD_RETURN_UNDEF;
4199 	    }
4200 
4201 	    tdev = statbuf.st_dev;
4202 	    tino = statbuf.st_ino;
4203 	    if (tino == oino && tdev == odev) {
4204 		break;
4205 	    }
4206 	}
4207 
4208 	if (!dp) {
4209 	    SV_CWD_RETURN_UNDEF;
4210 	}
4211 
4212 	if (pathlen + namelen + 1 >= MAXPATHLEN) {
4213 	    SV_CWD_RETURN_UNDEF;
4214 	}
4215 
4216 	SvGROW(sv, pathlen + namelen + 1);
4217 
4218 	if (pathlen) {
4219 	    /* shift down */
4220 	    Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
4221 	}
4222 
4223 	/* prepend current directory to the front */
4224 	*SvPVX(sv) = '/';
4225 	Move(dp->d_name, SvPVX(sv)+1, namelen, char);
4226 	pathlen += (namelen + 1);
4227 
4228 #ifdef VOID_CLOSEDIR
4229 	PerlDir_close(dir);
4230 #else
4231 	if (PerlDir_close(dir) < 0) {
4232 	    SV_CWD_RETURN_UNDEF;
4233 	}
4234 #endif
4235     }
4236 
4237     if (pathlen) {
4238 	SvCUR_set(sv, pathlen);
4239 	*SvEND(sv) = '\0';
4240 	SvPOK_only(sv);
4241 
4242 	if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
4243 	    SV_CWD_RETURN_UNDEF;
4244 	}
4245     }
4246     if (PerlLIO_stat(".", &statbuf) < 0) {
4247 	SV_CWD_RETURN_UNDEF;
4248     }
4249 
4250     cdev = statbuf.st_dev;
4251     cino = statbuf.st_ino;
4252 
4253     if (cdev != orig_cdev || cino != orig_cino) {
4254 	Perl_croak(aTHX_ "Unstable directory path, "
4255 		   "current directory changed unexpectedly");
4256     }
4257 
4258     return TRUE;
4259 #endif
4260 
4261 #else
4262     return FALSE;
4263 #endif
4264 }
4265 
4266 #include "vutil.c"
4267 
4268 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
4269 #   define EMULATE_SOCKETPAIR_UDP
4270 #endif
4271 
4272 #ifdef EMULATE_SOCKETPAIR_UDP
4273 static int
4274 S_socketpair_udp (int fd[2]) {
4275     dTHX;
4276     /* Fake a datagram socketpair using UDP to localhost.  */
4277     int sockets[2] = {-1, -1};
4278     struct sockaddr_in addresses[2];
4279     int i;
4280     Sock_size_t size = sizeof(struct sockaddr_in);
4281     unsigned short port;
4282     int got;
4283 
4284     memset(&addresses, 0, sizeof(addresses));
4285     i = 1;
4286     do {
4287 	sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4288 	if (sockets[i] == -1)
4289 	    goto tidy_up_and_fail;
4290 
4291 	addresses[i].sin_family = AF_INET;
4292 	addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4293 	addresses[i].sin_port = 0;	/* kernel choses port.  */
4294 	if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4295 		sizeof(struct sockaddr_in)) == -1)
4296 	    goto tidy_up_and_fail;
4297     } while (i--);
4298 
4299     /* Now have 2 UDP sockets. Find out which port each is connected to, and
4300        for each connect the other socket to it.  */
4301     i = 1;
4302     do {
4303 	if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4304 		&size) == -1)
4305 	    goto tidy_up_and_fail;
4306 	if (size != sizeof(struct sockaddr_in))
4307 	    goto abort_tidy_up_and_fail;
4308 	/* !1 is 0, !0 is 1 */
4309 	if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4310 		sizeof(struct sockaddr_in)) == -1)
4311 	    goto tidy_up_and_fail;
4312     } while (i--);
4313 
4314     /* Now we have 2 sockets connected to each other. I don't trust some other
4315        process not to have already sent a packet to us (by random) so send
4316        a packet from each to the other.  */
4317     i = 1;
4318     do {
4319 	/* I'm going to send my own port number.  As a short.
4320 	   (Who knows if someone somewhere has sin_port as a bitfield and needs
4321 	   this routine. (I'm assuming crays have socketpair)) */
4322 	port = addresses[i].sin_port;
4323 	got = PerlLIO_write(sockets[i], &port, sizeof(port));
4324 	if (got != sizeof(port)) {
4325 	    if (got == -1)
4326 		goto tidy_up_and_fail;
4327 	    goto abort_tidy_up_and_fail;
4328 	}
4329     } while (i--);
4330 
4331     /* Packets sent. I don't trust them to have arrived though.
4332        (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4333        connect to localhost will use a second kernel thread. In 2.6 the
4334        first thread running the connect() returns before the second completes,
4335        so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4336        returns 0. Poor programs have tripped up. One poor program's authors'
4337        had a 50-1 reverse stock split. Not sure how connected these were.)
4338        So I don't trust someone not to have an unpredictable UDP stack.
4339     */
4340 
4341     {
4342 	struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4343 	int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4344 	fd_set rset;
4345 
4346 	FD_ZERO(&rset);
4347 	FD_SET((unsigned int)sockets[0], &rset);
4348 	FD_SET((unsigned int)sockets[1], &rset);
4349 
4350 	got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4351 	if (got != 2 || !FD_ISSET(sockets[0], &rset)
4352 		|| !FD_ISSET(sockets[1], &rset)) {
4353 	    /* I hope this is portable and appropriate.  */
4354 	    if (got == -1)
4355 		goto tidy_up_and_fail;
4356 	    goto abort_tidy_up_and_fail;
4357 	}
4358     }
4359 
4360     /* And the paranoia department even now doesn't trust it to have arrive
4361        (hence MSG_DONTWAIT). Or that what arrives was sent by us.  */
4362     {
4363 	struct sockaddr_in readfrom;
4364 	unsigned short buffer[2];
4365 
4366 	i = 1;
4367 	do {
4368 #ifdef MSG_DONTWAIT
4369 	    got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4370 		    sizeof(buffer), MSG_DONTWAIT,
4371 		    (struct sockaddr *) &readfrom, &size);
4372 #else
4373 	    got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4374 		    sizeof(buffer), 0,
4375 		    (struct sockaddr *) &readfrom, &size);
4376 #endif
4377 
4378 	    if (got == -1)
4379 		goto tidy_up_and_fail;
4380 	    if (got != sizeof(port)
4381 		    || size != sizeof(struct sockaddr_in)
4382 		    /* Check other socket sent us its port.  */
4383 		    || buffer[0] != (unsigned short) addresses[!i].sin_port
4384 		    /* Check kernel says we got the datagram from that socket */
4385 		    || readfrom.sin_family != addresses[!i].sin_family
4386 		    || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4387 		    || readfrom.sin_port != addresses[!i].sin_port)
4388 		goto abort_tidy_up_and_fail;
4389 	} while (i--);
4390     }
4391     /* My caller (my_socketpair) has validated that this is non-NULL  */
4392     fd[0] = sockets[0];
4393     fd[1] = sockets[1];
4394     /* I hereby declare this connection open.  May God bless all who cross
4395        her.  */
4396     return 0;
4397 
4398   abort_tidy_up_and_fail:
4399     errno = ECONNABORTED;
4400   tidy_up_and_fail:
4401     {
4402 	dSAVE_ERRNO;
4403 	if (sockets[0] != -1)
4404 	    PerlLIO_close(sockets[0]);
4405 	if (sockets[1] != -1)
4406 	    PerlLIO_close(sockets[1]);
4407 	RESTORE_ERRNO;
4408 	return -1;
4409     }
4410 }
4411 #endif /*  EMULATE_SOCKETPAIR_UDP */
4412 
4413 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
4414 int
4415 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4416     /* Stevens says that family must be AF_LOCAL, protocol 0.
4417        I'm going to enforce that, then ignore it, and use TCP (or UDP).  */
4418     dTHXa(NULL);
4419     int listener = -1;
4420     int connector = -1;
4421     int acceptor = -1;
4422     struct sockaddr_in listen_addr;
4423     struct sockaddr_in connect_addr;
4424     Sock_size_t size;
4425 
4426     if (protocol
4427 #ifdef AF_UNIX
4428 	|| family != AF_UNIX
4429 #endif
4430     ) {
4431 	errno = EAFNOSUPPORT;
4432 	return -1;
4433     }
4434     if (!fd) {
4435 	errno = EINVAL;
4436 	return -1;
4437     }
4438 
4439 #ifdef EMULATE_SOCKETPAIR_UDP
4440     if (type == SOCK_DGRAM)
4441 	return S_socketpair_udp(fd);
4442 #endif
4443 
4444     aTHXa(PERL_GET_THX);
4445     listener = PerlSock_socket(AF_INET, type, 0);
4446     if (listener == -1)
4447 	return -1;
4448     memset(&listen_addr, 0, sizeof(listen_addr));
4449     listen_addr.sin_family = AF_INET;
4450     listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4451     listen_addr.sin_port = 0;	/* kernel choses port.  */
4452     if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4453 	    sizeof(listen_addr)) == -1)
4454 	goto tidy_up_and_fail;
4455     if (PerlSock_listen(listener, 1) == -1)
4456 	goto tidy_up_and_fail;
4457 
4458     connector = PerlSock_socket(AF_INET, type, 0);
4459     if (connector == -1)
4460 	goto tidy_up_and_fail;
4461     /* We want to find out the port number to connect to.  */
4462     size = sizeof(connect_addr);
4463     if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4464 	    &size) == -1)
4465 	goto tidy_up_and_fail;
4466     if (size != sizeof(connect_addr))
4467 	goto abort_tidy_up_and_fail;
4468     if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
4469 	    sizeof(connect_addr)) == -1)
4470 	goto tidy_up_and_fail;
4471 
4472     size = sizeof(listen_addr);
4473     acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4474 	    &size);
4475     if (acceptor == -1)
4476 	goto tidy_up_and_fail;
4477     if (size != sizeof(listen_addr))
4478 	goto abort_tidy_up_and_fail;
4479     PerlLIO_close(listener);
4480     /* Now check we are talking to ourself by matching port and host on the
4481        two sockets.  */
4482     if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4483 	    &size) == -1)
4484 	goto tidy_up_and_fail;
4485     if (size != sizeof(connect_addr)
4486 	    || listen_addr.sin_family != connect_addr.sin_family
4487 	    || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4488 	    || listen_addr.sin_port != connect_addr.sin_port) {
4489 	goto abort_tidy_up_and_fail;
4490     }
4491     fd[0] = connector;
4492     fd[1] = acceptor;
4493     return 0;
4494 
4495   abort_tidy_up_and_fail:
4496 #ifdef ECONNABORTED
4497   errno = ECONNABORTED;	/* This would be the standard thing to do. */
4498 #else
4499 #  ifdef ECONNREFUSED
4500   errno = ECONNREFUSED;	/* E.g. Symbian does not have ECONNABORTED. */
4501 #  else
4502   errno = ETIMEDOUT;	/* Desperation time. */
4503 #  endif
4504 #endif
4505   tidy_up_and_fail:
4506     {
4507 	dSAVE_ERRNO;
4508 	if (listener != -1)
4509 	    PerlLIO_close(listener);
4510 	if (connector != -1)
4511 	    PerlLIO_close(connector);
4512 	if (acceptor != -1)
4513 	    PerlLIO_close(acceptor);
4514 	RESTORE_ERRNO;
4515 	return -1;
4516     }
4517 }
4518 #else
4519 /* In any case have a stub so that there's code corresponding
4520  * to the my_socketpair in embed.fnc. */
4521 int
4522 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4523 #ifdef HAS_SOCKETPAIR
4524     return socketpair(family, type, protocol, fd);
4525 #else
4526     return -1;
4527 #endif
4528 }
4529 #endif
4530 
4531 /*
4532 
4533 =for apidoc sv_nosharing
4534 
4535 Dummy routine which "shares" an SV when there is no sharing module present.
4536 Or "locks" it.  Or "unlocks" it.  In other
4537 words, ignores its single SV argument.
4538 Exists to avoid test for a C<NULL> function pointer and because it could
4539 potentially warn under some level of strict-ness.
4540 
4541 =cut
4542 */
4543 
4544 void
4545 Perl_sv_nosharing(pTHX_ SV *sv)
4546 {
4547     PERL_UNUSED_CONTEXT;
4548     PERL_UNUSED_ARG(sv);
4549 }
4550 
4551 /*
4552 
4553 =for apidoc sv_destroyable
4554 
4555 Dummy routine which reports that object can be destroyed when there is no
4556 sharing module present.  It ignores its single SV argument, and returns
4557 'true'.  Exists to avoid test for a C<NULL> function pointer and because it
4558 could potentially warn under some level of strict-ness.
4559 
4560 =cut
4561 */
4562 
4563 bool
4564 Perl_sv_destroyable(pTHX_ SV *sv)
4565 {
4566     PERL_UNUSED_CONTEXT;
4567     PERL_UNUSED_ARG(sv);
4568     return TRUE;
4569 }
4570 
4571 U32
4572 Perl_parse_unicode_opts(pTHX_ const char **popt)
4573 {
4574   const char *p = *popt;
4575   U32 opt = 0;
4576 
4577   PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS;
4578 
4579   if (*p) {
4580        if (isDIGIT(*p)) {
4581             const char* endptr;
4582             UV uv;
4583             if (grok_atoUV(p, &uv, &endptr) && uv <= U32_MAX) {
4584                 opt = (U32)uv;
4585                 p = endptr;
4586                 if (p && *p && *p != '\n' && *p != '\r') {
4587                     if (isSPACE(*p))
4588                         goto the_end_of_the_opts_parser;
4589                     else
4590                         Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4591                 }
4592             }
4593             else {
4594                 Perl_croak(aTHX_ "Invalid number '%s' for -C option.\n", p);
4595             }
4596         }
4597         else {
4598 	    for (; *p; p++) {
4599 		 switch (*p) {
4600 		 case PERL_UNICODE_STDIN:
4601 		      opt |= PERL_UNICODE_STDIN_FLAG;	break;
4602 		 case PERL_UNICODE_STDOUT:
4603 		      opt |= PERL_UNICODE_STDOUT_FLAG;	break;
4604 		 case PERL_UNICODE_STDERR:
4605 		      opt |= PERL_UNICODE_STDERR_FLAG;	break;
4606 		 case PERL_UNICODE_STD:
4607 		      opt |= PERL_UNICODE_STD_FLAG;    	break;
4608 		 case PERL_UNICODE_IN:
4609 		      opt |= PERL_UNICODE_IN_FLAG;	break;
4610 		 case PERL_UNICODE_OUT:
4611 		      opt |= PERL_UNICODE_OUT_FLAG;	break;
4612 		 case PERL_UNICODE_INOUT:
4613 		      opt |= PERL_UNICODE_INOUT_FLAG;	break;
4614 		 case PERL_UNICODE_LOCALE:
4615 		      opt |= PERL_UNICODE_LOCALE_FLAG;	break;
4616 		 case PERL_UNICODE_ARGV:
4617 		      opt |= PERL_UNICODE_ARGV_FLAG;	break;
4618 		 case PERL_UNICODE_UTF8CACHEASSERT:
4619 		      opt |= PERL_UNICODE_UTF8CACHEASSERT_FLAG; break;
4620 		 default:
4621 		      if (*p != '\n' && *p != '\r') {
4622 			if(isSPACE(*p)) goto the_end_of_the_opts_parser;
4623 			else
4624 			  Perl_croak(aTHX_
4625 				     "Unknown Unicode option letter '%c'", *p);
4626 		      }
4627 		 }
4628 	    }
4629        }
4630   }
4631   else
4632        opt = PERL_UNICODE_DEFAULT_FLAGS;
4633 
4634   the_end_of_the_opts_parser:
4635 
4636   if (opt & ~PERL_UNICODE_ALL_FLAGS)
4637        Perl_croak(aTHX_ "Unknown Unicode option value %"UVuf,
4638 		  (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4639 
4640   *popt = p;
4641 
4642   return opt;
4643 }
4644 
4645 #ifdef VMS
4646 #  include <starlet.h>
4647 #endif
4648 
4649 U32
4650 Perl_seed(pTHX)
4651 {
4652 #if defined(__OpenBSD__)
4653 	return arc4random();
4654 #else
4655     /*
4656      * This is really just a quick hack which grabs various garbage
4657      * values.  It really should be a real hash algorithm which
4658      * spreads the effect of every input bit onto every output bit,
4659      * if someone who knows about such things would bother to write it.
4660      * Might be a good idea to add that function to CORE as well.
4661      * No numbers below come from careful analysis or anything here,
4662      * except they are primes and SEED_C1 > 1E6 to get a full-width
4663      * value from (tv_sec * SEED_C1 + tv_usec).  The multipliers should
4664      * probably be bigger too.
4665      */
4666 #if RANDBITS > 16
4667 #  define SEED_C1	1000003
4668 #define   SEED_C4	73819
4669 #else
4670 #  define SEED_C1	25747
4671 #define   SEED_C4	20639
4672 #endif
4673 #define   SEED_C2	3
4674 #define   SEED_C3	269
4675 #define   SEED_C5	26107
4676 
4677 #ifndef PERL_NO_DEV_RANDOM
4678     int fd;
4679 #endif
4680     U32 u;
4681 #ifdef HAS_GETTIMEOFDAY
4682     struct timeval when;
4683 #else
4684     Time_t when;
4685 #endif
4686 
4687 /* This test is an escape hatch, this symbol isn't set by Configure. */
4688 #ifndef PERL_NO_DEV_RANDOM
4689 #ifndef PERL_RANDOM_DEVICE
4690    /* /dev/random isn't used by default because reads from it will block
4691     * if there isn't enough entropy available.  You can compile with
4692     * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4693     * is enough real entropy to fill the seed. */
4694 #  ifdef __amigaos4__
4695 #    define PERL_RANDOM_DEVICE "RANDOM:SIZE=4"
4696 #  else
4697 #    define PERL_RANDOM_DEVICE "/dev/urandom"
4698 #  endif
4699 #endif
4700     fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
4701     if (fd != -1) {
4702     	if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
4703 	    u = 0;
4704 	PerlLIO_close(fd);
4705 	if (u)
4706 	    return u;
4707     }
4708 #endif
4709 
4710 #ifdef HAS_GETTIMEOFDAY
4711     PerlProc_gettimeofday(&when,NULL);
4712     u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4713 #else
4714     (void)time(&when);
4715     u = (U32)SEED_C1 * when;
4716 #endif
4717     u += SEED_C3 * (U32)PerlProc_getpid();
4718     u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4719 #ifndef PLAN9           /* XXX Plan9 assembler chokes on this; fix needed  */
4720     u += SEED_C5 * (U32)PTR2UV(&when);
4721 #endif
4722     return u;
4723 #endif
4724 }
4725 
4726 void
4727 Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer)
4728 {
4729     const char *env_pv;
4730     unsigned long i;
4731 
4732     PERL_ARGS_ASSERT_GET_HASH_SEED;
4733 
4734     env_pv= PerlEnv_getenv("PERL_HASH_SEED");
4735 
4736     if ( env_pv )
4737 #ifndef USE_HASH_SEED_EXPLICIT
4738     {
4739         /* ignore leading spaces */
4740         while (isSPACE(*env_pv))
4741             env_pv++;
4742 #ifdef USE_PERL_PERTURB_KEYS
4743         /* if they set it to "0" we disable key traversal randomization completely */
4744         if (strEQ(env_pv,"0")) {
4745             PL_hash_rand_bits_enabled= 0;
4746         } else {
4747             /* otherwise switch to deterministic mode */
4748             PL_hash_rand_bits_enabled= 2;
4749         }
4750 #endif
4751         /* ignore a leading 0x... if it is there */
4752         if (env_pv[0] == '0' && env_pv[1] == 'x')
4753             env_pv += 2;
4754 
4755         for( i = 0; isXDIGIT(*env_pv) && i < PERL_HASH_SEED_BYTES; i++ ) {
4756             seed_buffer[i] = READ_XDIGIT(env_pv) << 4;
4757             if ( isXDIGIT(*env_pv)) {
4758                 seed_buffer[i] |= READ_XDIGIT(env_pv);
4759             }
4760         }
4761         while (isSPACE(*env_pv))
4762             env_pv++;
4763 
4764         if (*env_pv && !isXDIGIT(*env_pv)) {
4765             Perl_warn(aTHX_ "perl: warning: Non hex character in '$ENV{PERL_HASH_SEED}', seed only partially set\n");
4766         }
4767         /* should we check for unparsed crap? */
4768         /* should we warn about unused hex? */
4769         /* should we warn about insufficient hex? */
4770     }
4771     else
4772 #endif
4773     {
4774         (void)seedDrand01((Rand_seed_t)seed());
4775 
4776         for( i = 0; i < PERL_HASH_SEED_BYTES; i++ ) {
4777             seed_buffer[i] = (unsigned char)(Drand01() * (U8_MAX+1));
4778         }
4779     }
4780 #ifdef USE_PERL_PERTURB_KEYS
4781     {   /* initialize PL_hash_rand_bits from the hash seed.
4782          * This value is highly volatile, it is updated every
4783          * hash insert, and is used as part of hash bucket chain
4784          * randomization and hash iterator randomization. */
4785         PL_hash_rand_bits= 0xbe49d17f; /* I just picked a number */
4786         for( i = 0; i < sizeof(UV) ; i++ ) {
4787             PL_hash_rand_bits += seed_buffer[i % PERL_HASH_SEED_BYTES];
4788             PL_hash_rand_bits = ROTL_UV(PL_hash_rand_bits,8);
4789         }
4790     }
4791     env_pv= PerlEnv_getenv("PERL_PERTURB_KEYS");
4792     if (env_pv) {
4793         if (strEQ(env_pv,"0") || strEQ(env_pv,"NO")) {
4794             PL_hash_rand_bits_enabled= 0;
4795         } else if (strEQ(env_pv,"1") || strEQ(env_pv,"RANDOM")) {
4796             PL_hash_rand_bits_enabled= 1;
4797         } else if (strEQ(env_pv,"2") || strEQ(env_pv,"DETERMINISTIC")) {
4798             PL_hash_rand_bits_enabled= 2;
4799         } else {
4800             Perl_warn(aTHX_ "perl: warning: strange setting in '$ENV{PERL_PERTURB_KEYS}': '%s'\n", env_pv);
4801         }
4802     }
4803 #endif
4804 }
4805 
4806 #ifdef PERL_GLOBAL_STRUCT
4807 
4808 #define PERL_GLOBAL_STRUCT_INIT
4809 #include "opcode.h" /* the ppaddr and check */
4810 
4811 struct perl_vars *
4812 Perl_init_global_struct(pTHX)
4813 {
4814     struct perl_vars *plvarsp = NULL;
4815 # ifdef PERL_GLOBAL_STRUCT
4816     const IV nppaddr = C_ARRAY_LENGTH(Gppaddr);
4817     const IV ncheck  = C_ARRAY_LENGTH(Gcheck);
4818     PERL_UNUSED_CONTEXT;
4819 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4820     /* PerlMem_malloc() because can't use even safesysmalloc() this early. */
4821     plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars));
4822     if (!plvarsp)
4823         exit(1);
4824 #  else
4825     plvarsp = PL_VarsPtr;
4826 #  endif /* PERL_GLOBAL_STRUCT_PRIVATE */
4827 #  undef PERLVAR
4828 #  undef PERLVARA
4829 #  undef PERLVARI
4830 #  undef PERLVARIC
4831 #  define PERLVAR(prefix,var,type) /**/
4832 #  define PERLVARA(prefix,var,n,type) /**/
4833 #  define PERLVARI(prefix,var,type,init) plvarsp->prefix##var = init;
4834 #  define PERLVARIC(prefix,var,type,init) plvarsp->prefix##var = init;
4835 #  include "perlvars.h"
4836 #  undef PERLVAR
4837 #  undef PERLVARA
4838 #  undef PERLVARI
4839 #  undef PERLVARIC
4840 #  ifdef PERL_GLOBAL_STRUCT
4841     plvarsp->Gppaddr =
4842 	(Perl_ppaddr_t*)
4843 	PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t));
4844     if (!plvarsp->Gppaddr)
4845         exit(1);
4846     plvarsp->Gcheck  =
4847 	(Perl_check_t*)
4848 	PerlMem_malloc(ncheck  * sizeof(Perl_check_t));
4849     if (!plvarsp->Gcheck)
4850         exit(1);
4851     Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t);
4852     Copy(Gcheck,  plvarsp->Gcheck,  ncheck,  Perl_check_t);
4853 #  endif
4854 #  ifdef PERL_SET_VARS
4855     PERL_SET_VARS(plvarsp);
4856 #  endif
4857 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4858     plvarsp->Gsv_placeholder.sv_flags = 0;
4859     memset(plvarsp->Ghash_seed, 0, sizeof(plvarsp->Ghash_seed));
4860 #  endif
4861 # undef PERL_GLOBAL_STRUCT_INIT
4862 # endif
4863     return plvarsp;
4864 }
4865 
4866 #endif /* PERL_GLOBAL_STRUCT */
4867 
4868 #ifdef PERL_GLOBAL_STRUCT
4869 
4870 void
4871 Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
4872 {
4873     int veto = plvarsp->Gveto_cleanup;
4874 
4875     PERL_ARGS_ASSERT_FREE_GLOBAL_STRUCT;
4876     PERL_UNUSED_CONTEXT;
4877 # ifdef PERL_GLOBAL_STRUCT
4878 #  ifdef PERL_UNSET_VARS
4879     PERL_UNSET_VARS(plvarsp);
4880 #  endif
4881     if (veto)
4882         return;
4883     free(plvarsp->Gppaddr);
4884     free(plvarsp->Gcheck);
4885 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
4886     free(plvarsp);
4887 #  endif
4888 # endif
4889 }
4890 
4891 #endif /* PERL_GLOBAL_STRUCT */
4892 
4893 #ifdef PERL_MEM_LOG
4894 
4895 /* -DPERL_MEM_LOG: the Perl_mem_log_..() is compiled, including
4896  * the default implementation, unless -DPERL_MEM_LOG_NOIMPL is also
4897  * given, and you supply your own implementation.
4898  *
4899  * The default implementation reads a single env var, PERL_MEM_LOG,
4900  * expecting one or more of the following:
4901  *
4902  *    \d+ - fd		fd to write to		: must be 1st (grok_atoUV)
4903  *    'm' - memlog	was PERL_MEM_LOG=1
4904  *    's' - svlog	was PERL_SV_LOG=1
4905  *    't' - timestamp	was PERL_MEM_LOG_TIMESTAMP=1
4906  *
4907  * This makes the logger controllable enough that it can reasonably be
4908  * added to the system perl.
4909  */
4910 
4911 /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer
4912  * the Perl_mem_log_...() will use (either via sprintf or snprintf).
4913  */
4914 #define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128
4915 
4916 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...()
4917  * writes to.  In the default logger, this is settable at runtime.
4918  */
4919 #ifndef PERL_MEM_LOG_FD
4920 #  define PERL_MEM_LOG_FD 2 /* If STDERR is too boring for you. */
4921 #endif
4922 
4923 #ifndef PERL_MEM_LOG_NOIMPL
4924 
4925 # ifdef DEBUG_LEAKING_SCALARS
4926 #   define SV_LOG_SERIAL_FMT	    " [%lu]"
4927 #   define _SV_LOG_SERIAL_ARG(sv)   , (unsigned long) (sv)->sv_debug_serial
4928 # else
4929 #   define SV_LOG_SERIAL_FMT
4930 #   define _SV_LOG_SERIAL_ARG(sv)
4931 # endif
4932 
4933 static void
4934 S_mem_log_common(enum mem_log_type mlt, const UV n,
4935 		 const UV typesize, const char *type_name, const SV *sv,
4936 		 Malloc_t oldalloc, Malloc_t newalloc,
4937 		 const char *filename, const int linenumber,
4938 		 const char *funcname)
4939 {
4940     const char *pmlenv;
4941 
4942     PERL_ARGS_ASSERT_MEM_LOG_COMMON;
4943 
4944     pmlenv = PerlEnv_getenv("PERL_MEM_LOG");
4945     if (!pmlenv)
4946 	return;
4947     if (mlt < MLT_NEW_SV ? strchr(pmlenv,'m') : strchr(pmlenv,'s'))
4948     {
4949 	/* We can't use SVs or PerlIO for obvious reasons,
4950 	 * so we'll use stdio and low-level IO instead. */
4951 	char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
4952 
4953 #   ifdef HAS_GETTIMEOFDAY
4954 #     define MEM_LOG_TIME_FMT	"%10d.%06d: "
4955 #     define MEM_LOG_TIME_ARG	(int)tv.tv_sec, (int)tv.tv_usec
4956 	struct timeval tv;
4957 	gettimeofday(&tv, 0);
4958 #   else
4959 #     define MEM_LOG_TIME_FMT	"%10d: "
4960 #     define MEM_LOG_TIME_ARG	(int)when
4961         Time_t when;
4962         (void)time(&when);
4963 #   endif
4964 	/* If there are other OS specific ways of hires time than
4965 	 * gettimeofday() (see dist/Time-HiRes), the easiest way is
4966 	 * probably that they would be used to fill in the struct
4967 	 * timeval. */
4968 	{
4969 	    STRLEN len;
4970             const char* endptr;
4971 	    int fd;
4972             UV uv;
4973             if (grok_atoUV(pmlenv, &uv, &endptr) /* Ignore endptr. */
4974                 && uv && uv <= PERL_INT_MAX
4975             ) {
4976                 fd = (int)uv;
4977             } else {
4978 		fd = PERL_MEM_LOG_FD;
4979             }
4980 
4981 	    if (strchr(pmlenv, 't')) {
4982 		len = my_snprintf(buf, sizeof(buf),
4983 				MEM_LOG_TIME_FMT, MEM_LOG_TIME_ARG);
4984 		PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
4985 	    }
4986 	    switch (mlt) {
4987 	    case MLT_ALLOC:
4988 		len = my_snprintf(buf, sizeof(buf),
4989 			"alloc: %s:%d:%s: %"IVdf" %"UVuf
4990 			" %s = %"IVdf": %"UVxf"\n",
4991 			filename, linenumber, funcname, n, typesize,
4992 			type_name, n * typesize, PTR2UV(newalloc));
4993 		break;
4994 	    case MLT_REALLOC:
4995 		len = my_snprintf(buf, sizeof(buf),
4996 			"realloc: %s:%d:%s: %"IVdf" %"UVuf
4997 			" %s = %"IVdf": %"UVxf" -> %"UVxf"\n",
4998 			filename, linenumber, funcname, n, typesize,
4999 			type_name, n * typesize, PTR2UV(oldalloc),
5000 			PTR2UV(newalloc));
5001 		break;
5002 	    case MLT_FREE:
5003 		len = my_snprintf(buf, sizeof(buf),
5004 			"free: %s:%d:%s: %"UVxf"\n",
5005 			filename, linenumber, funcname,
5006 			PTR2UV(oldalloc));
5007 		break;
5008 	    case MLT_NEW_SV:
5009 	    case MLT_DEL_SV:
5010 		len = my_snprintf(buf, sizeof(buf),
5011 			"%s_SV: %s:%d:%s: %"UVxf SV_LOG_SERIAL_FMT "\n",
5012 			mlt == MLT_NEW_SV ? "new" : "del",
5013 			filename, linenumber, funcname,
5014 			PTR2UV(sv) _SV_LOG_SERIAL_ARG(sv));
5015 		break;
5016 	    default:
5017 		len = 0;
5018 	    }
5019 	    PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len));
5020 	}
5021     }
5022 }
5023 #endif /* !PERL_MEM_LOG_NOIMPL */
5024 
5025 #ifndef PERL_MEM_LOG_NOIMPL
5026 # define \
5027     mem_log_common_if(alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm) \
5028     mem_log_common   (alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm)
5029 #else
5030 /* this is suboptimal, but bug compatible.  User is providing their
5031    own implementation, but is getting these functions anyway, and they
5032    do nothing. But _NOIMPL users should be able to cope or fix */
5033 # define \
5034     mem_log_common_if(alty, num, tysz, tynm, u, oal, nal, flnm, ln, fnnm) \
5035     /* mem_log_common_if_PERL_MEM_LOG_NOIMPL */
5036 #endif
5037 
5038 Malloc_t
5039 Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name,
5040 		   Malloc_t newalloc,
5041 		   const char *filename, const int linenumber,
5042 		   const char *funcname)
5043 {
5044     PERL_ARGS_ASSERT_MEM_LOG_ALLOC;
5045 
5046     mem_log_common_if(MLT_ALLOC, n, typesize, type_name,
5047 		      NULL, NULL, newalloc,
5048 		      filename, linenumber, funcname);
5049     return newalloc;
5050 }
5051 
5052 Malloc_t
5053 Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name,
5054 		     Malloc_t oldalloc, Malloc_t newalloc,
5055 		     const char *filename, const int linenumber,
5056 		     const char *funcname)
5057 {
5058     PERL_ARGS_ASSERT_MEM_LOG_REALLOC;
5059 
5060     mem_log_common_if(MLT_REALLOC, n, typesize, type_name,
5061 		      NULL, oldalloc, newalloc,
5062 		      filename, linenumber, funcname);
5063     return newalloc;
5064 }
5065 
5066 Malloc_t
5067 Perl_mem_log_free(Malloc_t oldalloc,
5068 		  const char *filename, const int linenumber,
5069 		  const char *funcname)
5070 {
5071     PERL_ARGS_ASSERT_MEM_LOG_FREE;
5072 
5073     mem_log_common_if(MLT_FREE, 0, 0, "", NULL, oldalloc, NULL,
5074 		      filename, linenumber, funcname);
5075     return oldalloc;
5076 }
5077 
5078 void
5079 Perl_mem_log_new_sv(const SV *sv,
5080 		    const char *filename, const int linenumber,
5081 		    const char *funcname)
5082 {
5083     mem_log_common_if(MLT_NEW_SV, 0, 0, "", sv, NULL, NULL,
5084 		      filename, linenumber, funcname);
5085 }
5086 
5087 void
5088 Perl_mem_log_del_sv(const SV *sv,
5089 		    const char *filename, const int linenumber,
5090 		    const char *funcname)
5091 {
5092     mem_log_common_if(MLT_DEL_SV, 0, 0, "", sv, NULL, NULL,
5093 		      filename, linenumber, funcname);
5094 }
5095 
5096 #endif /* PERL_MEM_LOG */
5097 
5098 /*
5099 =for apidoc my_sprintf
5100 
5101 The C library C<sprintf>, wrapped if necessary, to ensure that it will return
5102 the length of the string written to the buffer.  Only rare pre-ANSI systems
5103 need the wrapper function - usually this is a direct call to C<sprintf>.
5104 
5105 =cut
5106 */
5107 #ifndef SPRINTF_RETURNS_STRLEN
5108 int
5109 Perl_my_sprintf(char *buffer, const char* pat, ...)
5110 {
5111     va_list args;
5112     PERL_ARGS_ASSERT_MY_SPRINTF;
5113     va_start(args, pat);
5114     vsprintf(buffer, pat, args);
5115     va_end(args);
5116     return strlen(buffer);
5117 }
5118 #endif
5119 
5120 /*
5121 =for apidoc quadmath_format_single
5122 
5123 C<quadmath_snprintf()> is very strict about its C<format> string and will
5124 fail, returning -1, if the format is invalid.  It accepts exactly
5125 one format spec.
5126 
5127 C<quadmath_format_single()> checks that the intended single spec looks
5128 sane: begins with C<%>, has only one C<%>, ends with C<[efgaEFGA]>,
5129 and has C<Q> before it.  This is not a full "printf syntax check",
5130 just the basics.
5131 
5132 Returns the format if it is valid, NULL if not.
5133 
5134 C<quadmath_format_single()> can and will actually patch in the missing
5135 C<Q>, if necessary.  In this case it will return the modified copy of
5136 the format, B<which the caller will need to free.>
5137 
5138 See also L</quadmath_format_needed>.
5139 
5140 =cut
5141 */
5142 #ifdef USE_QUADMATH
5143 const char*
5144 Perl_quadmath_format_single(const char* format)
5145 {
5146     STRLEN len;
5147 
5148     PERL_ARGS_ASSERT_QUADMATH_FORMAT_SINGLE;
5149 
5150     if (format[0] != '%' || strchr(format + 1, '%'))
5151         return NULL;
5152     len = strlen(format);
5153     /* minimum length three: %Qg */
5154     if (len < 3 || strchr("efgaEFGA", format[len - 1]) == NULL)
5155         return NULL;
5156     if (format[len - 2] != 'Q') {
5157         char* fixed;
5158         Newx(fixed, len + 1, char);
5159         memcpy(fixed, format, len - 1);
5160         fixed[len - 1] = 'Q';
5161         fixed[len    ] = format[len - 1];
5162         fixed[len + 1] = 0;
5163         return (const char*)fixed;
5164     }
5165     return format;
5166 }
5167 #endif
5168 
5169 /*
5170 =for apidoc quadmath_format_needed
5171 
5172 C<quadmath_format_needed()> returns true if the C<format> string seems to
5173 contain at least one non-Q-prefixed C<%[efgaEFGA]> format specifier,
5174 or returns false otherwise.
5175 
5176 The format specifier detection is not complete printf-syntax detection,
5177 but it should catch most common cases.
5178 
5179 If true is returned, those arguments B<should> in theory be processed
5180 with C<quadmath_snprintf()>, but in case there is more than one such
5181 format specifier (see L</quadmath_format_single>), and if there is
5182 anything else beyond that one (even just a single byte), they
5183 B<cannot> be processed because C<quadmath_snprintf()> is very strict,
5184 accepting only one format spec, and nothing else.
5185 In this case, the code should probably fail.
5186 
5187 =cut
5188 */
5189 #ifdef USE_QUADMATH
5190 bool
5191 Perl_quadmath_format_needed(const char* format)
5192 {
5193   const char *p = format;
5194   const char *q;
5195 
5196   PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED;
5197 
5198   while ((q = strchr(p, '%'))) {
5199     q++;
5200     if (*q == '+') /* plus */
5201       q++;
5202     if (*q == '#') /* alt */
5203       q++;
5204     if (*q == '*') /* width */
5205       q++;
5206     else {
5207       if (isDIGIT(*q)) {
5208         while (isDIGIT(*q)) q++;
5209       }
5210     }
5211     if (*q == '.' && (q[1] == '*' || isDIGIT(q[1]))) { /* prec */
5212       q++;
5213       if (*q == '*')
5214         q++;
5215       else
5216         while (isDIGIT(*q)) q++;
5217     }
5218     if (strchr("efgaEFGA", *q)) /* Would have needed 'Q' in front. */
5219       return TRUE;
5220     p = q + 1;
5221   }
5222   return FALSE;
5223 }
5224 #endif
5225 
5226 /*
5227 =for apidoc my_snprintf
5228 
5229 The C library C<snprintf> functionality, if available and
5230 standards-compliant (uses C<vsnprintf>, actually).  However, if the
5231 C<vsnprintf> is not available, will unfortunately use the unsafe
5232 C<vsprintf> which can overrun the buffer (there is an overrun check,
5233 but that may be too late).  Consider using C<sv_vcatpvf> instead, or
5234 getting C<vsnprintf>.
5235 
5236 =cut
5237 */
5238 int
5239 Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
5240 {
5241     int retval = -1;
5242     va_list ap;
5243     PERL_ARGS_ASSERT_MY_SNPRINTF;
5244 #ifndef HAS_VSNPRINTF
5245     PERL_UNUSED_VAR(len);
5246 #endif
5247     va_start(ap, format);
5248 #ifdef USE_QUADMATH
5249     {
5250         const char* qfmt = quadmath_format_single(format);
5251         bool quadmath_valid = FALSE;
5252         if (qfmt) {
5253             /* If the format looked promising, use it as quadmath. */
5254             retval = quadmath_snprintf(buffer, len, qfmt, va_arg(ap, NV));
5255             if (retval == -1)
5256                 Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", qfmt);
5257             quadmath_valid = TRUE;
5258             if (qfmt != format)
5259                 Safefree(qfmt);
5260             qfmt = NULL;
5261         }
5262         assert(qfmt == NULL);
5263         /* quadmath_format_single() will return false for example for
5264          * "foo = %g", or simply "%g".  We could handle the %g by
5265          * using quadmath for the NV args.  More complex cases of
5266          * course exist: "foo = %g, bar = %g", or "foo=%Qg" (otherwise
5267          * quadmath-valid but has stuff in front).
5268          *
5269          * Handling the "Q-less" cases right would require walking
5270          * through the va_list and rewriting the format, calling
5271          * quadmath for the NVs, building a new va_list, and then
5272          * letting vsnprintf/vsprintf to take care of the other
5273          * arguments.  This may be doable.
5274          *
5275          * We do not attempt that now.  But for paranoia, we here try
5276          * to detect some common (but not all) cases where the
5277          * "Q-less" %[efgaEFGA] formats are present, and die if
5278          * detected.  This doesn't fix the problem, but it stops the
5279          * vsnprintf/vsprintf pulling doubles off the va_list when
5280          * __float128 NVs should be pulled off instead.
5281          *
5282          * If quadmath_format_needed() returns false, we are reasonably
5283          * certain that we can call vnsprintf() or vsprintf() safely. */
5284         if (!quadmath_valid && quadmath_format_needed(format))
5285           Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format);
5286 
5287     }
5288 #endif
5289     if (retval == -1)
5290 #ifdef HAS_VSNPRINTF
5291         retval = vsnprintf(buffer, len, format, ap);
5292 #else
5293         retval = vsprintf(buffer, format, ap);
5294 #endif
5295     va_end(ap);
5296     /* vsprintf() shows failure with < 0 */
5297     if (retval < 0
5298 #ifdef HAS_VSNPRINTF
5299     /* vsnprintf() shows failure with >= len */
5300         ||
5301         (len > 0 && (Size_t)retval >= len)
5302 #endif
5303     )
5304 	Perl_croak_nocontext("panic: my_snprintf buffer overflow");
5305     return retval;
5306 }
5307 
5308 /*
5309 =for apidoc my_vsnprintf
5310 
5311 The C library C<vsnprintf> if available and standards-compliant.
5312 However, if if the C<vsnprintf> is not available, will unfortunately
5313 use the unsafe C<vsprintf> which can overrun the buffer (there is an
5314 overrun check, but that may be too late).  Consider using
5315 C<sv_vcatpvf> instead, or getting C<vsnprintf>.
5316 
5317 =cut
5318 */
5319 int
5320 Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
5321 {
5322 #ifdef USE_QUADMATH
5323     PERL_UNUSED_ARG(buffer);
5324     PERL_UNUSED_ARG(len);
5325     PERL_UNUSED_ARG(format);
5326     /* the cast is to avoid gcc -Wsizeof-array-argument complaining */
5327     PERL_UNUSED_ARG((void*)ap);
5328     Perl_croak_nocontext("panic: my_vsnprintf not available with quadmath");
5329     return 0;
5330 #else
5331     int retval;
5332 #ifdef NEED_VA_COPY
5333     va_list apc;
5334 
5335     PERL_ARGS_ASSERT_MY_VSNPRINTF;
5336     Perl_va_copy(ap, apc);
5337 # ifdef HAS_VSNPRINTF
5338     retval = vsnprintf(buffer, len, format, apc);
5339 # else
5340     PERL_UNUSED_ARG(len);
5341     retval = vsprintf(buffer, format, apc);
5342 # endif
5343     va_end(apc);
5344 #else
5345 # ifdef HAS_VSNPRINTF
5346     retval = vsnprintf(buffer, len, format, ap);
5347 # else
5348     PERL_UNUSED_ARG(len);
5349     retval = vsprintf(buffer, format, ap);
5350 # endif
5351 #endif /* #ifdef NEED_VA_COPY */
5352     /* vsprintf() shows failure with < 0 */
5353     if (retval < 0
5354 #ifdef HAS_VSNPRINTF
5355     /* vsnprintf() shows failure with >= len */
5356         ||
5357         (len > 0 && (Size_t)retval >= len)
5358 #endif
5359     )
5360 	Perl_croak_nocontext("panic: my_vsnprintf buffer overflow");
5361     return retval;
5362 #endif
5363 }
5364 
5365 void
5366 Perl_my_clearenv(pTHX)
5367 {
5368     dVAR;
5369 #if ! defined(PERL_MICRO)
5370 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
5371     PerlEnv_clearenv();
5372 #  else /* ! (PERL_IMPLICIT_SYS || WIN32) */
5373 #    if defined(USE_ENVIRON_ARRAY)
5374 #      if defined(USE_ITHREADS)
5375     /* only the parent thread can clobber the process environment */
5376     if (PL_curinterp == aTHX)
5377 #      endif /* USE_ITHREADS */
5378     {
5379 #      if ! defined(PERL_USE_SAFE_PUTENV)
5380     if ( !PL_use_safe_putenv) {
5381       I32 i;
5382       if (environ == PL_origenviron)
5383         environ = (char**)safesysmalloc(sizeof(char*));
5384       else
5385         for (i = 0; environ[i]; i++)
5386           (void)safesysfree(environ[i]);
5387     }
5388     environ[0] = NULL;
5389 #      else /* PERL_USE_SAFE_PUTENV */
5390 #        if defined(HAS_CLEARENV)
5391     (void)clearenv();
5392 #        elif defined(HAS_UNSETENV)
5393     int bsiz = 80; /* Most envvar names will be shorter than this. */
5394     char *buf = (char*)safesysmalloc(bsiz);
5395     while (*environ != NULL) {
5396       char *e = strchr(*environ, '=');
5397       int l = e ? e - *environ : (int)strlen(*environ);
5398       if (bsiz < l + 1) {
5399         (void)safesysfree(buf);
5400         bsiz = l + 1; /* + 1 for the \0. */
5401         buf = (char*)safesysmalloc(bsiz);
5402       }
5403       memcpy(buf, *environ, l);
5404       buf[l] = '\0';
5405       (void)unsetenv(buf);
5406     }
5407     (void)safesysfree(buf);
5408 #        else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
5409     /* Just null environ and accept the leakage. */
5410     *environ = NULL;
5411 #        endif /* HAS_CLEARENV || HAS_UNSETENV */
5412 #      endif /* ! PERL_USE_SAFE_PUTENV */
5413     }
5414 #    endif /* USE_ENVIRON_ARRAY */
5415 #  endif /* PERL_IMPLICIT_SYS || WIN32 */
5416 #endif /* PERL_MICRO */
5417 }
5418 
5419 #ifdef PERL_IMPLICIT_CONTEXT
5420 
5421 /* Implements the MY_CXT_INIT macro. The first time a module is loaded,
5422 the global PL_my_cxt_index is incremented, and that value is assigned to
5423 that module's static my_cxt_index (who's address is passed as an arg).
5424 Then, for each interpreter this function is called for, it makes sure a
5425 void* slot is available to hang the static data off, by allocating or
5426 extending the interpreter's PL_my_cxt_list array */
5427 
5428 #ifndef PERL_GLOBAL_STRUCT_PRIVATE
5429 void *
5430 Perl_my_cxt_init(pTHX_ int *index, size_t size)
5431 {
5432     dVAR;
5433     void *p;
5434     PERL_ARGS_ASSERT_MY_CXT_INIT;
5435     if (*index == -1) {
5436 	/* this module hasn't been allocated an index yet */
5437 #if defined(USE_ITHREADS)
5438 	MUTEX_LOCK(&PL_my_ctx_mutex);
5439 #endif
5440 	*index = PL_my_cxt_index++;
5441 #if defined(USE_ITHREADS)
5442 	MUTEX_UNLOCK(&PL_my_ctx_mutex);
5443 #endif
5444     }
5445 
5446     /* make sure the array is big enough */
5447     if (PL_my_cxt_size <= *index) {
5448 	if (PL_my_cxt_size) {
5449 	    while (PL_my_cxt_size <= *index)
5450 		PL_my_cxt_size *= 2;
5451 	    Renew(PL_my_cxt_list, PL_my_cxt_size, void *);
5452 	}
5453 	else {
5454 	    PL_my_cxt_size = 16;
5455 	    Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
5456 	}
5457     }
5458     /* newSV() allocates one more than needed */
5459     p = (void*)SvPVX(newSV(size-1));
5460     PL_my_cxt_list[*index] = p;
5461     Zero(p, size, char);
5462     return p;
5463 }
5464 
5465 #else /* #ifndef PERL_GLOBAL_STRUCT_PRIVATE */
5466 
5467 int
5468 Perl_my_cxt_index(pTHX_ const char *my_cxt_key)
5469 {
5470     dVAR;
5471     int index;
5472 
5473     PERL_ARGS_ASSERT_MY_CXT_INDEX;
5474 
5475     for (index = 0; index < PL_my_cxt_index; index++) {
5476 	const char *key = PL_my_cxt_keys[index];
5477 	/* try direct pointer compare first - there are chances to success,
5478 	 * and it's much faster.
5479 	 */
5480 	if ((key == my_cxt_key) || strEQ(key, my_cxt_key))
5481 	    return index;
5482     }
5483     return -1;
5484 }
5485 
5486 void *
5487 Perl_my_cxt_init(pTHX_ const char *my_cxt_key, size_t size)
5488 {
5489     dVAR;
5490     void *p;
5491     int index;
5492 
5493     PERL_ARGS_ASSERT_MY_CXT_INIT;
5494 
5495     index = Perl_my_cxt_index(aTHX_ my_cxt_key);
5496     if (index == -1) {
5497 	/* this module hasn't been allocated an index yet */
5498 #if defined(USE_ITHREADS)
5499 	MUTEX_LOCK(&PL_my_ctx_mutex);
5500 #endif
5501 	index = PL_my_cxt_index++;
5502 #if defined(USE_ITHREADS)
5503 	MUTEX_UNLOCK(&PL_my_ctx_mutex);
5504 #endif
5505     }
5506 
5507     /* make sure the array is big enough */
5508     if (PL_my_cxt_size <= index) {
5509 	int old_size = PL_my_cxt_size;
5510 	int i;
5511 	if (PL_my_cxt_size) {
5512 	    while (PL_my_cxt_size <= index)
5513 		PL_my_cxt_size *= 2;
5514 	    Renew(PL_my_cxt_list, PL_my_cxt_size, void *);
5515 	    Renew(PL_my_cxt_keys, PL_my_cxt_size, const char *);
5516 	}
5517 	else {
5518 	    PL_my_cxt_size = 16;
5519 	    Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
5520 	    Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
5521 	}
5522 	for (i = old_size; i < PL_my_cxt_size; i++) {
5523 	    PL_my_cxt_keys[i] = 0;
5524 	    PL_my_cxt_list[i] = 0;
5525 	}
5526     }
5527     PL_my_cxt_keys[index] = my_cxt_key;
5528     /* newSV() allocates one more than needed */
5529     p = (void*)SvPVX(newSV(size-1));
5530     PL_my_cxt_list[index] = p;
5531     Zero(p, size, char);
5532     return p;
5533 }
5534 #endif /* #ifndef PERL_GLOBAL_STRUCT_PRIVATE */
5535 #endif /* PERL_IMPLICIT_CONTEXT */
5536 
5537 
5538 /* Perl_xs_handshake():
5539    implement the various XS_*_BOOTCHECK macros, which are added to .c
5540    files by ExtUtils::ParseXS, to check that the perl the module was built
5541    with is binary compatible with the running perl.
5542 
5543    usage:
5544        Perl_xs_handshake(U32 key, void * v_my_perl, const char * file,
5545             [U32 items, U32 ax], [char * api_version], [char * xs_version])
5546 
5547    The meaning of the varargs is determined the U32 key arg (which is not
5548    a format string). The fields of key are assembled by using HS_KEY().
5549 
5550    Under PERL_IMPLICIT_CONTEX, the v_my_perl arg is of type
5551    "PerlInterpreter *" and represents the callers context; otherwise it is
5552    of type "CV *", and is the boot xsub's CV.
5553 
5554    v_my_perl will catch where a threaded future perl526.dll calling IO.dll
5555    for example, and IO.dll was linked with threaded perl524.dll, and both
5556    perl526.dll and perl524.dll are in %PATH and the Win32 DLL loader
5557    successfully can load IO.dll into the process but simultaneously it
5558    loaded an interpreter of a different version into the process, and XS
5559    code will naturally pass SV*s created by perl524.dll for perl526.dll to
5560    use through perl526.dll's my_perl->Istack_base.
5561 
5562    v_my_perl cannot be the first arg, since then 'key' will be out of
5563    place in a threaded vs non-threaded mixup; and analyzing the key
5564    number's bitfields won't reveal the problem, since it will be a valid
5565    key (unthreaded perl) on interp side, but croak will report the XS mod's
5566    key as gibberish (it is really a my_perl ptr) (threaded XS mod); or if
5567    it's a threaded perl and an unthreaded XS module, threaded perl will
5568    look at an uninit C stack or an uninit register to get 'key'
5569    (remember that it assumes that the 1st arg is the interp cxt).
5570 
5571    'file' is the source filename of the caller.
5572 */
5573 
5574 I32
5575 Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...)
5576 {
5577     va_list args;
5578     U32 items, ax;
5579     void * got;
5580     void * need;
5581 #ifdef PERL_IMPLICIT_CONTEXT
5582     dTHX;
5583     tTHX xs_interp;
5584 #else
5585     CV* cv;
5586     SV *** xs_spp;
5587 #endif
5588     PERL_ARGS_ASSERT_XS_HANDSHAKE;
5589     va_start(args, file);
5590 
5591     got = INT2PTR(void*, (UV)(key & HSm_KEY_MATCH));
5592     need = (void *)(HS_KEY(FALSE, FALSE, "", "") & HSm_KEY_MATCH);
5593     if (UNLIKELY(got != need))
5594 	goto bad_handshake;
5595 /* try to catch where a 2nd threaded perl interp DLL is loaded into a process
5596    by a XS DLL compiled against the wrong interl DLL b/c of bad @INC, and the
5597    2nd threaded perl interp DLL never initialized its TLS/PERL_SYS_INIT3 so
5598    dTHX call from 2nd interp DLL can't return the my_perl that pp_entersub
5599    passed to the XS DLL */
5600 #ifdef PERL_IMPLICIT_CONTEXT
5601     xs_interp = (tTHX)v_my_perl;
5602     got = xs_interp;
5603     need = my_perl;
5604 #else
5605 /* try to catch where an unthreaded perl interp DLL (for ex. perl522.dll) is
5606    loaded into a process by a XS DLL built by an unthreaded perl522.dll perl,
5607    but the DynaLoder/Perl that started the process and loaded the XS DLL is
5608    unthreaded perl524.dll, since unthreadeds don't pass my_perl (a unique *)
5609    through pp_entersub, use a unique value (which is a pointer to PL_stack_sp's
5610    location in the unthreaded perl binary) stored in CV * to figure out if this
5611    Perl_xs_handshake was called by the same pp_entersub */
5612     cv = (CV*)v_my_perl;
5613     xs_spp = (SV***)CvHSCXT(cv);
5614     got = xs_spp;
5615     need = &PL_stack_sp;
5616 #endif
5617     if(UNLIKELY(got != need)) {
5618 	bad_handshake:/* recycle branch and string from above */
5619 	if(got != (void *)HSf_NOCHK)
5620 	    noperl_die("%s: loadable library and perl binaries are mismatched"
5621                        " (got handshake key %p, needed %p)\n",
5622 		file, got, need);
5623     }
5624 
5625     if(key & HSf_SETXSUBFN) {     /* this might be called from a module bootstrap */
5626 	SAVEPPTR(PL_xsubfilename);/* which was require'd from a XSUB BEGIN */
5627 	PL_xsubfilename = file;   /* so the old name must be restored for
5628 				     additional XSUBs to register themselves */
5629 	/* XSUBs can't be perl lang/perl5db.pl debugged
5630 	if (PERLDB_LINE_OR_SAVESRC)
5631 	    (void)gv_fetchfile(file); */
5632     }
5633 
5634     if(key & HSf_POPMARK) {
5635 	ax = POPMARK;
5636 	{   SV **mark = PL_stack_base + ax++;
5637 	    {   dSP;
5638 		items = (I32)(SP - MARK);
5639 	    }
5640 	}
5641     } else {
5642 	items = va_arg(args, U32);
5643 	ax = va_arg(args, U32);
5644     }
5645     {
5646 	U32 apiverlen;
5647 	assert(HS_GETAPIVERLEN(key) <= UCHAR_MAX);
5648 	if((apiverlen = HS_GETAPIVERLEN(key))) {
5649 	    char * api_p = va_arg(args, char*);
5650 	    if(apiverlen != sizeof("v" PERL_API_VERSION_STRING)-1
5651 		|| memNE(api_p, "v" PERL_API_VERSION_STRING,
5652 			 sizeof("v" PERL_API_VERSION_STRING)-1))
5653 		Perl_croak_nocontext("Perl API version %s of %"SVf" does not match %s",
5654 				    api_p, SVfARG(PL_stack_base[ax + 0]),
5655 				    "v" PERL_API_VERSION_STRING);
5656 	}
5657     }
5658     {
5659 	U32 xsverlen;
5660 	assert(HS_GETXSVERLEN(key) <= UCHAR_MAX && HS_GETXSVERLEN(key) <= HS_APIVERLEN_MAX);
5661 	if((xsverlen = HS_GETXSVERLEN(key)))
5662 	    S_xs_version_bootcheck(aTHX_
5663 		items, ax, va_arg(args, char*), xsverlen);
5664     }
5665     va_end(args);
5666     return ax;
5667 }
5668 
5669 
5670 STATIC void
5671 S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p,
5672 			  STRLEN xs_len)
5673 {
5674     SV *sv;
5675     const char *vn = NULL;
5676     SV *const module = PL_stack_base[ax];
5677 
5678     PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK;
5679 
5680     if (items >= 2)	 /* version supplied as bootstrap arg */
5681 	sv = PL_stack_base[ax + 1];
5682     else {
5683 	/* XXX GV_ADDWARN */
5684 	vn = "XS_VERSION";
5685 	sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", SVfARG(module), vn), 0);
5686 	if (!sv || !SvOK(sv)) {
5687 	    vn = "VERSION";
5688 	    sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", SVfARG(module), vn), 0);
5689 	}
5690     }
5691     if (sv) {
5692 	SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP);
5693 	SV *pmsv = sv_isobject(sv) && sv_derived_from(sv, "version")
5694 	    ? sv : sv_2mortal(new_version(sv));
5695 	xssv = upg_version(xssv, 0);
5696 	if ( vcmp(pmsv,xssv) ) {
5697 	    SV *string = vstringify(xssv);
5698 	    SV *xpt = Perl_newSVpvf(aTHX_ "%"SVf" object version %"SVf
5699 				    " does not match ", SVfARG(module), SVfARG(string));
5700 
5701 	    SvREFCNT_dec(string);
5702 	    string = vstringify(pmsv);
5703 
5704 	    if (vn) {
5705 		Perl_sv_catpvf(aTHX_ xpt, "$%"SVf"::%s %"SVf, SVfARG(module), vn,
5706 			       SVfARG(string));
5707 	    } else {
5708 		Perl_sv_catpvf(aTHX_ xpt, "bootstrap parameter %"SVf, SVfARG(string));
5709 	    }
5710 	    SvREFCNT_dec(string);
5711 
5712 	    Perl_sv_2mortal(aTHX_ xpt);
5713 	    Perl_croak_sv(aTHX_ xpt);
5714 	}
5715     }
5716 }
5717 
5718 /*
5719 =for apidoc my_strlcat
5720 
5721 The C library C<strlcat> if available, or a Perl implementation of it.
5722 This operates on C C<NUL>-terminated strings.
5723 
5724 C<my_strlcat()> appends string C<src> to the end of C<dst>.  It will append at
5725 most S<C<size - strlen(dst) - 1>> characters.  It will then C<NUL>-terminate,
5726 unless C<size> is 0 or the original C<dst> string was longer than C<size> (in
5727 practice this should not happen as it means that either C<size> is incorrect or
5728 that C<dst> is not a proper C<NUL>-terminated string).
5729 
5730 Note that C<size> is the full size of the destination buffer and
5731 the result is guaranteed to be C<NUL>-terminated if there is room.  Note that
5732 room for the C<NUL> should be included in C<size>.
5733 
5734 =cut
5735 
5736 Description stolen from http://www.openbsd.org/cgi-bin/man.cgi?query=strlcat
5737 */
5738 #ifndef HAS_STRLCAT
5739 Size_t
5740 Perl_my_strlcat(char *dst, const char *src, Size_t size)
5741 {
5742     Size_t used, length, copy;
5743 
5744     used = strlen(dst);
5745     length = strlen(src);
5746     if (size > 0 && used < size - 1) {
5747         copy = (length >= size - used) ? size - used - 1 : length;
5748         memcpy(dst + used, src, copy);
5749         dst[used + copy] = '\0';
5750     }
5751     return used + length;
5752 }
5753 #endif
5754 
5755 
5756 /*
5757 =for apidoc my_strlcpy
5758 
5759 The C library C<strlcpy> if available, or a Perl implementation of it.
5760 This operates on C C<NUL>-terminated strings.
5761 
5762 C<my_strlcpy()> copies up to S<C<size - 1>> characters from the string C<src>
5763 to C<dst>, C<NUL>-terminating the result if C<size> is not 0.
5764 
5765 =cut
5766 
5767 Description stolen from http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy
5768 */
5769 #ifndef HAS_STRLCPY
5770 Size_t
5771 Perl_my_strlcpy(char *dst, const char *src, Size_t size)
5772 {
5773     Size_t length, copy;
5774 
5775     length = strlen(src);
5776     if (size > 0) {
5777         copy = (length >= size) ? size - 1 : length;
5778         memcpy(dst, src, copy);
5779         dst[copy] = '\0';
5780     }
5781     return length;
5782 }
5783 #endif
5784 
5785 #if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_MSC_VER < 1400) && (WINVER < 0x0500)
5786 /* VC7 or 7.1, building with pre-VC7 runtime libraries. */
5787 long _ftol( double ); /* Defined by VC6 C libs. */
5788 long _ftol2( double dblSource ) { return _ftol( dblSource ); }
5789 #endif
5790 
5791 PERL_STATIC_INLINE bool
5792 S_gv_has_usable_name(pTHX_ GV *gv)
5793 {
5794     GV **gvp;
5795     return GvSTASH(gv)
5796 	&& HvENAME(GvSTASH(gv))
5797 	&& (gvp = (GV **)hv_fetchhek(
5798 			GvSTASH(gv), GvNAME_HEK(gv), 0
5799 	   ))
5800 	&& *gvp == gv;
5801 }
5802 
5803 void
5804 Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
5805 {
5806     SV * const dbsv = GvSVn(PL_DBsub);
5807     const bool save_taint = TAINT_get;
5808 
5809     /* When we are called from pp_goto (svp is null),
5810      * we do not care about using dbsv to call CV;
5811      * it's for informational purposes only.
5812      */
5813 
5814     PERL_ARGS_ASSERT_GET_DB_SUB;
5815 
5816     TAINT_set(FALSE);
5817     save_item(dbsv);
5818     if (!PERLDB_SUB_NN) {
5819 	GV *gv = CvGV(cv);
5820 
5821 	if (!svp && !CvLEXICAL(cv)) {
5822 	    gv_efullname3(dbsv, gv, NULL);
5823 	}
5824 	else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED)) || CvLEXICAL(cv)
5825 	     || strEQ(GvNAME(gv), "END")
5826 	     || ( /* Could be imported, and old sub redefined. */
5827 		 (GvCV(gv) != cv || !S_gv_has_usable_name(aTHX_ gv))
5828 		 &&
5829 		 !( (SvTYPE(*svp) == SVt_PVGV)
5830 		    && (GvCV((const GV *)*svp) == cv)
5831 		    /* Use GV from the stack as a fallback. */
5832 		    && S_gv_has_usable_name(aTHX_ gv = (GV *)*svp)
5833 		  )
5834 		)
5835 	) {
5836 	    /* GV is potentially non-unique, or contain different CV. */
5837 	    SV * const tmp = newRV(MUTABLE_SV(cv));
5838 	    sv_setsv(dbsv, tmp);
5839 	    SvREFCNT_dec(tmp);
5840 	}
5841 	else {
5842 	    sv_sethek(dbsv, HvENAME_HEK(GvSTASH(gv)));
5843 	    sv_catpvs(dbsv, "::");
5844 	    sv_cathek(dbsv, GvNAME_HEK(gv));
5845 	}
5846     }
5847     else {
5848 	const int type = SvTYPE(dbsv);
5849 	if (type < SVt_PVIV && type != SVt_IV)
5850 	    sv_upgrade(dbsv, SVt_PVIV);
5851 	(void)SvIOK_on(dbsv);
5852 	SvIV_set(dbsv, PTR2IV(cv));	/* Do it the quickest way  */
5853     }
5854     SvSETMAGIC(dbsv);
5855     TAINT_IF(save_taint);
5856 #ifdef NO_TAINT_SUPPORT
5857     PERL_UNUSED_VAR(save_taint);
5858 #endif
5859 }
5860 
5861 int
5862 Perl_my_dirfd(DIR * dir) {
5863 
5864     /* Most dirfd implementations have problems when passed NULL. */
5865     if(!dir)
5866         return -1;
5867 #ifdef HAS_DIRFD
5868     return dirfd(dir);
5869 #elif defined(HAS_DIR_DD_FD)
5870     return dir->dd_fd;
5871 #else
5872     Perl_croak_nocontext(PL_no_func, "dirfd");
5873     NOT_REACHED; /* NOTREACHED */
5874     return 0;
5875 #endif
5876 }
5877 
5878 REGEXP *
5879 Perl_get_re_arg(pTHX_ SV *sv) {
5880 
5881     if (sv) {
5882         if (SvMAGICAL(sv))
5883             mg_get(sv);
5884         if (SvROK(sv))
5885 	    sv = MUTABLE_SV(SvRV(sv));
5886         if (SvTYPE(sv) == SVt_REGEXP)
5887             return (REGEXP*) sv;
5888     }
5889 
5890     return NULL;
5891 }
5892 
5893 /*
5894  * This code is derived from drand48() implementation from FreeBSD,
5895  * found in lib/libc/gen/_rand48.c.
5896  *
5897  * The U64 implementation is original, based on the POSIX
5898  * specification for drand48().
5899  */
5900 
5901 /*
5902 * Copyright (c) 1993 Martin Birgmeier
5903 * All rights reserved.
5904 *
5905 * You may redistribute unmodified or modified versions of this source
5906 * code provided that the above copyright notice and this and the
5907 * following conditions are retained.
5908 *
5909 * This software is provided ``as is'', and comes with no warranties
5910 * of any kind. I shall in no event be liable for anything that happens
5911 * to anyone/anything when using this software.
5912 */
5913 
5914 #define FREEBSD_DRAND48_SEED_0   (0x330e)
5915 
5916 #ifdef PERL_DRAND48_QUAD
5917 
5918 #define DRAND48_MULT U64_CONST(0x5deece66d)
5919 #define DRAND48_ADD  0xb
5920 #define DRAND48_MASK U64_CONST(0xffffffffffff)
5921 
5922 #else
5923 
5924 #define FREEBSD_DRAND48_SEED_1   (0xabcd)
5925 #define FREEBSD_DRAND48_SEED_2   (0x1234)
5926 #define FREEBSD_DRAND48_MULT_0   (0xe66d)
5927 #define FREEBSD_DRAND48_MULT_1   (0xdeec)
5928 #define FREEBSD_DRAND48_MULT_2   (0x0005)
5929 #define FREEBSD_DRAND48_ADD      (0x000b)
5930 
5931 const unsigned short _rand48_mult[3] = {
5932                 FREEBSD_DRAND48_MULT_0,
5933                 FREEBSD_DRAND48_MULT_1,
5934                 FREEBSD_DRAND48_MULT_2
5935 };
5936 const unsigned short _rand48_add = FREEBSD_DRAND48_ADD;
5937 
5938 #endif
5939 
5940 void
5941 Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed)
5942 {
5943     PERL_ARGS_ASSERT_DRAND48_INIT_R;
5944 
5945 #ifdef PERL_DRAND48_QUAD
5946     *random_state = FREEBSD_DRAND48_SEED_0 + ((U64)seed << 16);
5947 #else
5948     random_state->seed[0] = FREEBSD_DRAND48_SEED_0;
5949     random_state->seed[1] = (U16) seed;
5950     random_state->seed[2] = (U16) (seed >> 16);
5951 #endif
5952 }
5953 
5954 double
5955 Perl_drand48_r(perl_drand48_t *random_state)
5956 {
5957     PERL_ARGS_ASSERT_DRAND48_R;
5958 
5959 #ifdef PERL_DRAND48_QUAD
5960     *random_state = (*random_state * DRAND48_MULT + DRAND48_ADD)
5961         & DRAND48_MASK;
5962 
5963     return ldexp((double)*random_state, -48);
5964 #else
5965     {
5966     U32 accu;
5967     U16 temp[2];
5968 
5969     accu = (U32) _rand48_mult[0] * (U32) random_state->seed[0]
5970          + (U32) _rand48_add;
5971     temp[0] = (U16) accu;        /* lower 16 bits */
5972     accu >>= sizeof(U16) * 8;
5973     accu += (U32) _rand48_mult[0] * (U32) random_state->seed[1]
5974           + (U32) _rand48_mult[1] * (U32) random_state->seed[0];
5975     temp[1] = (U16) accu;        /* middle 16 bits */
5976     accu >>= sizeof(U16) * 8;
5977     accu += _rand48_mult[0] * random_state->seed[2]
5978           + _rand48_mult[1] * random_state->seed[1]
5979           + _rand48_mult[2] * random_state->seed[0];
5980     random_state->seed[0] = temp[0];
5981     random_state->seed[1] = temp[1];
5982     random_state->seed[2] = (U16) accu;
5983 
5984     return ldexp((double) random_state->seed[0], -48) +
5985            ldexp((double) random_state->seed[1], -32) +
5986            ldexp((double) random_state->seed[2], -16);
5987     }
5988 #endif
5989 }
5990 
5991 #ifdef USE_C_BACKTRACE
5992 
5993 /* Possibly move all this USE_C_BACKTRACE code into a new file. */
5994 
5995 #ifdef USE_BFD
5996 
5997 typedef struct {
5998     /* abfd is the BFD handle. */
5999     bfd* abfd;
6000     /* bfd_syms is the BFD symbol table. */
6001     asymbol** bfd_syms;
6002     /* bfd_text is handle to the the ".text" section of the object file. */
6003     asection* bfd_text;
6004     /* Since opening the executable and scanning its symbols is quite
6005      * heavy operation, we remember the filename we used the last time,
6006      * and do the opening and scanning only if the filename changes.
6007      * This removes most (but not all) open+scan cycles. */
6008     const char* fname_prev;
6009 } bfd_context;
6010 
6011 /* Given a dl_info, update the BFD context if necessary. */
6012 static void bfd_update(bfd_context* ctx, Dl_info* dl_info)
6013 {
6014     /* BFD open and scan only if the filename changed. */
6015     if (ctx->fname_prev == NULL ||
6016         strNE(dl_info->dli_fname, ctx->fname_prev)) {
6017         if (ctx->abfd) {
6018             bfd_close(ctx->abfd);
6019         }
6020         ctx->abfd = bfd_openr(dl_info->dli_fname, 0);
6021         if (ctx->abfd) {
6022             if (bfd_check_format(ctx->abfd, bfd_object)) {
6023                 IV symbol_size = bfd_get_symtab_upper_bound(ctx->abfd);
6024                 if (symbol_size > 0) {
6025                     Safefree(ctx->bfd_syms);
6026                     Newx(ctx->bfd_syms, symbol_size, asymbol*);
6027                     ctx->bfd_text =
6028                         bfd_get_section_by_name(ctx->abfd, ".text");
6029                 }
6030                 else
6031                     ctx->abfd = NULL;
6032             }
6033             else
6034                 ctx->abfd = NULL;
6035         }
6036         ctx->fname_prev = dl_info->dli_fname;
6037     }
6038 }
6039 
6040 /* Given a raw frame, try to symbolize it and store
6041  * symbol information (source file, line number) away. */
6042 static void bfd_symbolize(bfd_context* ctx,
6043                           void* raw_frame,
6044                           char** symbol_name,
6045                           STRLEN* symbol_name_size,
6046                           char** source_name,
6047                           STRLEN* source_name_size,
6048                           STRLEN* source_line)
6049 {
6050     *symbol_name = NULL;
6051     *symbol_name_size = 0;
6052     if (ctx->abfd) {
6053         IV offset = PTR2IV(raw_frame) - PTR2IV(ctx->bfd_text->vma);
6054         if (offset > 0 &&
6055             bfd_canonicalize_symtab(ctx->abfd, ctx->bfd_syms) > 0) {
6056             const char *file;
6057             const char *func;
6058             unsigned int line = 0;
6059             if (bfd_find_nearest_line(ctx->abfd, ctx->bfd_text,
6060                                       ctx->bfd_syms, offset,
6061                                       &file, &func, &line) &&
6062                 file && func && line > 0) {
6063                 /* Size and copy the source file, use only
6064                  * the basename of the source file.
6065                  *
6066                  * NOTE: the basenames are fine for the
6067                  * Perl source files, but may not always
6068                  * be the best idea for XS files. */
6069                 const char *p, *b = NULL;
6070                 /* Look for the last slash. */
6071                 for (p = file; *p; p++) {
6072                     if (*p == '/')
6073                         b = p + 1;
6074                 }
6075                 if (b == NULL || *b == 0) {
6076                     b = file;
6077                 }
6078                 *source_name_size = p - b + 1;
6079                 Newx(*source_name, *source_name_size + 1, char);
6080                 Copy(b, *source_name, *source_name_size + 1, char);
6081 
6082                 *symbol_name_size = strlen(func);
6083                 Newx(*symbol_name, *symbol_name_size + 1, char);
6084                 Copy(func, *symbol_name, *symbol_name_size + 1, char);
6085 
6086                 *source_line = line;
6087             }
6088         }
6089     }
6090 }
6091 
6092 #endif /* #ifdef USE_BFD */
6093 
6094 #ifdef PERL_DARWIN
6095 
6096 /* OS X has no public API for for 'symbolicating' (Apple official term)
6097  * stack addresses to {function_name, source_file, line_number}.
6098  * Good news: there is command line utility atos(1) which does that.
6099  * Bad news 1: it's a command line utility.
6100  * Bad news 2: one needs to have the Developer Tools installed.
6101  * Bad news 3: in newer releases it needs to be run as 'xcrun atos'.
6102  *
6103  * To recap: we need to open a pipe for reading for a utility which
6104  * might not exist, or exists in different locations, and then parse
6105  * the output.  And since this is all for a low-level API, we cannot
6106  * use high-level stuff.  Thanks, Apple. */
6107 
6108 typedef struct {
6109     /* tool is set to the absolute pathname of the tool to use:
6110      * xcrun or atos. */
6111     const char* tool;
6112     /* format is set to a printf format string used for building
6113      * the external command to run. */
6114     const char* format;
6115     /* unavail is set if e.g. xcrun cannot be found, or something
6116      * else happens that makes getting the backtrace dubious.  Note,
6117      * however, that the context isn't persistent, the next call to
6118      * get_c_backtrace() will start from scratch. */
6119     bool unavail;
6120     /* fname is the current object file name. */
6121     const char* fname;
6122     /* object_base_addr is the base address of the shared object. */
6123     void* object_base_addr;
6124 } atos_context;
6125 
6126 /* Given |dl_info|, updates the context.  If the context has been
6127  * marked unavailable, return immediately.  If not but the tool has
6128  * not been set, set it to either "xcrun atos" or "atos" (also set the
6129  * format to use for creating commands for piping), or if neither is
6130  * unavailable (one needs the Developer Tools installed), mark the context
6131  * an unavailable.  Finally, update the filename (object name),
6132  * and its base address. */
6133 
6134 static void atos_update(atos_context* ctx,
6135                         Dl_info* dl_info)
6136 {
6137     if (ctx->unavail)
6138         return;
6139     if (ctx->tool == NULL) {
6140         const char* tools[] = {
6141             "/usr/bin/xcrun",
6142             "/usr/bin/atos"
6143         };
6144         const char* formats[] = {
6145             "/usr/bin/xcrun atos -o '%s' -l %08x %08x 2>&1",
6146             "/usr/bin/atos -d -o '%s' -l %08x %08x 2>&1"
6147         };
6148         struct stat st;
6149         UV i;
6150         for (i = 0; i < C_ARRAY_LENGTH(tools); i++) {
6151             if (stat(tools[i], &st) == 0 && S_ISREG(st.st_mode)) {
6152                 ctx->tool = tools[i];
6153                 ctx->format = formats[i];
6154                 break;
6155             }
6156         }
6157         if (ctx->tool == NULL) {
6158             ctx->unavail = TRUE;
6159             return;
6160         }
6161     }
6162     if (ctx->fname == NULL ||
6163         strNE(dl_info->dli_fname, ctx->fname)) {
6164         ctx->fname = dl_info->dli_fname;
6165         ctx->object_base_addr = dl_info->dli_fbase;
6166     }
6167 }
6168 
6169 /* Given an output buffer end |p| and its |start|, matches
6170  * for the atos output, extracting the source code location
6171  * and returning non-NULL if possible, returning NULL otherwise. */
6172 static const char* atos_parse(const char* p,
6173                               const char* start,
6174                               STRLEN* source_name_size,
6175                               STRLEN* source_line) {
6176     /* atos() output is something like:
6177      * perl_parse (in miniperl) (perl.c:2314)\n\n".
6178      * We cannot use Perl regular expressions, because we need to
6179      * stay low-level.  Therefore here we have a rolled-out version
6180      * of a state machine which matches _backwards_from_the_end_ and
6181      * if there's a success, returns the starts of the filename,
6182      * also setting the filename size and the source line number.
6183      * The matched regular expression is roughly "\(.*:\d+\)\s*$" */
6184     const char* source_number_start;
6185     const char* source_name_end;
6186     const char* source_line_end;
6187     const char* close_paren;
6188     UV uv;
6189 
6190     /* Skip trailing whitespace. */
6191     while (p > start && isspace(*p)) p--;
6192     /* Now we should be at the close paren. */
6193     if (p == start || *p != ')')
6194         return NULL;
6195     close_paren = p;
6196     p--;
6197     /* Now we should be in the line number. */
6198     if (p == start || !isdigit(*p))
6199         return NULL;
6200     /* Skip over the digits. */
6201     while (p > start && isdigit(*p))
6202         p--;
6203     /* Now we should be at the colon. */
6204     if (p == start || *p != ':')
6205         return NULL;
6206     source_number_start = p + 1;
6207     source_name_end = p; /* Just beyond the end. */
6208     p--;
6209     /* Look for the open paren. */
6210     while (p > start && *p != '(')
6211         p--;
6212     if (p == start)
6213         return NULL;
6214     p++;
6215     *source_name_size = source_name_end - p;
6216     if (grok_atoUV(source_number_start, &uv,  &source_line_end)
6217         && source_line_end == close_paren
6218         && uv <= PERL_INT_MAX
6219     ) {
6220         *source_line = (STRLEN)uv;
6221         return p;
6222     }
6223     return NULL;
6224 }
6225 
6226 /* Given a raw frame, read a pipe from the symbolicator (that's the
6227  * technical term) atos, reads the result, and parses the source code
6228  * location.  We must stay low-level, so we use snprintf(), pipe(),
6229  * and fread(), and then also parse the output ourselves. */
6230 static void atos_symbolize(atos_context* ctx,
6231                            void* raw_frame,
6232                            char** source_name,
6233                            STRLEN* source_name_size,
6234                            STRLEN* source_line)
6235 {
6236     char cmd[1024];
6237     const char* p;
6238     Size_t cnt;
6239 
6240     if (ctx->unavail)
6241         return;
6242     /* Simple security measure: if there's any funny business with
6243      * the object name (used as "-o '%s'" ), leave since at least
6244      * partially the user controls it. */
6245     for (p = ctx->fname; *p; p++) {
6246         if (*p == '\'' || iscntrl(*p)) {
6247             ctx->unavail = TRUE;
6248             return;
6249         }
6250     }
6251     cnt = snprintf(cmd, sizeof(cmd), ctx->format,
6252                    ctx->fname, ctx->object_base_addr, raw_frame);
6253     if (cnt < sizeof(cmd)) {
6254         /* Undo nostdio.h #defines that disable stdio.
6255          * This is somewhat naughty, but is used elsewhere
6256          * in the core, and affects only OS X. */
6257 #undef FILE
6258 #undef popen
6259 #undef fread
6260 #undef pclose
6261         FILE* fp = popen(cmd, "r");
6262         /* At the moment we open a new pipe for each stack frame.
6263          * This is naturally somewhat slow, but hopefully generating
6264          * stack traces is never going to in a performance critical path.
6265          *
6266          * We could play tricks with atos by batching the stack
6267          * addresses to be resolved: atos can either take multiple
6268          * addresses from the command line, or read addresses from
6269          * a file (though the mess of creating temporary files would
6270          * probably negate much of any possible speedup).
6271          *
6272          * Normally there are only two objects present in the backtrace:
6273          * perl itself, and the libdyld.dylib.  (Note that the object
6274          * filenames contain the full pathname, so perl may not always
6275          * be in the same place.)  Whenever the object in the
6276          * backtrace changes, the base address also changes.
6277          *
6278          * The problem with batching the addresses, though, would be
6279          * matching the results with the addresses: the parsing of
6280          * the results is already painful enough with a single address. */
6281         if (fp) {
6282             char out[1024];
6283             UV cnt = fread(out, 1, sizeof(out), fp);
6284             if (cnt < sizeof(out)) {
6285                 const char* p = atos_parse(out + cnt - 1, out,
6286                                            source_name_size,
6287                                            source_line);
6288                 if (p) {
6289                     Newx(*source_name,
6290                          *source_name_size, char);
6291                     Copy(p, *source_name,
6292                          *source_name_size,  char);
6293                 }
6294             }
6295             pclose(fp);
6296         }
6297     }
6298 }
6299 
6300 #endif /* #ifdef PERL_DARWIN */
6301 
6302 /*
6303 =for apidoc get_c_backtrace
6304 
6305 Collects the backtrace (aka "stacktrace") into a single linear
6306 malloced buffer, which the caller B<must> C<Perl_free_c_backtrace()>.
6307 
6308 Scans the frames back by S<C<depth + skip>>, then drops the C<skip> innermost,
6309 returning at most C<depth> frames.
6310 
6311 =cut
6312 */
6313 
6314 Perl_c_backtrace*
6315 Perl_get_c_backtrace(pTHX_ int depth, int skip)
6316 {
6317     /* Note that here we must stay as low-level as possible: Newx(),
6318      * Copy(), Safefree(); since we may be called from anywhere,
6319      * so we should avoid higher level constructs like SVs or AVs.
6320      *
6321      * Since we are using safesysmalloc() via Newx(), don't try
6322      * getting backtrace() there, unless you like deep recursion. */
6323 
6324     /* Currently only implemented with backtrace() and dladdr(),
6325      * for other platforms NULL is returned. */
6326 
6327 #if defined(HAS_BACKTRACE) && defined(HAS_DLADDR)
6328     /* backtrace() is available via <execinfo.h> in glibc and in most
6329      * modern BSDs; dladdr() is available via <dlfcn.h>. */
6330 
6331     /* We try fetching this many frames total, but then discard
6332      * the |skip| first ones.  For the remaining ones we will try
6333      * retrieving more information with dladdr(). */
6334     int try_depth = skip +  depth;
6335 
6336     /* The addresses (program counters) returned by backtrace(). */
6337     void** raw_frames;
6338 
6339     /* Retrieved with dladdr() from the addresses returned by backtrace(). */
6340     Dl_info* dl_infos;
6341 
6342     /* Sizes _including_ the terminating \0 of the object name
6343      * and symbol name strings. */
6344     STRLEN* object_name_sizes;
6345     STRLEN* symbol_name_sizes;
6346 
6347 #ifdef USE_BFD
6348     /* The symbol names comes either from dli_sname,
6349      * or if using BFD, they can come from BFD. */
6350     char** symbol_names;
6351 #endif
6352 
6353     /* The source code location information.  Dug out with e.g. BFD. */
6354     char** source_names;
6355     STRLEN* source_name_sizes;
6356     STRLEN* source_lines;
6357 
6358     Perl_c_backtrace* bt = NULL;  /* This is what will be returned. */
6359     int got_depth; /* How many frames were returned from backtrace(). */
6360     UV frame_count = 0; /* How many frames we return. */
6361     UV total_bytes = 0; /* The size of the whole returned backtrace. */
6362 
6363 #ifdef USE_BFD
6364     bfd_context bfd_ctx;
6365 #endif
6366 #ifdef PERL_DARWIN
6367     atos_context atos_ctx;
6368 #endif
6369 
6370     /* Here are probably possibilities for optimizing.  We could for
6371      * example have a struct that contains most of these and then
6372      * allocate |try_depth| of them, saving a bunch of malloc calls.
6373      * Note, however, that |frames| could not be part of that struct
6374      * because backtrace() will want an array of just them.  Also be
6375      * careful about the name strings. */
6376     Newx(raw_frames, try_depth, void*);
6377     Newx(dl_infos, try_depth, Dl_info);
6378     Newx(object_name_sizes, try_depth, STRLEN);
6379     Newx(symbol_name_sizes, try_depth, STRLEN);
6380     Newx(source_names, try_depth, char*);
6381     Newx(source_name_sizes, try_depth, STRLEN);
6382     Newx(source_lines, try_depth, STRLEN);
6383 #ifdef USE_BFD
6384     Newx(symbol_names, try_depth, char*);
6385 #endif
6386 
6387     /* Get the raw frames. */
6388     got_depth = (int)backtrace(raw_frames, try_depth);
6389 
6390     /* We use dladdr() instead of backtrace_symbols() because we want
6391      * the full details instead of opaque strings.  This is useful for
6392      * two reasons: () the details are needed for further symbolic
6393      * digging, for example in OS X (2) by having the details we fully
6394      * control the output, which in turn is useful when more platforms
6395      * are added: we can keep out output "portable". */
6396 
6397     /* We want a single linear allocation, which can then be freed
6398      * with a single swoop.  We will do the usual trick of first
6399      * walking over the structure and seeing how much we need to
6400      * allocate, then allocating, and then walking over the structure
6401      * the second time and populating it. */
6402 
6403     /* First we must compute the total size of the buffer. */
6404     total_bytes = sizeof(Perl_c_backtrace_header);
6405     if (got_depth > skip) {
6406         int i;
6407 #ifdef USE_BFD
6408         bfd_init(); /* Is this safe to call multiple times? */
6409         Zero(&bfd_ctx, 1, bfd_context);
6410 #endif
6411 #ifdef PERL_DARWIN
6412         Zero(&atos_ctx, 1, atos_context);
6413 #endif
6414         for (i = skip; i < try_depth; i++) {
6415             Dl_info* dl_info = &dl_infos[i];
6416 
6417             object_name_sizes[i] = 0;
6418             source_names[i] = NULL;
6419             source_name_sizes[i] = 0;
6420             source_lines[i] = 0;
6421 
6422             /* Yes, zero from dladdr() is failure. */
6423             if (dladdr(raw_frames[i], dl_info)) {
6424                 total_bytes += sizeof(Perl_c_backtrace_frame);
6425 
6426                 object_name_sizes[i] =
6427                     dl_info->dli_fname ? strlen(dl_info->dli_fname) : 0;
6428                 symbol_name_sizes[i] =
6429                     dl_info->dli_sname ? strlen(dl_info->dli_sname) : 0;
6430 #ifdef USE_BFD
6431                 bfd_update(&bfd_ctx, dl_info);
6432                 bfd_symbolize(&bfd_ctx, raw_frames[i],
6433                               &symbol_names[i],
6434                               &symbol_name_sizes[i],
6435                               &source_names[i],
6436                               &source_name_sizes[i],
6437                               &source_lines[i]);
6438 #endif
6439 #if PERL_DARWIN
6440                 atos_update(&atos_ctx, dl_info);
6441                 atos_symbolize(&atos_ctx,
6442                                raw_frames[i],
6443                                &source_names[i],
6444                                &source_name_sizes[i],
6445                                &source_lines[i]);
6446 #endif
6447 
6448                 /* Plus ones for the terminating \0. */
6449                 total_bytes += object_name_sizes[i] + 1;
6450                 total_bytes += symbol_name_sizes[i] + 1;
6451                 total_bytes += source_name_sizes[i] + 1;
6452 
6453                 frame_count++;
6454             } else {
6455                 break;
6456             }
6457         }
6458 #ifdef USE_BFD
6459         Safefree(bfd_ctx.bfd_syms);
6460 #endif
6461     }
6462 
6463     /* Now we can allocate and populate the result buffer. */
6464     Newxc(bt, total_bytes, char, Perl_c_backtrace);
6465     Zero(bt, total_bytes, char);
6466     bt->header.frame_count = frame_count;
6467     bt->header.total_bytes = total_bytes;
6468     if (frame_count > 0) {
6469         Perl_c_backtrace_frame* frame = bt->frame_info;
6470         char* name_base = (char *)(frame + frame_count);
6471         char* name_curr = name_base; /* Outputting the name strings here. */
6472         UV i;
6473         for (i = skip; i < skip + frame_count; i++) {
6474             Dl_info* dl_info = &dl_infos[i];
6475 
6476             frame->addr = raw_frames[i];
6477             frame->object_base_addr = dl_info->dli_fbase;
6478             frame->symbol_addr = dl_info->dli_saddr;
6479 
6480             /* Copies a string, including the \0, and advances the name_curr.
6481              * Also copies the start and the size to the frame. */
6482 #define PERL_C_BACKTRACE_STRCPY(frame, doffset, src, dsize, size) \
6483             if (size && src) \
6484                 Copy(src, name_curr, size, char); \
6485             frame->doffset = name_curr - (char*)bt; \
6486             frame->dsize = size; \
6487             name_curr += size; \
6488             *name_curr++ = 0;
6489 
6490             PERL_C_BACKTRACE_STRCPY(frame, object_name_offset,
6491                                     dl_info->dli_fname,
6492                                     object_name_size, object_name_sizes[i]);
6493 
6494 #ifdef USE_BFD
6495             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6496                                     symbol_names[i],
6497                                     symbol_name_size, symbol_name_sizes[i]);
6498             Safefree(symbol_names[i]);
6499 #else
6500             PERL_C_BACKTRACE_STRCPY(frame, symbol_name_offset,
6501                                     dl_info->dli_sname,
6502                                     symbol_name_size, symbol_name_sizes[i]);
6503 #endif
6504 
6505             PERL_C_BACKTRACE_STRCPY(frame, source_name_offset,
6506                                     source_names[i],
6507                                     source_name_size, source_name_sizes[i]);
6508             Safefree(source_names[i]);
6509 
6510 #undef PERL_C_BACKTRACE_STRCPY
6511 
6512             frame->source_line_number = source_lines[i];
6513 
6514             frame++;
6515         }
6516         assert(total_bytes ==
6517                (UV)(sizeof(Perl_c_backtrace_header) +
6518                     frame_count * sizeof(Perl_c_backtrace_frame) +
6519                     name_curr - name_base));
6520     }
6521 #ifdef USE_BFD
6522     Safefree(symbol_names);
6523     if (bfd_ctx.abfd) {
6524         bfd_close(bfd_ctx.abfd);
6525     }
6526 #endif
6527     Safefree(source_lines);
6528     Safefree(source_name_sizes);
6529     Safefree(source_names);
6530     Safefree(symbol_name_sizes);
6531     Safefree(object_name_sizes);
6532     /* Assuming the strings returned by dladdr() are pointers
6533      * to read-only static memory (the object file), so that
6534      * they do not need freeing (and cannot be). */
6535     Safefree(dl_infos);
6536     Safefree(raw_frames);
6537     return bt;
6538 #else
6539     PERL_UNUSED_ARGV(depth);
6540     PERL_UNUSED_ARGV(skip);
6541     return NULL;
6542 #endif
6543 }
6544 
6545 /*
6546 =for apidoc free_c_backtrace
6547 
6548 Deallocates a backtrace received from get_c_bracktrace.
6549 
6550 =cut
6551 */
6552 
6553 /*
6554 =for apidoc get_c_backtrace_dump
6555 
6556 Returns a SV containing a dump of C<depth> frames of the call stack, skipping
6557 the C<skip> innermost ones.  C<depth> of 20 is usually enough.
6558 
6559 The appended output looks like:
6560 
6561 ...
6562 1   10e004812:0082   Perl_croak   util.c:1716    /usr/bin/perl
6563 2   10df8d6d2:1d72   perl_parse   perl.c:3975    /usr/bin/perl
6564 ...
6565 
6566 The fields are tab-separated.  The first column is the depth (zero
6567 being the innermost non-skipped frame).  In the hex:offset, the hex is
6568 where the program counter was in C<S_parse_body>, and the :offset (might
6569 be missing) tells how much inside the C<S_parse_body> the program counter was.
6570 
6571 The C<util.c:1716> is the source code file and line number.
6572 
6573 The F</usr/bin/perl> is obvious (hopefully).
6574 
6575 Unknowns are C<"-">.  Unknowns can happen unfortunately quite easily:
6576 if the platform doesn't support retrieving the information;
6577 if the binary is missing the debug information;
6578 if the optimizer has transformed the code by for example inlining.
6579 
6580 =cut
6581 */
6582 
6583 SV*
6584 Perl_get_c_backtrace_dump(pTHX_ int depth, int skip)
6585 {
6586     Perl_c_backtrace* bt;
6587 
6588     bt = get_c_backtrace(depth, skip + 1 /* Hide ourselves. */);
6589     if (bt) {
6590         Perl_c_backtrace_frame* frame;
6591         SV* dsv = newSVpvs("");
6592         UV i;
6593         for (i = 0, frame = bt->frame_info;
6594              i < bt->header.frame_count; i++, frame++) {
6595             Perl_sv_catpvf(aTHX_ dsv, "%d", (int)i);
6596             Perl_sv_catpvf(aTHX_ dsv, "\t%p", frame->addr ? frame->addr : "-");
6597             /* Symbol (function) names might disappear without debug info.
6598              *
6599              * The source code location might disappear in case of the
6600              * optimizer inlining or otherwise rearranging the code. */
6601             if (frame->symbol_addr) {
6602                 Perl_sv_catpvf(aTHX_ dsv, ":%04x",
6603                                (int)
6604                                ((char*)frame->addr - (char*)frame->symbol_addr));
6605             }
6606             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6607                            frame->symbol_name_size &&
6608                            frame->symbol_name_offset ?
6609                            (char*)bt + frame->symbol_name_offset : "-");
6610             if (frame->source_name_size &&
6611                 frame->source_name_offset &&
6612                 frame->source_line_number) {
6613                 Perl_sv_catpvf(aTHX_ dsv, "\t%s:%"UVuf,
6614                                (char*)bt + frame->source_name_offset,
6615                                (UV)frame->source_line_number);
6616             } else {
6617                 Perl_sv_catpvf(aTHX_ dsv, "\t-");
6618             }
6619             Perl_sv_catpvf(aTHX_ dsv, "\t%s",
6620                            frame->object_name_size &&
6621                            frame->object_name_offset ?
6622                            (char*)bt + frame->object_name_offset : "-");
6623             /* The frame->object_base_addr is not output,
6624              * but it is used for symbolizing/symbolicating. */
6625             sv_catpvs(dsv, "\n");
6626         }
6627 
6628         Perl_free_c_backtrace(aTHX_ bt);
6629 
6630         return dsv;
6631     }
6632 
6633     return NULL;
6634 }
6635 
6636 /*
6637 =for apidoc dump_c_backtrace
6638 
6639 Dumps the C backtrace to the given C<fp>.
6640 
6641 Returns true if a backtrace could be retrieved, false if not.
6642 
6643 =cut
6644 */
6645 
6646 bool
6647 Perl_dump_c_backtrace(pTHX_ PerlIO* fp, int depth, int skip)
6648 {
6649     SV* sv;
6650 
6651     PERL_ARGS_ASSERT_DUMP_C_BACKTRACE;
6652 
6653     sv = Perl_get_c_backtrace_dump(aTHX_ depth, skip);
6654     if (sv) {
6655         sv_2mortal(sv);
6656         PerlIO_printf(fp, "%s", SvPV_nolen(sv));
6657         return TRUE;
6658     }
6659     return FALSE;
6660 }
6661 
6662 #endif /* #ifdef USE_C_BACKTRACE */
6663 
6664 #ifdef PERL_TSA_ACTIVE
6665 
6666 /* pthread_mutex_t and perl_mutex are typedef equivalent
6667  * so casting the pointers is fine. */
6668 
6669 int perl_tsa_mutex_lock(perl_mutex* mutex)
6670 {
6671     return pthread_mutex_lock((pthread_mutex_t *) mutex);
6672 }
6673 
6674 int perl_tsa_mutex_unlock(perl_mutex* mutex)
6675 {
6676     return pthread_mutex_unlock((pthread_mutex_t *) mutex);
6677 }
6678 
6679 int perl_tsa_mutex_destroy(perl_mutex* mutex)
6680 {
6681     return pthread_mutex_destroy((pthread_mutex_t *) mutex);
6682 }
6683 
6684 #endif
6685 
6686 
6687 #ifdef USE_DTRACE
6688 
6689 /* log a sub call or return */
6690 
6691 void
6692 Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call)
6693 {
6694     const char *func;
6695     const char *file;
6696     const char *stash;
6697     const COP  *start;
6698     line_t      line;
6699 
6700     PERL_ARGS_ASSERT_DTRACE_PROBE_CALL;
6701 
6702     if (CvNAMED(cv)) {
6703         HEK *hek = CvNAME_HEK(cv);
6704         func = HEK_KEY(hek);
6705     }
6706     else {
6707         GV  *gv = CvGV(cv);
6708         func = GvENAME(gv);
6709     }
6710     start = (const COP *)CvSTART(cv);
6711     file  = CopFILE(start);
6712     line  = CopLINE(start);
6713     stash = CopSTASHPV(start);
6714 
6715     if (is_call) {
6716         PERL_SUB_ENTRY(func, file, line, stash);
6717     }
6718     else {
6719         PERL_SUB_RETURN(func, file, line, stash);
6720     }
6721 }
6722 
6723 
6724 /* log a require file loading/loaded  */
6725 
6726 void
6727 Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading)
6728 {
6729     PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD;
6730 
6731     if (is_loading) {
6732 	PERL_LOADING_FILE(name);
6733     }
6734     else {
6735 	PERL_LOADED_FILE(name);
6736     }
6737 }
6738 
6739 
6740 /* log an op execution */
6741 
6742 void
6743 Perl_dtrace_probe_op(pTHX_ const OP *op)
6744 {
6745     PERL_ARGS_ASSERT_DTRACE_PROBE_OP;
6746 
6747     PERL_OP_ENTRY(OP_NAME(op));
6748 }
6749 
6750 
6751 /* log a compile/run phase change */
6752 
6753 void
6754 Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase)
6755 {
6756     const char *ph_old = PL_phase_names[PL_phase];
6757     const char *ph_new = PL_phase_names[phase];
6758 
6759     PERL_PHASE_CHANGE(ph_new, ph_old);
6760 }
6761 
6762 #endif
6763 
6764 /*
6765  * ex: set ts=8 sts=4 sw=4 et:
6766  */
6767