Remove unnecessary overrides in gnukfreebsd and gnuknetbsd hints.
[perl.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 HAS_SELECT
45 # ifdef I_SYS_SELECT
46 #  include <sys/select.h>
47 # endif
48 #endif
49
50 #define FLUSH
51
52 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
53 #  define FD_CLOEXEC 1                  /* NeXT needs this */
54 #endif
55
56 /* NOTE:  Do not call the next three routines directly.  Use the macros
57  * in handy.h, so that we can easily redefine everything to do tracking of
58  * allocated hunks back to the original New to track down any memory leaks.
59  * XXX This advice seems to be widely ignored :-(   --AD  August 1996.
60  */
61
62 static char *
63 S_write_no_mem(pTHX)
64 {
65     dVAR;
66     /* Can't use PerlIO to write as it allocates memory */
67     PerlLIO_write(PerlIO_fileno(Perl_error_log),
68                   PL_no_mem, strlen(PL_no_mem));
69     my_exit(1);
70     NORETURN_FUNCTION_END;
71 }
72
73 #if defined (DEBUGGING) || defined(PERL_IMPLICIT_SYS) || defined (PERL_TRACK_MEMPOOL)
74 #  define ALWAYS_NEED_THX
75 #endif
76
77 /* paranoid version of system's malloc() */
78
79 Malloc_t
80 Perl_safesysmalloc(MEM_SIZE size)
81 {
82 #ifdef ALWAYS_NEED_THX
83     dTHX;
84 #endif
85     Malloc_t ptr;
86 #ifdef HAS_64K_LIMIT
87         if (size > 0xffff) {
88             PerlIO_printf(Perl_error_log,
89                           "Allocation too large: %lx\n", size) FLUSH;
90             my_exit(1);
91         }
92 #endif /* HAS_64K_LIMIT */
93 #ifdef PERL_TRACK_MEMPOOL
94     size += sTHX;
95 #endif
96 #ifdef DEBUGGING
97     if ((SSize_t)size < 0)
98         Perl_croak_nocontext("panic: malloc, size=%"UVuf, (UV) size);
99 #endif
100     ptr = (Malloc_t)PerlMem_malloc(size?size:1);        /* malloc(0) is NASTY on our system */
101     PERL_ALLOC_CHECK(ptr);
102     if (ptr != NULL) {
103 #ifdef PERL_TRACK_MEMPOOL
104         struct perl_memory_debug_header *const header
105             = (struct perl_memory_debug_header *)ptr;
106 #endif
107
108 #ifdef PERL_POISON
109         PoisonNew(((char *)ptr), size, char);
110 #endif
111
112 #ifdef PERL_TRACK_MEMPOOL
113         header->interpreter = aTHX;
114         /* Link us into the list.  */
115         header->prev = &PL_memory_debug_header;
116         header->next = PL_memory_debug_header.next;
117         PL_memory_debug_header.next = header;
118         header->next->prev = header;
119 #  ifdef PERL_POISON
120         header->size = size;
121 #  endif
122         ptr = (Malloc_t)((char*)ptr+sTHX);
123 #endif
124         DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
125         return ptr;
126 }
127     else {
128 #ifndef ALWAYS_NEED_THX
129         dTHX;
130 #endif
131         if (PL_nomemok)
132             return NULL;
133         else {
134             return write_no_mem();
135         }
136     }
137     /*NOTREACHED*/
138 }
139
140 /* paranoid version of system's realloc() */
141
142 Malloc_t
143 Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
144 {
145 #ifdef ALWAYS_NEED_THX
146     dTHX;
147 #endif
148     Malloc_t ptr;
149 #if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
150     Malloc_t PerlMem_realloc();
151 #endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
152
153 #ifdef HAS_64K_LIMIT
154     if (size > 0xffff) {
155         PerlIO_printf(Perl_error_log,
156                       "Reallocation too large: %lx\n", size) FLUSH;
157         my_exit(1);
158     }
159 #endif /* HAS_64K_LIMIT */
160     if (!size) {
161         safesysfree(where);
162         return NULL;
163     }
164
165     if (!where)
166         return safesysmalloc(size);
167 #ifdef PERL_TRACK_MEMPOOL
168     where = (Malloc_t)((char*)where-sTHX);
169     size += sTHX;
170     {
171         struct perl_memory_debug_header *const header
172             = (struct perl_memory_debug_header *)where;
173
174         if (header->interpreter != aTHX) {
175             Perl_croak_nocontext("panic: realloc from wrong pool, %p!=%p",
176                                  header->interpreter, aTHX);
177         }
178         assert(header->next->prev == header);
179         assert(header->prev->next == header);
180 #  ifdef PERL_POISON
181         if (header->size > size) {
182             const MEM_SIZE freed_up = header->size - size;
183             char *start_of_freed = ((char *)where) + size;
184             PoisonFree(start_of_freed, freed_up, char);
185         }
186         header->size = size;
187 #  endif
188     }
189 #endif
190 #ifdef DEBUGGING
191     if ((SSize_t)size < 0)
192         Perl_croak_nocontext("panic: realloc, size=%"UVuf, (UV)size);
193 #endif
194     ptr = (Malloc_t)PerlMem_realloc(where,size);
195     PERL_ALLOC_CHECK(ptr);
196
197     /* MUST do this fixup first, before doing ANYTHING else, as anything else
198        might allocate memory/free/move memory, and until we do the fixup, it
199        may well be chasing (and writing to) free memory.  */
200 #ifdef PERL_TRACK_MEMPOOL
201     if (ptr != NULL) {
202         struct perl_memory_debug_header *const header
203             = (struct perl_memory_debug_header *)ptr;
204
205 #  ifdef PERL_POISON
206         if (header->size < size) {
207             const MEM_SIZE fresh = size - header->size;
208             char *start_of_fresh = ((char *)ptr) + size;
209             PoisonNew(start_of_fresh, fresh, char);
210         }
211 #  endif
212
213         header->next->prev = header;
214         header->prev->next = header;
215
216         ptr = (Malloc_t)((char*)ptr+sTHX);
217     }
218 #endif
219
220     /* In particular, must do that fixup above before logging anything via
221      *printf(), as it can reallocate memory, which can cause SEGVs.  */
222
223     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
224     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
225
226
227     if (ptr != NULL) {
228         return ptr;
229     }
230     else {
231 #ifndef ALWAYS_NEED_THX
232         dTHX;
233 #endif
234         if (PL_nomemok)
235             return NULL;
236         else {
237             return write_no_mem();
238         }
239     }
240     /*NOTREACHED*/
241 }
242
243 /* safe version of system's free() */
244
245 Free_t
246 Perl_safesysfree(Malloc_t where)
247 {
248 #ifdef ALWAYS_NEED_THX
249     dTHX;
250 #else
251     dVAR;
252 #endif
253     DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
254     if (where) {
255 #ifdef PERL_TRACK_MEMPOOL
256         where = (Malloc_t)((char*)where-sTHX);
257         {
258             struct perl_memory_debug_header *const header
259                 = (struct perl_memory_debug_header *)where;
260
261             if (header->interpreter != aTHX) {
262                 Perl_croak_nocontext("panic: free from wrong pool, %p!=%p",
263                                      header->interpreter, aTHX);
264             }
265             if (!header->prev) {
266                 Perl_croak_nocontext("panic: duplicate free");
267             }
268             if (!(header->next))
269                 Perl_croak_nocontext("panic: bad free, header->next==NULL");
270             if (header->next->prev != header || header->prev->next != header) {
271                 Perl_croak_nocontext("panic: bad free, ->next->prev=%p, "
272                                      "header=%p, ->prev->next=%p",
273                                      header->next->prev, header,
274                                      header->prev->next);
275             }
276             /* Unlink us from the chain.  */
277             header->next->prev = header->prev;
278             header->prev->next = header->next;
279 #  ifdef PERL_POISON
280             PoisonNew(where, header->size, char);
281 #  endif
282             /* Trigger the duplicate free warning.  */
283             header->next = NULL;
284         }
285 #endif
286         PerlMem_free(where);
287     }
288 }
289
290 /* safe version of system's calloc() */
291
292 Malloc_t
293 Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
294 {
295 #ifdef ALWAYS_NEED_THX
296     dTHX;
297 #endif
298     Malloc_t ptr;
299 #if defined(PERL_TRACK_MEMPOOL) || defined(HAS_64K_LIMIT) || defined(DEBUGGING)
300     MEM_SIZE total_size = 0;
301 #endif
302
303     /* Even though calloc() for zero bytes is strange, be robust. */
304     if (size && (count <= MEM_SIZE_MAX / size)) {
305 #if defined(PERL_TRACK_MEMPOOL) || defined(HAS_64K_LIMIT) || defined(DEBUGGING)
306         total_size = size * count;
307 #endif
308     }
309     else
310         Perl_croak_nocontext("%s", PL_memory_wrap);
311 #ifdef PERL_TRACK_MEMPOOL
312     if (sTHX <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
313         total_size += sTHX;
314     else
315         Perl_croak_nocontext("%s", PL_memory_wrap);
316 #endif
317 #ifdef HAS_64K_LIMIT
318     if (total_size > 0xffff) {
319         PerlIO_printf(Perl_error_log,
320                       "Allocation too large: %lx\n", total_size) FLUSH;
321         my_exit(1);
322     }
323 #endif /* HAS_64K_LIMIT */
324 #ifdef DEBUGGING
325     if ((SSize_t)size < 0 || (SSize_t)count < 0)
326         Perl_croak_nocontext("panic: calloc, size=%"UVuf", count=%"UVuf,
327                              (UV)size, (UV)count);
328 #endif
329 #ifdef PERL_TRACK_MEMPOOL
330     /* Have to use malloc() because we've added some space for our tracking
331        header.  */
332     /* malloc(0) is non-portable. */
333     ptr = (Malloc_t)PerlMem_malloc(total_size ? total_size : 1);
334 #else
335     /* Use calloc() because it might save a memset() if the memory is fresh
336        and clean from the OS.  */
337     if (count && size)
338         ptr = (Malloc_t)PerlMem_calloc(count, size);
339     else /* calloc(0) is non-portable. */
340         ptr = (Malloc_t)PerlMem_calloc(count ? count : 1, size ? size : 1);
341 #endif
342     PERL_ALLOC_CHECK(ptr);
343     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));
344     if (ptr != NULL) {
345 #ifdef PERL_TRACK_MEMPOOL
346         {
347             struct perl_memory_debug_header *const header
348                 = (struct perl_memory_debug_header *)ptr;
349
350             memset((void*)ptr, 0, total_size);
351             header->interpreter = aTHX;
352             /* Link us into the list.  */
353             header->prev = &PL_memory_debug_header;
354             header->next = PL_memory_debug_header.next;
355             PL_memory_debug_header.next = header;
356             header->next->prev = header;
357 #  ifdef PERL_POISON
358             header->size = total_size;
359 #  endif
360             ptr = (Malloc_t)((char*)ptr+sTHX);
361         }
362 #endif
363         return ptr;
364     }
365     else {
366 #ifndef ALWAYS_NEED_THX
367         dTHX;
368 #endif
369         if (PL_nomemok)
370             return NULL;
371         return write_no_mem();
372     }
373 }
374
375 /* These must be defined when not using Perl's malloc for binary
376  * compatibility */
377
378 #ifndef MYMALLOC
379
380 Malloc_t Perl_malloc (MEM_SIZE nbytes)
381 {
382     dTHXs;
383     return (Malloc_t)PerlMem_malloc(nbytes);
384 }
385
386 Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
387 {
388     dTHXs;
389     return (Malloc_t)PerlMem_calloc(elements, size);
390 }
391
392 Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
393 {
394     dTHXs;
395     return (Malloc_t)PerlMem_realloc(where, nbytes);
396 }
397
398 Free_t   Perl_mfree (Malloc_t where)
399 {
400     dTHXs;
401     PerlMem_free(where);
402 }
403
404 #endif
405
406 /* copy a string up to some (non-backslashed) delimiter, if any */
407
408 char *
409 Perl_delimcpy(register char *to, register const char *toend, register const char *from, register const char *fromend, register int delim, I32 *retlen)
410 {
411     I32 tolen;
412
413     PERL_ARGS_ASSERT_DELIMCPY;
414
415     for (tolen = 0; from < fromend; from++, tolen++) {
416         if (*from == '\\') {
417             if (from[1] != delim) {
418                 if (to < toend)
419                     *to++ = *from;
420                 tolen++;
421             }
422             from++;
423         }
424         else if (*from == delim)
425             break;
426         if (to < toend)
427             *to++ = *from;
428     }
429     if (to < toend)
430         *to = '\0';
431     *retlen = tolen;
432     return (char *)from;
433 }
434
435 /* return ptr to little string in big string, NULL if not found */
436 /* This routine was donated by Corey Satten. */
437
438 char *
439 Perl_instr(register const char *big, register const char *little)
440 {
441     I32 first;
442
443     PERL_ARGS_ASSERT_INSTR;
444
445     if (!little)
446         return (char*)big;
447     first = *little++;
448     if (!first)
449         return (char*)big;
450     while (*big) {
451         const char *s, *x;
452         if (*big++ != first)
453             continue;
454         for (x=big,s=little; *s; /**/ ) {
455             if (!*x)
456                 return NULL;
457             if (*s != *x)
458                 break;
459             else {
460                 s++;
461                 x++;
462             }
463         }
464         if (!*s)
465             return (char*)(big-1);
466     }
467     return NULL;
468 }
469
470 /* same as instr but allow embedded nulls.  The end pointers point to 1 beyond
471  * the final character desired to be checked */
472
473 char *
474 Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
475 {
476     PERL_ARGS_ASSERT_NINSTR;
477     if (little >= lend)
478         return (char*)big;
479     {
480         const char first = *little;
481         const char *s, *x;
482         bigend -= lend - little++;
483     OUTER:
484         while (big <= bigend) {
485             if (*big++ == first) {
486                 for (x=big,s=little; s < lend; x++,s++) {
487                     if (*s != *x)
488                         goto OUTER;
489                 }
490                 return (char*)(big-1);
491             }
492         }
493     }
494     return NULL;
495 }
496
497 /* reverse of the above--find last substring */
498
499 char *
500 Perl_rninstr(register const char *big, const char *bigend, const char *little, const char *lend)
501 {
502     const char *bigbeg;
503     const I32 first = *little;
504     const char * const littleend = lend;
505
506     PERL_ARGS_ASSERT_RNINSTR;
507
508     if (little >= littleend)
509         return (char*)bigend;
510     bigbeg = big;
511     big = bigend - (littleend - little++);
512     while (big >= bigbeg) {
513         const char *s, *x;
514         if (*big-- != first)
515             continue;
516         for (x=big+2,s=little; s < littleend; /**/ ) {
517             if (*s != *x)
518                 break;
519             else {
520                 x++;
521                 s++;
522             }
523         }
524         if (s >= littleend)
525             return (char*)(big+1);
526     }
527     return NULL;
528 }
529
530 /* As a space optimization, we do not compile tables for strings of length
531    0 and 1, and for strings of length 2 unless FBMcf_TAIL.  These are
532    special-cased in fbm_instr().
533
534    If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
535
536 /*
537 =head1 Miscellaneous Functions
538
539 =for apidoc fbm_compile
540
541 Analyses the string in order to make fast searches on it using fbm_instr()
542 -- the Boyer-Moore algorithm.
543
544 =cut
545 */
546
547 void
548 Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
549 {
550     dVAR;
551     const U8 *s;
552     STRLEN i;
553     STRLEN len;
554     STRLEN rarest = 0;
555     U32 frequency = 256;
556     MAGIC *mg;
557
558     PERL_ARGS_ASSERT_FBM_COMPILE;
559
560     if (isGV_with_GP(sv))
561         return;
562
563     if (SvVALID(sv))
564         return;
565
566     if (flags & FBMcf_TAIL) {
567         MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
568         sv_catpvs(sv, "\n");            /* Taken into account in fbm_instr() */
569         if (mg && mg->mg_len >= 0)
570             mg->mg_len++;
571     }
572     s = (U8*)SvPV_force_mutable(sv, len);
573     if (len == 0)               /* TAIL might be on a zero-length string. */
574         return;
575     SvUPGRADE(sv, SVt_PVMG);
576     SvIOK_off(sv);
577     SvNOK_off(sv);
578     SvVALID_on(sv);
579
580     /* "deep magic", the comment used to add. The use of MAGIC itself isn't
581        really. MAGIC was originally added in 79072805bf63abe5 (perl 5.0 alpha 2)
582        to call SvVALID_off() if the scalar was assigned to.
583
584        The comment itself (and "deeper magic" below) date back to
585        378cc40b38293ffc (perl 2.0). "deep magic" was an annotation on
586        str->str_pok |= 2;
587        where the magic (presumably) was that the scalar had a BM table hidden
588        inside itself.
589
590        As MAGIC is always present on BMs [in Perl 5 :-)], we can use it to store
591        the table instead of the previous (somewhat hacky) approach of co-opting
592        the string buffer and storing it after the string.  */
593
594     assert(!mg_find(sv, PERL_MAGIC_bm));
595     mg = sv_magicext(sv, NULL, PERL_MAGIC_bm, &PL_vtbl_bm, NULL, 0);
596     assert(mg);
597
598     if (len > 2) {
599         /* Shorter strings are special-cased in Perl_fbm_instr(), and don't use
600            the BM table.  */
601         const U8 mlen = (len>255) ? 255 : (U8)len;
602         const unsigned char *const sb = s + len - mlen; /* first char (maybe) */
603         U8 *table;
604
605         Newx(table, 256, U8);
606         memset((void*)table, mlen, 256);
607         mg->mg_ptr = (char *)table;
608         mg->mg_len = 256;
609
610         s += len - 1; /* last char */
611         i = 0;
612         while (s >= sb) {
613             if (table[*s] == mlen)
614                 table[*s] = (U8)i;
615             s--, i++;
616         }
617     }
618
619     s = (const unsigned char*)(SvPVX_const(sv));        /* deeper magic */
620     for (i = 0; i < len; i++) {
621         if (PL_freq[s[i]] < frequency) {
622             rarest = i;
623             frequency = PL_freq[s[i]];
624         }
625     }
626     BmRARE(sv) = s[rarest];
627     BmPREVIOUS(sv) = rarest;
628     BmUSEFUL(sv) = 100;                 /* Initial value */
629     if (flags & FBMcf_TAIL)
630         SvTAIL_on(sv);
631     DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %"UVuf"\n",
632                           BmRARE(sv), BmPREVIOUS(sv)));
633 }
634
635 /* If SvTAIL(littlestr), it has a fake '\n' at end. */
636 /* If SvTAIL is actually due to \Z or \z, this gives false positives
637    if multiline */
638
639 /*
640 =for apidoc fbm_instr
641
642 Returns the location of the SV in the string delimited by C<big> and
643 C<bigend>.  It returns C<NULL> if the string can't be found.  The C<sv>
644 does not have to be fbm_compiled, but the search will not be as fast
645 then.
646
647 =cut
648 */
649
650 char *
651 Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
652 {
653     unsigned char *s;
654     STRLEN l;
655     const unsigned char *little = (const unsigned char *)SvPV_const(littlestr,l);
656     STRLEN littlelen = l;
657     const I32 multiline = flags & FBMrf_MULTILINE;
658
659     PERL_ARGS_ASSERT_FBM_INSTR;
660
661     if ((STRLEN)(bigend - big) < littlelen) {
662         if ( SvTAIL(littlestr)
663              && ((STRLEN)(bigend - big) == littlelen - 1)
664              && (littlelen == 1
665                  || (*big == *little &&
666                      memEQ((char *)big, (char *)little, littlelen - 1))))
667             return (char*)big;
668         return NULL;
669     }
670
671     switch (littlelen) { /* Special cases for 0, 1 and 2  */
672     case 0:
673         return (char*)big;              /* Cannot be SvTAIL! */
674     case 1:
675             if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
676                 /* Know that bigend != big.  */
677                 if (bigend[-1] == '\n')
678                     return (char *)(bigend - 1);
679                 return (char *) bigend;
680             }
681             s = big;
682             while (s < bigend) {
683                 if (*s == *little)
684                     return (char *)s;
685                 s++;
686             }
687             if (SvTAIL(littlestr))
688                 return (char *) bigend;
689             return NULL;
690     case 2:
691         if (SvTAIL(littlestr) && !multiline) {
692             if (bigend[-1] == '\n' && bigend[-2] == *little)
693                 return (char*)bigend - 2;
694             if (bigend[-1] == *little)
695                 return (char*)bigend - 1;
696             return NULL;
697         }
698         {
699             /* This should be better than FBM if c1 == c2, and almost
700                as good otherwise: maybe better since we do less indirection.
701                And we save a lot of memory by caching no table. */
702             const unsigned char c1 = little[0];
703             const unsigned char c2 = little[1];
704
705             s = big + 1;
706             bigend--;
707             if (c1 != c2) {
708                 while (s <= bigend) {
709                     if (s[0] == c2) {
710                         if (s[-1] == c1)
711                             return (char*)s - 1;
712                         s += 2;
713                         continue;
714                     }
715                   next_chars:
716                     if (s[0] == c1) {
717                         if (s == bigend)
718                             goto check_1char_anchor;
719                         if (s[1] == c2)
720                             return (char*)s;
721                         else {
722                             s++;
723                             goto next_chars;
724                         }
725                     }
726                     else
727                         s += 2;
728                 }
729                 goto check_1char_anchor;
730             }
731             /* Now c1 == c2 */
732             while (s <= bigend) {
733                 if (s[0] == c1) {
734                     if (s[-1] == c1)
735                         return (char*)s - 1;
736                     if (s == bigend)
737                         goto check_1char_anchor;
738                     if (s[1] == c1)
739                         return (char*)s;
740                     s += 3;
741                 }
742                 else
743                     s += 2;
744             }
745         }
746       check_1char_anchor:               /* One char and anchor! */
747         if (SvTAIL(littlestr) && (*bigend == *little))
748             return (char *)bigend;      /* bigend is already decremented. */
749         return NULL;
750     default:
751         break; /* Only lengths 0 1 and 2 have special-case code.  */
752     }
753
754     if (SvTAIL(littlestr) && !multiline) {      /* tail anchored? */
755         s = bigend - littlelen;
756         if (s >= big && bigend[-1] == '\n' && *s == *little
757             /* Automatically of length > 2 */
758             && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
759         {
760             return (char*)s;            /* how sweet it is */
761         }
762         if (s[1] == *little
763             && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
764         {
765             return (char*)s + 1;        /* how sweet it is */
766         }
767         return NULL;
768     }
769     if (!SvVALID(littlestr)) {
770         char * const b = ninstr((char*)big,(char*)bigend,
771                          (char*)little, (char*)little + littlelen);
772
773         if (!b && SvTAIL(littlestr)) {  /* Automatically multiline!  */
774             /* Chop \n from littlestr: */
775             s = bigend - littlelen + 1;
776             if (*s == *little
777                 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
778             {
779                 return (char*)s;
780             }
781             return NULL;
782         }
783         return b;
784     }
785
786     /* Do actual FBM.  */
787     if (littlelen > (STRLEN)(bigend - big))
788         return NULL;
789
790     {
791         const MAGIC *const mg = mg_find(littlestr, PERL_MAGIC_bm);
792         const unsigned char * const table = (const unsigned char *) mg->mg_ptr;
793         const unsigned char *oldlittle;
794
795         --littlelen;                    /* Last char found by table lookup */
796
797         s = big + littlelen;
798         little += littlelen;            /* last char */
799         oldlittle = little;
800         if (s < bigend) {
801             I32 tmp;
802
803           top2:
804             if ((tmp = table[*s])) {
805                 if ((s += tmp) < bigend)
806                     goto top2;
807                 goto check_end;
808             }
809             else {              /* less expensive than calling strncmp() */
810                 unsigned char * const olds = s;
811
812                 tmp = littlelen;
813
814                 while (tmp--) {
815                     if (*--s == *--little)
816                         continue;
817                     s = olds + 1;       /* here we pay the price for failure */
818                     little = oldlittle;
819                     if (s < bigend)     /* fake up continue to outer loop */
820                         goto top2;
821                     goto check_end;
822                 }
823                 return (char *)s;
824             }
825         }
826       check_end:
827         if ( s == bigend
828              && SvTAIL(littlestr)
829              && memEQ((char *)(bigend - littlelen),
830                       (char *)(oldlittle - littlelen), littlelen) )
831             return (char*)bigend - littlelen;
832         return NULL;
833     }
834 }
835
836 char *
837 Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
838 {
839     dVAR;
840     PERL_ARGS_ASSERT_SCREAMINSTR;
841     PERL_UNUSED_ARG(bigstr);
842     PERL_UNUSED_ARG(littlestr);
843     PERL_UNUSED_ARG(start_shift);
844     PERL_UNUSED_ARG(end_shift);
845     PERL_UNUSED_ARG(old_posp);
846     PERL_UNUSED_ARG(last);
847
848     /* This function must only ever be called on a scalar with study magic,
849        but those do not happen any more. */
850     Perl_croak(aTHX_ "panic: screaminstr");
851     return NULL;
852 }
853
854 /*
855 =for apidoc foldEQ
856
857 Returns true if the leading len bytes of the strings s1 and s2 are the same
858 case-insensitively; false otherwise.  Uppercase and lowercase ASCII range bytes
859 match themselves and their opposite case counterparts.  Non-cased and non-ASCII
860 range bytes match only themselves.
861
862 =cut
863 */
864
865
866 I32
867 Perl_foldEQ(const char *s1, const char *s2, register I32 len)
868 {
869     const U8 *a = (const U8 *)s1;
870     const U8 *b = (const U8 *)s2;
871
872     PERL_ARGS_ASSERT_FOLDEQ;
873
874     while (len--) {
875         if (*a != *b && *a != PL_fold[*b])
876             return 0;
877         a++,b++;
878     }
879     return 1;
880 }
881 I32
882 Perl_foldEQ_latin1(const char *s1, const char *s2, register I32 len)
883 {
884     /* Compare non-utf8 using Unicode (Latin1) semantics.  Does not work on
885      * MICRO_SIGN, LATIN_SMALL_LETTER_SHARP_S, nor
886      * LATIN_SMALL_LETTER_Y_WITH_DIAERESIS, and does not check for these.  Nor
887      * does it check that the strings each have at least 'len' characters */
888
889     const U8 *a = (const U8 *)s1;
890     const U8 *b = (const U8 *)s2;
891
892     PERL_ARGS_ASSERT_FOLDEQ_LATIN1;
893
894     while (len--) {
895         if (*a != *b && *a != PL_fold_latin1[*b]) {
896             return 0;
897         }
898         a++, b++;
899     }
900     return 1;
901 }
902
903 /*
904 =for apidoc foldEQ_locale
905
906 Returns true if the leading len bytes of the strings s1 and s2 are the same
907 case-insensitively in the current locale; false otherwise.
908
909 =cut
910 */
911
912 I32
913 Perl_foldEQ_locale(const char *s1, const char *s2, register I32 len)
914 {
915     dVAR;
916     const U8 *a = (const U8 *)s1;
917     const U8 *b = (const U8 *)s2;
918
919     PERL_ARGS_ASSERT_FOLDEQ_LOCALE;
920
921     while (len--) {
922         if (*a != *b && *a != PL_fold_locale[*b])
923             return 0;
924         a++,b++;
925     }
926     return 1;
927 }
928
929 /* copy a string to a safe spot */
930
931 /*
932 =head1 Memory Management
933
934 =for apidoc savepv
935
936 Perl's version of C<strdup()>. Returns a pointer to a newly allocated
937 string which is a duplicate of C<pv>. The size of the string is
938 determined by C<strlen()>. The memory allocated for the new string can
939 be freed with the C<Safefree()> function.
940
941 =cut
942 */
943
944 char *
945 Perl_savepv(pTHX_ const char *pv)
946 {
947     PERL_UNUSED_CONTEXT;
948     if (!pv)
949         return NULL;
950     else {
951         char *newaddr;
952         const STRLEN pvlen = strlen(pv)+1;
953         Newx(newaddr, pvlen, char);
954         return (char*)memcpy(newaddr, pv, pvlen);
955     }
956 }
957
958 /* same thing but with a known length */
959
960 /*
961 =for apidoc savepvn
962
963 Perl's version of what C<strndup()> would be if it existed. Returns a
964 pointer to a newly allocated string which is a duplicate of the first
965 C<len> bytes from C<pv>, plus a trailing NUL byte. The memory allocated for
966 the new string can be freed with the C<Safefree()> function.
967
968 =cut
969 */
970
971 char *
972 Perl_savepvn(pTHX_ const char *pv, register I32 len)
973 {
974     char *newaddr;
975     PERL_UNUSED_CONTEXT;
976
977     Newx(newaddr,len+1,char);
978     /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
979     if (pv) {
980         /* might not be null terminated */
981         newaddr[len] = '\0';
982         return (char *) CopyD(pv,newaddr,len,char);
983     }
984     else {
985         return (char *) ZeroD(newaddr,len+1,char);
986     }
987 }
988
989 /*
990 =for apidoc savesharedpv
991
992 A version of C<savepv()> which allocates the duplicate string in memory
993 which is shared between threads.
994
995 =cut
996 */
997 char *
998 Perl_savesharedpv(pTHX_ const char *pv)
999 {
1000     char *newaddr;
1001     STRLEN pvlen;
1002     if (!pv)
1003         return NULL;
1004
1005     pvlen = strlen(pv)+1;
1006     newaddr = (char*)PerlMemShared_malloc(pvlen);
1007     if (!newaddr) {
1008         return write_no_mem();
1009     }
1010     return (char*)memcpy(newaddr, pv, pvlen);
1011 }
1012
1013 /*
1014 =for apidoc savesharedpvn
1015
1016 A version of C<savepvn()> which allocates the duplicate string in memory
1017 which is shared between threads. (With the specific difference that a NULL
1018 pointer is not acceptable)
1019
1020 =cut
1021 */
1022 char *
1023 Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
1024 {
1025     char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
1026
1027     /* PERL_ARGS_ASSERT_SAVESHAREDPVN; */
1028
1029     if (!newaddr) {
1030         return write_no_mem();
1031     }
1032     newaddr[len] = '\0';
1033     return (char*)memcpy(newaddr, pv, len);
1034 }
1035
1036 /*
1037 =for apidoc savesvpv
1038
1039 A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
1040 the passed in SV using C<SvPV()>
1041
1042 =cut
1043 */
1044
1045 char *
1046 Perl_savesvpv(pTHX_ SV *sv)
1047 {
1048     STRLEN len;
1049     const char * const pv = SvPV_const(sv, len);
1050     char *newaddr;
1051
1052     PERL_ARGS_ASSERT_SAVESVPV;
1053
1054     ++len;
1055     Newx(newaddr,len,char);
1056     return (char *) CopyD(pv,newaddr,len,char);
1057 }
1058
1059 /*
1060 =for apidoc savesharedsvpv
1061
1062 A version of C<savesharedpv()> which allocates the duplicate string in
1063 memory which is shared between threads.
1064
1065 =cut
1066 */
1067
1068 char *
1069 Perl_savesharedsvpv(pTHX_ SV *sv)
1070 {
1071     STRLEN len;
1072     const char * const pv = SvPV_const(sv, len);
1073
1074     PERL_ARGS_ASSERT_SAVESHAREDSVPV;
1075
1076     return savesharedpvn(pv, len);
1077 }
1078
1079 /* the SV for Perl_form() and mess() is not kept in an arena */
1080
1081 STATIC SV *
1082 S_mess_alloc(pTHX)
1083 {
1084     dVAR;
1085     SV *sv;
1086     XPVMG *any;
1087
1088     if (PL_phase != PERL_PHASE_DESTRUCT)
1089         return newSVpvs_flags("", SVs_TEMP);
1090
1091     if (PL_mess_sv)
1092         return PL_mess_sv;
1093
1094     /* Create as PVMG now, to avoid any upgrading later */
1095     Newx(sv, 1, SV);
1096     Newxz(any, 1, XPVMG);
1097     SvFLAGS(sv) = SVt_PVMG;
1098     SvANY(sv) = (void*)any;
1099     SvPV_set(sv, NULL);
1100     SvREFCNT(sv) = 1 << 30; /* practically infinite */
1101     PL_mess_sv = sv;
1102     return sv;
1103 }
1104
1105 #if defined(PERL_IMPLICIT_CONTEXT)
1106 char *
1107 Perl_form_nocontext(const char* pat, ...)
1108 {
1109     dTHX;
1110     char *retval;
1111     va_list args;
1112     PERL_ARGS_ASSERT_FORM_NOCONTEXT;
1113     va_start(args, pat);
1114     retval = vform(pat, &args);
1115     va_end(args);
1116     return retval;
1117 }
1118 #endif /* PERL_IMPLICIT_CONTEXT */
1119
1120 /*
1121 =head1 Miscellaneous Functions
1122 =for apidoc form
1123
1124 Takes a sprintf-style format pattern and conventional
1125 (non-SV) arguments and returns the formatted string.
1126
1127     (char *) Perl_form(pTHX_ const char* pat, ...)
1128
1129 can be used any place a string (char *) is required:
1130
1131     char * s = Perl_form("%d.%d",major,minor);
1132
1133 Uses a single private buffer so if you want to format several strings you
1134 must explicitly copy the earlier strings away (and free the copies when you
1135 are done).
1136
1137 =cut
1138 */
1139
1140 char *
1141 Perl_form(pTHX_ const char* pat, ...)
1142 {
1143     char *retval;
1144     va_list args;
1145     PERL_ARGS_ASSERT_FORM;
1146     va_start(args, pat);
1147     retval = vform(pat, &args);
1148     va_end(args);
1149     return retval;
1150 }
1151
1152 char *
1153 Perl_vform(pTHX_ const char *pat, va_list *args)
1154 {
1155     SV * const sv = mess_alloc();
1156     PERL_ARGS_ASSERT_VFORM;
1157     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1158     return SvPVX(sv);
1159 }
1160
1161 /*
1162 =for apidoc Am|SV *|mess|const char *pat|...
1163
1164 Take a sprintf-style format pattern and argument list.  These are used to
1165 generate a string message.  If the message does not end with a newline,
1166 then it will be extended with some indication of the current location
1167 in the code, as described for L</mess_sv>.
1168
1169 Normally, the resulting message is returned in a new mortal SV.
1170 During global destruction a single SV may be shared between uses of
1171 this function.
1172
1173 =cut
1174 */
1175
1176 #if defined(PERL_IMPLICIT_CONTEXT)
1177 SV *
1178 Perl_mess_nocontext(const char *pat, ...)
1179 {
1180     dTHX;
1181     SV *retval;
1182     va_list args;
1183     PERL_ARGS_ASSERT_MESS_NOCONTEXT;
1184     va_start(args, pat);
1185     retval = vmess(pat, &args);
1186     va_end(args);
1187     return retval;
1188 }
1189 #endif /* PERL_IMPLICIT_CONTEXT */
1190
1191 SV *
1192 Perl_mess(pTHX_ const char *pat, ...)
1193 {
1194     SV *retval;
1195     va_list args;
1196     PERL_ARGS_ASSERT_MESS;
1197     va_start(args, pat);
1198     retval = vmess(pat, &args);
1199     va_end(args);
1200     return retval;
1201 }
1202
1203 STATIC const COP*
1204 S_closest_cop(pTHX_ const COP *cop, const OP *o)
1205 {
1206     dVAR;
1207     /* Look for PL_op starting from o.  cop is the last COP we've seen. */
1208
1209     PERL_ARGS_ASSERT_CLOSEST_COP;
1210
1211     if (!o || o == PL_op)
1212         return cop;
1213
1214     if (o->op_flags & OPf_KIDS) {
1215         const OP *kid;
1216         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1217             const COP *new_cop;
1218
1219             /* If the OP_NEXTSTATE has been optimised away we can still use it
1220              * the get the file and line number. */
1221
1222             if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1223                 cop = (const COP *)kid;
1224
1225             /* Keep searching, and return when we've found something. */
1226
1227             new_cop = closest_cop(cop, kid);
1228             if (new_cop)
1229                 return new_cop;
1230         }
1231     }
1232
1233     /* Nothing found. */
1234
1235     return NULL;
1236 }
1237
1238 /*
1239 =for apidoc Am|SV *|mess_sv|SV *basemsg|bool consume
1240
1241 Expands a message, intended for the user, to include an indication of
1242 the current location in the code, if the message does not already appear
1243 to be complete.
1244
1245 C<basemsg> is the initial message or object.  If it is a reference, it
1246 will be used as-is and will be the result of this function.  Otherwise it
1247 is used as a string, and if it already ends with a newline, it is taken
1248 to be complete, and the result of this function will be the same string.
1249 If the message does not end with a newline, then a segment such as C<at
1250 foo.pl line 37> will be appended, and possibly other clauses indicating
1251 the current state of execution.  The resulting message will end with a
1252 dot and a newline.
1253
1254 Normally, the resulting message is returned in a new mortal SV.
1255 During global destruction a single SV may be shared between uses of this
1256 function.  If C<consume> is true, then the function is permitted (but not
1257 required) to modify and return C<basemsg> instead of allocating a new SV.
1258
1259 =cut
1260 */
1261
1262 SV *
1263 Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
1264 {
1265     dVAR;
1266     SV *sv;
1267
1268     PERL_ARGS_ASSERT_MESS_SV;
1269
1270     if (SvROK(basemsg)) {
1271         if (consume) {
1272             sv = basemsg;
1273         }
1274         else {
1275             sv = mess_alloc();
1276             sv_setsv(sv, basemsg);
1277         }
1278         return sv;
1279     }
1280
1281     if (SvPOK(basemsg) && consume) {
1282         sv = basemsg;
1283     }
1284     else {
1285         sv = mess_alloc();
1286         sv_copypv(sv, basemsg);
1287     }
1288
1289     if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
1290         /*
1291          * Try and find the file and line for PL_op.  This will usually be
1292          * PL_curcop, but it might be a cop that has been optimised away.  We
1293          * can try to find such a cop by searching through the optree starting
1294          * from the sibling of PL_curcop.
1295          */
1296
1297         const COP *cop = closest_cop(PL_curcop, PL_curcop->op_sibling);
1298         if (!cop)
1299             cop = PL_curcop;
1300
1301         if (CopLINE(cop))
1302             Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
1303             OutCopFILE(cop), (IV)CopLINE(cop));
1304         /* Seems that GvIO() can be untrustworthy during global destruction. */
1305         if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
1306                 && IoLINES(GvIOp(PL_last_in_gv)))
1307         {
1308             STRLEN l;
1309             const bool line_mode = (RsSIMPLE(PL_rs) &&
1310                                    *SvPV_const(PL_rs,l) == '\n' && l == 1);
1311             Perl_sv_catpvf(aTHX_ sv, ", <%"SVf"> %s %"IVdf,
1312                            SVfARG(PL_last_in_gv == PL_argvgv
1313                                  ? &PL_sv_no
1314                                  : sv_2mortal(newSVhek(GvNAME_HEK(PL_last_in_gv)))),
1315                            line_mode ? "line" : "chunk",
1316                            (IV)IoLINES(GvIOp(PL_last_in_gv)));
1317         }
1318         if (PL_phase == PERL_PHASE_DESTRUCT)
1319             sv_catpvs(sv, " during global destruction");
1320         sv_catpvs(sv, ".\n");
1321     }
1322     return sv;
1323 }
1324
1325 /*
1326 =for apidoc Am|SV *|vmess|const char *pat|va_list *args
1327
1328 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1329 argument list.  These are used to generate a string message.  If the
1330 message does not end with a newline, then it will be extended with
1331 some indication of the current location in the code, as described for
1332 L</mess_sv>.
1333
1334 Normally, the resulting message is returned in a new mortal SV.
1335 During global destruction a single SV may be shared between uses of
1336 this function.
1337
1338 =cut
1339 */
1340
1341 SV *
1342 Perl_vmess(pTHX_ const char *pat, va_list *args)
1343 {
1344     dVAR;
1345     SV * const sv = mess_alloc();
1346
1347     PERL_ARGS_ASSERT_VMESS;
1348
1349     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1350     return mess_sv(sv, 1);
1351 }
1352
1353 void
1354 Perl_write_to_stderr(pTHX_ SV* msv)
1355 {
1356     dVAR;
1357     IO *io;
1358     MAGIC *mg;
1359
1360     PERL_ARGS_ASSERT_WRITE_TO_STDERR;
1361
1362     if (PL_stderrgv && SvREFCNT(PL_stderrgv) 
1363         && (io = GvIO(PL_stderrgv))
1364         && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) 
1365         Perl_magic_methcall(aTHX_ MUTABLE_SV(io), mg, "PRINT",
1366                             G_SCALAR | G_DISCARD | G_WRITING_TO_STDERR, 1, msv);
1367     else {
1368 #ifdef USE_SFIO
1369         /* SFIO can really mess with your errno */
1370         dSAVED_ERRNO;
1371 #endif
1372         PerlIO * const serr = Perl_error_log;
1373
1374         do_print(msv, serr);
1375         (void)PerlIO_flush(serr);
1376 #ifdef USE_SFIO
1377         RESTORE_ERRNO;
1378 #endif
1379     }
1380 }
1381
1382 /*
1383 =head1 Warning and Dieing
1384 */
1385
1386 /* Common code used in dieing and warning */
1387
1388 STATIC SV *
1389 S_with_queued_errors(pTHX_ SV *ex)
1390 {
1391     PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS;
1392     if (PL_errors && SvCUR(PL_errors) && !SvROK(ex)) {
1393         sv_catsv(PL_errors, ex);
1394         ex = sv_mortalcopy(PL_errors);
1395         SvCUR_set(PL_errors, 0);
1396     }
1397     return ex;
1398 }
1399
1400 STATIC bool
1401 S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
1402 {
1403     dVAR;
1404     HV *stash;
1405     GV *gv;
1406     CV *cv;
1407     SV **const hook = warn ? &PL_warnhook : &PL_diehook;
1408     /* sv_2cv might call Perl_croak() or Perl_warner() */
1409     SV * const oldhook = *hook;
1410
1411     if (!oldhook)
1412         return FALSE;
1413
1414     ENTER;
1415     SAVESPTR(*hook);
1416     *hook = NULL;
1417     cv = sv_2cv(oldhook, &stash, &gv, 0);
1418     LEAVE;
1419     if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1420         dSP;
1421         SV *exarg;
1422
1423         ENTER;
1424         save_re_context();
1425         if (warn) {
1426             SAVESPTR(*hook);
1427             *hook = NULL;
1428         }
1429         exarg = newSVsv(ex);
1430         SvREADONLY_on(exarg);
1431         SAVEFREESV(exarg);
1432
1433         PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
1434         PUSHMARK(SP);
1435         XPUSHs(exarg);
1436         PUTBACK;
1437         call_sv(MUTABLE_SV(cv), G_DISCARD);
1438         POPSTACK;
1439         LEAVE;
1440         return TRUE;
1441     }
1442     return FALSE;
1443 }
1444
1445 /*
1446 =for apidoc Am|OP *|die_sv|SV *baseex
1447
1448 Behaves the same as L</croak_sv>, except for the return type.
1449 It should be used only where the C<OP *> return type is required.
1450 The function never actually returns.
1451
1452 =cut
1453 */
1454
1455 OP *
1456 Perl_die_sv(pTHX_ SV *baseex)
1457 {
1458     PERL_ARGS_ASSERT_DIE_SV;
1459     croak_sv(baseex);
1460     assert(0); /* NOTREACHED */
1461     return NULL;
1462 }
1463
1464 /*
1465 =for apidoc Am|OP *|die|const char *pat|...
1466
1467 Behaves the same as L</croak>, except for the return type.
1468 It should be used only where the C<OP *> return type is required.
1469 The function never actually returns.
1470
1471 =cut
1472 */
1473
1474 #if defined(PERL_IMPLICIT_CONTEXT)
1475 OP *
1476 Perl_die_nocontext(const char* pat, ...)
1477 {
1478     dTHX;
1479     va_list args;
1480     va_start(args, pat);
1481     vcroak(pat, &args);
1482     assert(0); /* NOTREACHED */
1483     va_end(args);
1484     return NULL;
1485 }
1486 #endif /* PERL_IMPLICIT_CONTEXT */
1487
1488 OP *
1489 Perl_die(pTHX_ const char* pat, ...)
1490 {
1491     va_list args;
1492     va_start(args, pat);
1493     vcroak(pat, &args);
1494     assert(0); /* NOTREACHED */
1495     va_end(args);
1496     return NULL;
1497 }
1498
1499 /*
1500 =for apidoc Am|void|croak_sv|SV *baseex
1501
1502 This is an XS interface to Perl's C<die> function.
1503
1504 C<baseex> is the error message or object.  If it is a reference, it
1505 will be used as-is.  Otherwise it is used as a string, and if it does
1506 not end with a newline then it will be extended with some indication of
1507 the current location in the code, as described for L</mess_sv>.
1508
1509 The error message or object will be used as an exception, by default
1510 returning control to the nearest enclosing C<eval>, but subject to
1511 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak_sv>
1512 function never returns normally.
1513
1514 To die with a simple string message, the L</croak> function may be
1515 more convenient.
1516
1517 =cut
1518 */
1519
1520 void
1521 Perl_croak_sv(pTHX_ SV *baseex)
1522 {
1523     SV *ex = with_queued_errors(mess_sv(baseex, 0));
1524     PERL_ARGS_ASSERT_CROAK_SV;
1525     invoke_exception_hook(ex, FALSE);
1526     die_unwind(ex);
1527 }
1528
1529 /*
1530 =for apidoc Am|void|vcroak|const char *pat|va_list *args
1531
1532 This is an XS interface to Perl's C<die> function.
1533
1534 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1535 argument list.  These are used to generate a string message.  If the
1536 message does not end with a newline, then it will be extended with
1537 some indication of the current location in the code, as described for
1538 L</mess_sv>.
1539
1540 The error message will be used as an exception, by default
1541 returning control to the nearest enclosing C<eval>, but subject to
1542 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1543 function never returns normally.
1544
1545 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1546 (C<$@>) will be used as an error message or object instead of building an
1547 error message from arguments.  If you want to throw a non-string object,
1548 or build an error message in an SV yourself, it is preferable to use
1549 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1550
1551 =cut
1552 */
1553
1554 void
1555 Perl_vcroak(pTHX_ const char* pat, va_list *args)
1556 {
1557     SV *ex = with_queued_errors(pat ? vmess(pat, args) : mess_sv(ERRSV, 0));
1558     invoke_exception_hook(ex, FALSE);
1559     die_unwind(ex);
1560 }
1561
1562 /*
1563 =for apidoc Am|void|croak|const char *pat|...
1564
1565 This is an XS interface to Perl's C<die> function.
1566
1567 Take a sprintf-style format pattern and argument list.  These are used to
1568 generate a string message.  If the message does not end with a newline,
1569 then it will be extended with some indication of the current location
1570 in the code, as described for L</mess_sv>.
1571
1572 The error message will be used as an exception, by default
1573 returning control to the nearest enclosing C<eval>, but subject to
1574 modification by a C<$SIG{__DIE__}> handler.  In any case, the C<croak>
1575 function never returns normally.
1576
1577 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1578 (C<$@>) will be used as an error message or object instead of building an
1579 error message from arguments.  If you want to throw a non-string object,
1580 or build an error message in an SV yourself, it is preferable to use
1581 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1582
1583 =cut
1584 */
1585
1586 #if defined(PERL_IMPLICIT_CONTEXT)
1587 void
1588 Perl_croak_nocontext(const char *pat, ...)
1589 {
1590     dTHX;
1591     va_list args;
1592     va_start(args, pat);
1593     vcroak(pat, &args);
1594     assert(0); /* NOTREACHED */
1595     va_end(args);
1596 }
1597 #endif /* PERL_IMPLICIT_CONTEXT */
1598
1599 void
1600 Perl_croak(pTHX_ const char *pat, ...)
1601 {
1602     va_list args;
1603     va_start(args, pat);
1604     vcroak(pat, &args);
1605     assert(0); /* NOTREACHED */
1606     va_end(args);
1607 }
1608
1609 /*
1610 =for apidoc Am|void|croak_no_modify
1611
1612 Exactly equivalent to C<Perl_croak(aTHX_ "%s", PL_no_modify)>, but generates
1613 terser object code than using C<Perl_croak>. Less code used on exception code
1614 paths reduces CPU cache pressure.
1615
1616 =cut
1617 */
1618
1619 void
1620 Perl_croak_no_modify(pTHX)
1621 {
1622     Perl_croak(aTHX_ "%s", PL_no_modify);
1623 }
1624
1625 /*
1626 =for apidoc Am|void|warn_sv|SV *baseex
1627
1628 This is an XS interface to Perl's C<warn> function.
1629
1630 C<baseex> is the error message or object.  If it is a reference, it
1631 will be used as-is.  Otherwise it is used as a string, and if it does
1632 not end with a newline then it will be extended with some indication of
1633 the current location in the code, as described for L</mess_sv>.
1634
1635 The error message or object will by default be written to standard error,
1636 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1637
1638 To warn with a simple string message, the L</warn> function may be
1639 more convenient.
1640
1641 =cut
1642 */
1643
1644 void
1645 Perl_warn_sv(pTHX_ SV *baseex)
1646 {
1647     SV *ex = mess_sv(baseex, 0);
1648     PERL_ARGS_ASSERT_WARN_SV;
1649     if (!invoke_exception_hook(ex, TRUE))
1650         write_to_stderr(ex);
1651 }
1652
1653 /*
1654 =for apidoc Am|void|vwarn|const char *pat|va_list *args
1655
1656 This is an XS interface to Perl's C<warn> function.
1657
1658 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1659 argument list.  These are used to generate a string message.  If the
1660 message does not end with a newline, then it will be extended with
1661 some indication of the current location in the code, as described for
1662 L</mess_sv>.
1663
1664 The error message or object will by default be written to standard error,
1665 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1666
1667 Unlike with L</vcroak>, C<pat> is not permitted to be null.
1668
1669 =cut
1670 */
1671
1672 void
1673 Perl_vwarn(pTHX_ const char* pat, va_list *args)
1674 {
1675     SV *ex = vmess(pat, args);
1676     PERL_ARGS_ASSERT_VWARN;
1677     if (!invoke_exception_hook(ex, TRUE))
1678         write_to_stderr(ex);
1679 }
1680
1681 /*
1682 =for apidoc Am|void|warn|const char *pat|...
1683
1684 This is an XS interface to Perl's C<warn> function.
1685
1686 Take a sprintf-style format pattern and argument list.  These are used to
1687 generate a string message.  If the message does not end with a newline,
1688 then it will be extended with some indication of the current location
1689 in the code, as described for L</mess_sv>.
1690
1691 The error message or object will by default be written to standard error,
1692 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1693
1694 Unlike with L</croak>, C<pat> is not permitted to be null.
1695
1696 =cut
1697 */
1698
1699 #if defined(PERL_IMPLICIT_CONTEXT)
1700 void
1701 Perl_warn_nocontext(const char *pat, ...)
1702 {
1703     dTHX;
1704     va_list args;
1705     PERL_ARGS_ASSERT_WARN_NOCONTEXT;
1706     va_start(args, pat);
1707     vwarn(pat, &args);
1708     va_end(args);
1709 }
1710 #endif /* PERL_IMPLICIT_CONTEXT */
1711
1712 void
1713 Perl_warn(pTHX_ const char *pat, ...)
1714 {
1715     va_list args;
1716     PERL_ARGS_ASSERT_WARN;
1717     va_start(args, pat);
1718     vwarn(pat, &args);
1719     va_end(args);
1720 }
1721
1722 #if defined(PERL_IMPLICIT_CONTEXT)
1723 void
1724 Perl_warner_nocontext(U32 err, const char *pat, ...)
1725 {
1726     dTHX; 
1727     va_list args;
1728     PERL_ARGS_ASSERT_WARNER_NOCONTEXT;
1729     va_start(args, pat);
1730     vwarner(err, pat, &args);
1731     va_end(args);
1732 }
1733 #endif /* PERL_IMPLICIT_CONTEXT */
1734
1735 void
1736 Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
1737 {
1738     PERL_ARGS_ASSERT_CK_WARNER_D;
1739
1740     if (Perl_ckwarn_d(aTHX_ err)) {
1741         va_list args;
1742         va_start(args, pat);
1743         vwarner(err, pat, &args);
1744         va_end(args);
1745     }
1746 }
1747
1748 void
1749 Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
1750 {
1751     PERL_ARGS_ASSERT_CK_WARNER;
1752
1753     if (Perl_ckwarn(aTHX_ err)) {
1754         va_list args;
1755         va_start(args, pat);
1756         vwarner(err, pat, &args);
1757         va_end(args);
1758     }
1759 }
1760
1761 void
1762 Perl_warner(pTHX_ U32  err, const char* pat,...)
1763 {
1764     va_list args;
1765     PERL_ARGS_ASSERT_WARNER;
1766     va_start(args, pat);
1767     vwarner(err, pat, &args);
1768     va_end(args);
1769 }
1770
1771 void
1772 Perl_vwarner(pTHX_ U32  err, const char* pat, va_list* args)
1773 {
1774     dVAR;
1775     PERL_ARGS_ASSERT_VWARNER;
1776     if (PL_warnhook == PERL_WARNHOOK_FATAL || ckDEAD(err)) {
1777         SV * const msv = vmess(pat, args);
1778
1779         invoke_exception_hook(msv, FALSE);
1780         die_unwind(msv);
1781     }
1782     else {
1783         Perl_vwarn(aTHX_ pat, args);
1784     }
1785 }
1786
1787 /* implements the ckWARN? macros */
1788
1789 bool
1790 Perl_ckwarn(pTHX_ U32 w)
1791 {
1792     dVAR;
1793     /* If lexical warnings have not been set, use $^W.  */
1794     if (isLEXWARN_off)
1795         return PL_dowarn & G_WARN_ON;
1796
1797     return ckwarn_common(w);
1798 }
1799
1800 /* implements the ckWARN?_d macro */
1801
1802 bool
1803 Perl_ckwarn_d(pTHX_ U32 w)
1804 {
1805     dVAR;
1806     /* If lexical warnings have not been set then default classes warn.  */
1807     if (isLEXWARN_off)
1808         return TRUE;
1809
1810     return ckwarn_common(w);
1811 }
1812
1813 static bool
1814 S_ckwarn_common(pTHX_ U32 w)
1815 {
1816     if (PL_curcop->cop_warnings == pWARN_ALL)
1817         return TRUE;
1818
1819     if (PL_curcop->cop_warnings == pWARN_NONE)
1820         return FALSE;
1821
1822     /* Check the assumption that at least the first slot is non-zero.  */
1823     assert(unpackWARN1(w));
1824
1825     /* Check the assumption that it is valid to stop as soon as a zero slot is
1826        seen.  */
1827     if (!unpackWARN2(w)) {
1828         assert(!unpackWARN3(w));
1829         assert(!unpackWARN4(w));
1830     } else if (!unpackWARN3(w)) {
1831         assert(!unpackWARN4(w));
1832     }
1833         
1834     /* Right, dealt with all the special cases, which are implemented as non-
1835        pointers, so there is a pointer to a real warnings mask.  */
1836     do {
1837         if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)))
1838             return TRUE;
1839     } while (w >>= WARNshift);
1840
1841     return FALSE;
1842 }
1843
1844 /* Set buffer=NULL to get a new one.  */
1845 STRLEN *
1846 Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
1847                            STRLEN size) {
1848     const MEM_SIZE len_wanted =
1849         sizeof(STRLEN) + (size > WARNsize ? size : WARNsize);
1850     PERL_UNUSED_CONTEXT;
1851     PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
1852
1853     buffer = (STRLEN*)
1854         (specialWARN(buffer) ?
1855          PerlMemShared_malloc(len_wanted) :
1856          PerlMemShared_realloc(buffer, len_wanted));
1857     buffer[0] = size;
1858     Copy(bits, (buffer + 1), size, char);
1859     if (size < WARNsize)
1860         Zero((char *)(buffer + 1) + size, WARNsize - size, char);
1861     return buffer;
1862 }
1863
1864 /* since we've already done strlen() for both nam and val
1865  * we can use that info to make things faster than
1866  * sprintf(s, "%s=%s", nam, val)
1867  */
1868 #define my_setenv_format(s, nam, nlen, val, vlen) \
1869    Copy(nam, s, nlen, char); \
1870    *(s+nlen) = '='; \
1871    Copy(val, s+(nlen+1), vlen, char); \
1872    *(s+(nlen+1+vlen)) = '\0'
1873
1874 #ifdef USE_ENVIRON_ARRAY
1875        /* VMS' my_setenv() is in vms.c */
1876 #if !defined(WIN32) && !defined(NETWARE)
1877 void
1878 Perl_my_setenv(pTHX_ const char *nam, const char *val)
1879 {
1880   dVAR;
1881 #ifdef USE_ITHREADS
1882   /* only parent thread can modify process environment */
1883   if (PL_curinterp == aTHX)
1884 #endif
1885   {
1886 #ifndef PERL_USE_SAFE_PUTENV
1887     if (!PL_use_safe_putenv) {
1888     /* most putenv()s leak, so we manipulate environ directly */
1889     I32 i;
1890     const I32 len = strlen(nam);
1891     int nlen, vlen;
1892
1893     /* where does it go? */
1894     for (i = 0; environ[i]; i++) {
1895         if (strnEQ(environ[i],nam,len) && environ[i][len] == '=')
1896             break;
1897     }
1898
1899     if (environ == PL_origenviron) {   /* need we copy environment? */
1900        I32 j;
1901        I32 max;
1902        char **tmpenv;
1903
1904        max = i;
1905        while (environ[max])
1906            max++;
1907        tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
1908        for (j=0; j<max; j++) {         /* copy environment */
1909            const int len = strlen(environ[j]);
1910            tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
1911            Copy(environ[j], tmpenv[j], len+1, char);
1912        }
1913        tmpenv[max] = NULL;
1914        environ = tmpenv;               /* tell exec where it is now */
1915     }
1916     if (!val) {
1917        safesysfree(environ[i]);
1918        while (environ[i]) {
1919            environ[i] = environ[i+1];
1920            i++;
1921         }
1922        return;
1923     }
1924     if (!environ[i]) {                 /* does not exist yet */
1925        environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
1926        environ[i+1] = NULL;    /* make sure it's null terminated */
1927     }
1928     else
1929        safesysfree(environ[i]);
1930        nlen = strlen(nam);
1931        vlen = strlen(val);
1932
1933        environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
1934        /* all that work just for this */
1935        my_setenv_format(environ[i], nam, nlen, val, vlen);
1936     } else {
1937 # endif
1938 #   if defined(__CYGWIN__) || defined(EPOC) || defined(__SYMBIAN32__) || defined(__riscos__)
1939 #       if defined(HAS_UNSETENV)
1940         if (val == NULL) {
1941             (void)unsetenv(nam);
1942         } else {
1943             (void)setenv(nam, val, 1);
1944         }
1945 #       else /* ! HAS_UNSETENV */
1946         (void)setenv(nam, val, 1);
1947 #       endif /* HAS_UNSETENV */
1948 #   else
1949 #       if defined(HAS_UNSETENV)
1950         if (val == NULL) {
1951             (void)unsetenv(nam);
1952         } else {
1953             const int nlen = strlen(nam);
1954             const int vlen = strlen(val);
1955             char * const new_env =
1956                 (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1957             my_setenv_format(new_env, nam, nlen, val, vlen);
1958             (void)putenv(new_env);
1959         }
1960 #       else /* ! HAS_UNSETENV */
1961         char *new_env;
1962         const int nlen = strlen(nam);
1963         int vlen;
1964         if (!val) {
1965            val = "";
1966         }
1967         vlen = strlen(val);
1968         new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1969         /* all that work just for this */
1970         my_setenv_format(new_env, nam, nlen, val, vlen);
1971         (void)putenv(new_env);
1972 #       endif /* HAS_UNSETENV */
1973 #   endif /* __CYGWIN__ */
1974 #ifndef PERL_USE_SAFE_PUTENV
1975     }
1976 #endif
1977   }
1978 }
1979
1980 #else /* WIN32 || NETWARE */
1981
1982 void
1983 Perl_my_setenv(pTHX_ const char *nam, const char *val)
1984 {
1985     dVAR;
1986     char *envstr;
1987     const int nlen = strlen(nam);
1988     int vlen;
1989
1990     if (!val) {
1991        val = "";
1992     }
1993     vlen = strlen(val);
1994     Newx(envstr, nlen+vlen+2, char);
1995     my_setenv_format(envstr, nam, nlen, val, vlen);
1996     (void)PerlEnv_putenv(envstr);
1997     Safefree(envstr);
1998 }
1999
2000 #endif /* WIN32 || NETWARE */
2001
2002 #endif /* !VMS && !EPOC*/
2003
2004 #ifdef UNLINK_ALL_VERSIONS
2005 I32
2006 Perl_unlnk(pTHX_ const char *f) /* unlink all versions of a file */
2007 {
2008     I32 retries = 0;
2009
2010     PERL_ARGS_ASSERT_UNLNK;
2011
2012     while (PerlLIO_unlink(f) >= 0)
2013         retries++;
2014     return retries ? 0 : -1;
2015 }
2016 #endif
2017
2018 /* this is a drop-in replacement for bcopy() */
2019 #if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
2020 char *
2021 Perl_my_bcopy(register const char *from,register char *to,register I32 len)
2022 {
2023     char * const retval = to;
2024
2025     PERL_ARGS_ASSERT_MY_BCOPY;
2026
2027     if (from - to >= 0) {
2028         while (len--)
2029             *to++ = *from++;
2030     }
2031     else {
2032         to += len;
2033         from += len;
2034         while (len--)
2035             *(--to) = *(--from);
2036     }
2037     return retval;
2038 }
2039 #endif
2040
2041 /* this is a drop-in replacement for memset() */
2042 #ifndef HAS_MEMSET
2043 void *
2044 Perl_my_memset(register char *loc, register I32 ch, register I32 len)
2045 {
2046     char * const retval = loc;
2047
2048     PERL_ARGS_ASSERT_MY_MEMSET;
2049
2050     while (len--)
2051         *loc++ = ch;
2052     return retval;
2053 }
2054 #endif
2055
2056 /* this is a drop-in replacement for bzero() */
2057 #if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
2058 char *
2059 Perl_my_bzero(register char *loc, register I32 len)
2060 {
2061     char * const retval = loc;
2062
2063     PERL_ARGS_ASSERT_MY_BZERO;
2064
2065     while (len--)
2066         *loc++ = 0;
2067     return retval;
2068 }
2069 #endif
2070
2071 /* this is a drop-in replacement for memcmp() */
2072 #if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
2073 I32
2074 Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
2075 {
2076     const U8 *a = (const U8 *)s1;
2077     const U8 *b = (const U8 *)s2;
2078     I32 tmp;
2079
2080     PERL_ARGS_ASSERT_MY_MEMCMP;
2081
2082     while (len--) {
2083         if ((tmp = *a++ - *b++))
2084             return tmp;
2085     }
2086     return 0;
2087 }
2088 #endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
2089
2090 #ifndef HAS_VPRINTF
2091 /* This vsprintf replacement should generally never get used, since
2092    vsprintf was available in both System V and BSD 2.11.  (There may
2093    be some cross-compilation or embedded set-ups where it is needed,
2094    however.)
2095
2096    If you encounter a problem in this function, it's probably a symptom
2097    that Configure failed to detect your system's vprintf() function.
2098    See the section on "item vsprintf" in the INSTALL file.
2099
2100    This version may compile on systems with BSD-ish <stdio.h>,
2101    but probably won't on others.
2102 */
2103
2104 #ifdef USE_CHAR_VSPRINTF
2105 char *
2106 #else
2107 int
2108 #endif
2109 vsprintf(char *dest, const char *pat, void *args)
2110 {
2111     FILE fakebuf;
2112
2113 #if defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
2114     FILE_ptr(&fakebuf) = (STDCHAR *) dest;
2115     FILE_cnt(&fakebuf) = 32767;
2116 #else
2117     /* These probably won't compile -- If you really need
2118        this, you'll have to figure out some other method. */
2119     fakebuf._ptr = dest;
2120     fakebuf._cnt = 32767;
2121 #endif
2122 #ifndef _IOSTRG
2123 #define _IOSTRG 0
2124 #endif
2125     fakebuf._flag = _IOWRT|_IOSTRG;
2126     _doprnt(pat, args, &fakebuf);       /* what a kludge */
2127 #if defined(STDIO_PTR_LVALUE)
2128     *(FILE_ptr(&fakebuf)++) = '\0';
2129 #else
2130     /* PerlIO has probably #defined away fputc, but we want it here. */
2131 #  ifdef fputc
2132 #    undef fputc  /* XXX Should really restore it later */
2133 #  endif
2134     (void)fputc('\0', &fakebuf);
2135 #endif
2136 #ifdef USE_CHAR_VSPRINTF
2137     return(dest);
2138 #else
2139     return 0;           /* perl doesn't use return value */
2140 #endif
2141 }
2142
2143 #endif /* HAS_VPRINTF */
2144
2145 #ifdef MYSWAP
2146 #if BYTEORDER != 0x4321
2147 short
2148 Perl_my_swap(pTHX_ short s)
2149 {
2150 #if (BYTEORDER & 1) == 0
2151     short result;
2152
2153     result = ((s & 255) << 8) + ((s >> 8) & 255);
2154     return result;
2155 #else
2156     return s;
2157 #endif
2158 }
2159
2160 long
2161 Perl_my_htonl(pTHX_ long l)
2162 {
2163     union {
2164         long result;
2165         char c[sizeof(long)];
2166     } u;
2167
2168 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
2169 #if BYTEORDER == 0x12345678
2170     u.result = 0; 
2171 #endif 
2172     u.c[0] = (l >> 24) & 255;
2173     u.c[1] = (l >> 16) & 255;
2174     u.c[2] = (l >> 8) & 255;
2175     u.c[3] = l & 255;
2176     return u.result;
2177 #else
2178 #if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
2179     Perl_croak(aTHX_ "Unknown BYTEORDER\n");
2180 #else
2181     I32 o;
2182     I32 s;
2183
2184     for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
2185         u.c[o & 0xf] = (l >> s) & 255;
2186     }
2187     return u.result;
2188 #endif
2189 #endif
2190 }
2191
2192 long
2193 Perl_my_ntohl(pTHX_ long l)
2194 {
2195     union {
2196         long l;
2197         char c[sizeof(long)];
2198     } u;
2199
2200 #if BYTEORDER == 0x1234
2201     u.c[0] = (l >> 24) & 255;
2202     u.c[1] = (l >> 16) & 255;
2203     u.c[2] = (l >> 8) & 255;
2204     u.c[3] = l & 255;
2205     return u.l;
2206 #else
2207 #if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
2208     Perl_croak(aTHX_ "Unknown BYTEORDER\n");
2209 #else
2210     I32 o;
2211     I32 s;
2212
2213     u.l = l;
2214     l = 0;
2215     for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
2216         l |= (u.c[o & 0xf] & 255) << s;
2217     }
2218     return l;
2219 #endif
2220 #endif
2221 }
2222
2223 #endif /* BYTEORDER != 0x4321 */
2224 #endif /* MYSWAP */
2225
2226 /*
2227  * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
2228  * If these functions are defined,
2229  * the BYTEORDER is neither 0x1234 nor 0x4321.
2230  * However, this is not assumed.
2231  * -DWS
2232  */
2233
2234 #define HTOLE(name,type)                                        \
2235         type                                                    \
2236         name (register type n)                                  \
2237         {                                                       \
2238             union {                                             \
2239                 type value;                                     \
2240                 char c[sizeof(type)];                           \
2241             } u;                                                \
2242             U32 i;                                      \
2243             U32 s = 0;                                  \
2244             for (i = 0; i < sizeof(u.c); i++, s += 8) {         \
2245                 u.c[i] = (n >> s) & 0xFF;                       \
2246             }                                                   \
2247             return u.value;                                     \
2248         }
2249
2250 #define LETOH(name,type)                                        \
2251         type                                                    \
2252         name (register type n)                                  \
2253         {                                                       \
2254             union {                                             \
2255                 type value;                                     \
2256                 char c[sizeof(type)];                           \
2257             } u;                                                \
2258             U32 i;                                      \
2259             U32 s = 0;                                  \
2260             u.value = n;                                        \
2261             n = 0;                                              \
2262             for (i = 0; i < sizeof(u.c); i++, s += 8) {         \
2263                 n |= ((type)(u.c[i] & 0xFF)) << s;              \
2264             }                                                   \
2265             return n;                                           \
2266         }
2267
2268 /*
2269  * Big-endian byte order functions.
2270  */
2271
2272 #define HTOBE(name,type)                                        \
2273         type                                                    \
2274         name (register type n)                                  \
2275         {                                                       \
2276             union {                                             \
2277                 type value;                                     \
2278                 char c[sizeof(type)];                           \
2279             } u;                                                \
2280             U32 i;                                      \
2281             U32 s = 8*(sizeof(u.c)-1);                  \
2282             for (i = 0; i < sizeof(u.c); i++, s -= 8) {         \
2283                 u.c[i] = (n >> s) & 0xFF;                       \
2284             }                                                   \
2285             return u.value;                                     \
2286         }
2287
2288 #define BETOH(name,type)                                        \
2289         type                                                    \
2290         name (register type n)                                  \
2291         {                                                       \
2292             union {                                             \
2293                 type value;                                     \
2294                 char c[sizeof(type)];                           \
2295             } u;                                                \
2296             U32 i;                                      \
2297             U32 s = 8*(sizeof(u.c)-1);                  \
2298             u.value = n;                                        \
2299             n = 0;                                              \
2300             for (i = 0; i < sizeof(u.c); i++, s -= 8) {         \
2301                 n |= ((type)(u.c[i] & 0xFF)) << s;              \
2302             }                                                   \
2303             return n;                                           \
2304         }
2305
2306 /*
2307  * If we just can't do it...
2308  */
2309
2310 #define NOT_AVAIL(name,type)                                    \
2311         type                                                    \
2312         name (register type n)                                  \
2313         {                                                       \
2314             Perl_croak_nocontext(#name "() not available");     \
2315             return n; /* not reached */                         \
2316         }
2317
2318
2319 #if defined(HAS_HTOVS) && !defined(htovs)
2320 HTOLE(htovs,short)
2321 #endif
2322 #if defined(HAS_HTOVL) && !defined(htovl)
2323 HTOLE(htovl,long)
2324 #endif
2325 #if defined(HAS_VTOHS) && !defined(vtohs)
2326 LETOH(vtohs,short)
2327 #endif
2328 #if defined(HAS_VTOHL) && !defined(vtohl)
2329 LETOH(vtohl,long)
2330 #endif
2331
2332 #ifdef PERL_NEED_MY_HTOLE16
2333 # if U16SIZE == 2
2334 HTOLE(Perl_my_htole16,U16)
2335 # else
2336 NOT_AVAIL(Perl_my_htole16,U16)
2337 # endif
2338 #endif
2339 #ifdef PERL_NEED_MY_LETOH16
2340 # if U16SIZE == 2
2341 LETOH(Perl_my_letoh16,U16)
2342 # else
2343 NOT_AVAIL(Perl_my_letoh16,U16)
2344 # endif
2345 #endif
2346 #ifdef PERL_NEED_MY_HTOBE16
2347 # if U16SIZE == 2
2348 HTOBE(Perl_my_htobe16,U16)
2349 # else
2350 NOT_AVAIL(Perl_my_htobe16,U16)
2351 # endif
2352 #endif
2353 #ifdef PERL_NEED_MY_BETOH16
2354 # if U16SIZE == 2
2355 BETOH(Perl_my_betoh16,U16)
2356 # else
2357 NOT_AVAIL(Perl_my_betoh16,U16)
2358 # endif
2359 #endif
2360
2361 #ifdef PERL_NEED_MY_HTOLE32
2362 # if U32SIZE == 4
2363 HTOLE(Perl_my_htole32,U32)
2364 # else
2365 NOT_AVAIL(Perl_my_htole32,U32)
2366 # endif
2367 #endif
2368 #ifdef PERL_NEED_MY_LETOH32
2369 # if U32SIZE == 4
2370 LETOH(Perl_my_letoh32,U32)
2371 # else
2372 NOT_AVAIL(Perl_my_letoh32,U32)
2373 # endif
2374 #endif
2375 #ifdef PERL_NEED_MY_HTOBE32
2376 # if U32SIZE == 4
2377 HTOBE(Perl_my_htobe32,U32)
2378 # else
2379 NOT_AVAIL(Perl_my_htobe32,U32)
2380 # endif
2381 #endif
2382 #ifdef PERL_NEED_MY_BETOH32
2383 # if U32SIZE == 4
2384 BETOH(Perl_my_betoh32,U32)
2385 # else
2386 NOT_AVAIL(Perl_my_betoh32,U32)
2387 # endif
2388 #endif
2389
2390 #ifdef PERL_NEED_MY_HTOLE64
2391 # if U64SIZE == 8
2392 HTOLE(Perl_my_htole64,U64)
2393 # else
2394 NOT_AVAIL(Perl_my_htole64,U64)
2395 # endif
2396 #endif
2397 #ifdef PERL_NEED_MY_LETOH64
2398 # if U64SIZE == 8
2399 LETOH(Perl_my_letoh64,U64)
2400 # else
2401 NOT_AVAIL(Perl_my_letoh64,U64)
2402 # endif
2403 #endif
2404 #ifdef PERL_NEED_MY_HTOBE64
2405 # if U64SIZE == 8
2406 HTOBE(Perl_my_htobe64,U64)
2407 # else
2408 NOT_AVAIL(Perl_my_htobe64,U64)
2409 # endif
2410 #endif
2411 #ifdef PERL_NEED_MY_BETOH64
2412 # if U64SIZE == 8
2413 BETOH(Perl_my_betoh64,U64)
2414 # else
2415 NOT_AVAIL(Perl_my_betoh64,U64)
2416 # endif
2417 #endif
2418
2419 #ifdef PERL_NEED_MY_HTOLES
2420 HTOLE(Perl_my_htoles,short)
2421 #endif
2422 #ifdef PERL_NEED_MY_LETOHS
2423 LETOH(Perl_my_letohs,short)
2424 #endif
2425 #ifdef PERL_NEED_MY_HTOBES
2426 HTOBE(Perl_my_htobes,short)
2427 #endif
2428 #ifdef PERL_NEED_MY_BETOHS
2429 BETOH(Perl_my_betohs,short)
2430 #endif
2431
2432 #ifdef PERL_NEED_MY_HTOLEI
2433 HTOLE(Perl_my_htolei,int)
2434 #endif
2435 #ifdef PERL_NEED_MY_LETOHI
2436 LETOH(Perl_my_letohi,int)
2437 #endif
2438 #ifdef PERL_NEED_MY_HTOBEI
2439 HTOBE(Perl_my_htobei,int)
2440 #endif
2441 #ifdef PERL_NEED_MY_BETOHI
2442 BETOH(Perl_my_betohi,int)
2443 #endif
2444
2445 #ifdef PERL_NEED_MY_HTOLEL
2446 HTOLE(Perl_my_htolel,long)
2447 #endif
2448 #ifdef PERL_NEED_MY_LETOHL
2449 LETOH(Perl_my_letohl,long)
2450 #endif
2451 #ifdef PERL_NEED_MY_HTOBEL
2452 HTOBE(Perl_my_htobel,long)
2453 #endif
2454 #ifdef PERL_NEED_MY_BETOHL
2455 BETOH(Perl_my_betohl,long)
2456 #endif
2457
2458 void
2459 Perl_my_swabn(void *ptr, int n)
2460 {
2461     char *s = (char *)ptr;
2462     char *e = s + (n-1);
2463     char tc;
2464
2465     PERL_ARGS_ASSERT_MY_SWABN;
2466
2467     for (n /= 2; n > 0; s++, e--, n--) {
2468       tc = *s;
2469       *s = *e;
2470       *e = tc;
2471     }
2472 }
2473
2474 PerlIO *
2475 Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
2476 {
2477 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(EPOC) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__)
2478     dVAR;
2479     int p[2];
2480     I32 This, that;
2481     Pid_t pid;
2482     SV *sv;
2483     I32 did_pipes = 0;
2484     int pp[2];
2485
2486     PERL_ARGS_ASSERT_MY_POPEN_LIST;
2487
2488     PERL_FLUSHALL_FOR_CHILD;
2489     This = (*mode == 'w');
2490     that = !This;
2491     if (PL_tainting) {
2492         taint_env();
2493         taint_proper("Insecure %s%s", "EXEC");
2494     }
2495     if (PerlProc_pipe(p) < 0)
2496         return NULL;
2497     /* Try for another pipe pair for error return */
2498     if (PerlProc_pipe(pp) >= 0)
2499         did_pipes = 1;
2500     while ((pid = PerlProc_fork()) < 0) {
2501         if (errno != EAGAIN) {
2502             PerlLIO_close(p[This]);
2503             PerlLIO_close(p[that]);
2504             if (did_pipes) {
2505                 PerlLIO_close(pp[0]);
2506                 PerlLIO_close(pp[1]);
2507             }
2508             return NULL;
2509         }
2510         Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2511         sleep(5);
2512     }
2513     if (pid == 0) {
2514         /* Child */
2515 #undef THIS
2516 #undef THAT
2517 #define THIS that
2518 #define THAT This
2519         /* Close parent's end of error status pipe (if any) */
2520         if (did_pipes) {
2521             PerlLIO_close(pp[0]);
2522 #if defined(HAS_FCNTL) && defined(F_SETFD)
2523             /* Close error pipe automatically if exec works */
2524             fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2525 #endif
2526         }
2527         /* Now dup our end of _the_ pipe to right position */
2528         if (p[THIS] != (*mode == 'r')) {
2529             PerlLIO_dup2(p[THIS], *mode == 'r');
2530             PerlLIO_close(p[THIS]);
2531             if (p[THAT] != (*mode == 'r'))      /* if dup2() didn't close it */
2532                 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
2533         }
2534         else
2535             PerlLIO_close(p[THAT]);     /* close parent's end of _the_ pipe */
2536 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2537         /* No automatic close - do it by hand */
2538 #  ifndef NOFILE
2539 #  define NOFILE 20
2540 #  endif
2541         {
2542             int fd;
2543
2544             for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
2545                 if (fd != pp[1])
2546                     PerlLIO_close(fd);
2547             }
2548         }
2549 #endif
2550         do_aexec5(NULL, args-1, args-1+n, pp[1], did_pipes);
2551         PerlProc__exit(1);
2552 #undef THIS
2553 #undef THAT
2554     }
2555     /* Parent */
2556     do_execfree();      /* free any memory malloced by child on fork */
2557     if (did_pipes)
2558         PerlLIO_close(pp[1]);
2559     /* Keep the lower of the two fd numbers */
2560     if (p[that] < p[This]) {
2561         PerlLIO_dup2(p[This], p[that]);
2562         PerlLIO_close(p[This]);
2563         p[This] = p[that];
2564     }
2565     else
2566         PerlLIO_close(p[that]);         /* close child's end of pipe */
2567
2568     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2569     SvUPGRADE(sv,SVt_IV);
2570     SvIV_set(sv, pid);
2571     PL_forkprocess = pid;
2572     /* If we managed to get status pipe check for exec fail */
2573     if (did_pipes && pid > 0) {
2574         int errkid;
2575         unsigned n = 0;
2576         SSize_t n1;
2577
2578         while (n < sizeof(int)) {
2579             n1 = PerlLIO_read(pp[0],
2580                               (void*)(((char*)&errkid)+n),
2581                               (sizeof(int)) - n);
2582             if (n1 <= 0)
2583                 break;
2584             n += n1;
2585         }
2586         PerlLIO_close(pp[0]);
2587         did_pipes = 0;
2588         if (n) {                        /* Error */
2589             int pid2, status;
2590             PerlLIO_close(p[This]);
2591             if (n != sizeof(int))
2592                 Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2593             do {
2594                 pid2 = wait4pid(pid, &status, 0);
2595             } while (pid2 == -1 && errno == EINTR);
2596             errno = errkid;             /* Propagate errno from kid */
2597             return NULL;
2598         }
2599     }
2600     if (did_pipes)
2601          PerlLIO_close(pp[0]);
2602     return PerlIO_fdopen(p[This], mode);
2603 #else
2604 #  ifdef OS2    /* Same, without fork()ing and all extra overhead... */
2605     return my_syspopen4(aTHX_ NULL, mode, n, args);
2606 #  else
2607     Perl_croak(aTHX_ "List form of piped open not implemented");
2608     return (PerlIO *) NULL;
2609 #  endif
2610 #endif
2611 }
2612
2613     /* VMS' my_popen() is in VMS.c, same with OS/2. */
2614 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
2615 PerlIO *
2616 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2617 {
2618     dVAR;
2619     int p[2];
2620     I32 This, that;
2621     Pid_t pid;
2622     SV *sv;
2623     const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
2624     I32 did_pipes = 0;
2625     int pp[2];
2626
2627     PERL_ARGS_ASSERT_MY_POPEN;
2628
2629     PERL_FLUSHALL_FOR_CHILD;
2630 #ifdef OS2
2631     if (doexec) {
2632         return my_syspopen(aTHX_ cmd,mode);
2633     }
2634 #endif
2635     This = (*mode == 'w');
2636     that = !This;
2637     if (doexec && PL_tainting) {
2638         taint_env();
2639         taint_proper("Insecure %s%s", "EXEC");
2640     }
2641     if (PerlProc_pipe(p) < 0)
2642         return NULL;
2643     if (doexec && PerlProc_pipe(pp) >= 0)
2644         did_pipes = 1;
2645     while ((pid = PerlProc_fork()) < 0) {
2646         if (errno != EAGAIN) {
2647             PerlLIO_close(p[This]);
2648             PerlLIO_close(p[that]);
2649             if (did_pipes) {
2650                 PerlLIO_close(pp[0]);
2651                 PerlLIO_close(pp[1]);
2652             }
2653             if (!doexec)
2654                 Perl_croak(aTHX_ "Can't fork: %s", Strerror(errno));
2655             return NULL;
2656         }
2657         Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2658         sleep(5);
2659     }
2660     if (pid == 0) {
2661
2662 #undef THIS
2663 #undef THAT
2664 #define THIS that
2665 #define THAT This
2666         if (did_pipes) {
2667             PerlLIO_close(pp[0]);
2668 #if defined(HAS_FCNTL) && defined(F_SETFD)
2669             fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2670 #endif
2671         }
2672         if (p[THIS] != (*mode == 'r')) {
2673             PerlLIO_dup2(p[THIS], *mode == 'r');
2674             PerlLIO_close(p[THIS]);
2675             if (p[THAT] != (*mode == 'r'))      /* if dup2() didn't close it */
2676                 PerlLIO_close(p[THAT]);
2677         }
2678         else
2679             PerlLIO_close(p[THAT]);
2680 #ifndef OS2
2681         if (doexec) {
2682 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2683 #ifndef NOFILE
2684 #define NOFILE 20
2685 #endif
2686             {
2687                 int fd;
2688
2689                 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2690                     if (fd != pp[1])
2691                         PerlLIO_close(fd);
2692             }
2693 #endif
2694             /* may or may not use the shell */
2695             do_exec3(cmd, pp[1], did_pipes);
2696             PerlProc__exit(1);
2697         }
2698 #endif  /* defined OS2 */
2699
2700 #ifdef PERLIO_USING_CRLF
2701    /* Since we circumvent IO layers when we manipulate low-level
2702       filedescriptors directly, need to manually switch to the
2703       default, binary, low-level mode; see PerlIOBuf_open(). */
2704    PerlLIO_setmode((*mode == 'r'), O_BINARY);
2705 #endif 
2706         PL_forkprocess = 0;
2707 #ifdef PERL_USES_PL_PIDSTATUS
2708         hv_clear(PL_pidstatus); /* we have no children */
2709 #endif
2710         return NULL;
2711 #undef THIS
2712 #undef THAT
2713     }
2714     do_execfree();      /* free any memory malloced by child on vfork */
2715     if (did_pipes)
2716         PerlLIO_close(pp[1]);
2717     if (p[that] < p[This]) {
2718         PerlLIO_dup2(p[This], p[that]);
2719         PerlLIO_close(p[This]);
2720         p[This] = p[that];
2721     }
2722     else
2723         PerlLIO_close(p[that]);
2724
2725     sv = *av_fetch(PL_fdpid,p[This],TRUE);
2726     SvUPGRADE(sv,SVt_IV);
2727     SvIV_set(sv, pid);
2728     PL_forkprocess = pid;
2729     if (did_pipes && pid > 0) {
2730         int errkid;
2731         unsigned n = 0;
2732         SSize_t n1;
2733
2734         while (n < sizeof(int)) {
2735             n1 = PerlLIO_read(pp[0],
2736                               (void*)(((char*)&errkid)+n),
2737                               (sizeof(int)) - n);
2738             if (n1 <= 0)
2739                 break;
2740             n += n1;
2741         }
2742         PerlLIO_close(pp[0]);
2743         did_pipes = 0;
2744         if (n) {                        /* Error */
2745             int pid2, status;
2746             PerlLIO_close(p[This]);
2747             if (n != sizeof(int))
2748                 Perl_croak(aTHX_ "panic: kid popen errno read, n=%u", n);
2749             do {
2750                 pid2 = wait4pid(pid, &status, 0);
2751             } while (pid2 == -1 && errno == EINTR);
2752             errno = errkid;             /* Propagate errno from kid */
2753             return NULL;
2754         }
2755     }
2756     if (did_pipes)
2757          PerlLIO_close(pp[0]);
2758     return PerlIO_fdopen(p[This], mode);
2759 }
2760 #else
2761 #if defined(EPOC)
2762 FILE *popen();
2763 PerlIO *
2764 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2765 {
2766     PERL_ARGS_ASSERT_MY_POPEN;
2767     PERL_FLUSHALL_FOR_CHILD;
2768     /* Call system's popen() to get a FILE *, then import it.
2769        used 0 for 2nd parameter to PerlIO_importFILE;
2770        apparently not used
2771     */
2772     return PerlIO_importFILE(popen(cmd, mode), 0);
2773 }
2774 #else
2775 #if defined(DJGPP)
2776 FILE *djgpp_popen();
2777 PerlIO *
2778 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2779 {
2780     PERL_FLUSHALL_FOR_CHILD;
2781     /* Call system's popen() to get a FILE *, then import it.
2782        used 0 for 2nd parameter to PerlIO_importFILE;
2783        apparently not used
2784     */
2785     return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2786 }
2787 #else
2788 #if defined(__LIBCATAMOUNT__)
2789 PerlIO *
2790 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2791 {
2792     return NULL;
2793 }
2794 #endif
2795 #endif
2796 #endif
2797
2798 #endif /* !DOSISH */
2799
2800 /* this is called in parent before the fork() */
2801 void
2802 Perl_atfork_lock(void)
2803 {
2804    dVAR;
2805 #if defined(USE_ITHREADS)
2806     /* locks must be held in locking order (if any) */
2807 #  ifdef MYMALLOC
2808     MUTEX_LOCK(&PL_malloc_mutex);
2809 #  endif
2810     OP_REFCNT_LOCK;
2811 #endif
2812 }
2813
2814 /* this is called in both parent and child after the fork() */
2815 void
2816 Perl_atfork_unlock(void)
2817 {
2818     dVAR;
2819 #if defined(USE_ITHREADS)
2820     /* locks must be released in same order as in atfork_lock() */
2821 #  ifdef MYMALLOC
2822     MUTEX_UNLOCK(&PL_malloc_mutex);
2823 #  endif
2824     OP_REFCNT_UNLOCK;
2825 #endif
2826 }
2827
2828 Pid_t
2829 Perl_my_fork(void)
2830 {
2831 #if defined(HAS_FORK)
2832     Pid_t pid;
2833 #if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
2834     atfork_lock();
2835     pid = fork();
2836     atfork_unlock();
2837 #else
2838     /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2839      * handlers elsewhere in the code */
2840     pid = fork();
2841 #endif
2842     return pid;
2843 #else
2844     /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2845     Perl_croak_nocontext("fork() not available");
2846     return 0;
2847 #endif /* HAS_FORK */
2848 }
2849
2850 #ifdef DUMP_FDS
2851 void
2852 Perl_dump_fds(pTHX_ const char *const s)
2853 {
2854     int fd;
2855     Stat_t tmpstatbuf;
2856
2857     PERL_ARGS_ASSERT_DUMP_FDS;
2858
2859     PerlIO_printf(Perl_debug_log,"%s", s);
2860     for (fd = 0; fd < 32; fd++) {
2861         if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
2862             PerlIO_printf(Perl_debug_log," %d",fd);
2863     }
2864     PerlIO_printf(Perl_debug_log,"\n");
2865     return;
2866 }
2867 #endif  /* DUMP_FDS */
2868
2869 #ifndef HAS_DUP2
2870 int
2871 dup2(int oldfd, int newfd)
2872 {
2873 #if defined(HAS_FCNTL) && defined(F_DUPFD)
2874     if (oldfd == newfd)
2875         return oldfd;
2876     PerlLIO_close(newfd);
2877     return fcntl(oldfd, F_DUPFD, newfd);
2878 #else
2879 #define DUP2_MAX_FDS 256
2880     int fdtmp[DUP2_MAX_FDS];
2881     I32 fdx = 0;
2882     int fd;
2883
2884     if (oldfd == newfd)
2885         return oldfd;
2886     PerlLIO_close(newfd);
2887     /* good enough for low fd's... */
2888     while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
2889         if (fdx >= DUP2_MAX_FDS) {
2890             PerlLIO_close(fd);
2891             fd = -1;
2892             break;
2893         }
2894         fdtmp[fdx++] = fd;
2895     }
2896     while (fdx > 0)
2897         PerlLIO_close(fdtmp[--fdx]);
2898     return fd;
2899 #endif
2900 }
2901 #endif
2902
2903 #ifndef PERL_MICRO
2904 #ifdef HAS_SIGACTION
2905
2906 Sighandler_t
2907 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2908 {
2909     dVAR;
2910     struct sigaction act, oact;
2911
2912 #ifdef USE_ITHREADS
2913     /* only "parent" interpreter can diddle signals */
2914     if (PL_curinterp != aTHX)
2915         return (Sighandler_t) SIG_ERR;
2916 #endif
2917
2918     act.sa_handler = (void(*)(int))handler;
2919     sigemptyset(&act.sa_mask);
2920     act.sa_flags = 0;
2921 #ifdef SA_RESTART
2922     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2923         act.sa_flags |= SA_RESTART;     /* SVR4, 4.3+BSD */
2924 #endif
2925 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2926     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2927         act.sa_flags |= SA_NOCLDWAIT;
2928 #endif
2929     if (sigaction(signo, &act, &oact) == -1)
2930         return (Sighandler_t) SIG_ERR;
2931     else
2932         return (Sighandler_t) oact.sa_handler;
2933 }
2934
2935 Sighandler_t
2936 Perl_rsignal_state(pTHX_ int signo)
2937 {
2938     struct sigaction oact;
2939     PERL_UNUSED_CONTEXT;
2940
2941     if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
2942         return (Sighandler_t) SIG_ERR;
2943     else
2944         return (Sighandler_t) oact.sa_handler;
2945 }
2946
2947 int
2948 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
2949 {
2950     dVAR;
2951     struct sigaction act;
2952
2953     PERL_ARGS_ASSERT_RSIGNAL_SAVE;
2954
2955 #ifdef USE_ITHREADS
2956     /* only "parent" interpreter can diddle signals */
2957     if (PL_curinterp != aTHX)
2958         return -1;
2959 #endif
2960
2961     act.sa_handler = (void(*)(int))handler;
2962     sigemptyset(&act.sa_mask);
2963     act.sa_flags = 0;
2964 #ifdef SA_RESTART
2965     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2966         act.sa_flags |= SA_RESTART;     /* SVR4, 4.3+BSD */
2967 #endif
2968 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
2969     if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
2970         act.sa_flags |= SA_NOCLDWAIT;
2971 #endif
2972     return sigaction(signo, &act, save);
2973 }
2974
2975 int
2976 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
2977 {
2978     dVAR;
2979 #ifdef USE_ITHREADS
2980     /* only "parent" interpreter can diddle signals */
2981     if (PL_curinterp != aTHX)
2982         return -1;
2983 #endif
2984
2985     return sigaction(signo, save, (struct sigaction *)NULL);
2986 }
2987
2988 #else /* !HAS_SIGACTION */
2989
2990 Sighandler_t
2991 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
2992 {
2993 #if defined(USE_ITHREADS) && !defined(WIN32)
2994     /* only "parent" interpreter can diddle signals */
2995     if (PL_curinterp != aTHX)
2996         return (Sighandler_t) SIG_ERR;
2997 #endif
2998
2999     return PerlProc_signal(signo, handler);
3000 }
3001
3002 static Signal_t
3003 sig_trap(int signo)
3004 {
3005     dVAR;
3006     PL_sig_trapped++;
3007 }
3008
3009 Sighandler_t
3010 Perl_rsignal_state(pTHX_ int signo)
3011 {
3012     dVAR;
3013     Sighandler_t oldsig;
3014
3015 #if defined(USE_ITHREADS) && !defined(WIN32)
3016     /* only "parent" interpreter can diddle signals */
3017     if (PL_curinterp != aTHX)
3018         return (Sighandler_t) SIG_ERR;
3019 #endif
3020
3021     PL_sig_trapped = 0;
3022     oldsig = PerlProc_signal(signo, sig_trap);
3023     PerlProc_signal(signo, oldsig);
3024     if (PL_sig_trapped)
3025         PerlProc_kill(PerlProc_getpid(), signo);
3026     return oldsig;
3027 }
3028
3029 int
3030 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
3031 {
3032 #if defined(USE_ITHREADS) && !defined(WIN32)
3033     /* only "parent" interpreter can diddle signals */
3034     if (PL_curinterp != aTHX)
3035         return -1;
3036 #endif
3037     *save = PerlProc_signal(signo, handler);
3038     return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
3039 }
3040
3041 int
3042 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
3043 {
3044 #if defined(USE_ITHREADS) && !defined(WIN32)
3045     /* only "parent" interpreter can diddle signals */
3046     if (PL_curinterp != aTHX)
3047         return -1;
3048 #endif
3049     return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
3050 }
3051
3052 #endif /* !HAS_SIGACTION */
3053 #endif /* !PERL_MICRO */
3054
3055     /* VMS' my_pclose() is in VMS.c; same with OS/2 */
3056 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
3057 I32
3058 Perl_my_pclose(pTHX_ PerlIO *ptr)
3059 {
3060     dVAR;
3061     Sigsave_t hstat, istat, qstat;
3062     int status;
3063     SV **svp;
3064     Pid_t pid;
3065     Pid_t pid2 = 0;
3066     bool close_failed;
3067     dSAVEDERRNO;
3068     const int fd = PerlIO_fileno(ptr);
3069
3070 #ifdef USE_PERLIO
3071     /* Find out whether the refcount is low enough for us to wait for the
3072        child proc without blocking. */
3073     const bool should_wait = PerlIOUnix_refcnt(fd) == 1;
3074 #else
3075     const bool should_wait = 1;
3076 #endif
3077
3078     svp = av_fetch(PL_fdpid,fd,TRUE);
3079     pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
3080     SvREFCNT_dec(*svp);
3081     *svp = &PL_sv_undef;
3082 #ifdef OS2
3083     if (pid == -1) {                    /* Opened by popen. */
3084         return my_syspclose(ptr);
3085     }
3086 #endif
3087     close_failed = (PerlIO_close(ptr) == EOF);
3088     SAVE_ERRNO;
3089 #ifndef PERL_MICRO
3090     rsignal_save(SIGHUP,  (Sighandler_t) SIG_IGN, &hstat);
3091     rsignal_save(SIGINT,  (Sighandler_t) SIG_IGN, &istat);
3092     rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qstat);
3093 #endif
3094     if (should_wait) do {
3095         pid2 = wait4pid(pid, &status, 0);
3096     } while (pid2 == -1 && errno == EINTR);
3097 #ifndef PERL_MICRO
3098     rsignal_restore(SIGHUP, &hstat);
3099     rsignal_restore(SIGINT, &istat);
3100     rsignal_restore(SIGQUIT, &qstat);
3101 #endif
3102     if (close_failed) {
3103         RESTORE_ERRNO;
3104         return -1;
3105     }
3106     return(
3107       should_wait
3108        ? pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status)
3109        : 0
3110     );
3111 }
3112 #else
3113 #if defined(__LIBCATAMOUNT__)
3114 I32
3115 Perl_my_pclose(pTHX_ PerlIO *ptr)
3116 {
3117     return -1;
3118 }
3119 #endif
3120 #endif /* !DOSISH */
3121
3122 #if  (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(__LIBCATAMOUNT__)
3123 I32
3124 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
3125 {
3126     dVAR;
3127     I32 result = 0;
3128     PERL_ARGS_ASSERT_WAIT4PID;
3129     if (!pid)
3130         return -1;
3131 #ifdef PERL_USES_PL_PIDSTATUS
3132     {
3133         if (pid > 0) {
3134             /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
3135                pid, rather than a string form.  */
3136             SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
3137             if (svp && *svp != &PL_sv_undef) {
3138                 *statusp = SvIVX(*svp);
3139                 (void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
3140                                 G_DISCARD);
3141                 return pid;
3142             }
3143         }
3144         else {
3145             HE *entry;
3146
3147             hv_iterinit(PL_pidstatus);
3148             if ((entry = hv_iternext(PL_pidstatus))) {
3149                 SV * const sv = hv_iterval(PL_pidstatus,entry);
3150                 I32 len;
3151                 const char * const spid = hv_iterkey(entry,&len);
3152
3153                 assert (len == sizeof(Pid_t));
3154                 memcpy((char *)&pid, spid, len);
3155                 *statusp = SvIVX(sv);
3156                 /* The hash iterator is currently on this entry, so simply
3157                    calling hv_delete would trigger the lazy delete, which on
3158                    aggregate does more work, beacuse next call to hv_iterinit()
3159                    would spot the flag, and have to call the delete routine,
3160                    while in the meantime any new entries can't re-use that
3161                    memory.  */
3162                 hv_iterinit(PL_pidstatus);
3163                 (void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
3164                 return pid;
3165             }
3166         }
3167     }
3168 #endif
3169 #ifdef HAS_WAITPID
3170 #  ifdef HAS_WAITPID_RUNTIME
3171     if (!HAS_WAITPID_RUNTIME)
3172         goto hard_way;
3173 #  endif
3174     result = PerlProc_waitpid(pid,statusp,flags);
3175     goto finish;
3176 #endif
3177 #if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
3178     result = wait4((pid==-1)?0:pid,statusp,flags,NULL);
3179     goto finish;
3180 #endif
3181 #ifdef PERL_USES_PL_PIDSTATUS
3182 #if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
3183   hard_way:
3184 #endif
3185     {
3186         if (flags)
3187             Perl_croak(aTHX_ "Can't do waitpid with flags");
3188         else {
3189             while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
3190                 pidgone(result,*statusp);
3191             if (result < 0)
3192                 *statusp = -1;
3193         }
3194     }
3195 #endif
3196 #if defined(HAS_WAITPID) || defined(HAS_WAIT4)
3197   finish:
3198 #endif
3199     if (result < 0 && errno == EINTR) {
3200         PERL_ASYNC_CHECK();
3201         errno = EINTR; /* reset in case a signal handler changed $! */
3202     }
3203     return result;
3204 }
3205 #endif /* !DOSISH || OS2 || WIN32 || NETWARE */
3206
3207 #ifdef PERL_USES_PL_PIDSTATUS
3208 void
3209 S_pidgone(pTHX_ Pid_t pid, int status)
3210 {
3211     SV *sv;
3212
3213     sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
3214     SvUPGRADE(sv,SVt_IV);
3215     SvIV_set(sv, status);
3216     return;
3217 }
3218 #endif
3219
3220 #if defined(OS2) || defined(EPOC)
3221 int pclose();
3222 #ifdef HAS_FORK
3223 int                                     /* Cannot prototype with I32
3224                                            in os2ish.h. */
3225 my_syspclose(PerlIO *ptr)
3226 #else
3227 I32
3228 Perl_my_pclose(pTHX_ PerlIO *ptr)
3229 #endif
3230 {
3231     /* Needs work for PerlIO ! */
3232     FILE * const f = PerlIO_findFILE(ptr);
3233     const I32 result = pclose(f);
3234     PerlIO_releaseFILE(ptr,f);
3235     return result;
3236 }
3237 #endif
3238
3239 #if defined(DJGPP)
3240 int djgpp_pclose();
3241 I32
3242 Perl_my_pclose(pTHX_ PerlIO *ptr)
3243 {
3244     /* Needs work for PerlIO ! */
3245     FILE * const f = PerlIO_findFILE(ptr);
3246     I32 result = djgpp_pclose(f);
3247     result = (result << 8) & 0xff00;
3248     PerlIO_releaseFILE(ptr,f);
3249     return result;
3250 }
3251 #endif
3252
3253 #define PERL_REPEATCPY_LINEAR 4
3254 void
3255 Perl_repeatcpy(register char *to, register const char *from, I32 len, register IV count)
3256 {
3257     PERL_ARGS_ASSERT_REPEATCPY;
3258
3259     if (count < 0)
3260         Perl_croak_nocontext("%s",PL_memory_wrap);
3261
3262     if (len == 1)
3263         memset(to, *from, count);
3264     else if (count) {
3265         char *p = to;
3266         IV items, linear, half;
3267
3268         linear = count < PERL_REPEATCPY_LINEAR ? count : PERL_REPEATCPY_LINEAR;
3269         for (items = 0; items < linear; ++items) {
3270             const char *q = from;
3271             IV todo;
3272             for (todo = len; todo > 0; todo--)
3273                 *p++ = *q++;
3274         }
3275
3276         half = count / 2;
3277         while (items <= half) {
3278             IV size = items * len;
3279             memcpy(p, to, size);
3280             p     += size;
3281             items *= 2;
3282         }
3283
3284         if (count > items)
3285             memcpy(p, to, (count - items) * len);
3286     }
3287 }
3288
3289 #ifndef HAS_RENAME
3290 I32
3291 Perl_same_dirent(pTHX_ const char *a, const char *b)
3292 {
3293     char *fa = strrchr(a,'/');
3294     char *fb = strrchr(b,'/');
3295     Stat_t tmpstatbuf1;
3296     Stat_t tmpstatbuf2;
3297     SV * const tmpsv = sv_newmortal();
3298
3299     PERL_ARGS_ASSERT_SAME_DIRENT;
3300
3301     if (fa)
3302         fa++;
3303     else
3304         fa = a;
3305     if (fb)
3306         fb++;
3307     else
3308         fb = b;
3309     if (strNE(a,b))
3310         return FALSE;
3311     if (fa == a)
3312         sv_setpvs(tmpsv, ".");
3313     else
3314         sv_setpvn(tmpsv, a, fa - a);
3315     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
3316         return FALSE;
3317     if (fb == b)
3318         sv_setpvs(tmpsv, ".");
3319     else
3320         sv_setpvn(tmpsv, b, fb - b);
3321     if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
3322         return FALSE;
3323     return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
3324            tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
3325 }
3326 #endif /* !HAS_RENAME */
3327
3328 char*
3329 Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
3330                  const char *const *const search_ext, I32 flags)
3331 {
3332     dVAR;
3333     const char *xfound = NULL;
3334     char *xfailed = NULL;
3335     char tmpbuf[MAXPATHLEN];
3336     char *s;
3337     I32 len = 0;
3338     int retval;
3339     char *bufend;
3340 #if defined(DOSISH) && !defined(OS2)
3341 #  define SEARCH_EXTS ".bat", ".cmd", NULL
3342 #  define MAX_EXT_LEN 4
3343 #endif
3344 #ifdef OS2
3345 #  define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
3346 #  define MAX_EXT_LEN 4
3347 #endif
3348 #ifdef VMS
3349 #  define SEARCH_EXTS ".pl", ".com", NULL
3350 #  define MAX_EXT_LEN 4
3351 #endif
3352     /* additional extensions to try in each dir if scriptname not found */
3353 #ifdef SEARCH_EXTS
3354     static const char *const exts[] = { SEARCH_EXTS };
3355     const char *const *const ext = search_ext ? search_ext : exts;
3356     int extidx = 0, i = 0;
3357     const char *curext = NULL;
3358 #else
3359     PERL_UNUSED_ARG(search_ext);
3360 #  define MAX_EXT_LEN 0
3361 #endif
3362
3363     PERL_ARGS_ASSERT_FIND_SCRIPT;
3364
3365     /*
3366      * If dosearch is true and if scriptname does not contain path
3367      * delimiters, search the PATH for scriptname.
3368      *
3369      * If SEARCH_EXTS is also defined, will look for each
3370      * scriptname{SEARCH_EXTS} whenever scriptname is not found
3371      * while searching the PATH.
3372      *
3373      * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
3374      * proceeds as follows:
3375      *   If DOSISH or VMSISH:
3376      *     + look for ./scriptname{,.foo,.bar}
3377      *     + search the PATH for scriptname{,.foo,.bar}
3378      *
3379      *   If !DOSISH:
3380      *     + look *only* in the PATH for scriptname{,.foo,.bar} (note
3381      *       this will not look in '.' if it's not in the PATH)
3382      */
3383     tmpbuf[0] = '\0';
3384
3385 #ifdef VMS
3386 #  ifdef ALWAYS_DEFTYPES
3387     len = strlen(scriptname);
3388     if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
3389         int idx = 0, deftypes = 1;
3390         bool seen_dot = 1;
3391
3392         const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != NULL);
3393 #  else
3394     if (dosearch) {
3395         int idx = 0, deftypes = 1;
3396         bool seen_dot = 1;
3397
3398         const int hasdir = (strpbrk(scriptname,":[</") != NULL);
3399 #  endif
3400         /* The first time through, just add SEARCH_EXTS to whatever we
3401          * already have, so we can check for default file types. */
3402         while (deftypes ||
3403                (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
3404         {
3405             if (deftypes) {
3406                 deftypes = 0;
3407                 *tmpbuf = '\0';
3408             }
3409             if ((strlen(tmpbuf) + strlen(scriptname)
3410                  + MAX_EXT_LEN) >= sizeof tmpbuf)
3411                 continue;       /* don't search dir with too-long name */
3412             my_strlcat(tmpbuf, scriptname, sizeof(tmpbuf));
3413 #else  /* !VMS */
3414
3415 #ifdef DOSISH
3416     if (strEQ(scriptname, "-"))
3417         dosearch = 0;
3418     if (dosearch) {             /* Look in '.' first. */
3419         const char *cur = scriptname;
3420 #ifdef SEARCH_EXTS
3421         if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
3422             while (ext[i])
3423                 if (strEQ(ext[i++],curext)) {
3424                     extidx = -1;                /* already has an ext */
3425                     break;
3426                 }
3427         do {
3428 #endif
3429             DEBUG_p(PerlIO_printf(Perl_debug_log,
3430                                   "Looking for %s\n",cur));
3431             if (PerlLIO_stat(cur,&PL_statbuf) >= 0
3432                 && !S_ISDIR(PL_statbuf.st_mode)) {
3433                 dosearch = 0;
3434                 scriptname = cur;
3435 #ifdef SEARCH_EXTS
3436                 break;
3437 #endif
3438             }
3439 #ifdef SEARCH_EXTS
3440             if (cur == scriptname) {
3441                 len = strlen(scriptname);
3442                 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
3443                     break;
3444                 my_strlcpy(tmpbuf, scriptname, sizeof(tmpbuf));
3445                 cur = tmpbuf;
3446             }
3447         } while (extidx >= 0 && ext[extidx]     /* try an extension? */
3448                  && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len));
3449 #endif
3450     }
3451 #endif
3452
3453     if (dosearch && !strchr(scriptname, '/')
3454 #ifdef DOSISH
3455                  && !strchr(scriptname, '\\')
3456 #endif
3457                  && (s = PerlEnv_getenv("PATH")))
3458     {
3459         bool seen_dot = 0;
3460
3461         bufend = s + strlen(s);
3462         while (s < bufend) {
3463 #  ifdef DOSISH
3464             for (len = 0; *s
3465                     && *s != ';'; len++, s++) {
3466                 if (len < sizeof tmpbuf)
3467                     tmpbuf[len] = *s;
3468             }
3469             if (len < sizeof tmpbuf)
3470                 tmpbuf[len] = '\0';
3471 #  else
3472             s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
3473                         ':',
3474                         &len);
3475 #  endif
3476             if (s < bufend)
3477                 s++;
3478             if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
3479                 continue;       /* don't search dir with too-long name */
3480             if (len
3481 #  ifdef DOSISH
3482                 && tmpbuf[len - 1] != '/'
3483                 && tmpbuf[len - 1] != '\\'
3484 #  endif
3485                )
3486                 tmpbuf[len++] = '/';
3487             if (len == 2 && tmpbuf[0] == '.')
3488                 seen_dot = 1;
3489             (void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
3490 #endif  /* !VMS */
3491
3492 #ifdef SEARCH_EXTS
3493             len = strlen(tmpbuf);
3494             if (extidx > 0)     /* reset after previous loop */
3495                 extidx = 0;
3496             do {
3497 #endif
3498                 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3499                 retval = PerlLIO_stat(tmpbuf,&PL_statbuf);
3500                 if (S_ISDIR(PL_statbuf.st_mode)) {
3501                     retval = -1;
3502                 }
3503 #ifdef SEARCH_EXTS
3504             } while (  retval < 0               /* not there */
3505                     && extidx>=0 && ext[extidx] /* try an extension? */
3506                     && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len)
3507                 );
3508 #endif
3509             if (retval < 0)
3510                 continue;
3511             if (S_ISREG(PL_statbuf.st_mode)
3512                 && cando(S_IRUSR,TRUE,&PL_statbuf)
3513 #if !defined(DOSISH)
3514                 && cando(S_IXUSR,TRUE,&PL_statbuf)
3515 #endif
3516                 )
3517             {
3518                 xfound = tmpbuf;                /* bingo! */
3519                 break;
3520             }
3521             if (!xfailed)
3522                 xfailed = savepv(tmpbuf);
3523         }
3524 #ifndef DOSISH
3525         if (!xfound && !seen_dot && !xfailed &&
3526             (PerlLIO_stat(scriptname,&PL_statbuf) < 0
3527              || S_ISDIR(PL_statbuf.st_mode)))
3528 #endif
3529             seen_dot = 1;                       /* Disable message. */
3530         if (!xfound) {
3531             if (flags & 1) {                    /* do or die? */
3532                 /* diag_listed_as: Can't execute %s */
3533                 Perl_croak(aTHX_ "Can't %s %s%s%s",
3534                       (xfailed ? "execute" : "find"),
3535                       (xfailed ? xfailed : scriptname),
3536                       (xfailed ? "" : " on PATH"),
3537                       (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3538             }
3539             scriptname = NULL;
3540         }
3541         Safefree(xfailed);
3542         scriptname = xfound;
3543     }
3544     return (scriptname ? savepv(scriptname) : NULL);
3545 }
3546
3547 #ifndef PERL_GET_CONTEXT_DEFINED
3548
3549 void *
3550 Perl_get_context(void)
3551 {
3552     dVAR;
3553 #if defined(USE_ITHREADS)
3554 #  ifdef OLD_PTHREADS_API
3555     pthread_addr_t t;
3556     int error = pthread_getspecific(PL_thr_key, &t)
3557     if (error)
3558         Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error);
3559     return (void*)t;
3560 #  else
3561 #    ifdef I_MACH_CTHREADS
3562     return (void*)cthread_data(cthread_self());
3563 #    else
3564     return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3565 #    endif
3566 #  endif
3567 #else
3568     return (void*)NULL;
3569 #endif
3570 }
3571
3572 void
3573 Perl_set_context(void *t)
3574 {
3575     dVAR;
3576     PERL_ARGS_ASSERT_SET_CONTEXT;
3577 #if defined(USE_ITHREADS)
3578 #  ifdef I_MACH_CTHREADS
3579     cthread_set_data(cthread_self(), t);
3580 #  else
3581     {
3582         const int error = pthread_setspecific(PL_thr_key, t);
3583         if (error)
3584             Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error);
3585     }
3586 #  endif
3587 #else
3588     PERL_UNUSED_ARG(t);
3589 #endif
3590 }
3591
3592 #endif /* !PERL_GET_CONTEXT_DEFINED */
3593
3594 #if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
3595 struct perl_vars *
3596 Perl_GetVars(pTHX)
3597 {
3598  return &PL_Vars;
3599 }
3600 #endif
3601
3602 char **
3603 Perl_get_op_names(pTHX)
3604 {
3605     PERL_UNUSED_CONTEXT;
3606     return (char **)PL_op_name;
3607 }
3608
3609 char **
3610 Perl_get_op_descs(pTHX)
3611 {
3612     PERL_UNUSED_CONTEXT;
3613     return (char **)PL_op_desc;
3614 }
3615
3616 const char *
3617 Perl_get_no_modify(pTHX)
3618 {
3619     PERL_UNUSED_CONTEXT;
3620     return PL_no_modify;
3621 }
3622
3623 U32 *
3624 Perl_get_opargs(pTHX)
3625 {
3626     PERL_UNUSED_CONTEXT;
3627     return (U32 *)PL_opargs;
3628 }
3629
3630 PPADDR_t*
3631 Perl_get_ppaddr(pTHX)
3632 {
3633     dVAR;
3634     PERL_UNUSED_CONTEXT;
3635     return (PPADDR_t*)PL_ppaddr;
3636 }
3637
3638 #ifndef HAS_GETENV_LEN
3639 char *
3640 Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
3641 {
3642     char * const env_trans = PerlEnv_getenv(env_elem);
3643     PERL_UNUSED_CONTEXT;
3644     PERL_ARGS_ASSERT_GETENV_LEN;
3645     if (env_trans)
3646         *len = strlen(env_trans);
3647     return env_trans;
3648 }
3649 #endif
3650
3651
3652 MGVTBL*
3653 Perl_get_vtbl(pTHX_ int vtbl_id)
3654 {
3655     PERL_UNUSED_CONTEXT;
3656
3657     return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
3658         ? NULL : PL_magic_vtables + vtbl_id;
3659 }
3660
3661 I32
3662 Perl_my_fflush_all(pTHX)
3663 {
3664 #if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
3665     return PerlIO_flush(NULL);
3666 #else
3667 # if defined(HAS__FWALK)
3668     extern int fflush(FILE *);
3669     /* undocumented, unprototyped, but very useful BSDism */
3670     extern void _fwalk(int (*)(FILE *));
3671     _fwalk(&fflush);
3672     return 0;
3673 # else
3674 #  if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
3675     long open_max = -1;
3676 #   ifdef PERL_FFLUSH_ALL_FOPEN_MAX
3677     open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
3678 #   else
3679 #    if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
3680     open_max = sysconf(_SC_OPEN_MAX);
3681 #     else
3682 #      ifdef FOPEN_MAX
3683     open_max = FOPEN_MAX;
3684 #      else
3685 #       ifdef OPEN_MAX
3686     open_max = OPEN_MAX;
3687 #       else
3688 #        ifdef _NFILE
3689     open_max = _NFILE;
3690 #        endif
3691 #       endif
3692 #      endif
3693 #     endif
3694 #    endif
3695     if (open_max > 0) {
3696       long i;
3697       for (i = 0; i < open_max; i++)
3698             if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3699                 STDIO_STREAM_ARRAY[i]._file < open_max &&
3700                 STDIO_STREAM_ARRAY[i]._flag)
3701                 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
3702       return 0;
3703     }
3704 #  endif
3705     SETERRNO(EBADF,RMS_IFI);
3706     return EOF;
3707 # endif
3708 #endif
3709 }
3710
3711 void
3712 Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
3713 {
3714     if (ckWARN(WARN_IO)) {
3715         HEK * const name
3716            = gv && (isGV_with_GP(gv))
3717                 ? GvENAME_HEK((gv))
3718                 : NULL;
3719         const char * const direction = have == '>' ? "out" : "in";
3720
3721         if (name && HEK_LEN(name))
3722             Perl_warner(aTHX_ packWARN(WARN_IO),
3723                         "Filehandle %"HEKf" opened only for %sput",
3724                         name, direction);
3725         else
3726             Perl_warner(aTHX_ packWARN(WARN_IO),
3727                         "Filehandle opened only for %sput", direction);
3728     }
3729 }
3730
3731 void
3732 Perl_report_evil_fh(pTHX_ const GV *gv)
3733 {
3734     const IO *io = gv ? GvIO(gv) : NULL;
3735     const PERL_BITFIELD16 op = PL_op->op_type;
3736     const char *vile;
3737     I32 warn_type;
3738
3739     if (io && IoTYPE(io) == IoTYPE_CLOSED) {
3740         vile = "closed";
3741         warn_type = WARN_CLOSED;
3742     }
3743     else {
3744         vile = "unopened";
3745         warn_type = WARN_UNOPENED;
3746     }
3747
3748     if (ckWARN(warn_type)) {
3749         SV * const name
3750             = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ?
3751                                      sv_2mortal(newSVhek(GvENAME_HEK(gv))) : NULL;
3752         const char * const pars =
3753             (const char *)(OP_IS_FILETEST(op) ? "" : "()");
3754         const char * const func =
3755             (const char *)
3756             (op == OP_READLINE   ? "readline"  :        /* "<HANDLE>" not nice */
3757              op == OP_LEAVEWRITE ? "write" :            /* "write exit" not nice */
3758              PL_op_desc[op]);
3759         const char * const type =
3760             (const char *)
3761             (OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET)
3762              ? "socket" : "filehandle");
3763         const bool have_name = name && SvCUR(name);
3764         Perl_warner(aTHX_ packWARN(warn_type),
3765                    "%s%s on %s %s%s%"SVf, func, pars, vile, type,
3766                     have_name ? " " : "",
3767                     SVfARG(have_name ? name : &PL_sv_no));
3768         if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3769                 Perl_warner(
3770                             aTHX_ packWARN(warn_type),
3771                         "\t(Are you trying to call %s%s on dirhandle%s%"SVf"?)\n",
3772                         func, pars, have_name ? " " : "",
3773                         SVfARG(have_name ? name : &PL_sv_no)
3774                             );
3775     }
3776 }
3777
3778 /* To workaround core dumps from the uninitialised tm_zone we get the
3779  * system to give us a reasonable struct to copy.  This fix means that
3780  * strftime uses the tm_zone and tm_gmtoff values returned by
3781  * localtime(time()). That should give the desired result most of the
3782  * time. But probably not always!
3783  *
3784  * This does not address tzname aspects of NETaa14816.
3785  *
3786  */
3787
3788 #ifdef HAS_GNULIBC
3789 # ifndef STRUCT_TM_HASZONE
3790 #    define STRUCT_TM_HASZONE
3791 # endif
3792 #endif
3793
3794 #ifdef STRUCT_TM_HASZONE /* Backward compat */
3795 # ifndef HAS_TM_TM_ZONE
3796 #    define HAS_TM_TM_ZONE
3797 # endif
3798 #endif
3799
3800 void
3801 Perl_init_tm(pTHX_ struct tm *ptm)      /* see mktime, strftime and asctime */
3802 {
3803 #ifdef HAS_TM_TM_ZONE
3804     Time_t now;
3805     const struct tm* my_tm;
3806     PERL_ARGS_ASSERT_INIT_TM;
3807     (void)time(&now);
3808     my_tm = localtime(&now);
3809     if (my_tm)
3810         Copy(my_tm, ptm, 1, struct tm);
3811 #else
3812     PERL_ARGS_ASSERT_INIT_TM;
3813     PERL_UNUSED_ARG(ptm);
3814 #endif
3815 }
3816
3817 /*
3818  * mini_mktime - normalise struct tm values without the localtime()
3819  * semantics (and overhead) of mktime().
3820  */
3821 void
3822 Perl_mini_mktime(pTHX_ struct tm *ptm)
3823 {
3824     int yearday;
3825     int secs;
3826     int month, mday, year, jday;
3827     int odd_cent, odd_year;
3828     PERL_UNUSED_CONTEXT;
3829
3830     PERL_ARGS_ASSERT_MINI_MKTIME;
3831
3832 #define DAYS_PER_YEAR   365
3833 #define DAYS_PER_QYEAR  (4*DAYS_PER_YEAR+1)
3834 #define DAYS_PER_CENT   (25*DAYS_PER_QYEAR-1)
3835 #define DAYS_PER_QCENT  (4*DAYS_PER_CENT+1)
3836 #define SECS_PER_HOUR   (60*60)
3837 #define SECS_PER_DAY    (24*SECS_PER_HOUR)
3838 /* parentheses deliberately absent on these two, otherwise they don't work */
3839 #define MONTH_TO_DAYS   153/5
3840 #define DAYS_TO_MONTH   5/153
3841 /* offset to bias by March (month 4) 1st between month/mday & year finding */
3842 #define YEAR_ADJUST     (4*MONTH_TO_DAYS+1)
3843 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3844 #define WEEKDAY_BIAS    6       /* (1+6)%7 makes Sunday 0 again */
3845
3846 /*
3847  * Year/day algorithm notes:
3848  *
3849  * With a suitable offset for numeric value of the month, one can find
3850  * an offset into the year by considering months to have 30.6 (153/5) days,
3851  * using integer arithmetic (i.e., with truncation).  To avoid too much
3852  * messing about with leap days, we consider January and February to be
3853  * the 13th and 14th month of the previous year.  After that transformation,
3854  * we need the month index we use to be high by 1 from 'normal human' usage,
3855  * so the month index values we use run from 4 through 15.
3856  *
3857  * Given that, and the rules for the Gregorian calendar (leap years are those
3858  * divisible by 4 unless also divisible by 100, when they must be divisible
3859  * by 400 instead), we can simply calculate the number of days since some
3860  * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3861  * the days we derive from our month index, and adding in the day of the
3862  * month.  The value used here is not adjusted for the actual origin which
3863  * it normally would use (1 January A.D. 1), since we're not exposing it.
3864  * We're only building the value so we can turn around and get the
3865  * normalised values for the year, month, day-of-month, and day-of-year.
3866  *
3867  * For going backward, we need to bias the value we're using so that we find
3868  * the right year value.  (Basically, we don't want the contribution of
3869  * March 1st to the number to apply while deriving the year).  Having done
3870  * that, we 'count up' the contribution to the year number by accounting for
3871  * full quadracenturies (400-year periods) with their extra leap days, plus
3872  * the contribution from full centuries (to avoid counting in the lost leap
3873  * days), plus the contribution from full quad-years (to count in the normal
3874  * leap days), plus the leftover contribution from any non-leap years.
3875  * At this point, if we were working with an actual leap day, we'll have 0
3876  * days left over.  This is also true for March 1st, however.  So, we have
3877  * to special-case that result, and (earlier) keep track of the 'odd'
3878  * century and year contributions.  If we got 4 extra centuries in a qcent,
3879  * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3880  * Otherwise, we add back in the earlier bias we removed (the 123 from
3881  * figuring in March 1st), find the month index (integer division by 30.6),
3882  * and the remainder is the day-of-month.  We then have to convert back to
3883  * 'real' months (including fixing January and February from being 14/15 in
3884  * the previous year to being in the proper year).  After that, to get
3885  * tm_yday, we work with the normalised year and get a new yearday value for
3886  * January 1st, which we subtract from the yearday value we had earlier,
3887  * representing the date we've re-built.  This is done from January 1
3888  * because tm_yday is 0-origin.
3889  *
3890  * Since POSIX time routines are only guaranteed to work for times since the
3891  * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3892  * applies Gregorian calendar rules even to dates before the 16th century
3893  * doesn't bother me.  Besides, you'd need cultural context for a given
3894  * date to know whether it was Julian or Gregorian calendar, and that's
3895  * outside the scope for this routine.  Since we convert back based on the
3896  * same rules we used to build the yearday, you'll only get strange results
3897  * for input which needed normalising, or for the 'odd' century years which
3898  * were leap years in the Julian calendar but not in the Gregorian one.
3899  * I can live with that.
3900  *
3901  * This algorithm also fails to handle years before A.D. 1 gracefully, but
3902  * that's still outside the scope for POSIX time manipulation, so I don't
3903  * care.
3904  */
3905
3906     year = 1900 + ptm->tm_year;
3907     month = ptm->tm_mon;
3908     mday = ptm->tm_mday;
3909     jday = 0;
3910     if (month >= 2)
3911         month+=2;
3912     else
3913         month+=14, year--;
3914     yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3915     yearday += month*MONTH_TO_DAYS + mday + jday;
3916     /*
3917      * Note that we don't know when leap-seconds were or will be,
3918      * so we have to trust the user if we get something which looks
3919      * like a sensible leap-second.  Wild values for seconds will
3920      * be rationalised, however.
3921      */
3922     if ((unsigned) ptm->tm_sec <= 60) {
3923         secs = 0;
3924     }
3925     else {
3926         secs = ptm->tm_sec;
3927         ptm->tm_sec = 0;
3928     }
3929     secs += 60 * ptm->tm_min;
3930     secs += SECS_PER_HOUR * ptm->tm_hour;
3931     if (secs < 0) {
3932         if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3933             /* got negative remainder, but need positive time */
3934             /* back off an extra day to compensate */
3935             yearday += (secs/SECS_PER_DAY)-1;
3936             secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3937         }
3938         else {
3939             yearday += (secs/SECS_PER_DAY);
3940             secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3941         }
3942     }
3943     else if (secs >= SECS_PER_DAY) {
3944         yearday += (secs/SECS_PER_DAY);
3945         secs %= SECS_PER_DAY;
3946     }
3947     ptm->tm_hour = secs/SECS_PER_HOUR;
3948     secs %= SECS_PER_HOUR;
3949     ptm->tm_min = secs/60;
3950     secs %= 60;
3951     ptm->tm_sec += secs;
3952     /* done with time of day effects */
3953     /*
3954      * The algorithm for yearday has (so far) left it high by 428.
3955      * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3956      * bias it by 123 while trying to figure out what year it
3957      * really represents.  Even with this tweak, the reverse
3958      * translation fails for years before A.D. 0001.
3959      * It would still fail for Feb 29, but we catch that one below.
3960      */
3961     jday = yearday;     /* save for later fixup vis-a-vis Jan 1 */
3962     yearday -= YEAR_ADJUST;
3963     year = (yearday / DAYS_PER_QCENT) * 400;
3964     yearday %= DAYS_PER_QCENT;
3965     odd_cent = yearday / DAYS_PER_CENT;
3966     year += odd_cent * 100;
3967     yearday %= DAYS_PER_CENT;
3968     year += (yearday / DAYS_PER_QYEAR) * 4;
3969     yearday %= DAYS_PER_QYEAR;
3970     odd_year = yearday / DAYS_PER_YEAR;
3971     year += odd_year;
3972     yearday %= DAYS_PER_YEAR;
3973     if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3974         month = 1;
3975         yearday = 29;
3976     }
3977     else {
3978         yearday += YEAR_ADJUST; /* recover March 1st crock */
3979         month = yearday*DAYS_TO_MONTH;
3980         yearday -= month*MONTH_TO_DAYS;
3981         /* recover other leap-year adjustment */
3982         if (month > 13) {
3983             month-=14;
3984             year++;
3985         }
3986         else {
3987             month-=2;
3988         }
3989     }
3990     ptm->tm_year = year - 1900;
3991     if (yearday) {
3992       ptm->tm_mday = yearday;
3993       ptm->tm_mon = month;
3994     }
3995     else {
3996       ptm->tm_mday = 31;
3997       ptm->tm_mon = month - 1;
3998     }
3999     /* re-build yearday based on Jan 1 to get tm_yday */
4000     year--;
4001     yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
4002     yearday += 14*MONTH_TO_DAYS + 1;
4003     ptm->tm_yday = jday - yearday;
4004     ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
4005 }
4006
4007 char *
4008 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)
4009 {
4010 #ifdef HAS_STRFTIME
4011   char *buf;
4012   int buflen;
4013   struct tm mytm;
4014   int len;
4015
4016   PERL_ARGS_ASSERT_MY_STRFTIME;
4017
4018   init_tm(&mytm);       /* XXX workaround - see init_tm() above */
4019   mytm.tm_sec = sec;
4020   mytm.tm_min = min;
4021   mytm.tm_hour = hour;
4022   mytm.tm_mday = mday;
4023   mytm.tm_mon = mon;
4024   mytm.tm_year = year;
4025   mytm.tm_wday = wday;
4026   mytm.tm_yday = yday;
4027   mytm.tm_isdst = isdst;
4028   mini_mktime(&mytm);
4029   /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
4030 #if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
4031   STMT_START {
4032     struct tm mytm2;
4033     mytm2 = mytm;
4034     mktime(&mytm2);
4035 #ifdef HAS_TM_TM_GMTOFF
4036     mytm.tm_gmtoff = mytm2.tm_gmtoff;
4037 #endif
4038 #ifdef HAS_TM_TM_ZONE
4039     mytm.tm_zone = mytm2.tm_zone;
4040 #endif
4041   } STMT_END;
4042 #endif
4043   buflen = 64;
4044   Newx(buf, buflen, char);
4045   len = strftime(buf, buflen, fmt, &mytm);
4046   /*
4047   ** The following is needed to handle to the situation where
4048   ** tmpbuf overflows.  Basically we want to allocate a buffer
4049   ** and try repeatedly.  The reason why it is so complicated
4050   ** is that getting a return value of 0 from strftime can indicate
4051   ** one of the following:
4052   ** 1. buffer overflowed,
4053   ** 2. illegal conversion specifier, or
4054   ** 3. the format string specifies nothing to be returned(not
4055   **      an error).  This could be because format is an empty string
4056   **    or it specifies %p that yields an empty string in some locale.
4057   ** If there is a better way to make it portable, go ahead by
4058   ** all means.
4059   */
4060   if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
4061     return buf;
4062   else {
4063     /* Possibly buf overflowed - try again with a bigger buf */
4064     const int fmtlen = strlen(fmt);
4065     int bufsize = fmtlen + buflen;
4066
4067     Renew(buf, bufsize, char);
4068     while (buf) {
4069       buflen = strftime(buf, bufsize, fmt, &mytm);
4070       if (buflen > 0 && buflen < bufsize)
4071         break;
4072       /* heuristic to prevent out-of-memory errors */
4073       if (bufsize > 100*fmtlen) {
4074         Safefree(buf);
4075         buf = NULL;
4076         break;
4077       }
4078       bufsize *= 2;
4079       Renew(buf, bufsize, char);
4080     }
4081     return buf;
4082   }
4083 #else
4084   Perl_croak(aTHX_ "panic: no strftime");
4085   return NULL;
4086 #endif
4087 }
4088
4089
4090 #define SV_CWD_RETURN_UNDEF \
4091 sv_setsv(sv, &PL_sv_undef); \
4092 return FALSE
4093
4094 #define SV_CWD_ISDOT(dp) \
4095     (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
4096         (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
4097
4098 /*
4099 =head1 Miscellaneous Functions
4100
4101 =for apidoc getcwd_sv
4102
4103 Fill the sv with current working directory
4104
4105 =cut
4106 */
4107
4108 /* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
4109  * rewritten again by dougm, optimized for use with xs TARG, and to prefer
4110  * getcwd(3) if available
4111  * Comments from the orignal:
4112  *     This is a faster version of getcwd.  It's also more dangerous
4113  *     because you might chdir out of a directory that you can't chdir
4114  *     back into. */
4115
4116 int
4117 Perl_getcwd_sv(pTHX_ register SV *sv)
4118 {
4119 #ifndef PERL_MICRO
4120     dVAR;
4121 #ifndef INCOMPLETE_TAINTS
4122     SvTAINTED_on(sv);
4123 #endif
4124
4125     PERL_ARGS_ASSERT_GETCWD_SV;
4126
4127 #ifdef HAS_GETCWD
4128     {
4129         char buf[MAXPATHLEN];
4130
4131         /* Some getcwd()s automatically allocate a buffer of the given
4132          * size from the heap if they are given a NULL buffer pointer.
4133          * The problem is that this behaviour is not portable. */
4134         if (getcwd(buf, sizeof(buf) - 1)) {
4135             sv_setpv(sv, buf);
4136             return TRUE;
4137         }
4138         else {
4139             sv_setsv(sv, &PL_sv_undef);
4140             return FALSE;
4141         }
4142     }
4143
4144 #else
4145
4146     Stat_t statbuf;
4147     int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4148     int pathlen=0;
4149     Direntry_t *dp;
4150
4151     SvUPGRADE(sv, SVt_PV);
4152
4153     if (PerlLIO_lstat(".", &statbuf) < 0) {
4154         SV_CWD_RETURN_UNDEF;
4155     }
4156
4157     orig_cdev = statbuf.st_dev;
4158     orig_cino = statbuf.st_ino;
4159     cdev = orig_cdev;
4160     cino = orig_cino;
4161
4162     for (;;) {
4163         DIR *dir;
4164         int namelen;
4165         odev = cdev;
4166         oino = cino;
4167
4168         if (PerlDir_chdir("..") < 0) {
4169             SV_CWD_RETURN_UNDEF;
4170         }
4171         if (PerlLIO_stat(".", &statbuf) < 0) {
4172             SV_CWD_RETURN_UNDEF;
4173         }
4174
4175         cdev = statbuf.st_dev;
4176         cino = statbuf.st_ino;
4177
4178         if (odev == cdev && oino == cino) {
4179             break;
4180         }
4181         if (!(dir = PerlDir_open("."))) {
4182             SV_CWD_RETURN_UNDEF;
4183         }
4184
4185         while ((dp = PerlDir_read(dir)) != NULL) {
4186 #ifdef DIRNAMLEN
4187             namelen = dp->d_namlen;
4188 #else
4189             namelen = strlen(dp->d_name);
4190 #endif
4191             /* skip . and .. */
4192             if (SV_CWD_ISDOT(dp)) {
4193                 continue;
4194             }
4195
4196             if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
4197                 SV_CWD_RETURN_UNDEF;
4198             }
4199
4200             tdev = statbuf.st_dev;
4201             tino = statbuf.st_ino;
4202             if (tino == oino && tdev == odev) {
4203                 break;
4204             }
4205         }
4206
4207         if (!dp) {
4208             SV_CWD_RETURN_UNDEF;
4209         }
4210
4211         if (pathlen + namelen + 1 >= MAXPATHLEN) {
4212             SV_CWD_RETURN_UNDEF;
4213         }
4214
4215         SvGROW(sv, pathlen + namelen + 1);
4216
4217         if (pathlen) {
4218             /* shift down */
4219             Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
4220         }
4221
4222         /* prepend current directory to the front */
4223         *SvPVX(sv) = '/';
4224         Move(dp->d_name, SvPVX(sv)+1, namelen, char);
4225         pathlen += (namelen + 1);
4226
4227 #ifdef VOID_CLOSEDIR
4228         PerlDir_close(dir);
4229 #else
4230         if (PerlDir_close(dir) < 0) {
4231             SV_CWD_RETURN_UNDEF;
4232         }
4233 #endif
4234     }
4235
4236     if (pathlen) {
4237         SvCUR_set(sv, pathlen);
4238         *SvEND(sv) = '\0';
4239         SvPOK_only(sv);
4240
4241         if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
4242             SV_CWD_RETURN_UNDEF;
4243         }
4244     }
4245     if (PerlLIO_stat(".", &statbuf) < 0) {
4246         SV_CWD_RETURN_UNDEF;
4247     }
4248
4249     cdev = statbuf.st_dev;
4250     cino = statbuf.st_ino;
4251
4252     if (cdev != orig_cdev || cino != orig_cino) {
4253         Perl_croak(aTHX_ "Unstable directory path, "
4254                    "current directory changed unexpectedly");
4255     }
4256
4257     return TRUE;
4258 #endif
4259
4260 #else
4261     return FALSE;
4262 #endif
4263 }
4264
4265 #define VERSION_MAX 0x7FFFFFFF
4266
4267 /*
4268 =for apidoc prescan_version
4269
4270 Validate that a given string can be parsed as a version object, but doesn't
4271 actually perform the parsing.  Can use either strict or lax validation rules.
4272 Can optionally set a number of hint variables to save the parsing code
4273 some time when tokenizing.
4274
4275 =cut
4276 */
4277 const char *
4278 Perl_prescan_version(pTHX_ const char *s, bool strict,
4279                      const char **errstr,
4280                      bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha) {
4281     bool qv = (sqv ? *sqv : FALSE);
4282     int width = 3;
4283     int saw_decimal = 0;
4284     bool alpha = FALSE;
4285     const char *d = s;
4286
4287     PERL_ARGS_ASSERT_PRESCAN_VERSION;
4288
4289     if (qv && isDIGIT(*d))
4290         goto dotted_decimal_version;
4291
4292     if (*d == 'v') { /* explicit v-string */
4293         d++;
4294         if (isDIGIT(*d)) {
4295             qv = TRUE;
4296         }
4297         else { /* degenerate v-string */
4298             /* requires v1.2.3 */
4299             BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4300         }
4301
4302 dotted_decimal_version:
4303         if (strict && d[0] == '0' && isDIGIT(d[1])) {
4304             /* no leading zeros allowed */
4305             BADVERSION(s,errstr,"Invalid version format (no leading zeros)");
4306         }
4307
4308         while (isDIGIT(*d))     /* integer part */
4309             d++;
4310
4311         if (*d == '.')
4312         {
4313             saw_decimal++;
4314             d++;                /* decimal point */
4315         }
4316         else
4317         {
4318             if (strict) {
4319                 /* require v1.2.3 */
4320                 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4321             }
4322             else {
4323                 goto version_prescan_finish;
4324             }
4325         }
4326
4327         {
4328             int i = 0;
4329             int j = 0;
4330             while (isDIGIT(*d)) {       /* just keep reading */
4331                 i++;
4332                 while (isDIGIT(*d)) {
4333                     d++; j++;
4334                     /* maximum 3 digits between decimal */
4335                     if (strict && j > 3) {
4336                         BADVERSION(s,errstr,"Invalid version format (maximum 3 digits between decimals)");
4337                     }
4338                 }
4339                 if (*d == '_') {
4340                     if (strict) {
4341                         BADVERSION(s,errstr,"Invalid version format (no underscores)");
4342                     }
4343                     if ( alpha ) {
4344                         BADVERSION(s,errstr,"Invalid version format (multiple underscores)");
4345                     }
4346                     d++;
4347                     alpha = TRUE;
4348                 }
4349                 else if (*d == '.') {
4350                     if (alpha) {
4351                         BADVERSION(s,errstr,"Invalid version format (underscores before decimal)");
4352                     }
4353                     saw_decimal++;
4354                     d++;
4355                 }
4356                 else if (!isDIGIT(*d)) {
4357                     break;
4358                 }
4359                 j = 0;
4360             }
4361
4362             if (strict && i < 2) {
4363                 /* requires v1.2.3 */
4364                 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4365             }
4366         }
4367     }                                   /* end if dotted-decimal */
4368     else
4369     {                                   /* decimal versions */
4370         int j = 0;                      /* may need this later */
4371         /* special strict case for leading '.' or '0' */
4372         if (strict) {
4373             if (*d == '.') {
4374                 BADVERSION(s,errstr,"Invalid version format (0 before decimal required)");
4375             }
4376             if (*d == '0' && isDIGIT(d[1])) {
4377                 BADVERSION(s,errstr,"Invalid version format (no leading zeros)");
4378             }
4379         }
4380
4381         /* and we never support negative versions */
4382         if ( *d == '-') {
4383             BADVERSION(s,errstr,"Invalid version format (negative version number)");
4384         }
4385
4386         /* consume all of the integer part */
4387         while (isDIGIT(*d))
4388             d++;
4389
4390         /* look for a fractional part */
4391         if (*d == '.') {
4392             /* we found it, so consume it */
4393             saw_decimal++;
4394             d++;
4395         }
4396         else if (!*d || *d == ';' || isSPACE(*d) || *d == '{' || *d == '}') {
4397             if ( d == s ) {
4398                 /* found nothing */
4399                 BADVERSION(s,errstr,"Invalid version format (version required)");
4400             }
4401             /* found just an integer */
4402             goto version_prescan_finish;
4403         }
4404         else if ( d == s ) {
4405             /* didn't find either integer or period */
4406             BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4407         }
4408         else if (*d == '_') {
4409             /* underscore can't come after integer part */
4410             if (strict) {
4411                 BADVERSION(s,errstr,"Invalid version format (no underscores)");
4412             }
4413             else if (isDIGIT(d[1])) {
4414                 BADVERSION(s,errstr,"Invalid version format (alpha without decimal)");
4415             }
4416             else {
4417                 BADVERSION(s,errstr,"Invalid version format (misplaced underscore)");
4418             }
4419         }
4420         else {
4421             /* anything else after integer part is just invalid data */
4422             BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4423         }
4424
4425         /* scan the fractional part after the decimal point*/
4426
4427         if (!isDIGIT(*d) && (strict || ! (!*d || *d == ';' || isSPACE(*d) || *d == '{' || *d == '}') )) {
4428                 /* strict or lax-but-not-the-end */
4429                 BADVERSION(s,errstr,"Invalid version format (fractional part required)");
4430         }
4431
4432         while (isDIGIT(*d)) {
4433             d++; j++;
4434             if (*d == '.' && isDIGIT(d[-1])) {
4435                 if (alpha) {
4436                     BADVERSION(s,errstr,"Invalid version format (underscores before decimal)");
4437                 }
4438                 if (strict) {
4439                     BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions must begin with 'v')");
4440                 }
4441                 d = (char *)s;          /* start all over again */
4442                 qv = TRUE;
4443                 goto dotted_decimal_version;
4444             }
4445             if (*d == '_') {
4446                 if (strict) {
4447                     BADVERSION(s,errstr,"Invalid version format (no underscores)");
4448                 }
4449                 if ( alpha ) {
4450                     BADVERSION(s,errstr,"Invalid version format (multiple underscores)");
4451                 }
4452                 if ( ! isDIGIT(d[1]) ) {
4453                     BADVERSION(s,errstr,"Invalid version format (misplaced underscore)");
4454                 }
4455                 width = j;
4456                 d++;
4457                 alpha = TRUE;
4458             }
4459         }
4460     }
4461
4462 version_prescan_finish:
4463     while (isSPACE(*d))
4464         d++;
4465
4466     if (!isDIGIT(*d) && (! (!*d || *d == ';' || *d == '{' || *d == '}') )) {
4467         /* trailing non-numeric data */
4468         BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4469     }
4470
4471     if (sqv)
4472         *sqv = qv;
4473     if (swidth)
4474         *swidth = width;
4475     if (ssaw_decimal)
4476         *ssaw_decimal = saw_decimal;
4477     if (salpha)
4478         *salpha = alpha;
4479     return d;
4480 }
4481
4482 /*
4483 =for apidoc scan_version
4484
4485 Returns a pointer to the next character after the parsed
4486 version string, as well as upgrading the passed in SV to
4487 an RV.
4488
4489 Function must be called with an already existing SV like
4490
4491     sv = newSV(0);
4492     s = scan_version(s, SV *sv, bool qv);
4493
4494 Performs some preprocessing to the string to ensure that
4495 it has the correct characteristics of a version.  Flags the
4496 object if it contains an underscore (which denotes this
4497 is an alpha version).  The boolean qv denotes that the version
4498 should be interpreted as if it had multiple decimals, even if
4499 it doesn't.
4500
4501 =cut
4502 */
4503
4504 const char *
4505 Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv)
4506 {
4507     const char *start;
4508     const char *pos;
4509     const char *last;
4510     const char *errstr = NULL;
4511     int saw_decimal = 0;
4512     int width = 3;
4513     bool alpha = FALSE;
4514     bool vinf = FALSE;
4515     AV * const av = newAV();
4516     SV * const hv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
4517
4518     PERL_ARGS_ASSERT_SCAN_VERSION;
4519
4520     (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
4521
4522 #ifndef NODEFAULT_SHAREKEYS
4523     HvSHAREKEYS_on(hv);         /* key-sharing on by default */
4524 #endif
4525
4526     while (isSPACE(*s)) /* leading whitespace is OK */
4527         s++;
4528
4529     last = prescan_version(s, FALSE, &errstr, &qv, &saw_decimal, &width, &alpha);
4530     if (errstr) {
4531         /* "undef" is a special case and not an error */
4532         if ( ! ( *s == 'u' && strEQ(s,"undef")) ) {
4533             Perl_croak(aTHX_ "%s", errstr);
4534         }
4535     }
4536
4537     start = s;
4538     if (*s == 'v')
4539         s++;
4540     pos = s;
4541
4542     if ( qv )
4543         (void)hv_stores(MUTABLE_HV(hv), "qv", newSViv(qv));
4544     if ( alpha )
4545         (void)hv_stores(MUTABLE_HV(hv), "alpha", newSViv(alpha));
4546     if ( !qv && width < 3 )
4547         (void)hv_stores(MUTABLE_HV(hv), "width", newSViv(width));
4548     
4549     while (isDIGIT(*pos))
4550         pos++;
4551     if (!isALPHA(*pos)) {
4552         I32 rev;
4553
4554         for (;;) {
4555             rev = 0;
4556             {
4557                 /* this is atoi() that delimits on underscores */
4558                 const char *end = pos;
4559                 I32 mult = 1;
4560                 I32 orev;
4561
4562                 /* the following if() will only be true after the decimal
4563                  * point of a version originally created with a bare
4564                  * floating point number, i.e. not quoted in any way
4565                  */
4566                 if ( !qv && s > start && saw_decimal == 1 ) {
4567                     mult *= 100;
4568                     while ( s < end ) {
4569                         orev = rev;
4570                         rev += (*s - '0') * mult;
4571                         mult /= 10;
4572                         if (   (PERL_ABS(orev) > PERL_ABS(rev)) 
4573                             || (PERL_ABS(rev) > VERSION_MAX )) {
4574                             Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW), 
4575                                            "Integer overflow in version %d",VERSION_MAX);
4576                             s = end - 1;
4577                             rev = VERSION_MAX;
4578                             vinf = 1;
4579                         }
4580                         s++;
4581                         if ( *s == '_' )
4582                             s++;
4583                     }
4584                 }
4585                 else {
4586                     while (--end >= s) {
4587                         orev = rev;
4588                         rev += (*end - '0') * mult;
4589                         mult *= 10;
4590                         if (   (PERL_ABS(orev) > PERL_ABS(rev)) 
4591                             || (PERL_ABS(rev) > VERSION_MAX )) {
4592                             Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW), 
4593                                            "Integer overflow in version");
4594                             end = s - 1;
4595                             rev = VERSION_MAX;
4596                             vinf = 1;
4597                         }
4598                     }
4599                 } 
4600             }
4601
4602             /* Append revision */
4603             av_push(av, newSViv(rev));
4604             if ( vinf ) {
4605                 s = last;
4606                 break;
4607             }
4608             else if ( *pos == '.' )
4609                 s = ++pos;
4610             else if ( *pos == '_' && isDIGIT(pos[1]) )
4611                 s = ++pos;
4612             else if ( *pos == ',' && isDIGIT(pos[1]) )
4613                 s = ++pos;
4614             else if ( isDIGIT(*pos) )
4615                 s = pos;
4616             else {
4617                 s = pos;
4618                 break;
4619             }
4620             if ( qv ) {
4621                 while ( isDIGIT(*pos) )
4622                     pos++;
4623             }
4624             else {
4625                 int digits = 0;
4626                 while ( ( isDIGIT(*pos) || *pos == '_' ) && digits < 3 ) {
4627                     if ( *pos != '_' )
4628                         digits++;
4629                     pos++;
4630                 }
4631             }
4632         }
4633     }
4634     if ( qv ) { /* quoted versions always get at least three terms*/
4635         I32 len = av_len(av);
4636         /* This for loop appears to trigger a compiler bug on OS X, as it
4637            loops infinitely. Yes, len is negative. No, it makes no sense.
4638            Compiler in question is:
4639            gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
4640            for ( len = 2 - len; len > 0; len-- )
4641            av_push(MUTABLE_AV(sv), newSViv(0));
4642         */
4643         len = 2 - len;
4644         while (len-- > 0)
4645             av_push(av, newSViv(0));
4646     }
4647
4648     /* need to save off the current version string for later */
4649     if ( vinf ) {
4650         SV * orig = newSVpvn("v.Inf", sizeof("v.Inf")-1);
4651         (void)hv_stores(MUTABLE_HV(hv), "original", orig);
4652         (void)hv_stores(MUTABLE_HV(hv), "vinf", newSViv(1));
4653     }
4654     else if ( s > start ) {
4655         SV * orig = newSVpvn(start,s-start);
4656         if ( qv && saw_decimal == 1 && *start != 'v' ) {
4657             /* need to insert a v to be consistent */
4658             sv_insert(orig, 0, 0, "v", 1);
4659         }
4660         (void)hv_stores(MUTABLE_HV(hv), "original", orig);
4661     }
4662     else {
4663         (void)hv_stores(MUTABLE_HV(hv), "original", newSVpvs("0"));
4664         av_push(av, newSViv(0));
4665     }
4666
4667     /* And finally, store the AV in the hash */
4668     (void)hv_stores(MUTABLE_HV(hv), "version", newRV_noinc(MUTABLE_SV(av)));
4669
4670     /* fix RT#19517 - special case 'undef' as string */
4671     if ( *s == 'u' && strEQ(s,"undef") ) {
4672         s += 5;
4673     }
4674
4675     return s;
4676 }
4677
4678 /*
4679 =for apidoc new_version
4680
4681 Returns a new version object based on the passed in SV:
4682
4683     SV *sv = new_version(SV *ver);
4684
4685 Does not alter the passed in ver SV.  See "upg_version" if you
4686 want to upgrade the SV.
4687
4688 =cut
4689 */
4690
4691 SV *
4692 Perl_new_version(pTHX_ SV *ver)
4693 {
4694     dVAR;
4695     SV * const rv = newSV(0);
4696     PERL_ARGS_ASSERT_NEW_VERSION;
4697     if ( sv_isobject(ver) && sv_derived_from(ver, "version") )
4698          /* can just copy directly */
4699     {
4700         I32 key;
4701         AV * const av = newAV();
4702         AV *sav;
4703         /* This will get reblessed later if a derived class*/
4704         SV * const hv = newSVrv(rv, "version"); 
4705         (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
4706 #ifndef NODEFAULT_SHAREKEYS
4707         HvSHAREKEYS_on(hv);         /* key-sharing on by default */
4708 #endif
4709
4710         if ( SvROK(ver) )
4711             ver = SvRV(ver);
4712
4713         /* Begin copying all of the elements */
4714         if ( hv_exists(MUTABLE_HV(ver), "qv", 2) )
4715             (void)hv_stores(MUTABLE_HV(hv), "qv", newSViv(1));
4716
4717         if ( hv_exists(MUTABLE_HV(ver), "alpha", 5) )
4718             (void)hv_stores(MUTABLE_HV(hv), "alpha", newSViv(1));
4719         
4720         if ( hv_exists(MUTABLE_HV(ver), "width", 5 ) )
4721         {
4722             const I32 width = SvIV(*hv_fetchs(MUTABLE_HV(ver), "width", FALSE));
4723             (void)hv_stores(MUTABLE_HV(hv), "width", newSViv(width));
4724         }
4725
4726         if ( hv_exists(MUTABLE_HV(ver), "original", 8 ) )
4727         {
4728             SV * pv = *hv_fetchs(MUTABLE_HV(ver), "original", FALSE);
4729             (void)hv_stores(MUTABLE_HV(hv), "original", newSVsv(pv));
4730         }
4731
4732         sav = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(ver), "version", FALSE)));
4733         /* This will get reblessed later if a derived class*/
4734         for ( key = 0; key <= av_len(sav); key++ )
4735         {
4736             const I32 rev = SvIV(*av_fetch(sav, key, FALSE));
4737             av_push(av, newSViv(rev));
4738         }
4739
4740         (void)hv_stores(MUTABLE_HV(hv), "version", newRV_noinc(MUTABLE_SV(av)));
4741         return rv;
4742     }
4743 #ifdef SvVOK
4744     {
4745         const MAGIC* const mg = SvVSTRING_mg(ver);
4746         if ( mg ) { /* already a v-string */
4747             const STRLEN len = mg->mg_len;
4748             char * const version = savepvn( (const char*)mg->mg_ptr, len);
4749             sv_setpvn(rv,version,len);
4750             /* this is for consistency with the pure Perl class */
4751             if ( isDIGIT(*version) )
4752                 sv_insert(rv, 0, 0, "v", 1);
4753             Safefree(version);
4754         }
4755         else {
4756 #endif
4757         sv_setsv(rv,ver); /* make a duplicate */
4758 #ifdef SvVOK
4759         }
4760     }
4761 #endif
4762     return upg_version(rv, FALSE);
4763 }
4764
4765 /*
4766 =for apidoc upg_version
4767
4768 In-place upgrade of the supplied SV to a version object.
4769
4770     SV *sv = upg_version(SV *sv, bool qv);
4771
4772 Returns a pointer to the upgraded SV.  Set the boolean qv if you want
4773 to force this SV to be interpreted as an "extended" version.
4774
4775 =cut
4776 */
4777
4778 SV *
4779 Perl_upg_version(pTHX_ SV *ver, bool qv)
4780 {
4781     const char *version, *s;
4782 #ifdef SvVOK
4783     const MAGIC *mg;
4784 #endif
4785
4786     PERL_ARGS_ASSERT_UPG_VERSION;
4787
4788     if ( SvNOK(ver) && !( SvPOK(ver) && sv_len(ver) == 3 ) )
4789     {
4790         STRLEN len;
4791
4792         /* may get too much accuracy */ 
4793         char tbuf[64];
4794         SV *sv = SvNVX(ver) > 10e50 ? newSV(64) : 0;
4795         char *buf;
4796 #ifdef USE_LOCALE_NUMERIC
4797         char *loc = savepv(setlocale(LC_NUMERIC, NULL));
4798         setlocale(LC_NUMERIC, "C");
4799 #endif
4800         if (sv) {
4801             Perl_sv_setpvf(aTHX_ sv, "%.9"NVff, SvNVX(ver));
4802             buf = SvPV(sv, len);
4803         }
4804         else {
4805             len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
4806             buf = tbuf;
4807         }
4808 #ifdef USE_LOCALE_NUMERIC
4809         setlocale(LC_NUMERIC, loc);
4810         Safefree(loc);
4811 #endif
4812         while (buf[len-1] == '0' && len > 0) len--;
4813         if ( buf[len-1] == '.' ) len--; /* eat the trailing decimal */
4814         version = savepvn(buf, len);
4815         SvREFCNT_dec(sv);
4816     }
4817 #ifdef SvVOK
4818     else if ( (mg = SvVSTRING_mg(ver)) ) { /* already a v-string */
4819         version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
4820         qv = TRUE;
4821     }
4822 #endif
4823     else /* must be a string or something like a string */
4824     {
4825         STRLEN len;
4826         version = savepv(SvPV(ver,len));
4827 #ifndef SvVOK
4828 #  if PERL_VERSION > 5
4829         /* This will only be executed for 5.6.0 - 5.8.0 inclusive */
4830         if ( len >= 3 && !instr(version,".") && !instr(version,"_")) {
4831             /* may be a v-string */
4832             char *testv = (char *)version;
4833             STRLEN tlen = len;
4834             for (tlen=0; tlen < len; tlen++, testv++) {
4835                 /* if one of the characters is non-text assume v-string */
4836                 if (testv[0] < ' ') {
4837                     SV * const nsv = sv_newmortal();
4838                     const char *nver;
4839                     const char *pos;
4840                     int saw_decimal = 0;
4841                     sv_setpvf(nsv,"v%vd",ver);
4842                     pos = nver = savepv(SvPV_nolen(nsv));
4843
4844                     /* scan the resulting formatted string */
4845                     pos++; /* skip the leading 'v' */
4846                     while ( *pos == '.' || isDIGIT(*pos) ) {
4847                         if ( *pos == '.' )
4848                             saw_decimal++ ;
4849                         pos++;
4850                     }
4851
4852                     /* is definitely a v-string */
4853                     if ( saw_decimal >= 2 ) {   
4854                         Safefree(version);
4855                         version = nver;
4856                     }
4857                     break;
4858                 }
4859             }
4860         }
4861 #  endif
4862 #endif
4863     }
4864
4865     s = scan_version(version, ver, qv);
4866     if ( *s != '\0' ) 
4867         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), 
4868                        "Version string '%s' contains invalid data; "
4869                        "ignoring: '%s'", version, s);
4870     Safefree(version);
4871     return ver;
4872 }
4873
4874 /*
4875 =for apidoc vverify
4876
4877 Validates that the SV contains valid internal structure for a version object.
4878 It may be passed either the version object (RV) or the hash itself (HV).  If
4879 the structure is valid, it returns the HV.  If the structure is invalid,
4880 it returns NULL.
4881
4882     SV *hv = vverify(sv);
4883
4884 Note that it only confirms the bare minimum structure (so as not to get
4885 confused by derived classes which may contain additional hash entries):
4886
4887 =over 4
4888
4889 =item * The SV is an HV or a reference to an HV
4890
4891 =item * The hash contains a "version" key
4892
4893 =item * The "version" key has a reference to an AV as its value
4894
4895 =back
4896
4897 =cut
4898 */
4899
4900 SV *
4901 Perl_vverify(pTHX_ SV *vs)
4902 {
4903     SV *sv;
4904
4905     PERL_ARGS_ASSERT_VVERIFY;
4906
4907     if ( SvROK(vs) )
4908         vs = SvRV(vs);
4909
4910     /* see if the appropriate elements exist */
4911     if ( SvTYPE(vs) == SVt_PVHV
4912          && hv_exists(MUTABLE_HV(vs), "version", 7)
4913          && (sv = SvRV(*hv_fetchs(MUTABLE_HV(vs), "version", FALSE)))
4914          && SvTYPE(sv) == SVt_PVAV )
4915         return vs;
4916     else
4917         return NULL;
4918 }
4919
4920 /*
4921 =for apidoc vnumify
4922
4923 Accepts a version object and returns the normalized floating
4924 point representation.  Call like:
4925
4926     sv = vnumify(rv);
4927
4928 NOTE: you can pass either the object directly or the SV
4929 contained within the RV.
4930
4931 The SV returned has a refcount of 1.
4932
4933 =cut
4934 */
4935
4936 SV *
4937 Perl_vnumify(pTHX_ SV *vs)
4938 {
4939     I32 i, len, digit;
4940     int width;
4941     bool alpha = FALSE;
4942     SV *sv;
4943     AV *av;
4944
4945     PERL_ARGS_ASSERT_VNUMIFY;
4946
4947     /* extract the HV from the object */
4948     vs = vverify(vs);
4949     if ( ! vs )
4950         Perl_croak(aTHX_ "Invalid version object");
4951
4952     /* see if various flags exist */
4953     if ( hv_exists(MUTABLE_HV(vs), "alpha", 5 ) )
4954         alpha = TRUE;
4955     if ( hv_exists(MUTABLE_HV(vs), "width", 5 ) )
4956         width = SvIV(*hv_fetchs(MUTABLE_HV(vs), "width", FALSE));
4957     else
4958         width = 3;
4959
4960
4961     /* attempt to retrieve the version array */
4962     if ( !(av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(vs), "version", FALSE))) ) ) {
4963         return newSVpvs("0");
4964     }
4965
4966     len = av_len(av);
4967     if ( len == -1 )
4968     {
4969         return newSVpvs("0");
4970     }
4971
4972     digit = SvIV(*av_fetch(av, 0, 0));
4973     sv = Perl_newSVpvf(aTHX_ "%d.", (int)PERL_ABS(digit));
4974     for ( i = 1 ; i < len ; i++ )
4975     {
4976         digit = SvIV(*av_fetch(av, i, 0));
4977         if ( width < 3 ) {
4978             const int denom = (width == 2 ? 10 : 100);
4979             const div_t term = div((int)PERL_ABS(digit),denom);
4980             Perl_sv_catpvf(aTHX_ sv, "%0*d_%d", width, term.quot, term.rem);
4981         }
4982         else {
4983             Perl_sv_catpvf(aTHX_ sv, "%0*d", width, (int)digit);
4984         }
4985     }
4986
4987     if ( len > 0 )
4988     {
4989         digit = SvIV(*av_fetch(av, len, 0));
4990         if ( alpha && width == 3 ) /* alpha version */
4991             sv_catpvs(sv,"_");
4992         Perl_sv_catpvf(aTHX_ sv, "%0*d", width, (int)digit);
4993     }
4994     else /* len == 0 */
4995     {
4996         sv_catpvs(sv, "000");
4997     }
4998     return sv;
4999 }
5000
5001 /*
5002 =for apidoc vnormal
5003
5004 Accepts a version object and returns the normalized string
5005 representation.  Call like:
5006
5007     sv = vnormal(rv);
5008
5009 NOTE: you can pass either the object directly or the SV
5010 contained within the RV.
5011
5012 The SV returned has a refcount of 1.
5013
5014 =cut
5015 */
5016
5017 SV *
5018 Perl_vnormal(pTHX_ SV *vs)
5019 {
5020     I32 i, len, digit;
5021     bool alpha = FALSE;
5022     SV *sv;
5023     AV *av;
5024
5025     PERL_ARGS_ASSERT_VNORMAL;
5026
5027     /* extract the HV from the object */
5028     vs = vverify(vs);
5029     if ( ! vs )
5030         Perl_croak(aTHX_ "Invalid version object");
5031
5032     if ( hv_exists(MUTABLE_HV(vs), "alpha", 5 ) )
5033         alpha = TRUE;
5034     av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(vs), "version", FALSE)));
5035
5036     len = av_len(av);
5037     if ( len == -1 )
5038     {
5039         return newSVpvs("");
5040     }
5041     digit = SvIV(*av_fetch(av, 0, 0));
5042     sv = Perl_newSVpvf(aTHX_ "v%"IVdf, (IV)digit);
5043     for ( i = 1 ; i < len ; i++ ) {
5044         digit = SvIV(*av_fetch(av, i, 0));
5045         Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
5046     }
5047
5048     if ( len > 0 )
5049     {
5050         /* handle last digit specially */
5051         digit = SvIV(*av_fetch(av, len, 0));
5052         if ( alpha )
5053             Perl_sv_catpvf(aTHX_ sv, "_%"IVdf, (IV)digit);
5054         else
5055             Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
5056     }
5057
5058     if ( len <= 2 ) { /* short version, must be at least three */
5059         for ( len = 2 - len; len != 0; len-- )
5060             sv_catpvs(sv,".0");
5061     }
5062     return sv;
5063 }
5064
5065 /*
5066 =for apidoc vstringify
5067
5068 In order to maintain maximum compatibility with earlier versions
5069 of Perl, this function will return either the floating point