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