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