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