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