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