This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldiag: Add entry for unknown charname
[perl5.git] / util.c
1 /*    util.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * 'Very useful, no doubt, that was to Saruman; yet it seems that he was
13  *  not content.'                                    --Gandalf to Pippin
14  *
15  *     [p.598 of _The Lord of the Rings_, III/xi: "The Palantír"]
16  */
17
18 /* This file contains assorted utility routines.
19  * Which is a polite way of saying any stuff that people couldn't think of
20  * a better place for. Amongst other things, it includes the warning and
21  * dieing stuff, plus wrappers for malloc code.
22  */
23
24 #include "EXTERN.h"
25 #define PERL_IN_UTIL_C
26 #include "perl.h"
27
28 #ifdef USE_PERLIO
29 #include "perliol.h" /* For PerlIOUnix_refcnt */
30 #endif
31
32 #ifndef PERL_MICRO
33 #include <signal.h>
34 #ifndef SIG_ERR
35 # define SIG_ERR ((Sighandler_t) -1)
36 #endif
37 #endif
38
39 #ifdef __Lynx__
40 /* Missing protos on LynxOS */
41 int putenv(char *);
42 #endif
43
44 #ifdef 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         croak_memory_wrap();
311 #ifdef PERL_TRACK_MEMPOOL
312     if (sTHX <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
313         total_size += sTHX;
314     else
315         croak_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 (TAINTING_get) {
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 && TAINTING_get) {
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         croak_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
5070 notation or the multiple dotted notation, depending on whether
5071 the original version contained 1 or more dots, respectively.
5072
5073 The SV returned has a refcount of 1.
5074
5075 =cut
5076 */
5077
5078 SV *
5079 Perl_vstringify(pTHX_ SV *vs)
5080 {
5081     PERL_ARGS_ASSERT_VSTRINGIFY;
5082
5083     /* extract the HV from the object */
5084     vs = vverify(vs);
5085     if ( ! vs )
5086         Perl_croak(aTHX_ "Invalid version object");
5087
5088     if (hv_exists(MUTABLE_HV(vs), "original",  sizeof("original") - 1)) {
5089         SV *pv;
5090         pv = *hv_fetchs(MUTABLE_HV(vs), "original", FALSE);
5091         if ( SvPOK(pv) )
5092             return newSVsv(pv);
5093         else
5094             return &PL_sv_undef;
5095     }
5096     else {
5097         if ( hv_exists(MUTABLE_HV(vs), "qv", 2) )
5098             return vnormal(vs);
5099         else
5100             return vnumify(vs);
5101     }
5102 }
5103
5104 /*
5105 =for apidoc vcmp
5106
5107 Version object aware cmp.  Both operands must already have been 
5108 converted into version objects.
5109
5110 =cut
5111 */
5112
5113 int
5114 Perl_vcmp(pTHX_ SV *lhv, SV *rhv)
5115 {
5116     I32 i,l,m,r,retval;
5117     bool lalpha = FALSE;
5118     bool ralpha = FALSE;
5119     I32 left = 0;
5120     I32 right = 0;
5121     AV *lav, *rav;
5122
5123     PERL_ARGS_ASSERT_VCMP;
5124
5125     /* extract the HVs from the objects */
5126     lhv = vverify(lhv);
5127     rhv = vverify(rhv);
5128     if ( ! ( lhv && rhv ) )
5129         Perl_croak(aTHX_ "Invalid version object");
5130
5131     /* get the left hand term */
5132     lav = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(lhv), "version", FALSE)));
5133     if ( hv_exists(MUTABLE_HV(lhv), "alpha", 5 ) )
5134         lalpha = TRUE;
5135
5136     /* and the right hand term */
5137     rav = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(rhv), "version", FALSE)));
5138     if ( hv_exists(MUTABLE_HV(rhv), "alpha", 5 ) )
5139         ralpha = TRUE;
5140
5141     l = av_len(lav);
5142     r = av_len(rav);
5143     m = l < r ? l : r;
5144     retval = 0;
5145     i = 0;
5146     while ( i <= m && retval == 0 )
5147     {
5148         left  = SvIV(*av_fetch(lav,i,0));
5149         right = SvIV(*av_fetch(rav,i,0));
5150         if ( left < right  )
5151             retval = -1;
5152         if ( left > right )
5153             retval = +1;
5154         i++;
5155     }
5156
5157     /* tiebreaker for alpha with identical terms */
5158     if ( retval == 0 && l == r && left == right && ( lalpha || ralpha ) )
5159     {
5160         if ( lalpha && !ralpha )
5161         {
5162             retval = -1;
5163         }
5164         else if ( ralpha && !lalpha)
5165         {
5166             retval = +1;
5167         }
5168     }
5169
5170     if ( l != r && retval == 0 ) /* possible match except for trailing 0's */
5171     {
5172         if ( l < r )
5173         {
5174             while ( i <= r && retval == 0 )
5175             {
5176                 if ( SvIV(*av_fetch(rav,i,0)) != 0 )
5177                     retval = -1; /* not a match after all */
5178                 i++;
5179             }
5180         }
5181         else
5182         {
5183             while ( i <= l && retval == 0 )
5184             {
5185                 if ( SvIV(*av_fetch(lav,i,0)) != 0 )
5186                     retval = +1; /* not a match after all */
5187                 i++;
5188             }
5189         }
5190     }
5191     return retval;
5192 }
5193
5194 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
5195 #   define EMULATE_SOCKETPAIR_UDP
5196 #endif
5197
5198 #ifdef EMULATE_SOCKETPAIR_UDP
5199 static int
5200 S_socketpair_udp (int fd[2]) {
5201     dTHX;
5202     /* Fake a datagram socketpair using UDP to localhost.  */
5203     int sockets[2] = {-1, -1};
5204     struct sockaddr_in addresses[2];
5205     int i;
5206     Sock_size_t size = sizeof(struct sockaddr_in);
5207     unsigned short port;
5208     int got;
5209
5210     memset(&addresses, 0, sizeof(addresses));
5211     i = 1;
5212     do {
5213         sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
5214         if (sockets[i] == -1)
5215             goto tidy_up_and_fail;
5216
5217         addresses[i].sin_family = AF_INET;
5218         addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5219         addresses[i].sin_port = 0;      /* kernel choses port.  */
5220         if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
5221                 sizeof(struct sockaddr_in)) == -1)
5222             goto tidy_up_and_fail;
5223     } while (i--);
5224
5225     /* Now have 2 UDP sockets. Find out which port each is connected to, and
5226        for each connect the other socket to it.  */
5227     i = 1;
5228     do {
5229         if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
5230                 &size) == -1)
5231             goto tidy_up_and_fail;
5232         if (size != sizeof(struct sockaddr_in))
5233             goto abort_tidy_up_and_fail;
5234         /* !1 is 0, !0 is 1 */
5235         if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
5236                 sizeof(struct sockaddr_in)) == -1)
5237             goto tidy_up_and_fail;
5238     } while (i--);
5239
5240     /* Now we have 2 sockets connected to each other. I don't trust some other
5241        process not to have already sent a packet to us (by random) so send
5242        a packet from each to the other.  */
5243     i = 1;
5244     do {
5245         /* I'm going to send my own port number.  As a short.
5246            (Who knows if someone somewhere has sin_port as a bitfield and needs
5247            this routine. (I'm assuming crays have socketpair)) */
5248         port = addresses[i].sin_port;
5249         got = PerlLIO_write(sockets[i], &port, sizeof(port));
5250         if (got != sizeof(port)) {
5251             if (got == -1)
5252                 goto tidy_up_and_fail;
5253             goto abort_tidy_up_and_fail;
5254         }
5255     } while (i--);
5256
5257     /* Packets sent. I don't trust them to have arrived though.
5258        (As I understand it Solaris TCP stack is multithreaded. Non-blocking
5259        connect to localhost will use a second kernel thread. In 2.6 the
5260        first thread running the connect() returns before the second completes,
5261        so EINPROGRESS> In 2.7 the improved stack is faster and connect()
5262        returns 0. Poor programs have tripped up. One poor program's authors'
5263        had a 50-1 reverse stock split. Not sure how connected these were.)
5264        So I don't trust someone not to have an unpredictable UDP stack.
5265     */
5266
5267     {
5268         struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
5269         int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
5270         fd_set rset;
5271
5272         FD_ZERO(&rset);
5273         FD_SET((unsigned int)sockets[0], &rset);
5274         FD_SET((unsigned int)sockets[1], &rset);
5275
5276         got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
5277         if (got != 2 || !FD_ISSET(sockets[0], &rset)
5278                 || !FD_ISSET(sockets[1], &rset)) {
5279             /* I hope this is portable and appropriate.  */
5280             if (got == -1)
5281                 goto tidy_up_and_fail;
5282             goto abort_tidy_up_and_fail;
5283         }
5284     }
5285
5286     /* And the paranoia department even now doesn't trust it to have arrive
5287        (hence MSG_DONTWAIT). Or that what arrives was sent by us.  */
5288     {
5289         struct sockaddr_in readfrom;
5290         unsigned short buffer[2];
5291
5292         i = 1;
5293         do {
5294 #ifdef MSG_DONTWAIT
5295             got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
5296                     sizeof(buffer), MSG_DONTWAIT,
5297                     (struct sockaddr *) &readfrom, &size);
5298 #else
5299             got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
5300                     sizeof(buffer), 0,
5301                     (struct sockaddr *) &readfrom, &size);
5302 #endif
5303
5304             if (got == -1)
5305                 goto tidy_up_and_fail;
5306             if (got != sizeof(port)
5307                     || size != sizeof(struct sockaddr_in)
5308                     /* Check other socket sent us its port.  */
5309                     || buffer[0] != (unsigned short) addresses[!i].sin_port
5310                     /* Check kernel says we got the datagram from that socket */
5311                     || readfrom.sin_family != addresses[!i].sin_family
5312                     || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
5313                     || readfrom.sin_port != addresses[!i].sin_port)
5314                 goto abort_tidy_up_and_fail;
5315         } while (i--);
5316     }
5317     /* My caller (my_socketpair) has validated that this is non-NULL  */
5318     fd[0] = sockets[0];
5319     fd[1] = sockets[1];
5320     /* I hereby declare this connection open.  May God bless all who cross
5321        her.  */
5322     return 0;
5323
5324   abort_tidy_up_and_fail:
5325     errno = ECONNABORTED;
5326   tidy_up_and_fail:
5327     {
5328         dSAVE_ERRNO;
5329         if (sockets[0] != -1)
5330             PerlLIO_close(sockets[0]);
5331         if (sockets[1] != -1)
5332             PerlLIO_close(sockets[1]);
5333         RESTORE_ERRNO;
5334         return -1;
5335     }
5336 }
5337 #endif /*  EMULATE_SOCKETPAIR_UDP */
5338
5339 #if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
5340 int
5341 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
5342     /* Stevens says that family must be AF_LOCAL, protocol 0.
5343        I'm going to enforce that, then ignore it, and use TCP (or UDP).  */
5344     dTHX;
5345     int listener = -1;
5346     int connector = -1;
5347     int acceptor = -1;
5348     struct sockaddr_in listen_addr;
5349     struct sockaddr_in connect_addr;
5350     Sock_size_t size;
5351
5352     if (protocol
5353 #ifdef AF_UNIX
5354         || family != AF_UNIX
5355 #endif
5356     ) {
5357         errno = EAFNOSUPPORT;
5358         return -1;
5359     }
5360     if (!fd) {
5361         errno = EINVAL;
5362         return -1;
5363     }
5364
5365 #ifdef EMULATE_SOCKETPAIR_UDP
5366     if (type == SOCK_DGRAM)
5367         return S_socketpair_udp(fd);
5368 #endif
5369
5370     listener = PerlSock_socket(AF_INET, type, 0);
5371     if (listener == -1)
5372         return -1;
5373     memset(&listen_addr, 0, sizeof(listen_addr));
5374     listen_addr.sin_family = AF_INET;
5375     listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5376     listen_addr.sin_port = 0;   /* kernel choses port.  */
5377     if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
5378             sizeof(listen_addr)) == -1)
5379         goto tidy_up_and_fail;
5380     if (PerlSock_listen(listener, 1) == -1)
5381         goto tidy_up_and_fail;
5382
5383     connector = PerlSock_socket(AF_INET, type, 0);
5384     if (connector == -1)
5385         goto tidy_up_and_fail;
5386     /* We want to find out the port number to connect to.  */
5387     size = sizeof(connect_addr);
5388     if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
5389             &size) == -1)
5390         goto tidy_up_and_fail;
5391     if (size != sizeof(connect_addr))
5392         goto abort_tidy_up_and_fail;
5393     if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
5394             sizeof(connect_addr)) == -1)
5395         goto tidy_up_and_fail;
5396
5397     size = sizeof(listen_addr);
5398     acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
5399             &size);
5400     if (acceptor == -1)
5401         goto tidy_up_and_fail;
5402     if (size != sizeof(listen_addr))
5403         goto abort_tidy_up_and_fail;
5404     PerlLIO_close(listener);
5405     /* Now check we are talking to ourself by matching port and host on the
5406        two sockets.  */
5407     if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
5408             &size) == -1)
5409         goto tidy_up_and_fail;
5410     if (size != sizeof(connect_addr)
5411             || listen_addr.sin_family != connect_addr.sin_family
5412             || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
5413             || listen_addr.sin_port != connect_addr.sin_port) {
5414         goto abort_tidy_up_and_fail;
5415     }
5416     fd[0] = connector;
5417     fd[1] = acceptor;
5418     return 0;
5419
5420   abort_tidy_up_and_fail:
5421 #ifdef ECONNABORTED
5422   errno = ECONNABORTED; /* This would be the standard thing to do. */
5423 #else
5424 #  ifdef ECONNREFUSED
5425   errno = ECONNREFUSED; /* E.g. Symbian does not have ECONNABORTED. */
5426 #  else
5427   errno = ETIMEDOUT;    /* Desperation time. */
5428 #  endif
5429 #endif
5430   tidy_up_and_fail:
5431     {
5432         dSAVE_ERRNO;
5433         if (listener != -1)
5434             PerlLIO_close(listener);
5435         if (connector != -1)
5436             PerlLIO_close(connector);
5437         if (acceptor != -1)
5438             PerlLIO_close(acceptor);
5439         RESTORE_ERRNO;
5440         return -1;
5441     }
5442 }
5443 #else
5444 /* In any case have a stub so that there's code corresponding
5445  * to the my_socketpair in embed.fnc. */
5446 int
5447 Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
5448 #ifdef HAS_SOCKETPAIR
5449     return socketpair(family, type, protocol, fd);
5450 #else
5451     return -1;
5452 #endif
5453 }
5454 #endif
5455
5456 /*
5457
5458 =for apidoc sv_nosharing
5459
5460 Dummy routine which "shares" an SV when there is no sharing module present.
5461 Or "locks" it. Or "unlocks" it. In other words, ignores its single SV argument.
5462 Exists to avoid test for a NULL function pointer and because it could
5463 potentially warn under some level of strict-ness.
5464
5465 =cut
5466 */
5467
5468 void
5469 Perl_sv_nosharing(pTHX_ SV *sv)
5470 {
5471     PERL_UNUSED_CONTEXT;
5472     PERL_UNUSED_ARG(sv);
5473 }
5474
5475 /*
5476
5477 =for apidoc sv_destroyable
5478
5479 Dummy routine which reports that object can be destroyed when there is no
5480 sharing module present.  It ignores its single SV argument, and returns
5481 'true'.  Exists to avoid test for a NULL function pointer and because it
5482 could potentially warn under some level of strict-ness.
5483
5484 =cut
5485 */
5486
5487 bool
5488 Perl_sv_destroyable(pTHX_ SV *sv)
5489 {
5490     PERL_UNUSED_CONTEXT;
5491     PERL_UNUSED_ARG(sv);
5492     return TRUE;
5493 }
5494
5495 U32
5496 Perl_parse_unicode_opts(pTHX_ const char **popt)
5497 {
5498   const char *p = *popt;
5499   U32 opt = 0;
5500
5501   PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS;
5502
5503   if (*p) {
5504        if (isDIGIT(*p)) {
5505             opt = (U32) atoi(p);
5506             while (isDIGIT(*p))
5507                 p++;
5508             if (*p && *p != '\n' && *p != '\r') {
5509              if(isSPACE(*p)) goto the_end_of_the_opts_parser;
5510              else
5511                  Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
5512             }
5513        }
5514        else {
5515             for (; *p; p++) {
5516                  switch (*p) {
5517                  case PERL_UNICODE_STDIN:
5518                       opt |= PERL_UNICODE_STDIN_FLAG;   break;
5519                  case PERL_UNICODE_STDOUT:
5520                       opt |= PERL_UNICODE_STDOUT_FLAG;  break;
5521                  case PERL_UNICODE_STDERR:
5522                       opt |= PERL_UNICODE_STDERR_FLAG;  break;
5523                  case PERL_UNICODE_STD:
5524                       opt |= PERL_UNICODE_STD_FLAG;     break;
5525                  case PERL_UNICODE_IN:
5526                       opt |= PERL_UNICODE_IN_FLAG;      break;
5527                  case PERL_UNICODE_OUT:
5528                       opt |= PERL_UNICODE_OUT_FLAG;     break;
5529                  case PERL_UNICODE_INOUT:
5530                       opt |= PERL_UNICODE_INOUT_FLAG;   break;
5531                  case PERL_UNICODE_LOCALE:
5532                       opt |= PERL_UNICODE_LOCALE_FLAG;  break;
5533                  case PERL_UNICODE_ARGV:
5534                       opt |= PERL_UNICODE_ARGV_FLAG;    break;
5535                  case PERL_UNICODE_UTF8CACHEASSERT:
5536                       opt |= PERL_UNICODE_UTF8CACHEASSERT_FLAG; break;
5537                  default:
5538                       if (*p != '\n' && *p != '\r') {
5539                         if(isSPACE(*p)) goto the_end_of_the_opts_parser;
5540                         else
5541                           Perl_croak(aTHX_
5542                                      "Unknown Unicode option letter '%c'", *p);
5543                       }
5544                  }
5545             }
5546        }
5547   }
5548   else
5549        opt = PERL_UNICODE_DEFAULT_FLAGS;
5550
5551   the_end_of_the_opts_parser:
5552
5553   if (opt & ~PERL_UNICODE_ALL_FLAGS)
5554        Perl_croak(aTHX_ "Unknown Unicode option value %"UVuf,
5555                   (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
5556
5557   *popt = p;
5558
5559   return opt;
5560 }
5561
5562 #ifdef VMS
5563 #  include <starlet.h>
5564 #endif
5565
5566 U32
5567 Perl_seed(pTHX)
5568 {
5569     dVAR;
5570     /*
5571      * This is really just a quick hack which grabs various garbage
5572      * values.  It really should be a real hash algorithm which
5573      * spreads the effect of every input bit onto every output bit,
5574      * if someone who knows about such things would bother to write it.
5575      * Might be a good idea to add that function to CORE as well.
5576      * No numbers below come from careful analysis or anything here,
5577      * except they are primes and SEED_C1 > 1E6 to get a full-width
5578      * value from (tv_sec * SEED_C1 + tv_usec).  The multipliers should
5579      * probably be bigger too.
5580      */
5581 #if RANDBITS > 16
5582 #  define SEED_C1       1000003
5583 #define   SEED_C4       73819
5584 #else
5585 #  define SEED_C1       25747
5586 #define   SEED_C4       20639
5587 #endif
5588 #define   SEED_C2       3
5589 #define   SEED_C3       269
5590 #define   SEED_C5       26107
5591
5592 #ifndef PERL_NO_DEV_RANDOM
5593     int fd;
5594 #endif
5595     U32 u;
5596 #ifdef VMS
5597     /* when[] = (low 32 bits, high 32 bits) of time since epoch
5598      * in 100-ns units, typically incremented ever 10 ms.        */
5599     unsigned int when[2];
5600 #else
5601 #  ifdef HAS_GETTIMEOFDAY
5602     struct timeval when;
5603 #  else
5604     Time_t when;
5605 #  endif
5606 #endif
5607
5608 /* This test is an escape hatch, this symbol isn't set by Configure. */
5609 #ifndef PERL_NO_DEV_RANDOM
5610 #ifndef PERL_RANDOM_DEVICE
5611    /* /dev/random isn't used by default because reads from it will block
5612     * if there isn't enough entropy available.  You can compile with
5613     * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
5614     * is enough real entropy to fill the seed. */
5615 #  define PERL_RANDOM_DEVICE "/dev/urandom"
5616 #endif
5617     fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
5618     if (fd != -1) {
5619         if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
5620             u = 0;
5621         PerlLIO_close(fd);
5622         if (u)
5623             return u;
5624     }
5625 #endif
5626
5627 #ifdef VMS
5628     _ckvmssts(sys$gettim(when));
5629     u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
5630 #else
5631 #  ifdef HAS_GETTIMEOFDAY
5632     PerlProc_gettimeofday(&when,NULL);
5633     u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
5634 #  else
5635     (void)time(&when);
5636     u = (U32)SEED_C1 * when;
5637 #  endif
5638 #endif
5639     u += SEED_C3 * (U32)PerlProc_getpid();
5640     u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
5641 #ifndef PLAN9           /* XXX Plan9 assembler chokes on this; fix needed  */
5642     u += SEED_C5 * (U32)PTR2UV(&when);
5643 #endif
5644     return u;
5645 }
5646
5647 UV
5648 Perl_get_hash_seed(pTHX)
5649 {
5650     dVAR;
5651      const char *s = PerlEnv_getenv("PERL_HASH_SEED");
5652      UV myseed = 0;
5653
5654      if (s)
5655         while (isSPACE(*s))
5656             s++;
5657      if (s && isDIGIT(*s))
5658           myseed = (UV)Atoul(s);
5659      else
5660 #ifdef USE_HASH_SEED_EXPLICIT
5661      if (s)
5662 #endif
5663      {
5664           /* Compute a random seed */
5665           (void)seedDrand01((Rand_seed_t)seed());
5666           myseed = (UV)(Drand01() * (NV)UV_MAX);
5667 #if RANDBITS < (UVSIZE * 8)
5668           /* Since there are not enough randbits to to reach all
5669            * the bits of a UV, the low bits might need extra
5670            * help.  Sum in another random number that will
5671            * fill in the low bits. */
5672           myseed +=
5673                (UV)(Drand01() * (NV)((((UV)1) << ((UVSIZE * 8 - RANDBITS))) - 1));
5674 #endif /* RANDBITS < (UVSIZE * 8) */
5675           if (myseed == 0) { /* Superparanoia. */
5676               myseed = (UV)(Drand01() * (NV)UV_MAX); /* One more chance. */
5677               if (myseed == 0)
5678                   Perl_croak(aTHX_ "Your random numbers are not that random");
5679           }
5680      }
5681      PL_rehash_seed_set = TRUE;
5682
5683      return myseed;
5684 }
5685
5686 #ifdef PERL_GLOBAL_STRUCT
5687
5688 #define PERL_GLOBAL_STRUCT_INIT
5689 #include "opcode.h" /* the ppaddr and check */
5690
5691 struct perl_vars *
5692 Perl_init_global_struct(pTHX)
5693 {
5694     struct perl_vars *plvarsp = NULL;
5695 # ifdef PERL_GLOBAL_STRUCT
5696     const IV nppaddr = sizeof(Gppaddr)/sizeof(Perl_ppaddr_t);
5697     const IV ncheck  = sizeof(Gcheck) /sizeof(Perl_check_t);
5698 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5699     /* PerlMem_malloc() because can't use even safesysmalloc() this early. */
5700     plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars));
5701     if (!plvarsp)
5702         exit(1);
5703 #  else
5704     plvarsp = PL_VarsPtr;
5705 #  endif /* PERL_GLOBAL_STRUCT_PRIVATE */
5706 #  undef PERLVAR
5707 #  undef PERLVARA
5708 #  undef PERLVARI
5709 #  undef PERLVARIC
5710 #  define PERLVAR(prefix,var,type) /**/
5711 #  define PERLVARA(prefix,var,n,type) /**/
5712 #  define PERLVARI(prefix,var,type,init) plvarsp->prefix##var = init;
5713 #  define PERLVARIC(prefix,var,type,init) plvarsp->prefix##var = init;
5714 #  include "perlvars.h"
5715 #  undef PERLVAR
5716 #  undef PERLVARA
5717 #  undef PERLVARI
5718 #  undef PERLVARIC
5719 #  ifdef PERL_GLOBAL_STRUCT
5720     plvarsp->Gppaddr =
5721         (Perl_ppaddr_t*)
5722         PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t));
5723     if (!plvarsp->Gppaddr)
5724         exit(1);
5725     plvarsp->Gcheck  =
5726         (Perl_check_t*)
5727         PerlMem_malloc(ncheck  * sizeof(Perl_check_t));
5728     if (!plvarsp->Gcheck)
5729         exit(1);
5730     Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t); 
5731     Copy(Gcheck,  plvarsp->Gcheck,  ncheck,  Perl_check_t); 
5732 #  endif
5733 #  ifdef PERL_SET_VARS
5734     PERL_SET_VARS(plvarsp);
5735 #  endif
5736 # undef PERL_GLOBAL_STRUCT_INIT
5737 # endif
5738     return plvarsp;
5739 }
5740
5741 #endif /* PERL_GLOBAL_STRUCT */
5742
5743 #ifdef PERL_GLOBAL_STRUCT
5744
5745 void
5746 Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
5747 {
5748     PERL_ARGS_ASSERT_FREE_GLOBAL_STRUCT;
5749 # ifdef PERL_GLOBAL_STRUCT
5750 #  ifdef PERL_UNSET_VARS
5751     PERL_UNSET_VARS(plvarsp);
5752 #  endif
5753     free(plvarsp->Gppaddr);
5754     free(plvarsp->Gcheck);
5755 #  ifdef PERL_GLOBAL_STRUCT_PRIVATE
5756     free(plvarsp);
5757 #  endif
5758 # endif
5759 }
5760
5761 #endif /* PERL_GLOBAL_STRUCT */
5762
5763 #ifdef PERL_MEM_LOG
5764
5765 /* -DPERL_MEM_LOG: the Perl_mem_log_..() is compiled, including the
5766  * the default implementation, unless -DPERL_MEM_LOG_NOIMPL is also
5767  * given, and you supply your own implementation.
5768  *
5769  * The default implementation reads a single env var, PERL_MEM_LOG,
5770  * expecting one or more of the following:
5771  *
5772  *    \d+ - fd          fd to write to          : must be 1st (atoi)
5773  *    'm' - memlog      was PERL_MEM_LOG=1
5774  *    's' - svlog       was PERL_SV_LOG=1
5775  *    't' - timestamp   was PERL_MEM_LOG_TIMESTAMP=1
5776  *
5777  * This makes the logger controllable enough that it can reasonably be
5778  * added to the system perl.
5779  */
5780
5781 /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer
5782  * the Perl_mem_log_...() will use (either via sprintf or snprintf).
5783  */
5784 #define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128
5785
5786 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...()
5787  * writes to.  In the default logger, this is settable at runtime.
5788  */
5789 #ifndef PERL_MEM_LOG_FD
5790 #  define PERL_MEM_LOG_FD 2 /* If STDERR is too boring for you. */
5791 #endif
5792
5793 #ifndef PERL_MEM_LOG_NOIMPL
5794
5795 # ifdef DEBUG_LEAKING_SCALARS
5796 #   define SV_LOG_SERIAL_FMT        " [%lu]"
5797 #   define _SV_LOG_SERIAL_ARG(sv)   , (unsigned long) (sv)->sv_debug_serial
5798 # else
5799 #   define SV_LOG_SERIAL_FMT
5800 #   define _SV_LOG_SERIAL_ARG(sv)
5801 # endif
5802
5803 static void
5804 S_mem_log_common(enum mem_log_type mlt, const UV n, 
5805                  const UV typesize, const char *type_name, const SV *sv,
5806                  Malloc_t oldalloc, Malloc_t newalloc,
5807                  const char *filename, const int linenumber,
5808                  const char *funcname)
5809 {
5810     const char *pmlenv;
5811
5812     PERL_ARGS_ASSERT_MEM_LOG_COMMON;
5813
5814     pmlenv = PerlEnv_getenv("PERL_MEM_LOG");
5815     if (!pmlenv)
5816         return;
5817     if (mlt < MLT_NEW_SV ? strchr(pmlenv,'m') : strchr(pmlenv,'s'))
5818     {
5819         /* We can't use SVs or PerlIO for obvious reasons,
5820          * so we'll use stdio and low-level IO instead. */
5821         char buf[PERL_MEM_LOG_SPRINTF_BUF_SIZE];
5822
5823 #   ifdef HAS_GETTIMEOFDAY
5824 #     define MEM_LOG_TIME_FMT   "%10d.%06d: "
5825 #     define MEM_LOG_TIME_ARG   (int)tv.tv_sec, (int)tv.tv_usec
5826         struct timeval tv;
5827         gettimeofday(&tv, 0);
5828 #   else
5829 #     define MEM_LOG_TIME_FMT   "%10d: "
5830 #     define MEM_LOG_TIME_ARG   (int)when
5831         Time_t when;
5832         (void)time(&when);
5833 #   endif
5834         /* If there are other OS specific ways of hires time than
5835          * gettimeofday() (see ext/Time-HiRes), the easiest way is
5836          * probably that they would be used to fill in the struct
5837          * timeval. */
5838         {
5839             STRLEN len;
5840             int fd = atoi(pmlenv);
5841             if (!fd)
5842                 fd = PERL_MEM_LOG_FD;
5843
5844             if (strchr(pmlenv, 't')) {
5845                 len = my_snprintf(buf, sizeof(buf),
5846                                 MEM_LOG_TIME_FMT, MEM_LOG_TIME_ARG);
5847                 PerlLIO_write(fd, buf, len);
5848             }
5849             switch (mlt) {
5850             case MLT_ALLOC:
5851                 len = my_snprintf(buf, sizeof(buf),
5852                         "alloc: %s:%d:%s: %"IVdf" %"UVuf
5853                         " %s = %"IVdf": %"UVxf"\n",
5854                         filename, linenumber, funcname, n, typesize,
5855                         type_name, n * typesize, PTR2UV(newalloc));
5856                 break;
5857             case MLT_REALLOC:
5858                 len = my_snprintf(buf, sizeof(buf),
5859                         "realloc: %s:%d:%s: %"IVdf" %"UVuf
5860                         " %s = %"IVdf": %"UVxf" -> %"UVxf"\n",
5861                         filename, linenumber, funcname, n, typesize,
5862                         type_name, n * typesize, PTR2UV(oldalloc),
5863                         PTR2UV(newalloc));
5864                 break;
5865             case MLT_FREE:
5866                 len = my_snprintf(buf, sizeof(buf),
5867                         "free: %s:%d:%s: %"UVxf"\n",
5868                         filename, linenumber, funcname,
5869                         PTR2UV(oldalloc));
5870                 break;
5871             case MLT_NEW_SV:
5872             case MLT_DEL_SV:
5873                 len = my_snprintf(buf, sizeof(buf),
5874                         "%s_SV: %s:%d:%s: %"UVxf SV_LOG_SERIAL_FMT "\n",
5875                         mlt == MLT_NEW_SV ? "new" : "del",
5876                         filename, linenumber, funcname,
5877                         PTR2UV(sv) _SV_LOG_SERIAL_ARG(sv));
5878                 break;
5879             default:
5880                 len = 0;
5881             }
5882             PerlLIO_write(fd, buf, len);
5883         }
5884     }
5885 }
5886 #endif /* !PERL_MEM_LOG_NOIMPL */
5887
5888 #ifndef PERL_MEM_LOG_NOIMPL
5889 # define \
5890     mem_log_common_if(alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm) \
5891     mem_log_common   (alty, num, tysz, tynm, sv, oal, nal, flnm, ln, fnnm)
5892 #else
5893 /* this is suboptimal, but bug compatible.  User is providing their
5894    own implementation, but is getting these functions anyway, and they
5895    do nothing. But _NOIMPL users should be able to cope or fix */
5896 # define \
5897     mem_log_common_if(alty, num, tysz, tynm, u, oal, nal, flnm, ln, fnnm) \
5898     /* mem_log_common_if_PERL_MEM_LOG_NOIMPL */
5899 #endif
5900
5901 Malloc_t
5902 Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name,
5903                    Malloc_t newalloc, 
5904                    const char *filename, const int linenumber,
5905                    const char *funcname)
5906 {
5907     mem_log_common_if(MLT_ALLOC, n, typesize, type_name,
5908                       NULL, NULL, newalloc,
5909                       filename, linenumber, funcname);
5910     return newalloc;
5911 }
5912
5913 Malloc_t
5914 Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name,
5915                      Malloc_t oldalloc, Malloc_t newalloc, 
5916                      const char *filename, const int linenumber, 
5917                      const char *funcname)
5918 {
5919     mem_log_common_if(MLT_REALLOC, n, typesize, type_name,
5920                       NULL, oldalloc, newalloc, 
5921                       filename, linenumber, funcname);
5922     return newalloc;
5923 }
5924
5925 Malloc_t
5926 Perl_mem_log_free(Malloc_t oldalloc, 
5927                   const char *filename, const int linenumber, 
5928                   const char *funcname)
5929 {
5930     mem_log_common_if(MLT_FREE, 0, 0, "", NULL, oldalloc, NULL, 
5931                       filename, linenumber, funcname);
5932     return oldalloc;
5933 }
5934
5935 void
5936 Perl_mem_log_new_sv(const SV *sv, 
5937                     const char *filename, const int linenumber,
5938                     const char *funcname)
5939 {
5940     mem_log_common_if(MLT_NEW_SV, 0, 0, "", sv, NULL, NULL,
5941                       filename, linenumber, funcname);
5942 }
5943
5944 void
5945 Perl_mem_log_del_sv(const SV *sv,
5946                     const char *filename, const int linenumber, 
5947                     const char *funcname)
5948 {
5949     mem_log_common_if(MLT_DEL_SV, 0, 0, "", sv, NULL, NULL, 
5950                       filename, linenumber, funcname);
5951 }
5952
5953 #endif /* PERL_MEM_LOG */
5954
5955 /*
5956 =for apidoc my_sprintf
5957
5958 The C library C<sprintf>, wrapped if necessary, to ensure that it will return
5959 the length of the string written to the buffer. Only rare pre-ANSI systems
5960 need the wrapper function - usually this is a direct call to C<sprintf>.
5961
5962 =cut
5963 */
5964 #ifndef SPRINTF_RETURNS_STRLEN
5965 int
5966 Perl_my_sprintf(char *buffer, const char* pat, ...)
5967 {
5968     va_list args;
5969     PERL_ARGS_ASSERT_MY_SPRINTF;
5970     va_start(args, pat);
5971     vsprintf(buffer, pat, args);
5972     va_end(args);
5973     return strlen(buffer);
5974 }
5975 #endif
5976
5977 /*
5978 =for apidoc my_snprintf
5979
5980 The C library C<snprintf> functionality, if available and
5981 standards-compliant (uses C<vsnprintf>, actually).  However, if the
5982 C<vsnprintf> is not available, will unfortunately use the unsafe
5983 C<vsprintf> which can overrun the buffer (there is an overrun check,
5984 but that may be too late).  Consider using C<sv_vcatpvf> instead, or
5985 getting C<vsnprintf>.
5986
5987 =cut
5988 */
5989 int
5990 Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
5991 {
5992     int retval;
5993     va_list ap;
5994     PERL_ARGS_ASSERT_MY_SNPRINTF;
5995     va_start(ap, format);
5996 #ifdef HAS_VSNPRINTF
5997     retval = vsnprintf(buffer, len, format, ap);
5998 #else
5999     retval = vsprintf(buffer, format, ap);
6000 #endif
6001     va_end(ap);
6002     /* vsprintf() shows failure with < 0 */
6003     if (retval < 0
6004 #ifdef HAS_VSNPRINTF
6005     /* vsnprintf() shows failure with >= len */
6006         ||
6007         (len > 0 && (Size_t)retval >= len) 
6008 #endif
6009     )
6010         Perl_croak_nocontext("panic: my_snprintf buffer overflow");
6011     return retval;
6012 }
6013
6014 /*
6015 =for apidoc my_vsnprintf
6016
6017 The C library C<vsnprintf> if available and standards-compliant.
6018 However, if if the C<vsnprintf> is not available, will unfortunately
6019 use the unsafe C<vsprintf> which can overrun the buffer (there is an
6020 overrun check, but that may be too late).  Consider using
6021 C<sv_vcatpvf> instead, or getting C<vsnprintf>.
6022
6023 =cut
6024 */
6025 int
6026 Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
6027 {
6028     int retval;
6029 #ifdef NEED_VA_COPY
6030     va_list apc;
6031
6032     PERL_ARGS_ASSERT_MY_VSNPRINTF;
6033
6034     Perl_va_copy(ap, apc);
6035 # ifdef HAS_VSNPRINTF
6036     retval = vsnprintf(buffer, len, format, apc);
6037 # else
6038     retval = vsprintf(buffer, format, apc);
6039 # endif
6040 #else
6041 # ifdef HAS_VSNPRINTF
6042     retval = vsnprintf(buffer, len, format, ap);
6043 # else
6044     retval = vsprintf(buffer, format, ap);
6045 # endif
6046 #endif /* #ifdef NEED_VA_COPY */
6047     /* vsprintf() shows failure with < 0 */
6048     if (retval < 0
6049 #ifdef HAS_VSNPRINTF
6050     /* vsnprintf() shows failure with >= len */
6051         ||
6052         (len > 0 && (Size_t)retval >= len) 
6053 #endif
6054     )
6055         Perl_croak_nocontext("panic: my_vsnprintf buffer overflow");
6056     return retval;
6057 }
6058
6059 void
6060 Perl_my_clearenv(pTHX)
6061 {
6062     dVAR;
6063 #if ! defined(PERL_MICRO)
6064 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
6065     PerlEnv_clearenv();
6066 #  else /* ! (PERL_IMPLICIT_SYS || WIN32) */
6067 #    if defined(USE_ENVIRON_ARRAY)
6068 #      if defined(USE_ITHREADS)
6069     /* only the parent thread can clobber the process environment */
6070     if (PL_curinterp == aTHX)
6071 #      endif /* USE_ITHREADS */
6072     {
6073 #      if ! defined(PERL_USE_SAFE_PUTENV)
6074     if ( !PL_use_safe_putenv) {
6075       I32 i;
6076       if (environ == PL_origenviron)
6077         environ = (char**)safesysmalloc(sizeof(char*));
6078       else
6079         for (i = 0; environ[i]; i++)
6080           (void)safesysfree(environ[i]);
6081     }
6082     environ[0] = NULL;
6083 #      else /* PERL_USE_SAFE_PUTENV */
6084 #        if defined(HAS_CLEARENV)
6085     (void)clearenv();
6086 #        elif defined(HAS_UNSETENV)
6087     int bsiz = 80; /* Most envvar names will be shorter than this. */
6088     int bufsiz = bsiz * sizeof(char); /* sizeof(char) paranoid? */
6089     char *buf = (char*)safesysmalloc(bufsiz);
6090     while (*environ != NULL) {
6091       char *e = strchr(*environ, '=');
6092       int l = e ? e - *environ : (int)strlen(*environ);
6093       if (bsiz < l + 1) {
6094         (void)safesysfree(buf);
6095         bsiz = l + 1; /* + 1 for the \0. */
6096         buf = (char*)safesysmalloc(bufsiz);
6097       } 
6098       memcpy(buf, *environ, l);
6099       buf[l] = '\0';
6100       (void)unsetenv(buf);
6101     }
6102     (void)safesysfree(buf);
6103 #        else /* ! HAS_CLEARENV && ! HAS_UNSETENV */
6104     /* Just null environ and accept the leakage. */
6105     *environ = NULL;
6106 #        endif /* HAS_CLEARENV || HAS_UNSETENV */
6107 #      endif /* ! PERL_USE_SAFE_PUTENV */
6108     }
6109 #    endif /* USE_ENVIRON_ARRAY */
6110 #  endif /* PERL_IMPLICIT_SYS || WIN32 */
6111 #endif /* PERL_MICRO */
6112 }
6113
6114 #ifdef PERL_IMPLICIT_CONTEXT
6115
6116 /* Implements the MY_CXT_INIT macro. The first time a module is loaded,
6117 the global PL_my_cxt_index is incremented, and that value is assigned to
6118 that module's static my_cxt_index (who's address is passed as an arg).
6119 Then, for each interpreter this function is called for, it makes sure a
6120 void* slot is available to hang the static data off, by allocating or
6121 extending the interpreter's PL_my_cxt_list array */
6122
6123 #ifndef PERL_GLOBAL_STRUCT_PRIVATE
6124 void *
6125 Perl_my_cxt_init(pTHX_ int *index, size_t size)
6126 {
6127     dVAR;
6128     void *p;
6129     PERL_ARGS_ASSERT_MY_CXT_INIT;
6130     if (*index == -1) {
6131         /* this module hasn't been allocated an index yet */
6132 #if defined(USE_ITHREADS)
6133         MUTEX_LOCK(&PL_my_ctx_mutex);
6134 #endif
6135         *index = PL_my_cxt_index++;
6136 #if defined(USE_ITHREADS)
6137         MUTEX_UNLOCK(&PL_my_ctx_mutex);
6138 #endif
6139     }
6140     
6141     /* make sure the array is big enough */
6142     if (PL_my_cxt_size <= *index) {
6143         if (PL_my_cxt_size) {
6144             while (PL_my_cxt_size <= *index)
6145                 PL_my_cxt_size *= 2;
6146             Renew(PL_my_cxt_list, PL_my_cxt_size, void *);
6147         }
6148         else {
6149             PL_my_cxt_size = 16;
6150             Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
6151         }
6152     }
6153     /* newSV() allocates one more than needed */
6154     p = (void*)SvPVX(newSV(size-1));
6155     PL_my_cxt_list[*index] = p;
6156     Zero(p, size, char);
6157     return p;
6158 }
6159
6160 #else /* #ifndef PERL_GLOBAL_STRUCT_PRIVATE */
6161
6162 int
6163 Perl_my_cxt_index(pTHX_ const char *my_cxt_key)
6164 {
6165     dVAR;
6166     int index;
6167
6168     PERL_ARGS_ASSERT_MY_CXT_INDEX;
6169
6170     for (index = 0; index < PL_my_cxt_index; index++) {
6171         const char *key = PL_my_cxt_keys[index];
6172         /* try direct pointer compare first - there are chances to success,
6173          * and it's much faster.
6174          */
6175         if ((key == my_cxt_key) || strEQ(key, my_cxt_key))
6176             return index;
6177     }
6178     return -1;
6179 }
6180
6181 void *
6182 Perl_my_cxt_init(pTHX_ const char *my_cxt_key, size_t size)
6183 {
6184     dVAR;
6185     void *p;
6186     int index;
6187
6188     PERL_ARGS_ASSERT_MY_CXT_INIT;
6189
6190     index = Perl_my_cxt_index(aTHX_ my_cxt_key);
6191     if (index == -1) {
6192         /* this module hasn't been allocated an index yet */
6193 #if defined(USE_ITHREADS)
6194         MUTEX_LOCK(&PL_my_ctx_mutex);
6195 #endif
6196         index = PL_my_cxt_index++;
6197 #if defined(USE_ITHREADS)
6198         MUTEX_UNLOCK(&PL_my_ctx_mutex);
6199 #endif
6200     }
6201
6202     /* make sure the array is big enough */
6203     if (PL_my_cxt_size <= index) {
6204         int old_size = PL_my_cxt_size;
6205         int i;
6206         if (PL_my_cxt_size) {
6207             while (PL_my_cxt_size <= index)
6208                 PL_my_cxt_size *= 2;
6209             Renew(PL_my_cxt_list, PL_my_cxt_size, void *);
6210             Renew(PL_my_cxt_keys, PL_my_cxt_size, const char *);
6211         }
6212         else {
6213             PL_my_cxt_size = 16;
6214             Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
6215             Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
6216         }
6217         for (i = old_size; i < PL_my_cxt_size; i++) {
6218             PL_my_cxt_keys[i] = 0;
6219             PL_my_cxt_list[i] = 0;
6220         }
6221     }
6222     PL_my_cxt_keys[index] = my_cxt_key;
6223     /* newSV() allocates one more than needed */
6224     p = (void*)SvPVX(newSV(size-1));
6225     PL_my_cxt_list[index] = p;
6226     Zero(p, size, char);
6227     return p;
6228 }
6229 #endif /* #ifndef PERL_GLOBAL_STRUCT_PRIVATE */
6230 #endif /* PERL_IMPLICIT_CONTEXT */
6231
6232 void
6233 Perl_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p,
6234                           STRLEN xs_len)
6235 {
6236     SV *sv;
6237     const char *vn = NULL;
6238     SV *const module = PL_stack_base[ax];
6239
6240     PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK;
6241
6242     if (items >= 2)      /* version supplied as bootstrap arg */
6243         sv = PL_stack_base[ax + 1];
6244     else {
6245         /* XXX GV_ADDWARN */
6246         vn = "XS_VERSION";
6247         sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", module, vn), 0);
6248         if (!sv || !SvOK(sv)) {
6249             vn = "VERSION";
6250             sv = get_sv(Perl_form(aTHX_ "%"SVf"::%s", module, vn), 0);
6251         }
6252     }
6253     if (sv) {
6254         SV *xssv = Perl_newSVpvn_flags(aTHX_ xs_p, xs_len, SVs_TEMP);
6255         SV *pmsv = sv_isobject(sv) && sv_derived_from(sv, "version")
6256             ? sv : sv_2mortal(new_version(sv));
6257         xssv = upg_version(xssv, 0);
6258         if ( vcmp(pmsv,xssv) ) {
6259             SV *string = vstringify(xssv);
6260             SV *xpt = Perl_newSVpvf(aTHX_ "%"SVf" object version %"SVf
6261                                     " does not match ", module, string);
6262
6263             SvREFCNT_dec(string);
6264             string = vstringify(pmsv);
6265
6266             if (vn) {
6267                 Perl_sv_catpvf(aTHX_ xpt, "$%"SVf"::%s %"SVf, module, vn,
6268                                string);
6269             } else {
6270                 Perl_sv_catpvf(aTHX_ xpt, "bootstrap parameter %"SVf, string);
6271             }
6272             SvREFCNT_dec(string);
6273
6274             Perl_sv_2mortal(aTHX_ xpt);
6275             Perl_croak_sv(aTHX_ xpt);
6276         }
6277     }
6278 }
6279
6280 void
6281 Perl_xs_apiversion_bootcheck(pTHX_ SV *module, const char *api_p,
6282                              STRLEN api_len)
6283 {
6284     SV *xpt = NULL;
6285     SV *compver = Perl_newSVpvn_flags(aTHX_ api_p, api_len, SVs_TEMP);
6286     SV *runver;
6287
6288     PERL_ARGS_ASSERT_XS_APIVERSION_BOOTCHECK;
6289
6290     /* This might croak  */
6291     compver = upg_version(compver, 0);
6292     /* This should never croak */
6293     runver = new_version(PL_apiversion);
6294     if (vcmp(compver, runver)) {
6295         SV *compver_string = vstringify(compver);
6296         SV *runver_string = vstringify(runver);
6297         xpt = Perl_newSVpvf(aTHX_ "Perl API version %"SVf
6298                             " of %"SVf" does not match %"SVf,
6299                             compver_string, module, runver_string);
6300         Perl_sv_2mortal(aTHX_ xpt);
6301
6302         SvREFCNT_dec(compver_string);
6303         SvREFCNT_dec(runver_string);
6304     }
6305     SvREFCNT_dec(runver);
6306     if (xpt)
6307         Perl_croak_sv(aTHX_ xpt);
6308 }
6309
6310 #ifndef HAS_STRLCAT
6311 Size_t
6312 Perl_my_strlcat(char *dst, const char *src, Size_t size)
6313 {
6314     Size_t used, length, copy;
6315
6316     used = strlen(dst);
6317     length = strlen(src);
6318     if (size > 0 && used < size - 1) {
6319         copy = (length >= size - used) ? size - used - 1 : length;
6320         memcpy(dst + used, src, copy);
6321         dst[used + copy] = '\0';
6322     }
6323     return used + length;
6324 }
6325 #endif
6326
6327 #ifndef HAS_STRLCPY
6328 Size_t
6329 Perl_my_strlcpy(char *dst, const char *src, Size_t size)
6330 {
6331     Size_t length, copy;
6332
6333     length = strlen(src);
6334     if (size > 0) {
6335         copy = (length >= size) ? size - 1 : length;
6336         memcpy(dst, src, copy);
6337         dst[copy] = '\0';
6338     }
6339     return length;
6340 }
6341 #endif
6342
6343 #if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_MSC_VER < 1400) && (WINVER < 0x0500)
6344 /* VC7 or 7.1, building with pre-VC7 runtime libraries. */
6345 long _ftol( double ); /* Defined by VC6 C libs. */
6346 long _ftol2( double dblSource ) { return _ftol( dblSource ); }
6347 #endif
6348
6349 PERL_STATIC_INLINE bool
6350 S_gv_has_usable_name(pTHX_ GV *gv)
6351 {
6352     GV **gvp;
6353     return GvSTASH(gv)
6354         && HvENAME(GvSTASH(gv))
6355         && (gvp = (GV **)hv_fetch(
6356                         GvSTASH(gv), GvNAME(gv),
6357                         GvNAMEUTF8(gv) ? -GvNAMELEN(gv) : GvNAMELEN(gv), 0
6358            ))
6359         && *gvp == gv;
6360 }
6361
6362 void
6363 Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
6364 {
6365     dVAR;
6366     SV * const dbsv = GvSVn(PL_DBsub);
6367     const bool save_taint = TAINT_get; /* Accepted unused var warning under NO_TAINT_SUPPORT */
6368
6369     /* When we are called from pp_goto (svp is null),
6370      * we do not care about using dbsv to call CV;
6371      * it's for informational purposes only.
6372      */
6373
6374     PERL_ARGS_ASSERT_GET_DB_SUB;
6375
6376     TAINT_set(FALSE);
6377     save_item(dbsv);
6378     if (!PERLDB_SUB_NN) {
6379         GV *gv = CvGV(cv);
6380
6381         if (!svp) {
6382             gv_efullname3(dbsv, gv, NULL);
6383         }
6384         else if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
6385              || strEQ(GvNAME(gv), "END")
6386              || ( /* Could be imported, and old sub redefined. */
6387                  (GvCV(gv) != cv || !S_gv_has_usable_name(aTHX_ gv))
6388                  &&
6389                  !( (SvTYPE(*svp) == SVt_PVGV)
6390                     && (GvCV((const GV *)*svp) == cv)
6391                     /* Use GV from the stack as a fallback. */
6392                     && S_gv_has_usable_name(aTHX_ gv = (GV *)*svp) 
6393                   )
6394                 )
6395         ) {
6396             /* GV is potentially non-unique, or contain different CV. */
6397             SV * const tmp = newRV(MUTABLE_SV(cv));
6398             sv_setsv(dbsv, tmp);
6399             SvREFCNT_dec(tmp);
6400         }
6401         else {
6402             sv_sethek(dbsv, HvENAME_HEK(GvSTASH(gv)));
6403             sv_catpvs(dbsv, "::");
6404             sv_catpvn_flags(
6405               dbsv, GvNAME(gv), GvNAMELEN(gv),
6406               GvNAMEUTF8(gv) ? SV_CATUTF8 : SV_CATBYTES
6407             );
6408         }
6409     }
6410     else {
6411         const int type = SvTYPE(dbsv);
6412         if (type < SVt_PVIV && type != SVt_IV)
6413             sv_upgrade(dbsv, SVt_PVIV);
6414         (void)SvIOK_on(dbsv);
6415         SvIV_set(dbsv, PTR2IV(cv));     /* Do it the quickest way  */
6416     }
6417     TAINT_IF(save_taint);
6418 }
6419
6420 int
6421 Perl_my_dirfd(pTHX_ DIR * dir) {
6422
6423     /* Most dirfd implementations have problems when passed NULL. */
6424     if(!dir)
6425         return -1;
6426 #ifdef HAS_DIRFD
6427     return dirfd(dir);
6428 #elif defined(HAS_DIR_DD_FD)
6429     return dir->dd_fd;
6430 #else
6431     Perl_die(aTHX_ PL_no_func, "dirfd");
6432     assert(0); /* NOT REACHED */
6433     return 0;
6434 #endif 
6435 }
6436
6437 REGEXP *
6438 Perl_get_re_arg(pTHX_ SV *sv) {
6439
6440     if (sv) {
6441         if (SvMAGICAL(sv))
6442             mg_get(sv);
6443         if (SvROK(sv))
6444             sv = MUTABLE_SV(SvRV(sv));
6445         if (SvTYPE(sv) == SVt_REGEXP)
6446             return (REGEXP*) sv;
6447     }
6448  
6449     return NULL;
6450 }
6451
6452 /*
6453  * Local variables:
6454  * c-indentation-style: bsd
6455  * c-basic-offset: 4
6456  * indent-tabs-mode: nil
6457  * End:
6458  *
6459  * ex: set ts=8 sts=4 sw=4 et:
6460  */