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
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.
12 * 'Very useful, no doubt, that was to Saruman; yet it seems that he was
13 * not content.' --Gandalf to Pippin
15 * [p.598 of _The Lord of the Rings_, III/xi: "The PalantÃr"]
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.
25 #define PERL_IN_UTIL_C
29 #include "perliol.h" /* For PerlIOUnix_refcnt */
35 # define SIG_ERR ((Sighandler_t) -1)
40 /* Missing protos on LynxOS */
45 # include <sys/wait.h>
50 # include <sys/select.h>
56 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
57 # define FD_CLOEXEC 1 /* NeXT needs this */
60 /* NOTE: Do not call the next three routines directly. Use the macros
61 * in handy.h, so that we can easily redefine everything to do tracking of
62 * allocated hunks back to the original New to track down any memory leaks.
63 * XXX This advice seems to be widely ignored :-( --AD August 1996.
70 /* Can't use PerlIO to write as it allocates memory */
71 PerlLIO_write(PerlIO_fileno(Perl_error_log),
72 PL_no_mem, strlen(PL_no_mem));
74 NORETURN_FUNCTION_END;
77 #if defined (DEBUGGING) || defined(PERL_IMPLICIT_SYS) || defined (PERL_TRACK_MEMPOOL)
78 # define ALWAYS_NEED_THX
81 /* paranoid version of system's malloc() */
84 Perl_safesysmalloc(MEM_SIZE size)
86 #ifdef ALWAYS_NEED_THX
92 PerlIO_printf(Perl_error_log,
93 "Allocation too large: %lx\n", size) FLUSH;
96 #endif /* HAS_64K_LIMIT */
97 #ifdef PERL_TRACK_MEMPOOL
102 Perl_croak_nocontext("panic: malloc");
104 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
105 PERL_ALLOC_CHECK(ptr);
107 #ifdef PERL_TRACK_MEMPOOL
108 struct perl_memory_debug_header *const header
109 = (struct perl_memory_debug_header *)ptr;
113 PoisonNew(((char *)ptr), size, char);
116 #ifdef PERL_TRACK_MEMPOOL
117 header->interpreter = aTHX;
118 /* Link us into the list. */
119 header->prev = &PL_memory_debug_header;
120 header->next = PL_memory_debug_header.next;
121 PL_memory_debug_header.next = header;
122 header->next->prev = header;
126 ptr = (Malloc_t)((char*)ptr+sTHX);
128 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
132 #ifndef ALWAYS_NEED_THX
138 return write_no_mem();
144 /* paranoid version of system's realloc() */
147 Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
149 #ifdef ALWAYS_NEED_THX
153 #if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
154 Malloc_t PerlMem_realloc();
155 #endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
159 PerlIO_printf(Perl_error_log,
160 "Reallocation too large: %lx\n", size) FLUSH;
163 #endif /* HAS_64K_LIMIT */
170 return safesysmalloc(size);
171 #ifdef PERL_TRACK_MEMPOOL
172 where = (Malloc_t)((char*)where-sTHX);
175 struct perl_memory_debug_header *const header
176 = (struct perl_memory_debug_header *)where;
178 if (header->interpreter != aTHX) {
179 Perl_croak_nocontext("panic: realloc from wrong pool");
181 assert(header->next->prev == header);
182 assert(header->prev->next == header);
184 if (header->size > size) {
185 const MEM_SIZE freed_up = header->size - size;
186 char *start_of_freed = ((char *)where) + size;
187 PoisonFree(start_of_freed, freed_up, char);
195 Perl_croak_nocontext("panic: realloc");
197 ptr = (Malloc_t)PerlMem_realloc(where,size);
198 PERL_ALLOC_CHECK(ptr);
200 /* MUST do this fixup first, before doing ANYTHING else, as anything else
201 might allocate memory/free/move memory, and until we do the fixup, it
202 may well be chasing (and writing to) free memory. */
203 #ifdef PERL_TRACK_MEMPOOL
205 struct perl_memory_debug_header *const header
206 = (struct perl_memory_debug_header *)ptr;
209 if (header->size < size) {
210 const MEM_SIZE fresh = size - header->size;
211 char *start_of_fresh = ((char *)ptr) + size;
212 PoisonNew(start_of_fresh, fresh, char);
216 header->next->prev = header;
217 header->prev->next = header;
219 ptr = (Malloc_t)((char*)ptr+sTHX);
223 /* In particular, must do that fixup above before logging anything via
224 *printf(), as it can reallocate memory, which can cause SEGVs. */
226 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
227 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
234 #ifndef ALWAYS_NEED_THX
240 return write_no_mem();
246 /* safe version of system's free() */
249 Perl_safesysfree(Malloc_t where)
251 #ifdef ALWAYS_NEED_THX
256 DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
258 #ifdef PERL_TRACK_MEMPOOL
259 where = (Malloc_t)((char*)where-sTHX);
261 struct perl_memory_debug_header *const header
262 = (struct perl_memory_debug_header *)where;
264 if (header->interpreter != aTHX) {
265 Perl_croak_nocontext("panic: free from wrong pool");
268 Perl_croak_nocontext("panic: duplicate free");
270 if (!(header->next) || header->next->prev != header
271 || header->prev->next != header) {
272 Perl_croak_nocontext("panic: bad free");
274 /* Unlink us from the chain. */
275 header->next->prev = header->prev;
276 header->prev->next = header->next;
278 PoisonNew(where, header->size, char);
280 /* Trigger the duplicate free warning. */
288 /* safe version of system's calloc() */
291 Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
293 #ifdef ALWAYS_NEED_THX
297 #if defined(PERL_TRACK_MEMPOOL) || defined(HAS_64K_LIMIT) || defined(DEBUGGING)
298 MEM_SIZE total_size = 0;
301 /* Even though calloc() for zero bytes is strange, be robust. */
302 if (size && (count <= MEM_SIZE_MAX / size)) {
303 #if defined(PERL_TRACK_MEMPOOL) || defined(HAS_64K_LIMIT) || defined(DEBUGGING)
304 total_size = size * count;
308 Perl_croak_nocontext("%s", PL_memory_wrap);
309 #ifdef PERL_TRACK_MEMPOOL
310 if (sTHX <= MEM_SIZE_MAX - (MEM_SIZE)total_size)
313 Perl_croak_nocontext("%s", PL_memory_wrap);
316 if (total_size > 0xffff) {
317 PerlIO_printf(Perl_error_log,
318 "Allocation too large: %lx\n", total_size) FLUSH;
321 #endif /* HAS_64K_LIMIT */
323 if ((long)size < 0 || (long)count < 0)
324 Perl_croak_nocontext("panic: calloc");
326 #ifdef PERL_TRACK_MEMPOOL
327 /* Have to use malloc() because we've added some space for our tracking
329 /* malloc(0) is non-portable. */
330 ptr = (Malloc_t)PerlMem_malloc(total_size ? total_size : 1);
332 /* Use calloc() because it might save a memset() if the memory is fresh
333 and clean from the OS. */
335 ptr = (Malloc_t)PerlMem_calloc(count, size);
336 else /* calloc(0) is non-portable. */
337 ptr = (Malloc_t)PerlMem_calloc(count ? count : 1, size ? size : 1);
339 PERL_ALLOC_CHECK(ptr);
340 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)total_size));
342 #ifdef PERL_TRACK_MEMPOOL
344 struct perl_memory_debug_header *const header
345 = (struct perl_memory_debug_header *)ptr;
347 memset((void*)ptr, 0, total_size);
348 header->interpreter = aTHX;
349 /* Link us into the list. */
350 header->prev = &PL_memory_debug_header;
351 header->next = PL_memory_debug_header.next;
352 PL_memory_debug_header.next = header;
353 header->next->prev = header;
355 header->size = total_size;
357 ptr = (Malloc_t)((char*)ptr+sTHX);
363 #ifndef ALWAYS_NEED_THX
368 return write_no_mem();
372 /* These must be defined when not using Perl's malloc for binary
377 Malloc_t Perl_malloc (MEM_SIZE nbytes)
380 return (Malloc_t)PerlMem_malloc(nbytes);
383 Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
386 return (Malloc_t)PerlMem_calloc(elements, size);
389 Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
392 return (Malloc_t)PerlMem_realloc(where, nbytes);
395 Free_t Perl_mfree (Malloc_t where)
403 /* copy a string up to some (non-backslashed) delimiter, if any */
406 Perl_delimcpy(register char *to, register const char *toend, register const char *from, register const char *fromend, register int delim, I32 *retlen)
410 PERL_ARGS_ASSERT_DELIMCPY;
412 for (tolen = 0; from < fromend; from++, tolen++) {
414 if (from[1] != delim) {
421 else if (*from == delim)
432 /* return ptr to little string in big string, NULL if not found */
433 /* This routine was donated by Corey Satten. */
436 Perl_instr(register const char *big, register const char *little)
440 PERL_ARGS_ASSERT_INSTR;
448 register const char *s, *x;
451 for (x=big,s=little; *s; /**/ ) {
462 return (char*)(big-1);
467 /* same as instr but allow embedded nulls */
470 Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend)
472 PERL_ARGS_ASSERT_NINSTR;
476 const char first = *little;
478 bigend -= lend - little++;
480 while (big <= bigend) {
481 if (*big++ == first) {
482 for (x=big,s=little; s < lend; x++,s++) {
486 return (char*)(big-1);
493 /* reverse of the above--find last substring */
496 Perl_rninstr(register const char *big, const char *bigend, const char *little, const char *lend)
498 register const char *bigbeg;
499 register const I32 first = *little;
500 register const char * const littleend = lend;
502 PERL_ARGS_ASSERT_RNINSTR;
504 if (little >= littleend)
505 return (char*)bigend;
507 big = bigend - (littleend - little++);
508 while (big >= bigbeg) {
509 register const char *s, *x;
512 for (x=big+2,s=little; s < littleend; /**/ ) {
521 return (char*)(big+1);
526 /* As a space optimization, we do not compile tables for strings of length
527 0 and 1, and for strings of length 2 unless FBMcf_TAIL. These are
528 special-cased in fbm_instr().
530 If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
533 =head1 Miscellaneous Functions
535 =for apidoc fbm_compile
537 Analyses the string in order to make fast searches on it using fbm_instr()
538 -- the Boyer-Moore algorithm.
544 Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
547 register const U8 *s;
554 PERL_ARGS_ASSERT_FBM_COMPILE;
556 /* Refuse to fbm_compile a studied scalar, as this gives more flexibility in
557 SV flag usage. No real-world code would ever end up using a studied
558 scalar as a compile-time second argument to index, so this isn't a real
566 if (flags & FBMcf_TAIL) {
567 MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
568 sv_catpvs(sv, "\n"); /* Taken into account in fbm_instr() */
569 if (mg && mg->mg_len >= 0)
572 s = (U8*)SvPV_force_mutable(sv, len);
573 if (len == 0) /* TAIL might be on a zero-length string. */
575 SvUPGRADE(sv, SVt_PVMG);
580 /* "deep magic", the comment used to add. The use of MAGIC itself isn't
581 really. MAGIC was originally added in 79072805bf63abe5 (perl 5.0 alpha 2)
582 to call SvVALID_off() if the scalar was assigned to.
584 The comment itself (and "deeper magic" below) date back to
585 378cc40b38293ffc (perl 2.0). "deep magic" was an annotation on
587 where the magic (presumably) was that the scalar had a BM table hidden
590 As MAGIC is always present on BMs [in Perl 5 :-)], we can use it to store
591 the table instead of the previous (somewhat hacky) approach of co-opting
592 the string buffer and storing it after the string. */
594 assert(!mg_find(sv, PERL_MAGIC_bm));
595 mg = sv_magicext(sv, NULL, PERL_MAGIC_bm, &PL_vtbl_bm, NULL, 0);
599 /* Shorter strings are special-cased in Perl_fbm_instr(), and don't use
601 const U8 mlen = (len>255) ? 255 : (U8)len;
602 const unsigned char *const sb = s + len - mlen; /* first char (maybe) */
605 Newx(table, 256, U8);
606 memset((void*)table, mlen, 256);
607 mg->mg_ptr = (char *)table;
610 s += len - 1; /* last char */
613 if (table[*s] == mlen)
619 s = (const unsigned char*)(SvPVX_const(sv)); /* deeper magic */
620 for (i = 0; i < len; i++) {
621 if (PL_freq[s[i]] < frequency) {
623 frequency = PL_freq[s[i]];
626 BmRARE(sv) = s[rarest];
627 BmPREVIOUS(sv) = rarest;
628 BmUSEFUL(sv) = 100; /* Initial value */
629 if (flags & FBMcf_TAIL)
631 DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %"UVuf"\n",
632 BmRARE(sv), BmPREVIOUS(sv)));
635 /* If SvTAIL(littlestr), it has a fake '\n' at end. */
636 /* If SvTAIL is actually due to \Z or \z, this gives false positives
640 =for apidoc fbm_instr
642 Returns the location of the SV in the string delimited by C<str> and
643 C<strend>. It returns C<NULL> if the string can't be found. The C<sv>
644 does not have to be fbm_compiled, but the search will not be as fast
651 Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
653 register unsigned char *s;
655 register const unsigned char *little
656 = (const unsigned char *)SvPV_const(littlestr,l);
657 register STRLEN littlelen = l;
658 register const I32 multiline = flags & FBMrf_MULTILINE;
660 PERL_ARGS_ASSERT_FBM_INSTR;
662 if ((STRLEN)(bigend - big) < littlelen) {
663 if ( SvTAIL(littlestr)
664 && ((STRLEN)(bigend - big) == littlelen - 1)
666 || (*big == *little &&
667 memEQ((char *)big, (char *)little, littlelen - 1))))
672 switch (littlelen) { /* Special cases for 0, 1 and 2 */
674 return (char*)big; /* Cannot be SvTAIL! */
676 if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
677 /* Know that bigend != big. */
678 if (bigend[-1] == '\n')
679 return (char *)(bigend - 1);
680 return (char *) bigend;
688 if (SvTAIL(littlestr))
689 return (char *) bigend;
692 if (SvTAIL(littlestr) && !multiline) {
693 if (bigend[-1] == '\n' && bigend[-2] == *little)
694 return (char*)bigend - 2;
695 if (bigend[-1] == *little)
696 return (char*)bigend - 1;
700 /* This should be better than FBM if c1 == c2, and almost
701 as good otherwise: maybe better since we do less indirection.
702 And we save a lot of memory by caching no table. */
703 const unsigned char c1 = little[0];
704 const unsigned char c2 = little[1];
709 while (s <= bigend) {
719 goto check_1char_anchor;
730 goto check_1char_anchor;
733 while (s <= bigend) {
738 goto check_1char_anchor;
747 check_1char_anchor: /* One char and anchor! */
748 if (SvTAIL(littlestr) && (*bigend == *little))
749 return (char *)bigend; /* bigend is already decremented. */
752 break; /* Only lengths 0 1 and 2 have special-case code. */
755 if (SvTAIL(littlestr) && !multiline) { /* tail anchored? */
756 s = bigend - littlelen;
757 if (s >= big && bigend[-1] == '\n' && *s == *little
758 /* Automatically of length > 2 */
759 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
761 return (char*)s; /* how sweet it is */
764 && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
766 return (char*)s + 1; /* how sweet it is */
770 if (!SvVALID(littlestr)) {
771 char * const b = ninstr((char*)big,(char*)bigend,
772 (char*)little, (char*)little + littlelen);
774 if (!b && SvTAIL(littlestr)) { /* Automatically multiline! */
775 /* Chop \n from littlestr: */
776 s = bigend - littlelen + 1;
778 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
788 if (littlelen > (STRLEN)(bigend - big))
792 const MAGIC *const mg = mg_find(littlestr, PERL_MAGIC_bm);
793 const unsigned char * const table = (const unsigned char *) mg->mg_ptr;
794 register const unsigned char *oldlittle;
796 --littlelen; /* Last char found by table lookup */
799 little += littlelen; /* last char */
805 if ((tmp = table[*s])) {
806 if ((s += tmp) < bigend)
810 else { /* less expensive than calling strncmp() */
811 register unsigned char * const olds = s;
816 if (*--s == *--little)
818 s = olds + 1; /* here we pay the price for failure */
820 if (s < bigend) /* fake up continue to outer loop */
830 && memEQ((char *)(bigend - littlelen),
831 (char *)(oldlittle - littlelen), littlelen) )
832 return (char*)bigend - littlelen;
837 /* start_shift, end_shift are positive quantities which give offsets
838 of ends of some substring of bigstr.
839 If "last" we want the last occurrence.
840 old_posp is the way of communication between consequent calls if
841 the next call needs to find the .
842 The initial *old_posp should be -1.
844 Note that we take into account SvTAIL, so one can get extra
845 optimizations if _ALL flag is set.
848 /* If SvTAIL is actually due to \Z or \z, this gives false positives
849 if PL_multiline. In fact if !PL_multiline the authoritative answer
850 is not supported yet. */
853 Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
856 register const unsigned char *big;
858 register I32 previous;
860 register const unsigned char *little;
861 register I32 stop_pos;
862 register const unsigned char *littleend;
869 PERL_ARGS_ASSERT_SCREAMINSTR;
871 assert(SvMAGICAL(bigstr));
872 mg = mg_find(bigstr, PERL_MAGIC_study);
874 assert(SvTYPE(littlestr) == SVt_PVMG);
875 assert(SvVALID(littlestr));
877 screamfirst = (U32 *)mg->mg_ptr;
878 screamnext = screamfirst + 256;
880 pos = *old_posp == -1
881 ? screamfirst[BmRARE(littlestr)] : screamnext[*old_posp];
884 if ( BmRARE(littlestr) == '\n'
885 && BmPREVIOUS(littlestr) == SvCUR(littlestr) - 1) {
886 little = (const unsigned char *)(SvPVX_const(littlestr));
887 littleend = little + SvCUR(littlestr);
894 little = (const unsigned char *)(SvPVX_const(littlestr));
895 littleend = little + SvCUR(littlestr);
897 /* The value of pos we can start at: */
898 previous = BmPREVIOUS(littlestr);
899 big = (const unsigned char *)(SvPVX_const(bigstr));
900 /* The value of pos we can stop at: */
901 stop_pos = SvCUR(bigstr) - end_shift - (SvCUR(littlestr) - 1 - previous);
902 if (previous + start_shift > stop_pos) {
904 stop_pos does not include SvTAIL in the count, so this check is incorrect
905 (I think) - see [ID 20010618.006] and t/op/study.t. HVDS 2001/06/19
908 if (previous + start_shift == stop_pos + 1) /* A fake '\n'? */
913 while ((I32)pos < previous + start_shift) {
914 pos = screamnext[pos];
920 if ((I32)pos >= stop_pos) break;
921 if (big[pos] == first) {
922 const unsigned char *s = little;
923 const unsigned char *x = big + pos + 1;
924 while (s < littleend) {
929 if (s == littleend) {
930 *old_posp = (I32)pos;
931 if (!last) return (char *)(big+pos);
935 pos = screamnext[pos];
936 } while (pos != nope);
938 return (char *)(big+(*old_posp));
940 if (!SvTAIL(littlestr) || (end_shift > 0))
942 /* Ignore the trailing "\n". This code is not microoptimized */
943 big = (const unsigned char *)(SvPVX_const(bigstr) + SvCUR(bigstr));
944 stop_pos = littleend - little; /* Actual littlestr len */
949 && ((stop_pos == 1) ||
950 memEQ((char *)(big + 1), (char *)little, stop_pos - 1)))
958 Returns true if the leading len bytes of the strings s1 and s2 are the same
959 case-insensitively; false otherwise. Uppercase and lowercase ASCII range bytes
960 match themselves and their opposite case counterparts. Non-cased and non-ASCII
961 range bytes match only themselves.
968 Perl_foldEQ(const char *s1, const char *s2, register I32 len)
970 register const U8 *a = (const U8 *)s1;
971 register const U8 *b = (const U8 *)s2;
973 PERL_ARGS_ASSERT_FOLDEQ;
976 if (*a != *b && *a != PL_fold[*b])
983 Perl_foldEQ_latin1(const char *s1, const char *s2, register I32 len)
985 /* Compare non-utf8 using Unicode (Latin1) semantics. Does not work on
986 * MICRO_SIGN, LATIN_SMALL_LETTER_SHARP_S, nor
987 * LATIN_SMALL_LETTER_Y_WITH_DIAERESIS, and does not check for these. Nor
988 * does it check that the strings each have at least 'len' characters */
990 register const U8 *a = (const U8 *)s1;
991 register const U8 *b = (const U8 *)s2;
993 PERL_ARGS_ASSERT_FOLDEQ_LATIN1;
996 if (*a != *b && *a != PL_fold_latin1[*b]) {
1005 =for apidoc foldEQ_locale
1007 Returns true if the leading len bytes of the strings s1 and s2 are the same
1008 case-insensitively in the current locale; false otherwise.
1014 Perl_foldEQ_locale(const char *s1, const char *s2, register I32 len)
1017 register const U8 *a = (const U8 *)s1;
1018 register const U8 *b = (const U8 *)s2;
1020 PERL_ARGS_ASSERT_FOLDEQ_LOCALE;
1023 if (*a != *b && *a != PL_fold_locale[*b])
1030 /* copy a string to a safe spot */
1033 =head1 Memory Management
1037 Perl's version of C<strdup()>. Returns a pointer to a newly allocated
1038 string which is a duplicate of C<pv>. The size of the string is
1039 determined by C<strlen()>. The memory allocated for the new string can
1040 be freed with the C<Safefree()> function.
1046 Perl_savepv(pTHX_ const char *pv)
1048 PERL_UNUSED_CONTEXT;
1053 const STRLEN pvlen = strlen(pv)+1;
1054 Newx(newaddr, pvlen, char);
1055 return (char*)memcpy(newaddr, pv, pvlen);
1059 /* same thing but with a known length */
1064 Perl's version of what C<strndup()> would be if it existed. Returns a
1065 pointer to a newly allocated string which is a duplicate of the first
1066 C<len> bytes from C<pv>, plus a trailing NUL byte. The memory allocated for
1067 the new string can be freed with the C<Safefree()> function.
1073 Perl_savepvn(pTHX_ const char *pv, register I32 len)
1075 register char *newaddr;
1076 PERL_UNUSED_CONTEXT;
1078 Newx(newaddr,len+1,char);
1079 /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
1081 /* might not be null terminated */
1082 newaddr[len] = '\0';
1083 return (char *) CopyD(pv,newaddr,len,char);
1086 return (char *) ZeroD(newaddr,len+1,char);
1091 =for apidoc savesharedpv
1093 A version of C<savepv()> which allocates the duplicate string in memory
1094 which is shared between threads.
1099 Perl_savesharedpv(pTHX_ const char *pv)
1101 register char *newaddr;
1106 pvlen = strlen(pv)+1;
1107 newaddr = (char*)PerlMemShared_malloc(pvlen);
1109 return write_no_mem();
1111 return (char*)memcpy(newaddr, pv, pvlen);
1115 =for apidoc savesharedpvn
1117 A version of C<savepvn()> which allocates the duplicate string in memory
1118 which is shared between threads. (With the specific difference that a NULL
1119 pointer is not acceptable)
1124 Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
1126 char *const newaddr = (char*)PerlMemShared_malloc(len + 1);
1128 PERL_ARGS_ASSERT_SAVESHAREDPVN;
1131 return write_no_mem();
1133 newaddr[len] = '\0';
1134 return (char*)memcpy(newaddr, pv, len);
1138 =for apidoc savesvpv
1140 A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
1141 the passed in SV using C<SvPV()>
1147 Perl_savesvpv(pTHX_ SV *sv)
1150 const char * const pv = SvPV_const(sv, len);
1151 register char *newaddr;
1153 PERL_ARGS_ASSERT_SAVESVPV;
1156 Newx(newaddr,len,char);
1157 return (char *) CopyD(pv,newaddr,len,char);
1161 =for apidoc savesharedsvpv
1163 A version of C<savesharedpv()> which allocates the duplicate string in
1164 memory which is shared between threads.
1170 Perl_savesharedsvpv(pTHX_ SV *sv)
1173 const char * const pv = SvPV_const(sv, len);
1175 PERL_ARGS_ASSERT_SAVESHAREDSVPV;
1177 return savesharedpvn(pv, len);
1180 /* the SV for Perl_form() and mess() is not kept in an arena */
1189 if (PL_phase != PERL_PHASE_DESTRUCT)
1190 return newSVpvs_flags("", SVs_TEMP);
1195 /* Create as PVMG now, to avoid any upgrading later */
1197 Newxz(any, 1, XPVMG);
1198 SvFLAGS(sv) = SVt_PVMG;
1199 SvANY(sv) = (void*)any;
1201 SvREFCNT(sv) = 1 << 30; /* practically infinite */
1206 #if defined(PERL_IMPLICIT_CONTEXT)
1208 Perl_form_nocontext(const char* pat, ...)
1213 PERL_ARGS_ASSERT_FORM_NOCONTEXT;
1214 va_start(args, pat);
1215 retval = vform(pat, &args);
1219 #endif /* PERL_IMPLICIT_CONTEXT */
1222 =head1 Miscellaneous Functions
1225 Takes a sprintf-style format pattern and conventional
1226 (non-SV) arguments and returns the formatted string.
1228 (char *) Perl_form(pTHX_ const char* pat, ...)
1230 can be used any place a string (char *) is required:
1232 char * s = Perl_form("%d.%d",major,minor);
1234 Uses a single private buffer so if you want to format several strings you
1235 must explicitly copy the earlier strings away (and free the copies when you
1242 Perl_form(pTHX_ const char* pat, ...)
1246 PERL_ARGS_ASSERT_FORM;
1247 va_start(args, pat);
1248 retval = vform(pat, &args);
1254 Perl_vform(pTHX_ const char *pat, va_list *args)
1256 SV * const sv = mess_alloc();
1257 PERL_ARGS_ASSERT_VFORM;
1258 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1263 =for apidoc Am|SV *|mess|const char *pat|...
1265 Take a sprintf-style format pattern and argument list. These are used to
1266 generate a string message. If the message does not end with a newline,
1267 then it will be extended with some indication of the current location
1268 in the code, as described for L</mess_sv>.
1270 Normally, the resulting message is returned in a new mortal SV.
1271 During global destruction a single SV may be shared between uses of
1277 #if defined(PERL_IMPLICIT_CONTEXT)
1279 Perl_mess_nocontext(const char *pat, ...)
1284 PERL_ARGS_ASSERT_MESS_NOCONTEXT;
1285 va_start(args, pat);
1286 retval = vmess(pat, &args);
1290 #endif /* PERL_IMPLICIT_CONTEXT */
1293 Perl_mess(pTHX_ const char *pat, ...)
1297 PERL_ARGS_ASSERT_MESS;
1298 va_start(args, pat);
1299 retval = vmess(pat, &args);
1305 S_closest_cop(pTHX_ const COP *cop, const OP *o)
1308 /* Look for PL_op starting from o. cop is the last COP we've seen. */
1310 PERL_ARGS_ASSERT_CLOSEST_COP;
1312 if (!o || o == PL_op)
1315 if (o->op_flags & OPf_KIDS) {
1317 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
1320 /* If the OP_NEXTSTATE has been optimised away we can still use it
1321 * the get the file and line number. */
1323 if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
1324 cop = (const COP *)kid;
1326 /* Keep searching, and return when we've found something. */
1328 new_cop = closest_cop(cop, kid);
1334 /* Nothing found. */
1340 =for apidoc Am|SV *|mess_sv|SV *basemsg|bool consume
1342 Expands a message, intended for the user, to include an indication of
1343 the current location in the code, if the message does not already appear
1346 C<basemsg> is the initial message or object. If it is a reference, it
1347 will be used as-is and will be the result of this function. Otherwise it
1348 is used as a string, and if it already ends with a newline, it is taken
1349 to be complete, and the result of this function will be the same string.
1350 If the message does not end with a newline, then a segment such as C<at
1351 foo.pl line 37> will be appended, and possibly other clauses indicating
1352 the current state of execution. The resulting message will end with a
1355 Normally, the resulting message is returned in a new mortal SV.
1356 During global destruction a single SV may be shared between uses of this
1357 function. If C<consume> is true, then the function is permitted (but not
1358 required) to modify and return C<basemsg> instead of allocating a new SV.
1364 Perl_mess_sv(pTHX_ SV *basemsg, bool consume)
1369 PERL_ARGS_ASSERT_MESS_SV;
1371 if (SvROK(basemsg)) {
1377 sv_setsv(sv, basemsg);
1382 if (SvPOK(basemsg) && consume) {
1387 sv_copypv(sv, basemsg);
1390 if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
1392 * Try and find the file and line for PL_op. This will usually be
1393 * PL_curcop, but it might be a cop that has been optimised away. We
1394 * can try to find such a cop by searching through the optree starting
1395 * from the sibling of PL_curcop.
1398 const COP *cop = closest_cop(PL_curcop, PL_curcop->op_sibling);
1403 Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
1404 OutCopFILE(cop), (IV)CopLINE(cop));
1405 /* Seems that GvIO() can be untrustworthy during global destruction. */
1406 if (GvIO(PL_last_in_gv) && (SvTYPE(GvIOp(PL_last_in_gv)) == SVt_PVIO)
1407 && IoLINES(GvIOp(PL_last_in_gv)))
1409 const bool line_mode = (RsSIMPLE(PL_rs) &&
1410 SvCUR(PL_rs) == 1 && *SvPVX_const(PL_rs) == '\n');
1411 Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf,
1412 PL_last_in_gv == PL_argvgv ? "" : GvNAME(PL_last_in_gv),
1413 line_mode ? "line" : "chunk",
1414 (IV)IoLINES(GvIOp(PL_last_in_gv)));
1416 if (PL_phase == PERL_PHASE_DESTRUCT)
1417 sv_catpvs(sv, " during global destruction");
1418 sv_catpvs(sv, ".\n");
1424 =for apidoc Am|SV *|vmess|const char *pat|va_list *args
1426 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1427 argument list. These are used to generate a string message. If the
1428 message does not end with a newline, then it will be extended with
1429 some indication of the current location in the code, as described for
1432 Normally, the resulting message is returned in a new mortal SV.
1433 During global destruction a single SV may be shared between uses of
1440 Perl_vmess(pTHX_ const char *pat, va_list *args)
1443 SV * const sv = mess_alloc();
1445 PERL_ARGS_ASSERT_VMESS;
1447 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
1448 return mess_sv(sv, 1);
1452 Perl_write_to_stderr(pTHX_ SV* msv)
1458 PERL_ARGS_ASSERT_WRITE_TO_STDERR;
1460 if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1461 && (io = GvIO(PL_stderrgv))
1462 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
1463 Perl_magic_methcall(aTHX_ MUTABLE_SV(io), mg, "PRINT",
1464 G_SCALAR | G_DISCARD | G_WRITING_TO_STDERR, 1, msv);
1467 /* SFIO can really mess with your errno */
1470 PerlIO * const serr = Perl_error_log;
1472 do_print(msv, serr);
1473 (void)PerlIO_flush(serr);
1481 =head1 Warning and Dieing
1484 /* Common code used in dieing and warning */
1487 S_with_queued_errors(pTHX_ SV *ex)
1489 PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS;
1490 if (PL_errors && SvCUR(PL_errors) && !SvROK(ex)) {
1491 sv_catsv(PL_errors, ex);
1492 ex = sv_mortalcopy(PL_errors);
1493 SvCUR_set(PL_errors, 0);
1499 S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
1505 SV **const hook = warn ? &PL_warnhook : &PL_diehook;
1506 /* sv_2cv might call Perl_croak() or Perl_warner() */
1507 SV * const oldhook = *hook;
1515 cv = sv_2cv(oldhook, &stash, &gv, 0);
1517 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1527 exarg = newSVsv(ex);
1528 SvREADONLY_on(exarg);
1531 PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
1535 call_sv(MUTABLE_SV(cv), G_DISCARD);
1544 =for apidoc Am|OP *|die_sv|SV *baseex
1546 Behaves the same as L</croak_sv>, except for the return type.
1547 It should be used only where the C<OP *> return type is required.
1548 The function never actually returns.
1554 Perl_die_sv(pTHX_ SV *baseex)
1556 PERL_ARGS_ASSERT_DIE_SV;
1563 =for apidoc Am|OP *|die|const char *pat|...
1565 Behaves the same as L</croak>, except for the return type.
1566 It should be used only where the C<OP *> return type is required.
1567 The function never actually returns.
1572 #if defined(PERL_IMPLICIT_CONTEXT)
1574 Perl_die_nocontext(const char* pat, ...)
1578 va_start(args, pat);
1584 #endif /* PERL_IMPLICIT_CONTEXT */
1587 Perl_die(pTHX_ const char* pat, ...)
1590 va_start(args, pat);
1598 =for apidoc Am|void|croak_sv|SV *baseex
1600 This is an XS interface to Perl's C<die> function.
1602 C<baseex> is the error message or object. If it is a reference, it
1603 will be used as-is. Otherwise it is used as a string, and if it does
1604 not end with a newline then it will be extended with some indication of
1605 the current location in the code, as described for L</mess_sv>.
1607 The error message or object will be used as an exception, by default
1608 returning control to the nearest enclosing C<eval>, but subject to
1609 modification by a C<$SIG{__DIE__}> handler. In any case, the C<croak_sv>
1610 function never returns normally.
1612 To die with a simple string message, the L</croak> function may be
1619 Perl_croak_sv(pTHX_ SV *baseex)
1621 SV *ex = with_queued_errors(mess_sv(baseex, 0));
1622 PERL_ARGS_ASSERT_CROAK_SV;
1623 invoke_exception_hook(ex, FALSE);
1628 =for apidoc Am|void|vcroak|const char *pat|va_list *args
1630 This is an XS interface to Perl's C<die> function.
1632 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1633 argument list. These are used to generate a string message. If the
1634 message does not end with a newline, then it will be extended with
1635 some indication of the current location in the code, as described for
1638 The error message will be used as an exception, by default
1639 returning control to the nearest enclosing C<eval>, but subject to
1640 modification by a C<$SIG{__DIE__}> handler. In any case, the C<croak>
1641 function never returns normally.
1643 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1644 (C<$@>) will be used as an error message or object instead of building an
1645 error message from arguments. If you want to throw a non-string object,
1646 or build an error message in an SV yourself, it is preferable to use
1647 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1653 Perl_vcroak(pTHX_ const char* pat, va_list *args)
1655 SV *ex = with_queued_errors(pat ? vmess(pat, args) : mess_sv(ERRSV, 0));
1656 invoke_exception_hook(ex, FALSE);
1661 =for apidoc Am|void|croak|const char *pat|...
1663 This is an XS interface to Perl's C<die> function.
1665 Take a sprintf-style format pattern and argument list. These are used to
1666 generate a string message. If the message does not end with a newline,
1667 then it will be extended with some indication of the current location
1668 in the code, as described for L</mess_sv>.
1670 The error message will be used as an exception, by default
1671 returning control to the nearest enclosing C<eval>, but subject to
1672 modification by a C<$SIG{__DIE__}> handler. In any case, the C<croak>
1673 function never returns normally.
1675 For historical reasons, if C<pat> is null then the contents of C<ERRSV>
1676 (C<$@>) will be used as an error message or object instead of building an
1677 error message from arguments. If you want to throw a non-string object,
1678 or build an error message in an SV yourself, it is preferable to use
1679 the L</croak_sv> function, which does not involve clobbering C<ERRSV>.
1684 #if defined(PERL_IMPLICIT_CONTEXT)
1686 Perl_croak_nocontext(const char *pat, ...)
1690 va_start(args, pat);
1695 #endif /* PERL_IMPLICIT_CONTEXT */
1698 Perl_croak(pTHX_ const char *pat, ...)
1701 va_start(args, pat);
1708 =for apidoc Am|void|croak_no_modify
1710 Exactly equivalent to C<Perl_croak(aTHX_ "%s", PL_no_modify)>, but generates
1711 terser object code than using C<Perl_croak>. Less code used on exception code
1712 paths reduces CPU cache pressure.
1718 Perl_croak_no_modify(pTHX)
1720 Perl_croak(aTHX_ "%s", PL_no_modify);
1724 =for apidoc Am|void|warn_sv|SV *baseex
1726 This is an XS interface to Perl's C<warn> function.
1728 C<baseex> is the error message or object. If it is a reference, it
1729 will be used as-is. Otherwise it is used as a string, and if it does
1730 not end with a newline then it will be extended with some indication of
1731 the current location in the code, as described for L</mess_sv>.
1733 The error message or object will by default be written to standard error,
1734 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1736 To warn with a simple string message, the L</warn> function may be
1743 Perl_warn_sv(pTHX_ SV *baseex)
1745 SV *ex = mess_sv(baseex, 0);
1746 PERL_ARGS_ASSERT_WARN_SV;
1747 if (!invoke_exception_hook(ex, TRUE))
1748 write_to_stderr(ex);
1752 =for apidoc Am|void|vwarn|const char *pat|va_list *args
1754 This is an XS interface to Perl's C<warn> function.
1756 C<pat> and C<args> are a sprintf-style format pattern and encapsulated
1757 argument list. These are used to generate a string message. If the
1758 message does not end with a newline, then it will be extended with
1759 some indication of the current location in the code, as described for
1762 The error message or object will by default be written to standard error,
1763 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1765 Unlike with L</vcroak>, C<pat> is not permitted to be null.
1771 Perl_vwarn(pTHX_ const char* pat, va_list *args)
1773 SV *ex = vmess(pat, args);
1774 PERL_ARGS_ASSERT_VWARN;
1775 if (!invoke_exception_hook(ex, TRUE))
1776 write_to_stderr(ex);
1780 =for apidoc Am|void|warn|const char *pat|...
1782 This is an XS interface to Perl's C<warn> function.
1784 Take a sprintf-style format pattern and argument list. These are used to
1785 generate a string message. If the message does not end with a newline,
1786 then it will be extended with some indication of the current location
1787 in the code, as described for L</mess_sv>.
1789 The error message or object will by default be written to standard error,
1790 but this is subject to modification by a C<$SIG{__WARN__}> handler.
1792 Unlike with L</croak>, C<pat> is not permitted to be null.
1797 #if defined(PERL_IMPLICIT_CONTEXT)
1799 Perl_warn_nocontext(const char *pat, ...)
1803 PERL_ARGS_ASSERT_WARN_NOCONTEXT;
1804 va_start(args, pat);
1808 #endif /* PERL_IMPLICIT_CONTEXT */
1811 Perl_warn(pTHX_ const char *pat, ...)
1814 PERL_ARGS_ASSERT_WARN;
1815 va_start(args, pat);
1820 #if defined(PERL_IMPLICIT_CONTEXT)
1822 Perl_warner_nocontext(U32 err, const char *pat, ...)
1826 PERL_ARGS_ASSERT_WARNER_NOCONTEXT;
1827 va_start(args, pat);
1828 vwarner(err, pat, &args);
1831 #endif /* PERL_IMPLICIT_CONTEXT */
1834 Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
1836 PERL_ARGS_ASSERT_CK_WARNER_D;
1838 if (Perl_ckwarn_d(aTHX_ err)) {
1840 va_start(args, pat);
1841 vwarner(err, pat, &args);
1847 Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
1849 PERL_ARGS_ASSERT_CK_WARNER;
1851 if (Perl_ckwarn(aTHX_ err)) {
1853 va_start(args, pat);
1854 vwarner(err, pat, &args);
1860 Perl_warner(pTHX_ U32 err, const char* pat,...)
1863 PERL_ARGS_ASSERT_WARNER;
1864 va_start(args, pat);
1865 vwarner(err, pat, &args);
1870 Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
1873 PERL_ARGS_ASSERT_VWARNER;
1874 if (PL_warnhook == PERL_WARNHOOK_FATAL || ckDEAD(err)) {
1875 SV * const msv = vmess(pat, args);
1877 invoke_exception_hook(msv, FALSE);
1881 Perl_vwarn(aTHX_ pat, args);
1885 /* implements the ckWARN? macros */
1888 Perl_ckwarn(pTHX_ U32 w)
1891 /* If lexical warnings have not been set, use $^W. */
1893 return PL_dowarn & G_WARN_ON;
1895 return ckwarn_common(w);
1898 /* implements the ckWARN?_d macro */
1901 Perl_ckwarn_d(pTHX_ U32 w)
1904 /* If lexical warnings have not been set then default classes warn. */
1908 return ckwarn_common(w);
1912 S_ckwarn_common(pTHX_ U32 w)
1914 if (PL_curcop->cop_warnings == pWARN_ALL)
1917 if (PL_curcop->cop_warnings == pWARN_NONE)
1920 /* Check the assumption that at least the first slot is non-zero. */
1921 assert(unpackWARN1(w));
1923 /* Check the assumption that it is valid to stop as soon as a zero slot is
1925 if (!unpackWARN2(w)) {
1926 assert(!unpackWARN3(w));
1927 assert(!unpackWARN4(w));
1928 } else if (!unpackWARN3(w)) {
1929 assert(!unpackWARN4(w));
1932 /* Right, dealt with all the special cases, which are implemented as non-
1933 pointers, so there is a pointer to a real warnings mask. */
1935 if (isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w)))
1937 } while (w >>= WARNshift);
1942 /* Set buffer=NULL to get a new one. */
1944 Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits,
1946 const MEM_SIZE len_wanted = sizeof(STRLEN) + size;
1947 PERL_UNUSED_CONTEXT;
1948 PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD;
1951 (specialWARN(buffer) ?
1952 PerlMemShared_malloc(len_wanted) :
1953 PerlMemShared_realloc(buffer, len_wanted));
1955 Copy(bits, (buffer + 1), size, char);
1959 /* since we've already done strlen() for both nam and val
1960 * we can use that info to make things faster than
1961 * sprintf(s, "%s=%s", nam, val)
1963 #define my_setenv_format(s, nam, nlen, val, vlen) \
1964 Copy(nam, s, nlen, char); \
1966 Copy(val, s+(nlen+1), vlen, char); \
1967 *(s+(nlen+1+vlen)) = '\0'
1969 #ifdef USE_ENVIRON_ARRAY
1970 /* VMS' my_setenv() is in vms.c */
1971 #if !defined(WIN32) && !defined(NETWARE)
1973 Perl_my_setenv(pTHX_ const char *nam, const char *val)
1977 /* only parent thread can modify process environment */
1978 if (PL_curinterp == aTHX)
1981 #ifndef PERL_USE_SAFE_PUTENV
1982 if (!PL_use_safe_putenv) {
1983 /* most putenv()s leak, so we manipulate environ directly */
1985 register const I32 len = strlen(nam);
1988 /* where does it go? */
1989 for (i = 0; environ[i]; i++) {
1990 if (strnEQ(environ[i],nam,len) && environ[i][len] == '=')
1994 if (environ == PL_origenviron) { /* need we copy environment? */
2000 while (environ[max])
2002 tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
2003 for (j=0; j<max; j++) { /* copy environment */
2004 const int len = strlen(environ[j]);
2005 tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
2006 Copy(environ[j], tmpenv[j], len+1, char);
2009 environ = tmpenv; /* tell exec where it is now */
2012 safesysfree(environ[i]);
2013 while (environ[i]) {
2014 environ[i] = environ[i+1];
2019 if (!environ[i]) { /* does not exist yet */
2020 environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
2021 environ[i+1] = NULL; /* make sure it's null terminated */
2024 safesysfree(environ[i]);
2028 environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
2029 /* all that work just for this */
2030 my_setenv_format(environ[i], nam, nlen, val, vlen);
2033 # if defined(__CYGWIN__) || defined(EPOC) || defined(__SYMBIAN32__) || defined(__riscos__)
2034 # if defined(HAS_UNSETENV)
2036 (void)unsetenv(nam);
2038 (void)setenv(nam, val, 1);
2040 # else /* ! HAS_UNSETENV */
2041 (void)setenv(nam, val, 1);
2042 # endif /* HAS_UNSETENV */
2044 # if defined(HAS_UNSETENV)
2046 (void)unsetenv(nam);
2048 const int nlen = strlen(nam);
2049 const int vlen = strlen(val);
2050 char * const new_env =
2051 (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
2052 my_setenv_format(new_env, nam, nlen, val, vlen);
2053 (void)putenv(new_env);
2055 # else /* ! HAS_UNSETENV */
2057 const int nlen = strlen(nam);
2063 new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
2064 /* all that work just for this */
2065 my_setenv_format(new_env, nam, nlen, val, vlen);
2066 (void)putenv(new_env);
2067 # endif /* HAS_UNSETENV */
2068 # endif /* __CYGWIN__ */
2069 #ifndef PERL_USE_SAFE_PUTENV
2075 #else /* WIN32 || NETWARE */
2078 Perl_my_setenv(pTHX_ const char *nam, const char *val)
2081 register char *envstr;
2082 const int nlen = strlen(nam);
2089 Newx(envstr, nlen+vlen+2, char);
2090 my_setenv_format(envstr, nam, nlen, val, vlen);
2091 (void)PerlEnv_putenv(envstr);
2095 #endif /* WIN32 || NETWARE */
2097 #endif /* !VMS && !EPOC*/
2099 #ifdef UNLINK_ALL_VERSIONS
2101 Perl_unlnk(pTHX_ const char *f) /* unlink all versions of a file */
2105 PERL_ARGS_ASSERT_UNLNK;
2107 while (PerlLIO_unlink(f) >= 0)
2109 return retries ? 0 : -1;
2113 /* this is a drop-in replacement for bcopy() */
2114 #if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
2116 Perl_my_bcopy(register const char *from,register char *to,register I32 len)
2118 char * const retval = to;
2120 PERL_ARGS_ASSERT_MY_BCOPY;
2122 if (from - to >= 0) {
2130 *(--to) = *(--from);
2136 /* this is a drop-in replacement for memset() */
2139 Perl_my_memset(register char *loc, register I32 ch, register I32 len)
2141 char * const retval = loc;
2143 PERL_ARGS_ASSERT_MY_MEMSET;
2151 /* this is a drop-in replacement for bzero() */
2152 #if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
2154 Perl_my_bzero(register char *loc, register I32 len)
2156 char * const retval = loc;
2158 PERL_ARGS_ASSERT_MY_BZERO;
2166 /* this is a drop-in replacement for memcmp() */
2167 #if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
2169 Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
2171 register const U8 *a = (const U8 *)s1;
2172 register const U8 *b = (const U8 *)s2;
2175 PERL_ARGS_ASSERT_MY_MEMCMP;
2178 if ((tmp = *a++ - *b++))
2183 #endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
2186 /* This vsprintf replacement should generally never get used, since
2187 vsprintf was available in both System V and BSD 2.11. (There may
2188 be some cross-compilation or embedded set-ups where it is needed,
2191 If you encounter a problem in this function, it's probably a symptom
2192 that Configure failed to detect your system's vprintf() function.
2193 See the section on "item vsprintf" in the INSTALL file.
2195 This version may compile on systems with BSD-ish <stdio.h>,
2196 but probably won't on others.
2199 #ifdef USE_CHAR_VSPRINTF
2204 vsprintf(char *dest, const char *pat, void *args)
2208 #if defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
2209 FILE_ptr(&fakebuf) = (STDCHAR *) dest;
2210 FILE_cnt(&fakebuf) = 32767;
2212 /* These probably won't compile -- If you really need
2213 this, you'll have to figure out some other method. */
2214 fakebuf._ptr = dest;
2215 fakebuf._cnt = 32767;
2220 fakebuf._flag = _IOWRT|_IOSTRG;
2221 _doprnt(pat, args, &fakebuf); /* what a kludge */
2222 #if defined(STDIO_PTR_LVALUE)
2223 *(FILE_ptr(&fakebuf)++) = '\0';
2225 /* PerlIO has probably #defined away fputc, but we want it here. */
2227 # undef fputc /* XXX Should really restore it later */
2229 (void)fputc('\0', &fakebuf);
2231 #ifdef USE_CHAR_VSPRINTF
2234 return 0; /* perl doesn't use return value */
2238 #endif /* HAS_VPRINTF */
2241 #if BYTEORDER != 0x4321
2243 Perl_my_swap(pTHX_ short s)
2245 #if (BYTEORDER & 1) == 0
2248 result = ((s & 255) << 8) + ((s >> 8) & 255);
2256 Perl_my_htonl(pTHX_ long l)
2260 char c[sizeof(long)];
2263 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
2264 #if BYTEORDER == 0x12345678
2267 u.c[0] = (l >> 24) & 255;
2268 u.c[1] = (l >> 16) & 255;
2269 u.c[2] = (l >> 8) & 255;
2273 #if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
2274 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
2279 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
2280 u.c[o & 0xf] = (l >> s) & 255;
2288 Perl_my_ntohl(pTHX_ long l)
2292 char c[sizeof(long)];
2295 #if BYTEORDER == 0x1234
2296 u.c[0] = (l >> 24) & 255;
2297 u.c[1] = (l >> 16) & 255;
2298 u.c[2] = (l >> 8) & 255;
2302 #if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
2303 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
2310 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
2311 l |= (u.c[o & 0xf] & 255) << s;
2318 #endif /* BYTEORDER != 0x4321 */
2322 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
2323 * If these functions are defined,
2324 * the BYTEORDER is neither 0x1234 nor 0x4321.
2325 * However, this is not assumed.
2329 #define HTOLE(name,type) \
2331 name (register type n) \
2335 char c[sizeof(type)]; \
2338 register U32 s = 0; \
2339 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
2340 u.c[i] = (n >> s) & 0xFF; \
2345 #define LETOH(name,type) \
2347 name (register type n) \
2351 char c[sizeof(type)]; \
2354 register U32 s = 0; \
2357 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
2358 n |= ((type)(u.c[i] & 0xFF)) << s; \
2364 * Big-endian byte order functions.
2367 #define HTOBE(name,type) \
2369 name (register type n) \
2373 char c[sizeof(type)]; \
2376 register U32 s = 8*(sizeof(u.c)-1); \
2377 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
2378 u.c[i] = (n >> s) & 0xFF; \
2383 #define BETOH(name,type) \
2385 name (register type n) \
2389 char c[sizeof(type)]; \
2392 register U32 s = 8*(sizeof(u.c)-1); \
2395 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
2396 n |= ((type)(u.c[i] & 0xFF)) << s; \
2402 * If we just can't do it...
2405 #define NOT_AVAIL(name,type) \
2407 name (register type n) \
2409 Perl_croak_nocontext(#name "() not available"); \
2410 return n; /* not reached */ \
2414 #if defined(HAS_HTOVS) && !defined(htovs)
2417 #if defined(HAS_HTOVL) && !defined(htovl)
2420 #if defined(HAS_VTOHS) && !defined(vtohs)
2423 #if defined(HAS_VTOHL) && !defined(vtohl)
2427 #ifdef PERL_NEED_MY_HTOLE16
2429 HTOLE(Perl_my_htole16,U16)
2431 NOT_AVAIL(Perl_my_htole16,U16)
2434 #ifdef PERL_NEED_MY_LETOH16
2436 LETOH(Perl_my_letoh16,U16)
2438 NOT_AVAIL(Perl_my_letoh16,U16)
2441 #ifdef PERL_NEED_MY_HTOBE16
2443 HTOBE(Perl_my_htobe16,U16)
2445 NOT_AVAIL(Perl_my_htobe16,U16)
2448 #ifdef PERL_NEED_MY_BETOH16
2450 BETOH(Perl_my_betoh16,U16)
2452 NOT_AVAIL(Perl_my_betoh16,U16)
2456 #ifdef PERL_NEED_MY_HTOLE32
2458 HTOLE(Perl_my_htole32,U32)
2460 NOT_AVAIL(Perl_my_htole32,U32)
2463 #ifdef PERL_NEED_MY_LETOH32
2465 LETOH(Perl_my_letoh32,U32)
2467 NOT_AVAIL(Perl_my_letoh32,U32)
2470 #ifdef PERL_NEED_MY_HTOBE32
2472 HTOBE(Perl_my_htobe32,U32)
2474 NOT_AVAIL(Perl_my_htobe32,U32)
2477 #ifdef PERL_NEED_MY_BETOH32
2479 BETOH(Perl_my_betoh32,U32)
2481 NOT_AVAIL(Perl_my_betoh32,U32)
2485 #ifdef PERL_NEED_MY_HTOLE64
2487 HTOLE(Perl_my_htole64,U64)
2489 NOT_AVAIL(Perl_my_htole64,U64)
2492 #ifdef PERL_NEED_MY_LETOH64
2494 LETOH(Perl_my_letoh64,U64)
2496 NOT_AVAIL(Perl_my_letoh64,U64)
2499 #ifdef PERL_NEED_MY_HTOBE64
2501 HTOBE(Perl_my_htobe64,U64)
2503 NOT_AVAIL(Perl_my_htobe64,U64)
2506 #ifdef PERL_NEED_MY_BETOH64
2508 BETOH(Perl_my_betoh64,U64)
2510 NOT_AVAIL(Perl_my_betoh64,U64)
2514 #ifdef PERL_NEED_MY_HTOLES
2515 HTOLE(Perl_my_htoles,short)
2517 #ifdef PERL_NEED_MY_LETOHS
2518 LETOH(Perl_my_letohs,short)
2520 #ifdef PERL_NEED_MY_HTOBES
2521 HTOBE(Perl_my_htobes,short)
2523 #ifdef PERL_NEED_MY_BETOHS
2524 BETOH(Perl_my_betohs,short)
2527 #ifdef PERL_NEED_MY_HTOLEI
2528 HTOLE(Perl_my_htolei,int)
2530 #ifdef PERL_NEED_MY_LETOHI
2531 LETOH(Perl_my_letohi,int)
2533 #ifdef PERL_NEED_MY_HTOBEI
2534 HTOBE(Perl_my_htobei,int)
2536 #ifdef PERL_NEED_MY_BETOHI
2537 BETOH(Perl_my_betohi,int)
2540 #ifdef PERL_NEED_MY_HTOLEL
2541 HTOLE(Perl_my_htolel,long)
2543 #ifdef PERL_NEED_MY_LETOHL
2544 LETOH(Perl_my_letohl,long)
2546 #ifdef PERL_NEED_MY_HTOBEL
2547 HTOBE(Perl_my_htobel,long)
2549 #ifdef PERL_NEED_MY_BETOHL
2550 BETOH(Perl_my_betohl,long)
2554 Perl_my_swabn(void *ptr, int n)
2556 register char *s = (char *)ptr;
2557 register char *e = s + (n-1);
2560 PERL_ARGS_ASSERT_MY_SWABN;
2562 for (n /= 2; n > 0; s++, e--, n--) {
2570 Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
2572 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__)
2575 register I32 This, that;
2581 PERL_ARGS_ASSERT_MY_POPEN_LIST;
2583 PERL_FLUSHALL_FOR_CHILD;
2584 This = (*mode == 'w');
2588 taint_proper("Insecure %s%s", "EXEC");
2590 if (PerlProc_pipe(p) < 0)
2592 /* Try for another pipe pair for error return */
2593 if (PerlProc_pipe(pp) >= 0)
2595 while ((pid = PerlProc_fork()) < 0) {
2596 if (errno != EAGAIN) {
2597 PerlLIO_close(p[This]);
2598 PerlLIO_close(p[that]);
2600 PerlLIO_close(pp[0]);
2601 PerlLIO_close(pp[1]);
2605 Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2614 /* Close parent's end of error status pipe (if any) */
2616 PerlLIO_close(pp[0]);
2617 #if defined(HAS_FCNTL) && defined(F_SETFD)
2618 /* Close error pipe automatically if exec works */
2619 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2622 /* Now dup our end of _the_ pipe to right position */
2623 if (p[THIS] != (*mode == 'r')) {
2624 PerlLIO_dup2(p[THIS], *mode == 'r');
2625 PerlLIO_close(p[THIS]);
2626 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2627 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
2630 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
2631 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2632 /* No automatic close - do it by hand */
2639 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
2645 do_aexec5(NULL, args-1, args-1+n, pp[1], did_pipes);
2651 do_execfree(); /* free any memory malloced by child on fork */
2653 PerlLIO_close(pp[1]);
2654 /* Keep the lower of the two fd numbers */
2655 if (p[that] < p[This]) {
2656 PerlLIO_dup2(p[This], p[that]);
2657 PerlLIO_close(p[This]);
2661 PerlLIO_close(p[that]); /* close child's end of pipe */
2663 sv = *av_fetch(PL_fdpid,p[This],TRUE);
2664 SvUPGRADE(sv,SVt_IV);
2666 PL_forkprocess = pid;
2667 /* If we managed to get status pipe check for exec fail */
2668 if (did_pipes && pid > 0) {
2673 while (n < sizeof(int)) {
2674 n1 = PerlLIO_read(pp[0],
2675 (void*)(((char*)&errkid)+n),
2681 PerlLIO_close(pp[0]);
2683 if (n) { /* Error */
2685 PerlLIO_close(p[This]);
2686 if (n != sizeof(int))
2687 Perl_croak(aTHX_ "panic: kid popen errno read");
2689 pid2 = wait4pid(pid, &status, 0);
2690 } while (pid2 == -1 && errno == EINTR);
2691 errno = errkid; /* Propagate errno from kid */
2696 PerlLIO_close(pp[0]);
2697 return PerlIO_fdopen(p[This], mode);
2699 # ifdef OS2 /* Same, without fork()ing and all extra overhead... */
2700 return my_syspopen4(aTHX_ NULL, mode, n, args);
2702 Perl_croak(aTHX_ "List form of piped open not implemented");
2703 return (PerlIO *) NULL;
2708 /* VMS' my_popen() is in VMS.c, same with OS/2. */
2709 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
2711 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2715 register I32 This, that;
2718 const I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
2722 PERL_ARGS_ASSERT_MY_POPEN;
2724 PERL_FLUSHALL_FOR_CHILD;
2727 return my_syspopen(aTHX_ cmd,mode);
2730 This = (*mode == 'w');
2732 if (doexec && PL_tainting) {
2734 taint_proper("Insecure %s%s", "EXEC");
2736 if (PerlProc_pipe(p) < 0)
2738 if (doexec && PerlProc_pipe(pp) >= 0)
2740 while ((pid = PerlProc_fork()) < 0) {
2741 if (errno != EAGAIN) {
2742 PerlLIO_close(p[This]);
2743 PerlLIO_close(p[that]);
2745 PerlLIO_close(pp[0]);
2746 PerlLIO_close(pp[1]);
2749 Perl_croak(aTHX_ "Can't fork: %s", Strerror(errno));
2752 Perl_ck_warner(aTHX_ packWARN(WARN_PIPE), "Can't fork, trying again in 5 seconds");
2762 PerlLIO_close(pp[0]);
2763 #if defined(HAS_FCNTL) && defined(F_SETFD)
2764 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2767 if (p[THIS] != (*mode == 'r')) {
2768 PerlLIO_dup2(p[THIS], *mode == 'r');
2769 PerlLIO_close(p[THIS]);
2770 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2771 PerlLIO_close(p[THAT]);
2774 PerlLIO_close(p[THAT]);
2777 #if !defined(HAS_FCNTL) || !defined(F_SETFD)
2784 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2789 /* may or may not use the shell */
2790 do_exec3(cmd, pp[1], did_pipes);
2793 #endif /* defined OS2 */
2795 #ifdef PERLIO_USING_CRLF
2796 /* Since we circumvent IO layers when we manipulate low-level
2797 filedescriptors directly, need to manually switch to the
2798 default, binary, low-level mode; see PerlIOBuf_open(). */
2799 PerlLIO_setmode((*mode == 'r'), O_BINARY);
2801 #ifdef THREADS_HAVE_PIDS
2802 PL_ppid = (IV)getppid();
2805 #ifdef PERL_USES_PL_PIDSTATUS
2806 hv_clear(PL_pidstatus); /* we have no children */
2812 do_execfree(); /* free any memory malloced by child on vfork */
2814 PerlLIO_close(pp[1]);
2815 if (p[that] < p[This]) {
2816 PerlLIO_dup2(p[This], p[that]);
2817 PerlLIO_close(p[This]);
2821 PerlLIO_close(p[that]);
2823 sv = *av_fetch(PL_fdpid,p[This],TRUE);
2824 SvUPGRADE(sv,SVt_IV);
2826 PL_forkprocess = pid;
2827 if (did_pipes && pid > 0) {
2832 while (n < sizeof(int)) {
2833 n1 = PerlLIO_read(pp[0],
2834 (void*)(((char*)&errkid)+n),
2840 PerlLIO_close(pp[0]);
2842 if (n) { /* Error */
2844 PerlLIO_close(p[This]);
2845 if (n != sizeof(int))
2846 Perl_croak(aTHX_ "panic: kid popen errno read");
2848 pid2 = wait4pid(pid, &status, 0);
2849 } while (pid2 == -1 && errno == EINTR);
2850 errno = errkid; /* Propagate errno from kid */
2855 PerlLIO_close(pp[0]);
2856 return PerlIO_fdopen(p[This], mode);
2859 #if defined(atarist) || defined(EPOC)
2862 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2864 PERL_ARGS_ASSERT_MY_POPEN;
2865 PERL_FLUSHALL_FOR_CHILD;
2866 /* Call system's popen() to get a FILE *, then import it.
2867 used 0 for 2nd parameter to PerlIO_importFILE;
2870 return PerlIO_importFILE(popen(cmd, mode), 0);
2874 FILE *djgpp_popen();
2876 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2878 PERL_FLUSHALL_FOR_CHILD;
2879 /* Call system's popen() to get a FILE *, then import it.
2880 used 0 for 2nd parameter to PerlIO_importFILE;
2883 return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2886 #if defined(__LIBCATAMOUNT__)
2888 Perl_my_popen(pTHX_ const char *cmd, const char *mode)
2896 #endif /* !DOSISH */
2898 /* this is called in parent before the fork() */
2900 Perl_atfork_lock(void)
2903 #if defined(USE_ITHREADS)
2904 /* locks must be held in locking order (if any) */
2906 MUTEX_LOCK(&PL_malloc_mutex);
2912 /* this is called in both parent and child after the fork() */
2914 Perl_atfork_unlock(void)
2917 #if defined(USE_ITHREADS)
2918 /* locks must be released in same order as in atfork_lock() */
2920 MUTEX_UNLOCK(&PL_malloc_mutex);
2929 #if defined(HAS_FORK)
2931 #if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
2936 /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2937 * handlers elsewhere in the code */
2942 /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2943 Perl_croak_nocontext("fork() not available");
2945 #endif /* HAS_FORK */
2950 Perl_dump_fds(pTHX_ const char *const s)
2955 PERL_ARGS_ASSERT_DUMP_FDS;
2957 PerlIO_printf(Perl_debug_log,"%s", s);
2958 for (fd = 0; fd < 32; fd++) {
2959 if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
2960 PerlIO_printf(Perl_debug_log," %d",fd);
2962 PerlIO_printf(Perl_debug_log,"\n");
2965 #endif /* DUMP_FDS */
2969 dup2(int oldfd, int newfd)
2971 #if defined(HAS_FCNTL) && defined(F_DUPFD)
2974 PerlLIO_close(newfd);
2975 return fcntl(oldfd, F_DUPFD, newfd);
2977 #define DUP2_MAX_FDS 256
2978 int fdtmp[DUP2_MAX_FDS];
2984 PerlLIO_close(newfd);
2985 /* good enough for low fd's... */
2986 while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
2987 if (fdx >= DUP2_MAX_FDS) {
2995 PerlLIO_close(fdtmp[--fdx]);
3002 #ifdef HAS_SIGACTION
3005 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
3008 struct sigaction act, oact;
3011 /* only "parent" interpreter can diddle signals */
3012 if (PL_curinterp != aTHX)
3013 return (Sighandler_t) SIG_ERR;
3016 act.sa_handler = (void(*)(int))handler;
3017 sigemptyset(&act.sa_mask);
3020 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3021 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
3023 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
3024 if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
3025 act.sa_flags |= SA_NOCLDWAIT;
3027 if (sigaction(signo, &act, &oact) == -1)
3028 return (Sighandler_t) SIG_ERR;
3030 return (Sighandler_t) oact.sa_handler;
3034 Perl_rsignal_state(pTHX_ int signo)
3036 struct sigaction oact;
3037 PERL_UNUSED_CONTEXT;
3039 if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
3040 return (Sighandler_t) SIG_ERR;
3042 return (Sighandler_t) oact.sa_handler;
3046 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
3049 struct sigaction act;
3051 PERL_ARGS_ASSERT_RSIGNAL_SAVE;
3054 /* only "parent" interpreter can diddle signals */
3055 if (PL_curinterp != aTHX)
3059 act.sa_handler = (void(*)(int))handler;
3060 sigemptyset(&act.sa_mask);
3063 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3064 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
3066 #if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
3067 if (signo == SIGCHLD && handler == (Sighandler_t) SIG_IGN)
3068 act.sa_flags |= SA_NOCLDWAIT;
3070 return sigaction(signo, &act, save);
3074 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
3078 /* only "parent" interpreter can diddle signals */
3079 if (PL_curinterp != aTHX)
3083 return sigaction(signo, save, (struct sigaction *)NULL);
3086 #else /* !HAS_SIGACTION */
3089 Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
3091 #if defined(USE_ITHREADS) && !defined(WIN32)
3092 /* only "parent" interpreter can diddle signals */
3093 if (PL_curinterp != aTHX)
3094 return (Sighandler_t) SIG_ERR;
3097 return PerlProc_signal(signo, handler);
3108 Perl_rsignal_state(pTHX_ int signo)
3111 Sighandler_t oldsig;
3113 #if defined(USE_ITHREADS) && !defined(WIN32)
3114 /* only "parent" interpreter can diddle signals */
3115 if (PL_curinterp != aTHX)
3116 return (Sighandler_t) SIG_ERR;
3120 oldsig = PerlProc_signal(signo, sig_trap);
3121 PerlProc_signal(signo, oldsig);
3123 PerlProc_kill(PerlProc_getpid(), signo);
3128 Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
3130 #if defined(USE_ITHREADS) && !defined(WIN32)
3131 /* only "parent" interpreter can diddle signals */
3132 if (PL_curinterp != aTHX)
3135 *save = PerlProc_signal(signo, handler);
3136 return (*save == (Sighandler_t) SIG_ERR) ? -1 : 0;
3140 Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
3142 #if defined(USE_ITHREADS) && !defined(WIN32)
3143 /* only "parent" interpreter can diddle signals */
3144 if (PL_curinterp != aTHX)
3147 return (PerlProc_signal(signo, *save) == (Sighandler_t) SIG_ERR) ? -1 : 0;
3150 #endif /* !HAS_SIGACTION */
3151 #endif /* !PERL_MICRO */
3153 /* VMS' my_pclose() is in VMS.c; same with OS/2 */
3154 #if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
3156 Perl_my_pclose(pTHX_ PerlIO *ptr)
3159 Sigsave_t hstat, istat, qstat;
3166 const int fd = PerlIO_fileno(ptr);
3169 /* Find out whether the refcount is low enough for us to wait for the
3170 child proc without blocking. */
3171 const bool should_wait = PerlIOUnix_refcnt(fd) == 1;
3173 const bool should_wait = 1;
3176 svp = av_fetch(PL_fdpid,fd,TRUE);
3177 pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
3179 *svp = &PL_sv_undef;
3181 if (pid == -1) { /* Opened by popen. */
3182 return my_syspclose(ptr);
3185 close_failed = (PerlIO_close(ptr) == EOF);
3188 if(PerlProc_kill(pid, 0) < 0) { return(pid); } /* HOM 12/23/91 */
3191 rsignal_save(SIGHUP, (Sighandler_t) SIG_IGN, &hstat);
3192 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &istat);
3193 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qstat);
3195 if (should_wait) do {
3196 pid2 = wait4pid(pid, &status, 0);
3197 } while (pid2 == -1 && errno == EINTR);
3199 rsignal_restore(SIGHUP, &hstat);
3200 rsignal_restore(SIGINT, &istat);
3201 rsignal_restore(SIGQUIT, &qstat);
3209 ? pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status)
3214 #if defined(__LIBCATAMOUNT__)
3216 Perl_my_pclose(pTHX_ PerlIO *ptr)
3221 #endif /* !DOSISH */
3223 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(__LIBCATAMOUNT__)
3225 Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
3229 PERL_ARGS_ASSERT_WAIT4PID;
3232 #ifdef PERL_USES_PL_PIDSTATUS
3235 /* The keys in PL_pidstatus are now the raw 4 (or 8) bytes of the
3236 pid, rather than a string form. */
3237 SV * const * const svp = hv_fetch(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),FALSE);
3238 if (svp && *svp != &PL_sv_undef) {
3239 *statusp = SvIVX(*svp);
3240 (void)hv_delete(PL_pidstatus,(const char*) &pid,sizeof(Pid_t),
3248 hv_iterinit(PL_pidstatus);
3249 if ((entry = hv_iternext(PL_pidstatus))) {
3250 SV * const sv = hv_iterval(PL_pidstatus,entry);
3252 const char * const spid = hv_iterkey(entry,&len);
3254 assert (len == sizeof(Pid_t));
3255 memcpy((char *)&pid, spid, len);
3256 *statusp = SvIVX(sv);
3257 /* The hash iterator is currently on this entry, so simply
3258 calling hv_delete would trigger the lazy delete, which on
3259 aggregate does more work, beacuse next call to hv_iterinit()
3260 would spot the flag, and have to call the delete routine,
3261 while in the meantime any new entries can't re-use that
3263 hv_iterinit(PL_pidstatus);
3264 (void)hv_delete(PL_pidstatus,spid,len,G_DISCARD);
3271 # ifdef HAS_WAITPID_RUNTIME
3272 if (!HAS_WAITPID_RUNTIME)
3275 result = PerlProc_waitpid(pid,statusp,flags);
3278 #if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
3279 result = wait4((pid==-1)?0:pid,statusp,flags,NULL);
3282 #ifdef PERL_USES_PL_PIDSTATUS
3283 #if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
3288 Perl_croak(aTHX_ "Can't do waitpid with flags");
3290 while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
3291 pidgone(result,*statusp);
3297 #if defined(HAS_WAITPID) || defined(HAS_WAIT4)
3300 if (result < 0 && errno == EINTR) {
3302 errno = EINTR; /* reset in case a signal handler changed $! */
3306 #endif /* !DOSISH || OS2 || WIN32 || NETWARE */
3308 #ifdef PERL_USES_PL_PIDSTATUS
3310 S_pidgone(pTHX_ Pid_t pid, int status)
3314 sv = *hv_fetch(PL_pidstatus,(const char*)&pid,sizeof(Pid_t),TRUE);
3315 SvUPGRADE(sv,SVt_IV);
3316 SvIV_set(sv, status);
3321 #if defined(atarist) || defined(OS2) || defined(EPOC)
3324 int /* Cannot prototype with I32
3326 my_syspclose(PerlIO *ptr)
3329 Perl_my_pclose(pTHX_ PerlIO *ptr)
3332 /* Needs work for PerlIO ! */
3333 FILE * const f = PerlIO_findFILE(ptr);
3334 const I32 result = pclose(f);
3335 PerlIO_releaseFILE(ptr,f);
3343 Perl_my_pclose(pTHX_ PerlIO *ptr)
3345 /* Needs work for PerlIO ! */
3346 FILE * const f = PerlIO_findFILE(ptr);
3347 I32 result = djgpp_pclose(f);
3348 result = (result << 8) & 0xff00;
3349 PerlIO_releaseFILE(ptr,f);
3354 #define PERL_REPEATCPY_LINEAR 4
3356 Perl_repeatcpy(register char *to, register const char *from, I32 len, register I32 count)
3358 PERL_ARGS_ASSERT_REPEATCPY;
3361 memset(to, *from, count);
3363 register char *p = to;
3364 I32 items, linear, half;
3366 linear = count < PERL_REPEATCPY_LINEAR ? count : PERL_REPEATCPY_LINEAR;
3367 for (items = 0; items < linear; ++items) {
3368 register const char *q = from;
3370 for (todo = len; todo > 0; todo--)
3375 while (items <= half) {
3376 I32 size = items * len;
3377 memcpy(p, to, size);
3383 memcpy(p, to, (count - items) * len);
3389 Perl_same_dirent(pTHX_ const char *a, const char *b)
3391 char *fa = strrchr(a,'/');
3392 char *fb = strrchr(b,'/');
3395 SV * const tmpsv = sv_newmortal();
3397 PERL_ARGS_ASSERT_SAME_DIRENT;
3410 sv_setpvs(tmpsv, ".");
3412 sv_setpvn(tmpsv, a, fa - a);
3413 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
3416 sv_setpvs(tmpsv, ".");
3418 sv_setpvn(tmpsv, b, fb - b);
3419 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
3421 return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
3422 tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
3424 #endif /* !HAS_RENAME */
3427 Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
3428 const char *const *const search_ext, I32 flags)
3431 const char *xfound = NULL;
3432 char *xfailed = NULL;
3433 char tmpbuf[MAXPATHLEN];
3438 #if defined(DOSISH) && !defined(OS2) && !defined(atarist)
3439 # define SEARCH_EXTS ".bat", ".cmd", NULL
3440 # define MAX_EXT_LEN 4
3443 # define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
3444 # define MAX_EXT_LEN 4
3447 # define SEARCH_EXTS ".pl", ".com", NULL
3448 # define MAX_EXT_LEN 4
3450 /* additional extensions to try in each dir if scriptname not found */
3452 static const char *const exts[] = { SEARCH_EXTS };
3453 const char *const *const ext = search_ext ? search_ext : exts;
3454 int extidx = 0, i = 0;
3455 const char *curext = NULL;
3457 PERL_UNUSED_ARG(search_ext);
3458 # define MAX_EXT_LEN 0
3461 PERL_ARGS_ASSERT_FIND_SCRIPT;
3464 * If dosearch is true and if scriptname does not contain path
3465 * delimiters, search the PATH for scriptname.
3467 * If SEARCH_EXTS is also defined, will look for each
3468 * scriptname{SEARCH_EXTS} whenever scriptname is not found
3469 * while searching the PATH.
3471 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
3472 * proceeds as follows:
3473 * If DOSISH or VMSISH:
3474 * + look for ./scriptname{,.foo,.bar}
3475 * + search the PATH for scriptname{,.foo,.bar}
3478 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
3479 * this will not look in '.' if it's not in the PATH)
3484 # ifdef ALWAYS_DEFTYPES
3485 len = strlen(scriptname);
3486 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
3487 int idx = 0, deftypes = 1;
3490 const int hasdir = !dosearch || (strpbrk(scriptname,":[</") != NULL);
3493 int idx = 0, deftypes = 1;
3496 const int hasdir = (strpbrk(scriptname,":[</") != NULL);
3498 /* The first time through, just add SEARCH_EXTS to whatever we
3499 * already have, so we can check for default file types. */
3501 (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
3507 if ((strlen(tmpbuf) + strlen(scriptname)
3508 + MAX_EXT_LEN) >= sizeof tmpbuf)
3509 continue; /* don't search dir with too-long name */
3510 my_strlcat(tmpbuf, scriptname, sizeof(tmpbuf));
3514 if (strEQ(scriptname, "-"))
3516 if (dosearch) { /* Look in '.' first. */
3517 const char *cur = scriptname;
3519 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
3521 if (strEQ(ext[i++],curext)) {
3522 extidx = -1; /* already has an ext */
3527 DEBUG_p(PerlIO_printf(Perl_debug_log,
3528 "Looking for %s\n",cur));
3529 if (PerlLIO_stat(cur,&PL_statbuf) >= 0
3530 && !S_ISDIR(PL_statbuf.st_mode)) {
3538 if (cur == scriptname) {
3539 len = strlen(scriptname);
3540 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
3542 my_strlcpy(tmpbuf, scriptname, sizeof(tmpbuf));
3545 } while (extidx >= 0 && ext[extidx] /* try an extension? */
3546 && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len));
3551 if (dosearch && !strchr(scriptname, '/')
3553 && !strchr(scriptname, '\\')
3555 && (s = PerlEnv_getenv("PATH")))
3559 bufend = s + strlen(s);
3560 while (s < bufend) {
3561 #if defined(atarist) || defined(DOSISH)
3566 && *s != ';'; len++, s++) {
3567 if (len < sizeof tmpbuf)
3570 if (len < sizeof tmpbuf)
3572 #else /* ! (atarist || DOSISH) */
3573 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
3576 #endif /* ! (atarist || DOSISH) */
3579 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
3580 continue; /* don't search dir with too-long name */
3582 # if defined(atarist) || defined(DOSISH)
3583 && tmpbuf[len - 1] != '/'
3584 && tmpbuf[len - 1] != '\\'
3587 tmpbuf[len++] = '/';
3588 if (len == 2 && tmpbuf[0] == '.')
3590 (void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
3594 len = strlen(tmpbuf);
3595 if (extidx > 0) /* reset after previous loop */
3599 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3600 retval = PerlLIO_stat(tmpbuf,&PL_statbuf);
3601 if (S_ISDIR(PL_statbuf.st_mode)) {
3605 } while ( retval < 0 /* not there */
3606 && extidx>=0 && ext[extidx] /* try an extension? */
3607 && my_strlcpy(tmpbuf+len, ext[extidx++], sizeof(tmpbuf) - len)
3612 if (S_ISREG(PL_statbuf.st_mode)
3613 && cando(S_IRUSR,TRUE,&PL_statbuf)
3614 #if !defined(DOSISH)
3615 && cando(S_IXUSR,TRUE,&PL_statbuf)
3619 xfound = tmpbuf; /* bingo! */
3623 xfailed = savepv(tmpbuf);
3626 if (!xfound && !seen_dot && !xfailed &&
3627 (PerlLIO_stat(scriptname,&PL_statbuf) < 0
3628 || S_ISDIR(PL_statbuf.st_mode)))
3630 seen_dot = 1; /* Disable message. */
3632 if (flags & 1) { /* do or die? */
3633 Perl_croak(aTHX_ "Can't %s %s%s%s",
3634 (xfailed ? "execute" : "find"),
3635 (xfailed ? xfailed : scriptname),
3636 (xfailed ? "" : " on PATH"),
3637 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3642 scriptname = xfound;
3644 return (scriptname ? savepv(scriptname) : NULL);
3647 #ifndef PERL_GET_CONTEXT_DEFINED
3650 Perl_get_context(void)
3653 #if defined(USE_ITHREADS)
3654 # ifdef OLD_PTHREADS_API
3656 if (pthread_getspecific(PL_thr_key, &t))
3657 Perl_croak_nocontext("panic: pthread_getspecific");
3660 # ifdef I_MACH_CTHREADS
3661 return (void*)cthread_data(cthread_self());
3663 return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3672 Perl_set_context(void *t)
3675 PERL_ARGS_ASSERT_SET_CONTEXT;
3676 #if defined(USE_ITHREADS)
3677 # ifdef I_MACH_CTHREADS
3678 cthread_set_data(cthread_self(), t);
3680 if (pthread_setspecific(PL_thr_key, t))
3681 Perl_croak_nocontext("panic: pthread_setspecific");
3688 #endif /* !PERL_GET_CONTEXT_DEFINED */
3690 #if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
3699 Perl_get_op_names(pTHX)
3701 PERL_UNUSED_CONTEXT;
3702 return (char **)PL_op_name;
3706 Perl_get_op_descs(pTHX)
3708 PERL_UNUSED_CONTEXT;
3709 return (char **)PL_op_desc;
3713 Perl_get_no_modify(pTHX)
3715 PERL_UNUSED_CONTEXT;
3716 return PL_no_modify;
3720 Perl_get_opargs(pTHX)
3722 PERL_UNUSED_CONTEXT;
3723 return (U32 *)PL_opargs;
3727 Perl_get_ppaddr(pTHX)
3730 PERL_UNUSED_CONTEXT;
3731 return (PPADDR_t*)PL_ppaddr;
3734 #ifndef HAS_GETENV_LEN
3736 Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
3738 char * const env_trans = PerlEnv_getenv(env_elem);
3739 PERL_UNUSED_CONTEXT;
3740 PERL_ARGS_ASSERT_GETENV_LEN;
3742 *len = strlen(env_trans);
3749 Perl_get_vtbl(pTHX_ int vtbl_id)
3751 PERL_UNUSED_CONTEXT;
3753 return (vtbl_id < 0 || vtbl_id >= magic_vtable_max)
3754 ? NULL : PL_magic_vtables + vtbl_id;
3758 Perl_my_fflush_all(pTHX)
3760 #if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
3761 return PerlIO_flush(NULL);
3763 # if defined(HAS__FWALK)
3764 extern int fflush(FILE *);
3765 /* undocumented, unprototyped, but very useful BSDism */
3766 extern void _fwalk(int (*)(FILE *));
3770 # if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
3772 # ifdef PERL_FFLUSH_ALL_FOPEN_MAX
3773 open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
3775 # if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
3776 open_max = sysconf(_SC_OPEN_MAX);
3779 open_max = FOPEN_MAX;
3782 open_max = OPEN_MAX;
3793 for (i = 0; i < open_max; i++)
3794 if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3795 STDIO_STREAM_ARRAY[i]._file < open_max &&
3796 STDIO_STREAM_ARRAY[i]._flag)
3797 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
3801 SETERRNO(EBADF,RMS_IFI);
3808 Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have)
3810 if (ckWARN(WARN_IO)) {
3811 const char * const name
3812 = gv && (isGV(gv) || isGV_with_GP(gv)) ? GvENAME(gv) : NULL;
3813 const char * const direction = have == '>' ? "out" : "in";
3816 Perl_warner(aTHX_ packWARN(WARN_IO),
3817 "Filehandle %s opened only for %sput",
3820 Perl_warner(aTHX_ packWARN(WARN_IO),
3821 "Filehandle opened only for %sput", direction);
3826 Perl_report_evil_fh(pTHX_ const GV *gv)
3828 const IO *io = gv ? GvIO(gv) : NULL;
3829 const PERL_BITFIELD16 op = PL_op->op_type;
3833 if (io && IoTYPE(io) == IoTYPE_CLOSED) {
3835 warn_type = WARN_CLOSED;
3839 warn_type = WARN_UNOPENED;
3842 if (ckWARN(warn_type)) {
3843 const char * const name
3844 = gv && (isGV(gv) || isGV_with_GP(gv)) ? GvENAME(gv) : NULL;
3845 const char * const pars =
3846 (const char *)(OP_IS_FILETEST(op) ? "" : "()");
3847 const char * const func =
3849 (op == OP_READLINE ? "readline" : /* "<HANDLE>" not nice */
3850 op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */
3852 const char * const type =
3854 (OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET)
3855 ? "socket" : "filehandle");
3856 if (name && *name) {
3857 Perl_warner(aTHX_ packWARN(warn_type),
3858 "%s%s on %s %s %s", func, pars, vile, type, name);
3859 if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3861 aTHX_ packWARN(warn_type),
3862 "\t(Are you trying to call %s%s on dirhandle %s?)\n",
3867 Perl_warner(aTHX_ packWARN(warn_type),
3868 "%s%s on %s %s", func, pars, vile, type);
3869 if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3871 aTHX_ packWARN(warn_type),
3872 "\t(Are you trying to call %s%s on dirhandle?)\n",
3879 /* To workaround core dumps from the uninitialised tm_zone we get the
3880 * system to give us a reasonable struct to copy. This fix means that
3881 * strftime uses the tm_zone and tm_gmtoff values returned by
3882 * localtime(time()). That should give the desired result most of the
3883 * time. But probably not always!
3885 * This does not address tzname aspects of NETaa14816.
3890 # ifndef STRUCT_TM_HASZONE
3891 # define STRUCT_TM_HASZONE
3895 #ifdef STRUCT_TM_HASZONE /* Backward compat */
3896 # ifndef HAS_TM_TM_ZONE
3897 # define HAS_TM_TM_ZONE
3902 Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */
3904 #ifdef HAS_TM_TM_ZONE
3906 const struct tm* my_tm;
3907 PERL_ARGS_ASSERT_INIT_TM;
3909 my_tm = localtime(&now);
3911 Copy(my_tm, ptm, 1, struct tm);
3913 PERL_ARGS_ASSERT_INIT_TM;
3914 PERL_UNUSED_ARG(ptm);
3919 * mini_mktime - normalise struct tm values without the localtime()
3920 * semantics (and overhead) of mktime().
3923 Perl_mini_mktime(pTHX_ struct tm *ptm)
3927 int month, mday, year, jday;
3928 int odd_cent, odd_year;
3929 PERL_UNUSED_CONTEXT;
3931 PERL_ARGS_ASSERT_MINI_MKTIME;
3933 #define DAYS_PER_YEAR 365
3934 #define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
3935 #define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
3936 #define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
3937 #define SECS_PER_HOUR (60*60)
3938 #define SECS_PER_DAY (24*SECS_PER_HOUR)
3939 /* parentheses deliberately absent on these two, otherwise they don't work */
3940 #define MONTH_TO_DAYS 153/5
3941 #define DAYS_TO_MONTH 5/153
3942 /* offset to bias by March (month 4) 1st between month/mday & year finding */
3943 #define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
3944 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3945 #define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
3948 * Year/day algorithm notes:
3950 * With a suitable offset for numeric value of the month, one can find
3951 * an offset into the year by considering months to have 30.6 (153/5) days,
3952 * using integer arithmetic (i.e., with truncation). To avoid too much
3953 * messing about with leap days, we consider January and February to be
3954 * the 13th and 14th month of the previous year. After that transformation,
3955 * we need the month index we use to be high by 1 from 'normal human' usage,
3956 * so the month index values we use run from 4 through 15.
3958 * Given that, and the rules for the Gregorian calendar (leap years are those
3959 * divisible by 4 unless also divisible by 100, when they must be divisible
3960 * by 400 instead), we can simply calculate the number of days since some
3961 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3962 * the days we derive from our month index, and adding in the day of the
3963 * month. The value used here is not adjusted for the actual origin which
3964 * it normally would use (1 January A.D. 1), since we're not exposing it.
3965 * We're only building the value so we can turn around and get the
3966 * normalised values for the year, month, day-of-month, and day-of-year.
3968 * For going backward, we need to bias the value we're using so that we find
3969 * the right year value. (Basically, we don't want the contribution of
3970 * March 1st to the number to apply while deriving the year). Having done
3971 * that, we 'count up' the contribution to the year number by accounting for
3972 * full quadracenturies (400-year periods) with their extra leap days, plus
3973 * the contribution from full centuries (to avoid counting in the lost leap
3974 * days), plus the contribution from full quad-years (to count in the normal
3975 * leap days), plus the leftover contribution from any non-leap years.
3976 * At this point, if we were working with an actual leap day, we'll have 0
3977 * days left over. This is also true for March 1st, however. So, we have
3978 * to special-case that result, and (earlier) keep track of the 'odd'
3979 * century and year contributions. If we got 4 extra centuries in a qcent,
3980 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3981 * Otherwise, we add back in the earlier bias we removed (the 123 from
3982 * figuring in March 1st), find the month index (integer division by 30.6),
3983 * and the remainder is the day-of-month. We then have to convert back to
3984 * 'real' months (including fixing January and February from being 14/15 in
3985 * the previous year to being in the proper year). After that, to get
3986 * tm_yday, we work with the normalised year and get a new yearday value for
3987 * January 1st, which we subtract from the yearday value we had earlier,
3988 * representing the date we've re-built. This is done from January 1
3989 * because tm_yday is 0-origin.
3991 * Since POSIX time routines are only guaranteed to work for times since the
3992 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3993 * applies Gregorian calendar rules even to dates before the 16th century
3994 * doesn't bother me. Besides, you'd need cultural context for a given
3995 * date to know whether it was Julian or Gregorian calendar, and that's
3996 * outside the scope for this routine. Since we convert back based on the
3997 * same rules we used to build the yearday, you'll only get strange results
3998 * for input which needed normalising, or for the 'odd' century years which
3999 * were leap years in the Julian calendar but not in the Gregorian one.
4000 * I can live with that.
4002 * This algorithm also fails to handle years before A.D. 1 gracefully, but
4003 * that's still outside the scope for POSIX time manipulation, so I don't
4007 year = 1900 + ptm->tm_year;
4008 month = ptm->tm_mon;
4009 mday = ptm->tm_mday;
4010 /* allow given yday with no month & mday to dominate the result */
4011 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
4014 jday = 1 + ptm->tm_yday;
4023 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
4024 yearday += month*MONTH_TO_DAYS + mday + jday;
4026 * Note that we don't know when leap-seconds were or will be,
4027 * so we have to trust the user if we get something which looks
4028 * like a sensible leap-second. Wild values for seconds will
4029 * be rationalised, however.
4031 if ((unsigned) ptm->tm_sec <= 60) {
4038 secs += 60 * ptm->tm_min;
4039 secs += SECS_PER_HOUR * ptm->tm_hour;
4041 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
4042 /* got negative remainder, but need positive time */
4043 /* back off an extra day to compensate */
4044 yearday += (secs/SECS_PER_DAY)-1;
4045 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
4048 yearday += (secs/SECS_PER_DAY);
4049 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
4052 else if (secs >= SECS_PER_DAY) {
4053 yearday += (secs/SECS_PER_DAY);
4054 secs %= SECS_PER_DAY;
4056 ptm->tm_hour = secs/SECS_PER_HOUR;
4057 secs %= SECS_PER_HOUR;
4058 ptm->tm_min = secs/60;
4060 ptm->tm_sec += secs;
4061 /* done with time of day effects */
4063 * The algorithm for yearday has (so far) left it high by 428.
4064 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
4065 * bias it by 123 while trying to figure out what year it
4066 * really represents. Even with this tweak, the reverse
4067 * translation fails for years before A.D. 0001.
4068 * It would still fail for Feb 29, but we catch that one below.
4070 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
4071 yearday -= YEAR_ADJUST;
4072 year = (yearday / DAYS_PER_QCENT) * 400;
4073 yearday %= DAYS_PER_QCENT;
4074 odd_cent = yearday / DAYS_PER_CENT;
4075 year += odd_cent * 100;
4076 yearday %= DAYS_PER_CENT;
4077 year += (yearday / DAYS_PER_QYEAR) * 4;
4078 yearday %= DAYS_PER_QYEAR;
4079 odd_year = yearday / DAYS_PER_YEAR;
4081 yearday %= DAYS_PER_YEAR;
4082 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
4087 yearday += YEAR_ADJUST; /* recover March 1st crock */
4088 month = yearday*DAYS_TO_MONTH;
4089 yearday -= month*MONTH_TO_DAYS;
4090 /* recover other leap-year adjustment */
4099 ptm->tm_year = year - 1900;
4101 ptm->tm_mday = yearday;
4102 ptm->tm_mon = month;
4106 ptm->tm_mon = month - 1;
4108 /* re-build yearday based on Jan 1 to get tm_yday */
4110 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
4111 yearday += 14*MONTH_TO_DAYS + 1;
4112 ptm->tm_yday = jday - yearday;
4113 /* fix tm_wday if not overridden by caller */
4114 if ((unsigned)ptm->tm_wday > 6)
4115 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
4119 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)
4127 PERL_ARGS_ASSERT_MY_STRFTIME;
4129 init_tm(&mytm); /* XXX workaround - see init_tm() above */
4132 mytm.tm_hour = hour;
4133 mytm.tm_mday = mday;
4135 mytm.tm_year = year;
4136 mytm.tm_wday = wday;
4137 mytm.tm_yday = yday;
4138 mytm.tm_isdst = isdst;
4140 /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
4141 #if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
4146 #ifdef HAS_TM_TM_GMTOFF
4147 mytm.tm_gmtoff = mytm2.tm_gmtoff;
4149 #ifdef HAS_TM_TM_ZONE
4150 mytm.tm_zone = mytm2.tm_zone;
4155 Newx(buf, buflen, char);
4156 len = strftime(buf, buflen, fmt, &mytm);
4158 ** The following is needed to handle to the situation where
4159 ** tmpbuf overflows. Basically we want to allocate a buffer
4160 ** and try repeatedly. The reason why it is so complicated
4161 ** is that getting a return value of 0 from strftime can indicate
4162 ** one of the following:
4163 ** 1. buffer overflowed,
4164 ** 2. illegal conversion specifier, or
4165 ** 3. the format string specifies nothing to be returned(not
4166 ** an error). This could be because format is an empty string
4167 ** or it specifies %p that yields an empty string in some locale.
4168 ** If there is a better way to make it portable, go ahead by
4171 if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
4174 /* Possibly buf overflowed - try again with a bigger buf */
4175 const int fmtlen = strlen(fmt);
4176 int bufsize = fmtlen + buflen;
4178 Renew(buf, bufsize, char);
4180 buflen = strftime(buf, bufsize, fmt, &mytm);
4181 if (buflen > 0 && buflen < bufsize)
4183 /* heuristic to prevent out-of-memory errors */
4184 if (bufsize > 100*fmtlen) {
4190 Renew(buf, bufsize, char);
4195 Perl_croak(aTHX_ "panic: no strftime");
4201 #define SV_CWD_RETURN_UNDEF \
4202 sv_setsv(sv, &PL_sv_undef); \
4205 #define SV_CWD_ISDOT(dp) \
4206 (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
4207 (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
4210 =head1 Miscellaneous Functions
4212 =for apidoc getcwd_sv
4214 Fill the sv with current working directory
4219 /* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
4220 * rewritten again by dougm, optimized for use with xs TARG, and to prefer
4221 * getcwd(3) if available
4222 * Comments from the orignal:
4223 * This is a faster version of getcwd. It's also more dangerous
4224 * because you might chdir out of a directory that you can't chdir
4228 Perl_getcwd_sv(pTHX_ register SV *sv)
4232 #ifndef INCOMPLETE_TAINTS
4236 PERL_ARGS_ASSERT_GETCWD_SV;
4240 char buf[MAXPATHLEN];
4242 /* Some getcwd()s automatically allocate a buffer of the given
4243 * size from the heap if they are given a NULL buffer pointer.
4244 * The problem is that this behaviour is not portable. */
4245 if (getcwd(buf, sizeof(buf) - 1)) {
4250 sv_setsv(sv, &PL_sv_undef);
4258 int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4262 SvUPGRADE(sv, SVt_PV);
4264 if (PerlLIO_lstat(".", &statbuf) < 0) {
4265 SV_CWD_RETURN_UNDEF;
4268 orig_cdev = statbuf.st_dev;
4269 orig_cino = statbuf.st_ino;
4279 if (PerlDir_chdir("..") < 0) {
4280 SV_CWD_RETURN_UNDEF;
4282 if (PerlLIO_stat(".", &statbuf) < 0) {
4283 SV_CWD_RETURN_UNDEF;
4286 cdev = statbuf.st_dev;
4287 cino = statbuf.st_ino;
4289 if (odev == cdev && oino == cino) {
4292 if (!(dir = PerlDir_open("."))) {
4293 SV_CWD_RETURN_UNDEF;
4296 while ((dp = PerlDir_read(dir)) != NULL) {
4298 namelen = dp->d_namlen;
4300 namelen = strlen(dp->d_name);
4303 if (SV_CWD_ISDOT(dp)) {
4307 if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
4308 SV_CWD_RETURN_UNDEF;
4311 tdev = statbuf.st_dev;
4312 tino = statbuf.st_ino;
4313 if (tino == oino && tdev == odev) {
4319 SV_CWD_RETURN_UNDEF;
4322 if (pathlen + namelen + 1 >= MAXPATHLEN) {
4323 SV_CWD_RETURN_UNDEF;
4326 SvGROW(sv, pathlen + namelen + 1);
4330 Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
4333 /* prepend current directory to the front */
4335 Move(dp->d_name, SvPVX(sv)+1, namelen, char);
4336 pathlen += (namelen + 1);
4338 #ifdef VOID_CLOSEDIR
4341 if (PerlDir_close(dir) < 0) {
4342 SV_CWD_RETURN_UNDEF;
4348 SvCUR_set(sv, pathlen);
4352 if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
4353 SV_CWD_RETURN_UNDEF;
4356 if (PerlLIO_stat(".", &statbuf) < 0) {
4357 SV_CWD_RETURN_UNDEF;
4360 cdev = statbuf.st_dev;
4361 cino = statbuf.st_ino;
4363 if (cdev != orig_cdev || cino != orig_cino) {
4364 Perl_croak(aTHX_ "Unstable directory path, "
4365 "current directory changed unexpectedly");
4376 #define VERSION_MAX 0x7FFFFFFF
4379 =for apidoc prescan_version
4381 Validate that a given string can be parsed as a version object, but doesn't
4382 actually perform the parsing. Can use either strict or lax validation rules.
4383 Can optionally set a number of hint variables to save the parsing code
4384 some time when tokenizing.
4389 Perl_prescan_version(pTHX_ const char *s, bool strict,
4390 const char **errstr,
4391 bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha) {
4392 bool qv = (sqv ? *sqv : FALSE);
4394 int saw_decimal = 0;
4398 PERL_ARGS_ASSERT_PRESCAN_VERSION;
4400 if (qv && isDIGIT(*d))
4401 goto dotted_decimal_version;
4403 if (*d == 'v') { /* explicit v-string */
4408 else { /* degenerate v-string */
4409 /* requires v1.2.3 */
4410 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4413 dotted_decimal_version:
4414 if (strict && d[0] == '0' && isDIGIT(d[1])) {
4415 /* no leading zeros allowed */
4416 BADVERSION(s,errstr,"Invalid version format (no leading zeros)");
4419 while (isDIGIT(*d)) /* integer part */
4425 d++; /* decimal point */
4430 /* require v1.2.3 */
4431 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4434 goto version_prescan_finish;
4441 while (isDIGIT(*d)) { /* just keep reading */
4443 while (isDIGIT(*d)) {
4445 /* maximum 3 digits between decimal */
4446 if (strict && j > 3) {
4447 BADVERSION(s,errstr,"Invalid version format (maximum 3 digits between decimals)");
4452 BADVERSION(s,errstr,"Invalid version format (no underscores)");
4455 BADVERSION(s,errstr,"Invalid version format (multiple underscores)");
4460 else if (*d == '.') {
4462 BADVERSION(s,errstr,"Invalid version format (underscores before decimal)");
4467 else if (!isDIGIT(*d)) {
4473 if (strict && i < 2) {
4474 /* requires v1.2.3 */
4475 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions require at least three parts)");
4478 } /* end if dotted-decimal */
4480 { /* decimal versions */
4481 /* special strict case for leading '.' or '0' */
4484 BADVERSION(s,errstr,"Invalid version format (0 before decimal required)");
4486 if (*d == '0' && isDIGIT(d[1])) {
4487 BADVERSION(s,errstr,"Invalid version format (no leading zeros)");
4491 /* consume all of the integer part */
4495 /* look for a fractional part */
4497 /* we found it, so consume it */
4501 else if (!*d || *d == ';' || isSPACE(*d) || *d == '{' || *d == '}') {
4504 BADVERSION(s,errstr,"Invalid version format (version required)");
4506 /* found just an integer */
4507 goto version_prescan_finish;
4509 else if ( *d == '-') {
4510 BADVERSION(s,errstr,"Invalid version format (negative version number)");
4512 else if ( d == s ) {
4513 /* didn't find either integer or period */
4514 BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4516 else if (*d == '_') {
4517 /* underscore can't come after integer part */
4519 BADVERSION(s,errstr,"Invalid version format (no underscores)");
4521 else if (isDIGIT(d[1])) {
4522 BADVERSION(s,errstr,"Invalid version format (alpha without decimal)");
4525 BADVERSION(s,errstr,"Invalid version format (misplaced underscore)");
4529 /* anything else after integer part is just invalid data */
4530 BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4533 /* scan the fractional part after the decimal point*/
4535 if (!isDIGIT(*d) && (strict || ! (!*d || *d == ';' || isSPACE(*d) || *d == '{' || *d == '}') )) {
4536 /* strict or lax-but-not-the-end */
4537 BADVERSION(s,errstr,"Invalid version format (fractional part required)");
4540 while (isDIGIT(*d)) {
4542 if (*d == '.' && isDIGIT(d[-1])) {
4544 BADVERSION(s,errstr,"Invalid version format (underscores before decimal)");
4547 BADVERSION(s,errstr,"Invalid version format (dotted-decimal versions must begin with 'v')");
4549 d = (char *)s; /* start all over again */
4551 goto dotted_decimal_version;
4555 BADVERSION(s,errstr,"Invalid version format (no underscores)");
4558 BADVERSION(s,errstr,"Invalid version format (multiple underscores)");
4560 if ( ! isDIGIT(d[1]) ) {
4561 BADVERSION(s,errstr,"Invalid version format (misplaced underscore)");
4569 version_prescan_finish:
4573 if (!isDIGIT(*d) && (! (!*d || *d == ';' || *d == '{' || *d == '}') )) {
4574 /* trailing non-numeric data */
4575 BADVERSION(s,errstr,"Invalid version format (non-numeric data)");
4583 *ssaw_decimal = saw_decimal;
4590 =for apidoc scan_version
4592 Returns a pointer to the next character after the parsed
4593 version string, as well as upgrading the passed in SV to
4596 Function must be called with an already existing SV like
4599 s = scan_version(s, SV *sv, bool qv);
4601 Performs some preprocessing to the string to ensure that
4602 it has the correct characteristics of a version. Flags the
4603 object if it contains an underscore (which denotes this
4604 is an alpha version). The boolean qv denotes that the version
4605 should be interpreted as if it had multiple decimals, even if
4612 Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv)
4617 const char *errstr = NULL;
4618 int saw_decimal = 0;
4622 AV * const av = newAV();
4623 SV * const hv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
4625 PERL_ARGS_ASSERT_SCAN_VERSION;
4627 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
4629 #ifndef NODEFAULT_SHAREKEYS
4630 HvSHAREKEYS_on(hv); /* key-sharing on by default */
4633 while (isSPACE(*s)) /* leading whitespace is OK */
4636 last = prescan_version(s, FALSE, &errstr, &qv, &saw_decimal, &width, &alpha);
4638 /* "undef" is a special case and not an error */
4639 if ( ! ( *s == 'u' && strEQ(s,"undef")) ) {
4640 Perl_croak(aTHX_ "%s", errstr);
4650 (void)hv_stores(MUTABLE_HV(hv), "qv", newSViv(qv));
4652 (void)hv_stores(MUTABLE_HV(hv), "alpha", newSViv(alpha));
4653 if ( !qv && width < 3 )
4654 (void)hv_stores(MUTABLE_HV(hv), "width", newSViv(width));
4656 while (isDIGIT(*pos))
4658 if (!isALPHA(*pos)) {
4664 /* this is atoi() that delimits on underscores */
4665 const char *end = pos;
4669 /* the following if() will only be true after the decimal
4670 * point of a version originally created with a bare
4671 * floating point number, i.e. not quoted in any way
4673 if ( !qv && s > start && saw_decimal == 1 ) {
4677 rev += (*s - '0') * mult;
4679 if ( (PERL_ABS(orev) > PERL_ABS(rev))
4680 || (PERL_ABS(rev) > VERSION_MAX )) {
4681 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4682 "Integer overflow in version %d",VERSION_MAX);
4693 while (--end >= s) {
4695 rev += (*end - '0') * mult;
4697 if ( (PERL_ABS(orev) > PERL_ABS(rev))
4698 || (PERL_ABS(rev) > VERSION_MAX )) {
4699 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4700 "Integer overflow in version");
4709 /* Append revision */
4710 av_push(av, newSViv(rev));
4715 else if ( *pos == '.' )
4717 else if ( *pos == '_' && isDIGIT(pos[1]) )
4719 else if ( *pos == ',' && isDIGIT(pos[1]) )
4721 else if ( isDIGIT(*pos) )
4728 while ( isDIGIT(*pos) )
4733 while ( ( isDIGIT(*pos) || *pos == '_' ) && digits < 3 ) {
4741 if ( qv ) { /* quoted versions always get at least three terms*/
4742 I32 len = av_len(av);
4743 /* This for loop appears to trigger a compiler bug on OS X, as it
4744 loops infinitely. Yes, len is negative. No, it makes no sense.
4745 Compiler in question is:
4746 gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
4747 for ( len = 2 - len; len > 0; len-- )
4748 av_push(MUTABLE_AV(sv), newSViv(0));
4752 av_push(av, newSViv(0));
4755 /* need to save off the current version string for later */
4757 SV * orig = newSVpvn("v.Inf", sizeof("v.Inf")-1);
4758 (void)hv_stores(MUTABLE_HV(hv), "original", orig);
4759 (void)hv_stores(MUTABLE_HV(hv), "vinf", newSViv(1));
4761 else if ( s > start ) {
4762 SV * orig = newSVpvn(start,s-start);
4763 if ( qv && saw_decimal == 1 && *start != 'v' ) {
4764 /* need to insert a v to be consistent */
4765 sv_insert(orig, 0, 0, "v", 1);
4767 (void)hv_stores(MUTABLE_HV(hv), "original", orig);
4770 (void)hv_stores(MUTABLE_HV(hv), "original", newSVpvs("0"));
4771 av_push(av, newSViv(0));
4774 /* And finally, store the AV in the hash */
4775 (void)hv_stores(MUTABLE_HV(hv), "version", newRV_noinc(MUTABLE_SV(av)));
4777 /* fix RT#19517 - special case 'undef' as string */
4778 if ( *s == 'u' && strEQ(s,"undef") ) {
4786 =for apidoc new_version
4788 Returns a new version object based on the passed in SV:
4790 SV *sv = new_version(SV *ver);
4792 Does not alter the passed in ver SV. See "upg_version" if you
4793 want to upgrade the SV.
4799 Perl_new_version(pTHX_ SV *ver)
4802 SV * const rv = newSV(0);
4803 PERL_ARGS_ASSERT_NEW_VERSION;
4804 if ( sv_derived_from(ver,"version") ) /* can just copy directly */
4807 AV * const av = newAV();
4809 /* This will get reblessed later if a derived class*/
4810 SV * const hv = newSVrv(rv, "version");
4811 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
4812 #ifndef NODEFAULT_SHAREKEYS
4813 HvSHAREKEYS_on(hv); /* key-sharing on by default */
4819 /* Begin copying all of the elements */
4820 if ( hv_exists(MUTABLE_HV(ver), "qv", 2) )
4821 (void)hv_stores(MUTABLE_HV(hv), "qv", newSViv(1));
4823 if ( hv_exists(MUTABLE_HV(ver), "alpha", 5) )
4824 (void)hv_stores(MUTABLE_HV(hv), "alpha", newSViv(1));
4826 if ( hv_exists(MUTABLE_HV(ver), "width", 5 ) )
4828 const I32 width = SvIV(*hv_fetchs(MUTABLE_HV(ver), "width", FALSE));
4829 (void)hv_stores(MUTABLE_HV(hv), "width", newSViv(width));
4832 if ( hv_exists(MUTABLE_HV(ver), "original", 8 ) )
4834 SV * pv = *hv_fetchs(MUTABLE_HV(ver), "original", FALSE);
4835 (void)hv_stores(MUTABLE_HV(hv), "original", newSVsv(pv));
4838 sav = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(ver), "version", FALSE)));
4839 /* This will get reblessed later if a derived class*/
4840 for ( key = 0; key <= av_len(sav); key++ )
4842 const I32 rev = SvIV(*av_fetch(sav, key, FALSE));
4843 av_push(av, newSViv(rev));
4846 (void)hv_stores(MUTABLE_HV(hv), "version", newRV_noinc(MUTABLE_SV(av)));
4851 const MAGIC* const mg = SvVSTRING_mg(ver);
4852 if ( mg ) { /* already a v-string */
4853 const STRLEN len = mg->mg_len;
4854 char * const version = savepvn( (const char*)mg->mg_ptr, len);
4855 sv_setpvn(rv,version,len);
4856 /* this is for consistency with the pure Perl class */
4857 if ( isDIGIT(*version) )
4858 sv_insert(rv, 0, 0, "v", 1);
4863 sv_setsv(rv,ver); /* make a duplicate */
4868 return upg_version(rv, FALSE);
4872 =for apidoc upg_version
4874 In-place upgrade of the supplied SV to a version object.
4876 SV *sv = upg_version(SV *sv, bool qv);
4878 Returns a pointer to the upgraded SV. Set the boolean qv if you want
4879 to force this SV to be interpreted as an "extended" version.
4885 Perl_upg_version(pTHX_ SV *ver, bool qv)
4887 const char *version, *s;
4892 PERL_ARGS_ASSERT_UPG_VERSION;
4894 if ( SvNOK(ver) && !( SvPOK(ver) && sv_len(ver) == 3 ) )
4896 /* may get too much accuracy */
4898 #ifdef USE_LOCALE_NUMERIC
4899 char *loc = setlocale(LC_NUMERIC, "C");
4901 STRLEN len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
4902 #ifdef USE_LOCALE_NUMERIC
4903 setlocale(LC_NUMERIC, loc);
4905 while (tbuf[len-1] == '0' && len > 0) len--;
4906 if ( tbuf[len-1] == '.' ) len--; /* eat the trailing decimal */
4907 version = savepvn(tbuf, len);
4910 else if ( (mg = SvVSTRING_mg(ver)) ) { /* already a v-string */
4911 version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
4915 else /* must be a string or something like a string */
4918 version = savepv(SvPV(ver,len));
4920 # if PERL_VERSION > 5
4921 /* This will only be executed for 5.6.0 - 5.8.0 inclusive */
4922 if ( len >= 3 && !instr(version,".") && !instr(version,"_")) {
4923 /* may be a v-string */
4924 char *testv = (char *)version;
4926 for (tlen=0; tlen < len; tlen++, testv++) {
4927 /* if one of the characters is non-text assume v-string */
4928 if (testv[0] < ' ') {
4929 SV * const nsv = sv_newmortal();
4932 int saw_decimal = 0;
4933 sv_setpvf(nsv,"v%vd",ver);
4934 pos = nver = savepv(SvPV_nolen(nsv));
4936 /* scan the resulting formatted string */
4937 pos++; /* skip the leading 'v' */
4938 while ( *pos == '.' || isDIGIT(*pos) ) {
4944 /* is definitely a v-string */
4945 if ( saw_decimal >= 2 ) {
4957 s = scan_version(version, ver, qv);
4959 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4960 "Version string '%s' contains invalid data; "
4961 "ignoring: '%s'", version, s);
4969 Validates that the SV contains valid internal structure for a version object.
4970 It may be passed either the version object (RV) or the hash itself (HV). If
4971 the structure is valid, it returns the HV. If the structure is invalid,
4974 SV *hv = vverify(sv);
4976 Note that it only confirms the bare minimum structure (so as not to get
4977 confused by derived classes which may contain additional hash entries):
4981 =item * The SV is an HV or a reference to an HV
4983 =item * The hash contains a "version" key
4985 =item * The "version" key has a reference to an AV as its value
4993 Perl_vverify(pTHX_ SV *vs)
4997 PERL_ARGS_ASSERT_VVERIFY;
5002 /* see if the appropriate elements exist */
5003 if ( SvTYPE(vs) == SVt_PVHV
5004 && hv_exists(MUTABLE_HV(vs), "version", 7)
5005 && (sv = SvRV(*hv_fetchs(MUTABLE_HV(vs), "version", FALSE)))
5006 && SvTYPE(sv) == SVt_PVAV )
5015 Accepts a version object and returns the normalized floating
5016 point representation. Call like:
5020 NOTE: you can pass either the object directly or the SV
5021 contained within the RV.
5023 The SV returned has a refcount of 1.
5029 Perl_vnumify(pTHX_ SV *vs)
5037 PERL_ARGS_ASSERT_VNUMIFY;