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