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