This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Inlining del_HE is actually a space optimisation.
[perl5.git] / util.c
CommitLineData
a0d0e21e 1/* util.c
a687059c 2 *
4bb101f2 3 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
770526c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 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/*
12 * "Very useful, no doubt, that was to Saruman; yet it seems that he was
13 * not content." --Gandalf
14 */
8d063cd8 15
166f8a29
DM
16/* This file contains assorted utility routines.
17 * Which is a polite way of saying any stuff that people couldn't think of
18 * a better place for. Amongst other things, it includes the warning and
19 * dieing stuff, plus wrappers for malloc code.
20 */
21
8d063cd8 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_UTIL_C
8d063cd8 24#include "perl.h"
62b28dd9 25
64ca3a65 26#ifndef PERL_MICRO
a687059c 27#include <signal.h>
36477c24 28#ifndef SIG_ERR
29# define SIG_ERR ((Sighandler_t) -1)
30#endif
64ca3a65 31#endif
36477c24 32
172d2248
OS
33#ifdef __Lynx__
34/* Missing protos on LynxOS */
35int putenv(char *);
36#endif
37
ff68c719 38#ifdef I_SYS_WAIT
39# include <sys/wait.h>
40#endif
41
868439a2
JH
42#ifdef HAS_SELECT
43# ifdef I_SYS_SELECT
44# include <sys/select.h>
45# endif
46#endif
47
8d063cd8 48#define FLUSH
8d063cd8 49
16cebae2
GS
50#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
51# define FD_CLOEXEC 1 /* NeXT needs this */
52#endif
53
a687059c
LW
54/* NOTE: Do not call the next three routines directly. Use the macros
55 * in handy.h, so that we can easily redefine everything to do tracking of
56 * allocated hunks back to the original New to track down any memory leaks.
20cec16a 57 * XXX This advice seems to be widely ignored :-( --AD August 1996.
a687059c
LW
58 */
59
26fa51c3
AMS
60/* paranoid version of system's malloc() */
61
bd4080b3 62Malloc_t
4f63d024 63Perl_safesysmalloc(MEM_SIZE size)
8d063cd8 64{
54aff467 65 dTHX;
bd4080b3 66 Malloc_t ptr;
55497cff 67#ifdef HAS_64K_LIMIT
62b28dd9 68 if (size > 0xffff) {
bf49b057 69 PerlIO_printf(Perl_error_log,
16cebae2 70 "Allocation too large: %lx\n", size) FLUSH;
54aff467 71 my_exit(1);
62b28dd9 72 }
55497cff 73#endif /* HAS_64K_LIMIT */
34de22dd
LW
74#ifdef DEBUGGING
75 if ((long)size < 0)
4f63d024 76 Perl_croak_nocontext("panic: malloc");
34de22dd 77#endif
12ae5dfc 78 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 79 PERL_ALLOC_CHECK(ptr);
97835f67 80 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) malloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
8d063cd8
LW
81 if (ptr != Nullch)
82 return ptr;
3280af22 83 else if (PL_nomemok)
7c0587c8 84 return Nullch;
8d063cd8 85 else {
e0767201
GA
86 /* Can't use PerlIO to write as it allocates memory */
87 PerlLIO_write(PerlIO_fileno(Perl_error_log),
88 PL_no_mem, strlen(PL_no_mem));
54aff467 89 my_exit(1);
3aed30dc 90 return Nullch;
8d063cd8
LW
91 }
92 /*NOTREACHED*/
93}
94
f2517201 95/* paranoid version of system's realloc() */
8d063cd8 96
bd4080b3 97Malloc_t
4f63d024 98Perl_safesysrealloc(Malloc_t where,MEM_SIZE size)
8d063cd8 99{
54aff467 100 dTHX;
bd4080b3 101 Malloc_t ptr;
9a34ef1d 102#if !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) && !defined(PERL_MICRO)
6ad3d225 103 Malloc_t PerlMem_realloc();
ecfc5424 104#endif /* !defined(STANDARD_C) && !defined(HAS_REALLOC_PROTOTYPE) */
8d063cd8 105
a1d180c4 106#ifdef HAS_64K_LIMIT
5f05dabc 107 if (size > 0xffff) {
bf49b057 108 PerlIO_printf(Perl_error_log,
5f05dabc 109 "Reallocation too large: %lx\n", size) FLUSH;
54aff467 110 my_exit(1);
5f05dabc 111 }
55497cff 112#endif /* HAS_64K_LIMIT */
7614df0c 113 if (!size) {
f2517201 114 safesysfree(where);
7614df0c
JD
115 return NULL;
116 }
117
378cc40b 118 if (!where)
f2517201 119 return safesysmalloc(size);
34de22dd
LW
120#ifdef DEBUGGING
121 if ((long)size < 0)
4f63d024 122 Perl_croak_nocontext("panic: realloc");
34de22dd 123#endif
12ae5dfc 124 ptr = (Malloc_t)PerlMem_realloc(where,size);
da927450 125 PERL_ALLOC_CHECK(ptr);
a1d180c4 126
97835f67
JH
127 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++));
128 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size));
79072805 129
8d063cd8
LW
130 if (ptr != Nullch)
131 return ptr;
3280af22 132 else if (PL_nomemok)
7c0587c8 133 return Nullch;
8d063cd8 134 else {
e0767201
GA
135 /* Can't use PerlIO to write as it allocates memory */
136 PerlLIO_write(PerlIO_fileno(Perl_error_log),
137 PL_no_mem, strlen(PL_no_mem));
54aff467 138 my_exit(1);
4e35701f 139 return Nullch;
8d063cd8
LW
140 }
141 /*NOTREACHED*/
142}
143
f2517201 144/* safe version of system's free() */
8d063cd8 145
54310121 146Free_t
4f63d024 147Perl_safesysfree(Malloc_t where)
8d063cd8 148{
27da23d5 149 dVAR;
155aba94 150#ifdef PERL_IMPLICIT_SYS
54aff467 151 dTHX;
155aba94 152#endif
97835f67 153 DEBUG_m( PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) free\n",PTR2UV(where),(long)PL_an++));
378cc40b 154 if (where) {
6ad3d225 155 PerlMem_free(where);
378cc40b 156 }
8d063cd8
LW
157}
158
f2517201 159/* safe version of system's calloc() */
1050c9ca 160
bd4080b3 161Malloc_t
4f63d024 162Perl_safesyscalloc(MEM_SIZE count, MEM_SIZE size)
1050c9ca 163{
54aff467 164 dTHX;
bd4080b3 165 Malloc_t ptr;
1050c9ca 166
55497cff 167#ifdef HAS_64K_LIMIT
5f05dabc 168 if (size * count > 0xffff) {
bf49b057 169 PerlIO_printf(Perl_error_log,
5f05dabc 170 "Allocation too large: %lx\n", size * count) FLUSH;
54aff467 171 my_exit(1);
5f05dabc 172 }
55497cff 173#endif /* HAS_64K_LIMIT */
1050c9ca 174#ifdef DEBUGGING
175 if ((long)size < 0 || (long)count < 0)
4f63d024 176 Perl_croak_nocontext("panic: calloc");
1050c9ca 177#endif
0b7c1c42 178 size *= count;
12ae5dfc 179 ptr = (Malloc_t)PerlMem_malloc(size?size:1); /* malloc(0) is NASTY on our system */
da927450 180 PERL_ALLOC_CHECK(ptr);
97835f67 181 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) calloc %ld x %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)count,(long)size));
1050c9ca 182 if (ptr != Nullch) {
183 memset((void*)ptr, 0, size);
184 return ptr;
185 }
3280af22 186 else if (PL_nomemok)
1050c9ca 187 return Nullch;
188 else {
e0767201
GA
189 /* Can't use PerlIO to write as it allocates memory */
190 PerlLIO_write(PerlIO_fileno(Perl_error_log),
191 PL_no_mem, strlen(PL_no_mem));
54aff467 192 my_exit(1);
4e35701f 193 return Nullch;
1050c9ca 194 }
195 /*NOTREACHED*/
196}
197
cae6d0e5
GS
198/* These must be defined when not using Perl's malloc for binary
199 * compatibility */
200
201#ifndef MYMALLOC
202
203Malloc_t Perl_malloc (MEM_SIZE nbytes)
204{
205 dTHXs;
077a72a9 206 return (Malloc_t)PerlMem_malloc(nbytes);
cae6d0e5
GS
207}
208
209Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size)
210{
211 dTHXs;
077a72a9 212 return (Malloc_t)PerlMem_calloc(elements, size);
cae6d0e5
GS
213}
214
215Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes)
216{
217 dTHXs;
077a72a9 218 return (Malloc_t)PerlMem_realloc(where, nbytes);
cae6d0e5
GS
219}
220
221Free_t Perl_mfree (Malloc_t where)
222{
223 dTHXs;
224 PerlMem_free(where);
225}
226
227#endif
228
8d063cd8
LW
229/* copy a string up to some (non-backslashed) delimiter, if any */
230
231char *
e1ec3a88 232Perl_delimcpy(pTHX_ register char *to, register const char *toend, register const char *from, register const char *fromend, register int delim, I32 *retlen)
8d063cd8 233{
fc36a67e 234 register I32 tolen;
235 for (tolen = 0; from < fromend; from++, tolen++) {
378cc40b
LW
236 if (*from == '\\') {
237 if (from[1] == delim)
238 from++;
fc36a67e 239 else {
240 if (to < toend)
241 *to++ = *from;
242 tolen++;
243 from++;
244 }
378cc40b 245 }
bedebaa5 246 else if (*from == delim)
8d063cd8 247 break;
fc36a67e 248 if (to < toend)
249 *to++ = *from;
8d063cd8 250 }
bedebaa5
CS
251 if (to < toend)
252 *to = '\0';
fc36a67e 253 *retlen = tolen;
73d840c0 254 return (char *)from;
8d063cd8
LW
255}
256
257/* return ptr to little string in big string, NULL if not found */
378cc40b 258/* This routine was donated by Corey Satten. */
8d063cd8
LW
259
260char *
864dbfa3 261Perl_instr(pTHX_ register const char *big, register const char *little)
378cc40b 262{
79072805 263 register I32 first;
378cc40b 264
a687059c 265 if (!little)
08105a92 266 return (char*)big;
a687059c 267 first = *little++;
378cc40b 268 if (!first)
08105a92 269 return (char*)big;
378cc40b 270 while (*big) {
66a1b24b 271 register const char *s, *x;
378cc40b
LW
272 if (*big++ != first)
273 continue;
274 for (x=big,s=little; *s; /**/ ) {
275 if (!*x)
276 return Nullch;
277 if (*s++ != *x++) {
278 s--;
279 break;
280 }
281 }
282 if (!*s)
08105a92 283 return (char*)(big-1);
378cc40b
LW
284 }
285 return Nullch;
286}
8d063cd8 287
a687059c
LW
288/* same as instr but allow embedded nulls */
289
290char *
864dbfa3 291Perl_ninstr(pTHX_ register const char *big, register const char *bigend, const char *little, const char *lend)
8d063cd8 292{
e1ec3a88 293 register const I32 first = *little;
08105a92 294 register const char *littleend = lend;
378cc40b 295
a0d0e21e 296 if (!first && little >= littleend)
08105a92 297 return (char*)big;
de3bb511
LW
298 if (bigend - big < littleend - little)
299 return Nullch;
a687059c
LW
300 bigend -= littleend - little++;
301 while (big <= bigend) {
66a1b24b 302 register const char *s, *x;
a687059c
LW
303 if (*big++ != first)
304 continue;
305 for (x=big,s=little; s < littleend; /**/ ) {
306 if (*s++ != *x++) {
307 s--;
308 break;
309 }
310 }
311 if (s >= littleend)
08105a92 312 return (char*)(big-1);
378cc40b 313 }
a687059c
LW
314 return Nullch;
315}
316
317/* reverse of the above--find last substring */
318
319char *
864dbfa3 320Perl_rninstr(pTHX_ register const char *big, const char *bigend, const char *little, const char *lend)
a687059c 321{
08105a92 322 register const char *bigbeg;
e1ec3a88 323 register const I32 first = *little;
08105a92 324 register const char *littleend = lend;
a687059c 325
a0d0e21e 326 if (!first && little >= littleend)
08105a92 327 return (char*)bigend;
a687059c
LW
328 bigbeg = big;
329 big = bigend - (littleend - little++);
330 while (big >= bigbeg) {
66a1b24b 331 register const char *s, *x;
a687059c
LW
332 if (*big-- != first)
333 continue;
334 for (x=big+2,s=little; s < littleend; /**/ ) {
335 if (*s++ != *x++) {
336 s--;
337 break;
338 }
339 }
340 if (s >= littleend)
08105a92 341 return (char*)(big+1);
378cc40b 342 }
a687059c 343 return Nullch;
378cc40b 344}
a687059c 345
cf93c79d
IZ
346#define FBM_TABLE_OFFSET 2 /* Number of bytes between EOS and table*/
347
348/* As a space optimization, we do not compile tables for strings of length
349 0 and 1, and for strings of length 2 unless FBMcf_TAIL. These are
350 special-cased in fbm_instr().
351
352 If FBMcf_TAIL, the table is created as if the string has a trailing \n. */
353
954c1994 354/*
ccfc67b7
JH
355=head1 Miscellaneous Functions
356
954c1994
GS
357=for apidoc fbm_compile
358
359Analyses the string in order to make fast searches on it using fbm_instr()
360-- the Boyer-Moore algorithm.
361
362=cut
363*/
364
378cc40b 365void
7506f9c3 366Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
378cc40b 367{
9cbe880b 368 const register U8 *s;
942e002e 369 register U8 *table;
79072805 370 register U32 i;
0b71040e 371 STRLEN len;
79072805
LW
372 I32 rarest = 0;
373 U32 frequency = 256;
374
c517dc2b
JH
375 if (flags & FBMcf_TAIL) {
376 MAGIC *mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
cf93c79d 377 sv_catpvn(sv, "\n", 1); /* Taken into account in fbm_instr() */
c517dc2b
JH
378 if (mg && mg->mg_len >= 0)
379 mg->mg_len++;
380 }
9cbe880b 381 s = (U8*)SvPV_force_mutable(sv, len);
862a34c6 382 SvUPGRADE(sv, SVt_PVBM);
d1be9408 383 if (len == 0) /* TAIL might be on a zero-length string. */
cf93c79d 384 return;
02128f11 385 if (len > 2) {
9cbe880b 386 const unsigned char *sb;
66a1b24b 387 const U8 mlen = (len>255) ? 255 : (U8)len;
cf93c79d 388
7506f9c3 389 Sv_Grow(sv, len + 256 + FBM_TABLE_OFFSET);
9cbe880b 390 table = (unsigned char*)(SvPVX_mutable(sv) + len + FBM_TABLE_OFFSET);
7506f9c3
GS
391 s = table - 1 - FBM_TABLE_OFFSET; /* last char */
392 memset((void*)table, mlen, 256);
393 table[-1] = (U8)flags;
02128f11 394 i = 0;
7506f9c3 395 sb = s - mlen + 1; /* first char (maybe) */
cf93c79d
IZ
396 while (s >= sb) {
397 if (table[*s] == mlen)
7506f9c3 398 table[*s] = (U8)i;
cf93c79d
IZ
399 s--, i++;
400 }
378cc40b 401 }
14befaf4 402 sv_magic(sv, Nullsv, PERL_MAGIC_bm, Nullch, 0); /* deep magic */
79072805 403 SvVALID_on(sv);
378cc40b 404
9cbe880b 405 s = (const unsigned char*)(SvPVX_const(sv)); /* deeper magic */
bbce6d69 406 for (i = 0; i < len; i++) {
22c35a8c 407 if (PL_freq[s[i]] < frequency) {
bbce6d69 408 rarest = i;
22c35a8c 409 frequency = PL_freq[s[i]];
378cc40b
LW
410 }
411 }
79072805 412 BmRARE(sv) = s[rarest];
eb160463 413 BmPREVIOUS(sv) = (U16)rarest;
cf93c79d
IZ
414 BmUSEFUL(sv) = 100; /* Initial value */
415 if (flags & FBMcf_TAIL)
416 SvTAIL_on(sv);
7506f9c3
GS
417 DEBUG_r(PerlIO_printf(Perl_debug_log, "rarest char %c at %d\n",
418 BmRARE(sv),BmPREVIOUS(sv)));
378cc40b
LW
419}
420
cf93c79d
IZ
421/* If SvTAIL(littlestr), it has a fake '\n' at end. */
422/* If SvTAIL is actually due to \Z or \z, this gives false positives
423 if multiline */
424
954c1994
GS
425/*
426=for apidoc fbm_instr
427
428Returns the location of the SV in the string delimited by C<str> and
429C<strend>. It returns C<Nullch> if the string can't be found. The C<sv>
430does not have to be fbm_compiled, but the search will not be as fast
431then.
432
433=cut
434*/
435
378cc40b 436char *
864dbfa3 437Perl_fbm_instr(pTHX_ unsigned char *big, register unsigned char *bigend, SV *littlestr, U32 flags)
378cc40b 438{
a687059c 439 register unsigned char *s;
cf93c79d 440 STRLEN l;
9cbe880b
NC
441 register const unsigned char *little
442 = (const unsigned char *)SvPV_const(littlestr,l);
cf93c79d 443 register STRLEN littlelen = l;
e1ec3a88 444 register const I32 multiline = flags & FBMrf_MULTILINE;
cf93c79d 445
eb160463 446 if ((STRLEN)(bigend - big) < littlelen) {
a1d180c4 447 if ( SvTAIL(littlestr)
eb160463 448 && ((STRLEN)(bigend - big) == littlelen - 1)
a1d180c4 449 && (littlelen == 1
12ae5dfc 450 || (*big == *little &&
27da23d5 451 memEQ((char *)big, (char *)little, littlelen - 1))))
cf93c79d
IZ
452 return (char*)big;
453 return Nullch;
454 }
378cc40b 455
cf93c79d 456 if (littlelen <= 2) { /* Special-cased */
cf93c79d
IZ
457
458 if (littlelen == 1) {
459 if (SvTAIL(littlestr) && !multiline) { /* Anchor only! */
460 /* Know that bigend != big. */
461 if (bigend[-1] == '\n')
462 return (char *)(bigend - 1);
463 return (char *) bigend;
464 }
465 s = big;
466 while (s < bigend) {
467 if (*s == *little)
468 return (char *)s;
469 s++;
470 }
471 if (SvTAIL(littlestr))
472 return (char *) bigend;
473 return Nullch;
474 }
475 if (!littlelen)
476 return (char*)big; /* Cannot be SvTAIL! */
477
478 /* littlelen is 2 */
479 if (SvTAIL(littlestr) && !multiline) {
480 if (bigend[-1] == '\n' && bigend[-2] == *little)
481 return (char*)bigend - 2;
482 if (bigend[-1] == *little)
483 return (char*)bigend - 1;
484 return Nullch;
485 }
486 {
487 /* This should be better than FBM if c1 == c2, and almost
488 as good otherwise: maybe better since we do less indirection.
489 And we save a lot of memory by caching no table. */
66a1b24b
AL
490 const unsigned char c1 = little[0];
491 const unsigned char c2 = little[1];
cf93c79d
IZ
492
493 s = big + 1;
494 bigend--;
495 if (c1 != c2) {
496 while (s <= bigend) {
497 if (s[0] == c2) {
498 if (s[-1] == c1)
499 return (char*)s - 1;
500 s += 2;
501 continue;
3fe6f2dc 502 }
cf93c79d
IZ
503 next_chars:
504 if (s[0] == c1) {
505 if (s == bigend)
506 goto check_1char_anchor;
507 if (s[1] == c2)
508 return (char*)s;
509 else {
510 s++;
511 goto next_chars;
512 }
513 }
514 else
515 s += 2;
516 }
517 goto check_1char_anchor;
518 }
519 /* Now c1 == c2 */
520 while (s <= bigend) {
521 if (s[0] == c1) {
522 if (s[-1] == c1)
523 return (char*)s - 1;
524 if (s == bigend)
525 goto check_1char_anchor;
526 if (s[1] == c1)
527 return (char*)s;
528 s += 3;
02128f11 529 }
c277df42 530 else
cf93c79d 531 s += 2;
c277df42 532 }
c277df42 533 }
cf93c79d
IZ
534 check_1char_anchor: /* One char and anchor! */
535 if (SvTAIL(littlestr) && (*bigend == *little))
536 return (char *)bigend; /* bigend is already decremented. */
537 return Nullch;
d48672a2 538 }
cf93c79d 539 if (SvTAIL(littlestr) && !multiline) { /* tail anchored? */
bbce6d69 540 s = bigend - littlelen;
a1d180c4 541 if (s >= big && bigend[-1] == '\n' && *s == *little
cf93c79d
IZ
542 /* Automatically of length > 2 */
543 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
7506f9c3 544 {
bbce6d69 545 return (char*)s; /* how sweet it is */
7506f9c3
GS
546 }
547 if (s[1] == *little
548 && memEQ((char*)s + 2, (char*)little + 1, littlelen - 2))
549 {
cf93c79d 550 return (char*)s + 1; /* how sweet it is */
7506f9c3 551 }
02128f11
IZ
552 return Nullch;
553 }
cf93c79d
IZ
554 if (SvTYPE(littlestr) != SVt_PVBM || !SvVALID(littlestr)) {
555 char *b = ninstr((char*)big,(char*)bigend,
556 (char*)little, (char*)little + littlelen);
557
558 if (!b && SvTAIL(littlestr)) { /* Automatically multiline! */
559 /* Chop \n from littlestr: */
560 s = bigend - littlelen + 1;
7506f9c3
GS
561 if (*s == *little
562 && memEQ((char*)s + 1, (char*)little + 1, littlelen - 2))
563 {
3fe6f2dc 564 return (char*)s;
7506f9c3 565 }
cf93c79d 566 return Nullch;
a687059c 567 }
cf93c79d 568 return b;
a687059c 569 }
a1d180c4 570
cf93c79d 571 { /* Do actual FBM. */
e1ec3a88 572 register const unsigned char *table = little + littlelen + FBM_TABLE_OFFSET;
9cbe880b 573 const register unsigned char *oldlittle;
cf93c79d 574
eb160463 575 if (littlelen > (STRLEN)(bigend - big))
cf93c79d
IZ
576 return Nullch;
577 --littlelen; /* Last char found by table lookup */
578
579 s = big + littlelen;
580 little += littlelen; /* last char */
581 oldlittle = little;
582 if (s < bigend) {
583 register I32 tmp;
584
585 top2:
7506f9c3 586 if ((tmp = table[*s])) {
cf93c79d 587 if ((s += tmp) < bigend)
62b28dd9 588 goto top2;
cf93c79d
IZ
589 goto check_end;
590 }
591 else { /* less expensive than calling strncmp() */
66a1b24b 592 register unsigned char * const olds = s;
cf93c79d
IZ
593
594 tmp = littlelen;
595
596 while (tmp--) {
597 if (*--s == *--little)
598 continue;
cf93c79d
IZ
599 s = olds + 1; /* here we pay the price for failure */
600 little = oldlittle;
601 if (s < bigend) /* fake up continue to outer loop */
602 goto top2;
603 goto check_end;
604 }
605 return (char *)s;
a687059c 606 }
378cc40b 607 }
cf93c79d
IZ
608 check_end:
609 if ( s == bigend && (table[-1] & FBMcf_TAIL)
12ae5dfc
JH
610 && memEQ((char *)(bigend - littlelen),
611 (char *)(oldlittle - littlelen), littlelen) )
cf93c79d
IZ
612 return (char*)bigend - littlelen;
613 return Nullch;
378cc40b 614 }
378cc40b
LW
615}
616
c277df42
IZ
617/* start_shift, end_shift are positive quantities which give offsets
618 of ends of some substring of bigstr.
a0288114 619 If "last" we want the last occurrence.
c277df42 620 old_posp is the way of communication between consequent calls if
a1d180c4 621 the next call needs to find the .
c277df42 622 The initial *old_posp should be -1.
cf93c79d
IZ
623
624 Note that we take into account SvTAIL, so one can get extra
625 optimizations if _ALL flag is set.
c277df42
IZ
626 */
627
cf93c79d 628/* If SvTAIL is actually due to \Z or \z, this gives false positives
26fa51c3 629 if PL_multiline. In fact if !PL_multiline the authoritative answer
cf93c79d
IZ
630 is not supported yet. */
631
378cc40b 632char *
864dbfa3 633Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
378cc40b 634{
cfd0369c 635 const register unsigned char *big;
79072805
LW
636 register I32 pos;
637 register I32 previous;
638 register I32 first;
cfd0369c 639 const register unsigned char *little;
c277df42 640 register I32 stop_pos;
cfd0369c 641 const register unsigned char *littleend;
c277df42 642 I32 found = 0;
378cc40b 643
c277df42 644 if (*old_posp == -1
3280af22 645 ? (pos = PL_screamfirst[BmRARE(littlestr)]) < 0
cf93c79d
IZ
646 : (((pos = *old_posp), pos += PL_screamnext[pos]) == 0)) {
647 cant_find:
a1d180c4 648 if ( BmRARE(littlestr) == '\n'
cf93c79d 649 && BmPREVIOUS(littlestr) == SvCUR(littlestr) - 1) {
cfd0369c 650 little = (const unsigned char *)(SvPVX_const(littlestr));
cf93c79d
IZ
651 littleend = little + SvCUR(littlestr);
652 first = *little++;
653 goto check_tail;
654 }
378cc40b 655 return Nullch;
cf93c79d
IZ
656 }
657
cfd0369c 658 little = (const unsigned char *)(SvPVX_const(littlestr));
79072805 659 littleend = little + SvCUR(littlestr);
378cc40b 660 first = *little++;
c277df42 661 /* The value of pos we can start at: */
79072805 662 previous = BmPREVIOUS(littlestr);
cfd0369c 663 big = (const unsigned char *)(SvPVX_const(bigstr));
c277df42
IZ
664 /* The value of pos we can stop at: */
665 stop_pos = SvCUR(bigstr) - end_shift - (SvCUR(littlestr) - 1 - previous);
cf93c79d 666 if (previous + start_shift > stop_pos) {
0fe87f7c
HS
667/*
668 stop_pos does not include SvTAIL in the count, so this check is incorrect
669 (I think) - see [ID 20010618.006] and t/op/study.t. HVDS 2001/06/19
670*/
671#if 0
cf93c79d
IZ
672 if (previous + start_shift == stop_pos + 1) /* A fake '\n'? */
673 goto check_tail;
0fe87f7c 674#endif
cf93c79d
IZ
675 return Nullch;
676 }
c277df42 677 while (pos < previous + start_shift) {
3280af22 678 if (!(pos += PL_screamnext[pos]))
cf93c79d 679 goto cant_find;
378cc40b 680 }
de3bb511 681 big -= previous;
bbce6d69 682 do {
cfd0369c 683 const register unsigned char *s, *x;
ef64f398 684 if (pos >= stop_pos) break;
bbce6d69 685 if (big[pos] != first)
686 continue;
687 for (x=big+pos+1,s=little; s < littleend; /**/ ) {
bbce6d69 688 if (*s++ != *x++) {
689 s--;
690 break;
378cc40b 691 }
bbce6d69 692 }
c277df42
IZ
693 if (s == littleend) {
694 *old_posp = pos;
695 if (!last) return (char *)(big+pos);
696 found = 1;
697 }
3280af22 698 } while ( pos += PL_screamnext[pos] );
a1d180c4 699 if (last && found)
cf93c79d 700 return (char *)(big+(*old_posp));
cf93c79d
IZ
701 check_tail:
702 if (!SvTAIL(littlestr) || (end_shift > 0))
703 return Nullch;
704 /* Ignore the trailing "\n". This code is not microoptimized */
cfd0369c 705 big = (const unsigned char *)(SvPVX_const(bigstr) + SvCUR(bigstr));
cf93c79d
IZ
706 stop_pos = littleend - little; /* Actual littlestr len */
707 if (stop_pos == 0)
708 return (char*)big;
709 big -= stop_pos;
710 if (*big == first
12ae5dfc
JH
711 && ((stop_pos == 1) ||
712 memEQ((char *)(big + 1), (char *)little, stop_pos - 1)))
cf93c79d
IZ
713 return (char*)big;
714 return Nullch;
8d063cd8
LW
715}
716
79072805 717I32
864dbfa3 718Perl_ibcmp(pTHX_ const char *s1, const char *s2, register I32 len)
79072805 719{
e1ec3a88
AL
720 register const U8 *a = (const U8 *)s1;
721 register const U8 *b = (const U8 *)s2;
79072805 722 while (len--) {
22c35a8c 723 if (*a != *b && *a != PL_fold[*b])
bbce6d69 724 return 1;
725 a++,b++;
726 }
727 return 0;
728}
729
730I32
864dbfa3 731Perl_ibcmp_locale(pTHX_ const char *s1, const char *s2, register I32 len)
bbce6d69 732{
27da23d5 733 dVAR;
e1ec3a88
AL
734 register const U8 *a = (const U8 *)s1;
735 register const U8 *b = (const U8 *)s2;
bbce6d69 736 while (len--) {
22c35a8c 737 if (*a != *b && *a != PL_fold_locale[*b])
bbce6d69 738 return 1;
739 a++,b++;
79072805
LW
740 }
741 return 0;
742}
743
8d063cd8
LW
744/* copy a string to a safe spot */
745
954c1994 746/*
ccfc67b7
JH
747=head1 Memory Management
748
954c1994
GS
749=for apidoc savepv
750
61a925ed
AMS
751Perl's version of C<strdup()>. Returns a pointer to a newly allocated
752string which is a duplicate of C<pv>. The size of the string is
753determined by C<strlen()>. The memory allocated for the new string can
754be freed with the C<Safefree()> function.
954c1994
GS
755
756=cut
757*/
758
8d063cd8 759char *
efdfce31 760Perl_savepv(pTHX_ const char *pv)
8d063cd8 761{
e90e2364
NC
762 if (!pv)
763 return Nullch;
66a1b24b
AL
764 else {
765 char *newaddr;
766 const STRLEN pvlen = strlen(pv)+1;
767 New(902,newaddr,pvlen,char);
490a0e98 768 return memcpy(newaddr,pv,pvlen);
66a1b24b 769 }
e90e2364 770
8d063cd8
LW
771}
772
a687059c
LW
773/* same thing but with a known length */
774
954c1994
GS
775/*
776=for apidoc savepvn
777
61a925ed
AMS
778Perl's version of what C<strndup()> would be if it existed. Returns a
779pointer to a newly allocated string which is a duplicate of the first
780C<len> bytes from C<pv>. The memory allocated for the new string can be
781freed with the C<Safefree()> function.
954c1994
GS
782
783=cut
784*/
785
a687059c 786char *
efdfce31 787Perl_savepvn(pTHX_ const char *pv, register I32 len)
a687059c
LW
788{
789 register char *newaddr;
790
791 New(903,newaddr,len+1,char);
92110913 792 /* Give a meaning to NULL pointer mainly for the use in sv_magic() */
efdfce31 793 if (pv) {
e90e2364
NC
794 /* might not be null terminated */
795 newaddr[len] = '\0';
07409e01 796 return (char *) CopyD(pv,newaddr,len,char);
92110913
NIS
797 }
798 else {
07409e01 799 return (char *) ZeroD(newaddr,len+1,char);
92110913 800 }
a687059c
LW
801}
802
05ec9bb3
NIS
803/*
804=for apidoc savesharedpv
805
61a925ed
AMS
806A version of C<savepv()> which allocates the duplicate string in memory
807which is shared between threads.
05ec9bb3
NIS
808
809=cut
810*/
811char *
efdfce31 812Perl_savesharedpv(pTHX_ const char *pv)
05ec9bb3 813{
e90e2364 814 register char *newaddr;
490a0e98 815 STRLEN pvlen;
e90e2364
NC
816 if (!pv)
817 return Nullch;
818
490a0e98
NC
819 pvlen = strlen(pv)+1;
820 newaddr = (char*)PerlMemShared_malloc(pvlen);
e90e2364
NC
821 if (!newaddr) {
822 PerlLIO_write(PerlIO_fileno(Perl_error_log),
823 PL_no_mem, strlen(PL_no_mem));
824 my_exit(1);
05ec9bb3 825 }
490a0e98 826 return memcpy(newaddr,pv,pvlen);
05ec9bb3
NIS
827}
828
2e0de35c
NC
829/*
830=for apidoc savesvpv
831
6832267f 832A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
2e0de35c
NC
833the passed in SV using C<SvPV()>
834
835=cut
836*/
837
838char *
839Perl_savesvpv(pTHX_ SV *sv)
840{
841 STRLEN len;
e62f0680 842 const char *pv = SvPV_const(sv, len);
2e0de35c
NC
843 register char *newaddr;
844
26866f99
NC
845 ++len;
846 New(903,newaddr,len,char);
07409e01 847 return (char *) CopyD(pv,newaddr,len,char);
2e0de35c 848}
05ec9bb3
NIS
849
850
cea2e8a9 851/* the SV for Perl_form() and mess() is not kept in an arena */
fc36a67e 852
76e3520e 853STATIC SV *
cea2e8a9 854S_mess_alloc(pTHX)
fc36a67e 855{
856 SV *sv;
857 XPVMG *any;
858
e72dc28c
GS
859 if (!PL_dirty)
860 return sv_2mortal(newSVpvn("",0));
861
0372dbb6
GS
862 if (PL_mess_sv)
863 return PL_mess_sv;
864
fc36a67e 865 /* Create as PVMG now, to avoid any upgrading later */
866 New(905, sv, 1, SV);
867 Newz(905, any, 1, XPVMG);
868 SvFLAGS(sv) = SVt_PVMG;
869 SvANY(sv) = (void*)any;
cace1726 870 SvPV_set(sv, 0);
fc36a67e 871 SvREFCNT(sv) = 1 << 30; /* practically infinite */
e72dc28c 872 PL_mess_sv = sv;
fc36a67e 873 return sv;
874}
875
c5be433b 876#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
877char *
878Perl_form_nocontext(const char* pat, ...)
879{
880 dTHX;
c5be433b 881 char *retval;
cea2e8a9
GS
882 va_list args;
883 va_start(args, pat);
c5be433b 884 retval = vform(pat, &args);
cea2e8a9 885 va_end(args);
c5be433b 886 return retval;
cea2e8a9 887}
c5be433b 888#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9 889
7c9e965c 890/*
ccfc67b7 891=head1 Miscellaneous Functions
7c9e965c
JP
892=for apidoc form
893
894Takes a sprintf-style format pattern and conventional
895(non-SV) arguments and returns the formatted string.
896
897 (char *) Perl_form(pTHX_ const char* pat, ...)
898
899can be used any place a string (char *) is required:
900
901 char * s = Perl_form("%d.%d",major,minor);
902
903Uses a single private buffer so if you want to format several strings you
904must explicitly copy the earlier strings away (and free the copies when you
905are done).
906
907=cut
908*/
909
8990e307 910char *
864dbfa3 911Perl_form(pTHX_ const char* pat, ...)
8990e307 912{
c5be433b 913 char *retval;
46fc3d4c 914 va_list args;
46fc3d4c 915 va_start(args, pat);
c5be433b 916 retval = vform(pat, &args);
46fc3d4c 917 va_end(args);
c5be433b
GS
918 return retval;
919}
920
921char *
922Perl_vform(pTHX_ const char *pat, va_list *args)
923{
924 SV *sv = mess_alloc();
925 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
e72dc28c 926 return SvPVX(sv);
46fc3d4c 927}
a687059c 928
5a844595
GS
929#if defined(PERL_IMPLICIT_CONTEXT)
930SV *
931Perl_mess_nocontext(const char *pat, ...)
932{
933 dTHX;
934 SV *retval;
935 va_list args;
936 va_start(args, pat);
937 retval = vmess(pat, &args);
938 va_end(args);
939 return retval;
940}
941#endif /* PERL_IMPLICIT_CONTEXT */
942
06bf62c7 943SV *
5a844595
GS
944Perl_mess(pTHX_ const char *pat, ...)
945{
946 SV *retval;
947 va_list args;
948 va_start(args, pat);
949 retval = vmess(pat, &args);
950 va_end(args);
951 return retval;
952}
953
ae7d165c 954STATIC COP*
8772537c 955S_closest_cop(pTHX_ COP *cop, const OP *o)
ae7d165c
PJ
956{
957 /* Look for PL_op starting from o. cop is the last COP we've seen. */
958
959 if (!o || o == PL_op) return cop;
960
961 if (o->op_flags & OPf_KIDS) {
962 OP *kid;
963 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
964 {
965 COP *new_cop;
966
967 /* If the OP_NEXTSTATE has been optimised away we can still use it
968 * the get the file and line number. */
969
970 if (kid->op_type == OP_NULL && kid->op_targ == OP_NEXTSTATE)
971 cop = (COP *)kid;
972
973 /* Keep searching, and return when we've found something. */
974
975 new_cop = closest_cop(cop, kid);
976 if (new_cop) return new_cop;
977 }
978 }
979
980 /* Nothing found. */
981
8772537c 982 return Null(COP *);
ae7d165c
PJ
983}
984
5a844595
GS
985SV *
986Perl_vmess(pTHX_ const char *pat, va_list *args)
46fc3d4c 987{
e72dc28c 988 SV *sv = mess_alloc();
27da23d5 989 static const char dgd[] = " during global destruction.\n";
46fc3d4c 990
fc36a67e 991 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
46fc3d4c 992 if (!SvCUR(sv) || *(SvEND(sv) - 1) != '\n') {
ae7d165c
PJ
993
994 /*
995 * Try and find the file and line for PL_op. This will usually be
996 * PL_curcop, but it might be a cop that has been optimised away. We
997 * can try to find such a cop by searching through the optree starting
998 * from the sibling of PL_curcop.
999 */
1000
e1ec3a88 1001 const COP *cop = closest_cop(PL_curcop, PL_curcop->op_sibling);
ae7d165c
PJ
1002 if (!cop) cop = PL_curcop;
1003
1004 if (CopLINE(cop))
ed094faf 1005 Perl_sv_catpvf(aTHX_ sv, " at %s line %"IVdf,
3aed30dc 1006 OutCopFILE(cop), (IV)CopLINE(cop));
2035c5e8 1007 if (GvIO(PL_last_in_gv) && IoLINES(GvIOp(PL_last_in_gv))) {
e1ec3a88 1008 const bool line_mode = (RsSIMPLE(PL_rs) &&
95a20fc0 1009 SvCUR(PL_rs) == 1 && *SvPVX_const(PL_rs) == '\n');
57def98f 1010 Perl_sv_catpvf(aTHX_ sv, ", <%s> %s %"IVdf,
edc2eac3
JH
1011 PL_last_in_gv == PL_argvgv ?
1012 "" : GvNAME(PL_last_in_gv),
1013 line_mode ? "line" : "chunk",
1014 (IV)IoLINES(GvIOp(PL_last_in_gv)));
a687059c 1015 }
515f54a1 1016 sv_catpv(sv, PL_dirty ? dgd : ".\n");
a687059c 1017 }
06bf62c7 1018 return sv;
a687059c
LW
1019}
1020
7ff03255
SG
1021void
1022Perl_write_to_stderr(pTHX_ const char* message, int msglen)
1023{
27da23d5 1024 dVAR;
7ff03255
SG
1025 IO *io;
1026 MAGIC *mg;
1027
1028 if (PL_stderrgv && SvREFCNT(PL_stderrgv)
1029 && (io = GvIO(PL_stderrgv))
1030 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1031 {
1032 dSP;
1033 ENTER;
1034 SAVETMPS;
1035
1036 save_re_context();
1037 SAVESPTR(PL_stderrgv);
1038 PL_stderrgv = Nullgv;
1039
1040 PUSHSTACKi(PERLSI_MAGIC);
1041
1042 PUSHMARK(SP);
1043 EXTEND(SP,2);
1044 PUSHs(SvTIED_obj((SV*)io, mg));
1045 PUSHs(sv_2mortal(newSVpvn(message, msglen)));
1046 PUTBACK;
1047 call_method("PRINT", G_SCALAR);
1048
1049 POPSTACK;
1050 FREETMPS;
1051 LEAVE;
1052 }
1053 else {
1054#ifdef USE_SFIO
1055 /* SFIO can really mess with your errno */
53c1dcc0 1056 const int e = errno;
7ff03255 1057#endif
53c1dcc0 1058 PerlIO * const serr = Perl_error_log;
7ff03255
SG
1059
1060 PERL_WRITE_MSG_TO_CONSOLE(serr, message, msglen);
1061 (void)PerlIO_flush(serr);
1062#ifdef USE_SFIO
1063 errno = e;
1064#endif
1065 }
1066}
1067
3ab1ac99
NC
1068/* Common code used by vcroak, vdie and vwarner */
1069
e07360fa 1070STATIC void
63315e18
NC
1071S_vdie_common(pTHX_ const char *message, STRLEN msglen, I32 utf8)
1072{
1073 HV *stash;
1074 GV *gv;
1075 CV *cv;
1076 /* sv_2cv might call Perl_croak() */
1077 SV *olddiehook = PL_diehook;
1078
1079 assert(PL_diehook);
1080 ENTER;
1081 SAVESPTR(PL_diehook);
1082 PL_diehook = Nullsv;
1083 cv = sv_2cv(olddiehook, &stash, &gv, 0);
1084 LEAVE;
1085 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
1086 dSP;
1087 SV *msg;
1088
1089 ENTER;
1090 save_re_context();
1091 if (message) {
1092 msg = newSVpvn(message, msglen);
1093 SvFLAGS(msg) |= utf8;
1094 SvREADONLY_on(msg);
1095 SAVEFREESV(msg);
1096 }
1097 else {
1098 msg = ERRSV;
1099 }
1100
1101 PUSHSTACKi(PERLSI_DIEHOOK);
1102 PUSHMARK(SP);
1103 XPUSHs(msg);
1104 PUTBACK;
1105 call_sv((SV*)cv, G_DISCARD);
1106 POPSTACK;
1107 LEAVE;
1108 }
1109}
1110
cfd0369c 1111STATIC const char *
e07360fa
AT
1112S_vdie_croak_common(pTHX_ const char* pat, va_list* args, STRLEN* msglen,
1113 I32* utf8)
1114{
1115 dVAR;
cfd0369c 1116 const char *message;
e07360fa
AT
1117
1118 if (pat) {
1119 SV *msv = vmess(pat, args);
1120 if (PL_errors && SvCUR(PL_errors)) {
1121 sv_catsv(PL_errors, msv);
cfd0369c 1122 message = SvPV_const(PL_errors, *msglen);
e07360fa
AT
1123 SvCUR_set(PL_errors, 0);
1124 }
1125 else
cfd0369c 1126 message = SvPV_const(msv,*msglen);
e07360fa
AT
1127 *utf8 = SvUTF8(msv);
1128 }
1129 else {
1130 message = Nullch;
1131 }
1132
1133 DEBUG_S(PerlIO_printf(Perl_debug_log,
1134 "%p: die/croak: message = %s\ndiehook = %p\n",
1135 thr, message, PL_diehook));
1136 if (PL_diehook) {
1137 S_vdie_common(aTHX_ message, *msglen, *utf8);
1138 }
1139 return message;
1140}
1141
c5be433b
GS
1142OP *
1143Perl_vdie(pTHX_ const char* pat, va_list *args)
36477c24 1144{
73d840c0 1145 const char *message;
e1ec3a88 1146 const int was_in_eval = PL_in_eval;
06bf62c7 1147 STRLEN msglen;
ff882698 1148 I32 utf8 = 0;
36477c24 1149
bf49b057 1150 DEBUG_S(PerlIO_printf(Perl_debug_log,
199100c8 1151 "%p: die: curstack = %p, mainstack = %p\n",
533c011a 1152 thr, PL_curstack, PL_mainstack));
36477c24 1153
3ab1ac99 1154 message = S_vdie_croak_common(aTHX_ pat, args, &msglen, &utf8);
36477c24 1155
06bf62c7 1156 PL_restartop = die_where(message, msglen);
ff882698 1157 SvFLAGS(ERRSV) |= utf8;
bf49b057 1158 DEBUG_S(PerlIO_printf(Perl_debug_log,
7c06b590 1159 "%p: die: restartop = %p, was_in_eval = %d, top_env = %p\n",
533c011a 1160 thr, PL_restartop, was_in_eval, PL_top_env));
3280af22 1161 if ((!PL_restartop && was_in_eval) || PL_top_env->je_prev)
6224f72b 1162 JMPENV_JUMP(3);
3280af22 1163 return PL_restartop;
36477c24 1164}
1165
c5be433b 1166#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1167OP *
1168Perl_die_nocontext(const char* pat, ...)
a687059c 1169{
cea2e8a9
GS
1170 dTHX;
1171 OP *o;
a687059c 1172 va_list args;
cea2e8a9 1173 va_start(args, pat);
c5be433b 1174 o = vdie(pat, &args);
cea2e8a9
GS
1175 va_end(args);
1176 return o;
1177}
c5be433b 1178#endif /* PERL_IMPLICIT_CONTEXT */
cea2e8a9
GS
1179
1180OP *
1181Perl_die(pTHX_ const char* pat, ...)
1182{
1183 OP *o;
1184 va_list args;
1185 va_start(args, pat);
c5be433b 1186 o = vdie(pat, &args);
cea2e8a9
GS
1187 va_end(args);
1188 return o;
1189}
1190
c5be433b
GS
1191void
1192Perl_vcroak(pTHX_ const char* pat, va_list *args)
cea2e8a9 1193{
73d840c0 1194 const char *message;
06bf62c7 1195 STRLEN msglen;
ff882698 1196 I32 utf8 = 0;
a687059c 1197
3ab1ac99 1198 message = S_vdie_croak_common(aTHX_ pat, args, &msglen, &utf8);
5a844595 1199
3280af22 1200 if (PL_in_eval) {
06bf62c7 1201 PL_restartop = die_where(message, msglen);
ff882698 1202 SvFLAGS(ERRSV) |= utf8;
6224f72b 1203 JMPENV_JUMP(3);
a0d0e21e 1204 }
84414e3e 1205 else if (!message)
cfd0369c 1206 message = SvPVx_const(ERRSV, msglen);
84414e3e 1207
7ff03255 1208 write_to_stderr(message, msglen);
f86702cc 1209 my_failure_exit();
a687059c
LW
1210}
1211
c5be433b 1212#if defined(PERL_IMPLICIT_CONTEXT)
8990e307 1213void
cea2e8a9 1214Perl_croak_nocontext(const char *pat, ...)
a687059c 1215{
cea2e8a9 1216 dTHX;
a687059c 1217 va_list args;
cea2e8a9 1218 va_start(args, pat);
c5be433b 1219 vcroak(pat, &args);
cea2e8a9
GS
1220 /* NOTREACHED */
1221 va_end(args);
1222}
1223#endif /* PERL_IMPLICIT_CONTEXT */
1224
954c1994 1225/*
ccfc67b7
JH
1226=head1 Warning and Dieing
1227
954c1994
GS
1228=for apidoc croak
1229
9983fa3c 1230This is the XSUB-writer's interface to Perl's C<die> function.
966353fd
MF
1231Normally call this function the same way you call the C C<printf>
1232function. Calling C<croak> returns control directly to Perl,
1233sidestepping the normal C order of execution. See C<warn>.
9983fa3c
GS
1234
1235If you want to throw an exception object, assign the object to
1236C<$@> and then pass C<Nullch> to croak():
1237
1238 errsv = get_sv("@", TRUE);
1239 sv_setsv(errsv, exception_object);
1240 croak(Nullch);
954c1994
GS
1241
1242=cut
1243*/
1244
cea2e8a9
GS
1245void
1246Perl_croak(pTHX_ const char *pat, ...)
1247{
1248 va_list args;
1249 va_start(args, pat);
c5be433b 1250 vcroak(pat, &args);
cea2e8a9
GS
1251 /* NOTREACHED */
1252 va_end(args);
1253}
1254
c5be433b
GS
1255void
1256Perl_vwarn(pTHX_ const char* pat, va_list *args)
cea2e8a9 1257{
27da23d5 1258 dVAR;
06bf62c7 1259 STRLEN msglen;
53c1dcc0
AL
1260 SV * const msv = vmess(pat, args);
1261 const I32 utf8 = SvUTF8(msv);
1262 const char * const message = SvPV_const(msv, msglen);
a687059c 1263
3280af22 1264 if (PL_warnhook) {
cea2e8a9 1265 /* sv_2cv might call Perl_warn() */
53c1dcc0
AL
1266 SV * const oldwarnhook = PL_warnhook;
1267 CV * cv;
1268 HV * stash;
1269 GV * gv;
1270
1738f5c4 1271 ENTER;
3280af22
NIS
1272 SAVESPTR(PL_warnhook);
1273 PL_warnhook = Nullsv;
20cec16a 1274 cv = sv_2cv(oldwarnhook, &stash, &gv, 0);
1738f5c4
CS
1275 LEAVE;
1276 if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
20cec16a 1277 dSP;
774d564b 1278 SV *msg;
1279
1280 ENTER;
3a1f2dc9 1281 save_re_context();
06bf62c7 1282 msg = newSVpvn(message, msglen);
ff882698 1283 SvFLAGS(msg) |= utf8;
774d564b 1284 SvREADONLY_on(msg);
1285 SAVEFREESV(msg);
1286
e788e7d3 1287 PUSHSTACKi(PERLSI_WARNHOOK);
924508f0 1288 PUSHMARK(SP);
774d564b 1289 XPUSHs(msg);
20cec16a 1290 PUTBACK;
864dbfa3 1291 call_sv((SV*)cv, G_DISCARD);
d3acc0f7 1292 POPSTACK;
774d564b 1293 LEAVE;
20cec16a 1294 return;
1295 }
748a9306 1296 }
87582a92 1297
7ff03255 1298 write_to_stderr(message, msglen);
a687059c 1299}
8d063cd8 1300
c5be433b 1301#if defined(PERL_IMPLICIT_CONTEXT)
cea2e8a9
GS
1302void
1303Perl_warn_nocontext(const char *pat, ...)
1304{
1305 dTHX;
1306 va_list args;
1307 va_start(args, pat);
c5be433b 1308 vwarn(pat, &args);
cea2e8a9
GS
1309 va_end(args);
1310}
1311#endif /* PERL_IMPLICIT_CONTEXT */
1312
954c1994
GS
1313/*
1314=for apidoc warn
1315
966353fd
MF
1316This is the XSUB-writer's interface to Perl's C<warn> function. Call this
1317function the same way you call the C C<printf> function. See C<croak>.
954c1994
GS
1318
1319=cut
1320*/
1321
cea2e8a9
GS
1322void
1323Perl_warn(pTHX_ const char *pat, ...)
1324{
1325 va_list args;
1326 va_start(args, pat);
c5be433b 1327 vwarn(pat, &args);
cea2e8a9
GS
1328 va_end(args);
1329}
1330
c5be433b
GS
1331#if defined(PERL_IMPLICIT_CONTEXT)
1332void
1333Perl_warner_nocontext(U32 err, const char *pat, ...)
1334{
27da23d5 1335 dTHX;
c5be433b
GS
1336 va_list args;
1337 va_start(args, pat);
1338 vwarner(err, pat, &args);
1339 va_end(args);
1340}
1341#endif /* PERL_IMPLICIT_CONTEXT */
1342
599cee73 1343void
864dbfa3 1344Perl_warner(pTHX_ U32 err, const char* pat,...)
599cee73
PM
1345{
1346 va_list args;
c5be433b
GS
1347 va_start(args, pat);
1348 vwarner(err, pat, &args);
1349 va_end(args);
1350}
1351
1352void
1353Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
1354{
27da23d5 1355 dVAR;
d13b0d77 1356 if (ckDEAD(err)) {
a3b680e6 1357 SV * const msv = vmess(pat, args);
d13b0d77 1358 STRLEN msglen;
cfd0369c 1359 const char *message = SvPV_const(msv, msglen);
a3b680e6 1360 const I32 utf8 = SvUTF8(msv);
599cee73 1361
3aed30dc 1362 if (PL_diehook) {
63315e18
NC
1363 assert(message);
1364 S_vdie_common(aTHX_ message, msglen, utf8);
3aed30dc
HS
1365 }
1366 if (PL_in_eval) {
1367 PL_restartop = die_where(message, msglen);
ff882698 1368 SvFLAGS(ERRSV) |= utf8;
3aed30dc
HS
1369 JMPENV_JUMP(3);
1370 }
7ff03255 1371 write_to_stderr(message, msglen);
3aed30dc 1372 my_failure_exit();
599cee73
PM
1373 }
1374 else {
d13b0d77 1375 Perl_vwarn(aTHX_ pat, args);
599cee73
PM
1376 }
1377}
1378
f54ba1c2
DM
1379/* implements the ckWARN? macros */
1380
1381bool
1382Perl_ckwarn(pTHX_ U32 w)
1383{
1384 return
1385 (
1386 isLEXWARN_on
1387 && PL_curcop->cop_warnings != pWARN_NONE
1388 && (
1389 PL_curcop->cop_warnings == pWARN_ALL
1390 || isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w))
1391 || (unpackWARN2(w) &&
1392 isWARN_on(PL_curcop->cop_warnings, unpackWARN2(w)))
1393 || (unpackWARN3(w) &&
1394 isWARN_on(PL_curcop->cop_warnings, unpackWARN3(w)))
1395 || (unpackWARN4(w) &&
1396 isWARN_on(PL_curcop->cop_warnings, unpackWARN4(w)))
1397 )
1398 )
1399 ||
1400 (
1401 isLEXWARN_off && PL_dowarn & G_WARN_ON
1402 )
1403 ;
1404}
1405
1406/* implements the ckWARN?_d macro */
1407
1408bool
1409Perl_ckwarn_d(pTHX_ U32 w)
1410{
1411 return
1412 isLEXWARN_off
1413 || PL_curcop->cop_warnings == pWARN_ALL
1414 || (
1415 PL_curcop->cop_warnings != pWARN_NONE
1416 && (
1417 isWARN_on(PL_curcop->cop_warnings, unpackWARN1(w))
1418 || (unpackWARN2(w) &&
1419 isWARN_on(PL_curcop->cop_warnings, unpackWARN2(w)))
1420 || (unpackWARN3(w) &&
1421 isWARN_on(PL_curcop->cop_warnings, unpackWARN3(w)))
1422 || (unpackWARN4(w) &&
1423 isWARN_on(PL_curcop->cop_warnings, unpackWARN4(w)))
1424 )
1425 )
1426 ;
1427}
1428
1429
1430
e6587932
DM
1431/* since we've already done strlen() for both nam and val
1432 * we can use that info to make things faster than
1433 * sprintf(s, "%s=%s", nam, val)
1434 */
1435#define my_setenv_format(s, nam, nlen, val, vlen) \
1436 Copy(nam, s, nlen, char); \
1437 *(s+nlen) = '='; \
1438 Copy(val, s+(nlen+1), vlen, char); \
1439 *(s+(nlen+1+vlen)) = '\0'
1440
13b6e58c 1441#ifdef USE_ENVIRON_ARRAY
eccd403f 1442 /* VMS' my_setenv() is in vms.c */
2986a63f 1443#if !defined(WIN32) && !defined(NETWARE)
8d063cd8 1444void
e1ec3a88 1445Perl_my_setenv(pTHX_ const char *nam, const char *val)
8d063cd8 1446{
27da23d5 1447 dVAR;
4efc5df6
GS
1448#ifdef USE_ITHREADS
1449 /* only parent thread can modify process environment */
1450 if (PL_curinterp == aTHX)
1451#endif
1452 {
f2517201 1453#ifndef PERL_USE_SAFE_PUTENV
50acdf95 1454 if (!PL_use_safe_putenv) {
f2517201 1455 /* most putenv()s leak, so we manipulate environ directly */
79072805 1456 register I32 i=setenv_getix(nam); /* where does it go? */
e6587932 1457 int nlen, vlen;
8d063cd8 1458
3280af22 1459 if (environ == PL_origenviron) { /* need we copy environment? */
79072805
LW
1460 I32 j;
1461 I32 max;
fe14fcc3
LW
1462 char **tmpenv;
1463
1464 for (max = i; environ[max]; max++) ;
f2517201
GS
1465 tmpenv = (char**)safesysmalloc((max+2) * sizeof(char*));
1466 for (j=0; j<max; j++) { /* copy environment */
e1ec3a88 1467 const int len = strlen(environ[j]);
3aed30dc
HS
1468 tmpenv[j] = (char*)safesysmalloc((len+1)*sizeof(char));
1469 Copy(environ[j], tmpenv[j], len+1, char);
f2517201 1470 }
fe14fcc3
LW
1471 tmpenv[max] = Nullch;
1472 environ = tmpenv; /* tell exec where it is now */
1473 }
a687059c 1474 if (!val) {
f2517201 1475 safesysfree(environ[i]);
a687059c
LW
1476 while (environ[i]) {
1477 environ[i] = environ[i+1];
1478 i++;
1479 }
1480 return;
1481 }
8d063cd8 1482 if (!environ[i]) { /* does not exist yet */
f2517201 1483 environ = (char**)safesysrealloc(environ, (i+2) * sizeof(char*));
8d063cd8
LW
1484 environ[i+1] = Nullch; /* make sure it's null terminated */
1485 }
fe14fcc3 1486 else
f2517201 1487 safesysfree(environ[i]);
e6587932
DM
1488 nlen = strlen(nam);
1489 vlen = strlen(val);
f2517201 1490
e6587932
DM
1491 environ[i] = (char*)safesysmalloc((nlen+vlen+2) * sizeof(char));
1492 /* all that work just for this */
1493 my_setenv_format(environ[i], nam, nlen, val, vlen);
50acdf95
MS
1494 } else {
1495# endif
27da23d5 1496# if defined(__CYGWIN__) || defined(EPOC) || defined(SYMBIAN)
47dafe4d
EF
1497 setenv(nam, val, 1);
1498# else
f2517201 1499 char *new_env;
53c1dcc0
AL
1500 const int nlen = strlen(nam);
1501 int vlen;
e6587932 1502 if (!val) {
3aed30dc 1503 val = "";
e6587932
DM
1504 }
1505 vlen = strlen(val);
1506 new_env = (char*)safesysmalloc((nlen + vlen + 2) * sizeof(char));
1507 /* all that work just for this */
1508 my_setenv_format(new_env, nam, nlen, val, vlen);
f2517201 1509 (void)putenv(new_env);
47dafe4d 1510# endif /* __CYGWIN__ */
50acdf95
MS
1511#ifndef PERL_USE_SAFE_PUTENV
1512 }
1513#endif
4efc5df6 1514 }
8d063cd8
LW
1515}
1516
2986a63f 1517#else /* WIN32 || NETWARE */
68dc0745 1518
1519void
72229eff 1520Perl_my_setenv(pTHX_ const char *nam, const char *val)
68dc0745 1521{
27da23d5 1522 dVAR;
ac5c734f 1523 register char *envstr;
e1ec3a88
AL
1524 const int nlen = strlen(nam);
1525 int vlen;
e6587932 1526
ac5c734f
GS
1527 if (!val) {
1528 val = "";
1529 }
e6587932
DM
1530 vlen = strlen(val);
1531 New(904, envstr, nlen+vlen+2, char);
1532 my_setenv_format(envstr, nam, nlen, val, vlen);
ac5c734f
GS
1533 (void)PerlEnv_putenv(envstr);
1534 Safefree(envstr);
3e3baf6d
TB
1535}
1536
2986a63f 1537#endif /* WIN32 || NETWARE */
3e3baf6d 1538
2f42fcb0 1539#ifndef PERL_MICRO
3e3baf6d 1540I32
e1ec3a88 1541Perl_setenv_getix(pTHX_ const char *nam)
3e3baf6d 1542{
53c1dcc0
AL
1543 register I32 i;
1544 const register I32 len = strlen(nam);
3e3baf6d
TB
1545
1546 for (i = 0; environ[i]; i++) {
1547 if (
1548#ifdef WIN32
1549 strnicmp(environ[i],nam,len) == 0
1550#else
1551 strnEQ(environ[i],nam,len)
1552#endif
1553 && environ[i][len] == '=')
1554 break; /* strnEQ must come first to avoid */
1555 } /* potential SEGV's */
1556 return i;
68dc0745 1557}
2f42fcb0 1558#endif /* !PERL_MICRO */
68dc0745 1559
ed79a026 1560#endif /* !VMS && !EPOC*/
378cc40b 1561
16d20bd9 1562#ifdef UNLINK_ALL_VERSIONS
79072805 1563I32
864dbfa3 1564Perl_unlnk(pTHX_ char *f) /* unlink all versions of a file */
378cc40b 1565{
79072805 1566 I32 i;
378cc40b 1567
6ad3d225 1568 for (i = 0; PerlLIO_unlink(f) >= 0; i++) ;
378cc40b
LW
1569 return i ? 0 : -1;
1570}
1571#endif
1572
7a3f2258 1573/* this is a drop-in replacement for bcopy() */
2253333f 1574#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
378cc40b 1575char *
7a3f2258 1576Perl_my_bcopy(register const char *from,register char *to,register I32 len)
378cc40b
LW
1577{
1578 char *retval = to;
1579
7c0587c8
LW
1580 if (from - to >= 0) {
1581 while (len--)
1582 *to++ = *from++;
1583 }
1584 else {
1585 to += len;
1586 from += len;
1587 while (len--)
faf8582f 1588 *(--to) = *(--from);
7c0587c8 1589 }
378cc40b
LW
1590 return retval;
1591}
ffed7fef 1592#endif
378cc40b 1593
7a3f2258 1594/* this is a drop-in replacement for memset() */
fc36a67e 1595#ifndef HAS_MEMSET
1596void *
7a3f2258 1597Perl_my_memset(register char *loc, register I32 ch, register I32 len)
fc36a67e 1598{
1599 char *retval = loc;
1600
1601 while (len--)
1602 *loc++ = ch;
1603 return retval;
1604}
1605#endif
1606
7a3f2258 1607/* this is a drop-in replacement for bzero() */
7c0587c8 1608#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
378cc40b 1609char *
7a3f2258 1610Perl_my_bzero(register char *loc, register I32 len)
378cc40b
LW
1611{
1612 char *retval = loc;
1613
1614 while (len--)
1615 *loc++ = 0;
1616 return retval;
1617}
1618#endif
7c0587c8 1619
7a3f2258 1620/* this is a drop-in replacement for memcmp() */
36477c24 1621#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
79072805 1622I32
7a3f2258 1623Perl_my_memcmp(const char *s1, const char *s2, register I32 len)
7c0587c8 1624{
e1ec3a88
AL
1625 register const U8 *a = (const U8 *)s1;
1626 register const U8 *b = (const U8 *)s2;
79072805 1627 register I32 tmp;
7c0587c8
LW
1628
1629 while (len--) {
27da23d5 1630 if ((tmp = *a++ - *b++))
7c0587c8
LW
1631 return tmp;
1632 }
1633 return 0;
1634}
36477c24 1635#endif /* !HAS_MEMCMP || !HAS_SANE_MEMCMP */
a687059c 1636
fe14fcc3 1637#ifndef HAS_VPRINTF
a687059c 1638
85e6fe83 1639#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1640char *
1641#else
1642int
1643#endif
08105a92 1644vsprintf(char *dest, const char *pat, char *args)
a687059c
LW
1645{
1646 FILE fakebuf;
1647
1648 fakebuf._ptr = dest;
1649 fakebuf._cnt = 32767;
35c8bce7
LW
1650#ifndef _IOSTRG
1651#define _IOSTRG 0
1652#endif
a687059c
LW
1653 fakebuf._flag = _IOWRT|_IOSTRG;
1654 _doprnt(pat, args, &fakebuf); /* what a kludge */
1655 (void)putc('\0', &fakebuf);
85e6fe83 1656#ifdef USE_CHAR_VSPRINTF
a687059c
LW
1657 return(dest);
1658#else
1659 return 0; /* perl doesn't use return value */
1660#endif
1661}
1662
fe14fcc3 1663#endif /* HAS_VPRINTF */
a687059c
LW
1664
1665#ifdef MYSWAP
ffed7fef 1666#if BYTEORDER != 0x4321
a687059c 1667short
864dbfa3 1668Perl_my_swap(pTHX_ short s)
a687059c
LW
1669{
1670#if (BYTEORDER & 1) == 0
1671 short result;
1672
1673 result = ((s & 255) << 8) + ((s >> 8) & 255);
1674 return result;
1675#else
1676 return s;
1677#endif
1678}
1679
1680long
864dbfa3 1681Perl_my_htonl(pTHX_ long l)
a687059c
LW
1682{
1683 union {
1684 long result;
ffed7fef 1685 char c[sizeof(long)];
a687059c
LW
1686 } u;
1687
ffed7fef 1688#if BYTEORDER == 0x1234
a687059c
LW
1689 u.c[0] = (l >> 24) & 255;
1690 u.c[1] = (l >> 16) & 255;
1691 u.c[2] = (l >> 8) & 255;
1692 u.c[3] = l & 255;
1693 return u.result;
1694#else
ffed7fef 1695#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1696 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1697#else
79072805
LW
1698 register I32 o;
1699 register I32 s;
a687059c 1700
ffed7fef
LW
1701 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1702 u.c[o & 0xf] = (l >> s) & 255;
a687059c
LW
1703 }
1704 return u.result;
1705#endif
1706#endif
1707}
1708
1709long
864dbfa3 1710Perl_my_ntohl(pTHX_ long l)
a687059c
LW
1711{
1712 union {
1713 long l;
ffed7fef 1714 char c[sizeof(long)];
a687059c
LW
1715 } u;
1716
ffed7fef 1717#if BYTEORDER == 0x1234
a687059c
LW
1718 u.c[0] = (l >> 24) & 255;
1719 u.c[1] = (l >> 16) & 255;
1720 u.c[2] = (l >> 8) & 255;
1721 u.c[3] = l & 255;
1722 return u.l;
1723#else
ffed7fef 1724#if ((BYTEORDER - 0x1111) & 0x444) || !(BYTEORDER & 0xf)
cea2e8a9 1725 Perl_croak(aTHX_ "Unknown BYTEORDER\n");
a687059c 1726#else
79072805
LW
1727 register I32 o;
1728 register I32 s;
a687059c
LW
1729
1730 u.l = l;
1731 l = 0;
ffed7fef
LW
1732 for (o = BYTEORDER - 0x1111, s = 0; s < (sizeof(long)*8); o >>= 4, s += 8) {
1733 l |= (u.c[o & 0xf] & 255) << s;
a687059c
LW
1734 }
1735 return l;
1736#endif
1737#endif
1738}
1739
ffed7fef 1740#endif /* BYTEORDER != 0x4321 */
988174c1
LW
1741#endif /* MYSWAP */
1742
1743/*
1744 * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
1745 * If these functions are defined,
1746 * the BYTEORDER is neither 0x1234 nor 0x4321.
1747 * However, this is not assumed.
1748 * -DWS
1749 */
1750
1109a392 1751#define HTOLE(name,type) \
988174c1 1752 type \
ba106d47 1753 name (register type n) \
988174c1
LW
1754 { \
1755 union { \
1756 type value; \
1757 char c[sizeof(type)]; \
1758 } u; \
79072805 1759 register I32 i; \
1109a392
MHM
1760 register I32 s = 0; \
1761 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
988174c1
LW
1762 u.c[i] = (n >> s) & 0xFF; \
1763 } \
1764 return u.value; \
1765 }
1766
1109a392 1767#define LETOH(name,type) \
988174c1 1768 type \
ba106d47 1769 name (register type n) \
988174c1
LW
1770 { \
1771 union { \
1772 type value; \
1773 char c[sizeof(type)]; \
1774 } u; \
79072805 1775 register I32 i; \
1109a392 1776 register I32 s = 0; \
988174c1
LW
1777 u.value = n; \
1778 n = 0; \
1109a392
MHM
1779 for (i = 0; i < sizeof(u.c); i++, s += 8) { \
1780 n |= ((type)(u.c[i] & 0xFF)) << s; \
988174c1
LW
1781 } \
1782 return n; \
1783 }
1784
1109a392
MHM
1785/*
1786 * Big-endian byte order functions.
1787 */
1788
1789#define HTOBE(name,type) \
1790 type \
1791 name (register type n) \
1792 { \
1793 union { \
1794 type value; \
1795 char c[sizeof(type)]; \
1796 } u; \
1797 register I32 i; \
1798 register I32 s = 8*(sizeof(u.c)-1); \
1799 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1800 u.c[i] = (n >> s) & 0xFF; \
1801 } \
1802 return u.value; \
1803 }
1804
1805#define BETOH(name,type) \
1806 type \
1807 name (register type n) \
1808 { \
1809 union { \
1810 type value; \
1811 char c[sizeof(type)]; \
1812 } u; \
1813 register I32 i; \
1814 register I32 s = 8*(sizeof(u.c)-1); \
1815 u.value = n; \
1816 n = 0; \
1817 for (i = 0; i < sizeof(u.c); i++, s -= 8) { \
1818 n |= ((type)(u.c[i] & 0xFF)) << s; \
1819 } \
1820 return n; \
1821 }
1822
1823/*
1824 * If we just can't do it...
1825 */
1826
1827#define NOT_AVAIL(name,type) \
1828 type \
1829 name (register type n) \
1830 { \
1831 Perl_croak_nocontext(#name "() not available"); \
1832 return n; /* not reached */ \
1833 }
1834
1835
988174c1 1836#if defined(HAS_HTOVS) && !defined(htovs)
1109a392 1837HTOLE(htovs,short)
988174c1
LW
1838#endif
1839#if defined(HAS_HTOVL) && !defined(htovl)
1109a392 1840HTOLE(htovl,long)
988174c1
LW
1841#endif
1842#if defined(HAS_VTOHS) && !defined(vtohs)
1109a392 1843LETOH(vtohs,short)
988174c1
LW
1844#endif
1845#if defined(HAS_VTOHL) && !defined(vtohl)
1109a392
MHM
1846LETOH(vtohl,long)
1847#endif
1848
1849#ifdef PERL_NEED_MY_HTOLE16
1850# if U16SIZE == 2
1851HTOLE(Perl_my_htole16,U16)
1852# else
1853NOT_AVAIL(Perl_my_htole16,U16)
1854# endif
1855#endif
1856#ifdef PERL_NEED_MY_LETOH16
1857# if U16SIZE == 2
1858LETOH(Perl_my_letoh16,U16)
1859# else
1860NOT_AVAIL(Perl_my_letoh16,U16)
1861# endif
1862#endif
1863#ifdef PERL_NEED_MY_HTOBE16
1864# if U16SIZE == 2
1865HTOBE(Perl_my_htobe16,U16)
1866# else
1867NOT_AVAIL(Perl_my_htobe16,U16)
1868# endif
1869#endif
1870#ifdef PERL_NEED_MY_BETOH16
1871# if U16SIZE == 2
1872BETOH(Perl_my_betoh16,U16)
1873# else
1874NOT_AVAIL(Perl_my_betoh16,U16)
1875# endif
1876#endif
1877
1878#ifdef PERL_NEED_MY_HTOLE32
1879# if U32SIZE == 4
1880HTOLE(Perl_my_htole32,U32)
1881# else
1882NOT_AVAIL(Perl_my_htole32,U32)
1883# endif
1884#endif
1885#ifdef PERL_NEED_MY_LETOH32
1886# if U32SIZE == 4
1887LETOH(Perl_my_letoh32,U32)
1888# else
1889NOT_AVAIL(Perl_my_letoh32,U32)
1890# endif
1891#endif
1892#ifdef PERL_NEED_MY_HTOBE32
1893# if U32SIZE == 4
1894HTOBE(Perl_my_htobe32,U32)
1895# else
1896NOT_AVAIL(Perl_my_htobe32,U32)
1897# endif
1898#endif
1899#ifdef PERL_NEED_MY_BETOH32
1900# if U32SIZE == 4
1901BETOH(Perl_my_betoh32,U32)
1902# else
1903NOT_AVAIL(Perl_my_betoh32,U32)
1904# endif
1905#endif
1906
1907#ifdef PERL_NEED_MY_HTOLE64
1908# if U64SIZE == 8
1909HTOLE(Perl_my_htole64,U64)
1910# else
1911NOT_AVAIL(Perl_my_htole64,U64)
1912# endif
1913#endif
1914#ifdef PERL_NEED_MY_LETOH64
1915# if U64SIZE == 8
1916LETOH(Perl_my_letoh64,U64)
1917# else
1918NOT_AVAIL(Perl_my_letoh64,U64)
1919# endif
1920#endif
1921#ifdef PERL_NEED_MY_HTOBE64
1922# if U64SIZE == 8
1923HTOBE(Perl_my_htobe64,U64)
1924# else
1925NOT_AVAIL(Perl_my_htobe64,U64)
1926# endif
1927#endif
1928#ifdef PERL_NEED_MY_BETOH64
1929# if U64SIZE == 8
1930BETOH(Perl_my_betoh64,U64)
1931# else
1932NOT_AVAIL(Perl_my_betoh64,U64)
1933# endif
988174c1 1934#endif
a687059c 1935
1109a392
MHM
1936#ifdef PERL_NEED_MY_HTOLES
1937HTOLE(Perl_my_htoles,short)
1938#endif
1939#ifdef PERL_NEED_MY_LETOHS
1940LETOH(Perl_my_letohs,short)
1941#endif
1942#ifdef PERL_NEED_MY_HTOBES
1943HTOBE(Perl_my_htobes,short)
1944#endif
1945#ifdef PERL_NEED_MY_BETOHS
1946BETOH(Perl_my_betohs,short)
1947#endif
1948
1949#ifdef PERL_NEED_MY_HTOLEI
1950HTOLE(Perl_my_htolei,int)
1951#endif
1952#ifdef PERL_NEED_MY_LETOHI
1953LETOH(Perl_my_letohi,int)
1954#endif
1955#ifdef PERL_NEED_MY_HTOBEI
1956HTOBE(Perl_my_htobei,int)
1957#endif
1958#ifdef PERL_NEED_MY_BETOHI
1959BETOH(Perl_my_betohi,int)
1960#endif
1961
1962#ifdef PERL_NEED_MY_HTOLEL
1963HTOLE(Perl_my_htolel,long)
1964#endif
1965#ifdef PERL_NEED_MY_LETOHL
1966LETOH(Perl_my_letohl,long)
1967#endif
1968#ifdef PERL_NEED_MY_HTOBEL
1969HTOBE(Perl_my_htobel,long)
1970#endif
1971#ifdef PERL_NEED_MY_BETOHL
1972BETOH(Perl_my_betohl,long)
1973#endif
1974
1975void
1976Perl_my_swabn(void *ptr, int n)
1977{
1978 register char *s = (char *)ptr;
1979 register char *e = s + (n-1);
1980 register char tc;
1981
1982 for (n /= 2; n > 0; s++, e--, n--) {
1983 tc = *s;
1984 *s = *e;
1985 *e = tc;
1986 }
1987}
1988
4a7d1889
NIS
1989PerlIO *
1990Perl_my_popen_list(pTHX_ char *mode, int n, SV **args)
1991{
2986a63f 1992#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE)
1f852d0d
NIS
1993 int p[2];
1994 register I32 This, that;
1995 register Pid_t pid;
1996 SV *sv;
1997 I32 did_pipes = 0;
1998 int pp[2];
1999
2000 PERL_FLUSHALL_FOR_CHILD;
2001 This = (*mode == 'w');
2002 that = !This;
2003 if (PL_tainting) {
2004 taint_env();
2005 taint_proper("Insecure %s%s", "EXEC");
2006 }
2007 if (PerlProc_pipe(p) < 0)
2008 return Nullfp;
2009 /* Try for another pipe pair for error return */
2010 if (PerlProc_pipe(pp) >= 0)
2011 did_pipes = 1;
52e18b1f 2012 while ((pid = PerlProc_fork()) < 0) {
1f852d0d
NIS
2013 if (errno != EAGAIN) {
2014 PerlLIO_close(p[This]);
4e6dfe71 2015 PerlLIO_close(p[that]);
1f852d0d
NIS
2016 if (did_pipes) {
2017 PerlLIO_close(pp[0]);
2018 PerlLIO_close(pp[1]);
2019 }
2020 return Nullfp;
2021 }
2022 sleep(5);
2023 }
2024 if (pid == 0) {
2025 /* Child */
1f852d0d
NIS
2026#undef THIS
2027#undef THAT
2028#define THIS that
2029#define THAT This
1f852d0d
NIS
2030 /* Close parent's end of error status pipe (if any) */
2031 if (did_pipes) {
2032 PerlLIO_close(pp[0]);
2033#if defined(HAS_FCNTL) && defined(F_SETFD)
2034 /* Close error pipe automatically if exec works */
2035 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2036#endif
2037 }
2038 /* Now dup our end of _the_ pipe to right position */
2039 if (p[THIS] != (*mode == 'r')) {
2040 PerlLIO_dup2(p[THIS], *mode == 'r');
2041 PerlLIO_close(p[THIS]);
4e6dfe71
GS
2042 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2043 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d 2044 }
4e6dfe71
GS
2045 else
2046 PerlLIO_close(p[THAT]); /* close parent's end of _the_ pipe */
1f852d0d
NIS
2047#if !defined(HAS_FCNTL) || !defined(F_SETFD)
2048 /* No automatic close - do it by hand */
b7953727
JH
2049# ifndef NOFILE
2050# define NOFILE 20
2051# endif
a080fe3d
NIS
2052 {
2053 int fd;
2054
2055 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++) {
3aed30dc 2056 if (fd != pp[1])
a080fe3d
NIS
2057 PerlLIO_close(fd);
2058 }
1f852d0d
NIS
2059 }
2060#endif
2061 do_aexec5(Nullsv, args-1, args-1+n, pp[1], did_pipes);
2062 PerlProc__exit(1);
2063#undef THIS
2064#undef THAT
2065 }
2066 /* Parent */
52e18b1f 2067 do_execfree(); /* free any memory malloced by child on fork */
1f852d0d
NIS
2068 if (did_pipes)
2069 PerlLIO_close(pp[1]);
2070 /* Keep the lower of the two fd numbers */
2071 if (p[that] < p[This]) {
2072 PerlLIO_dup2(p[This], p[that]);
2073 PerlLIO_close(p[This]);
2074 p[This] = p[that];
2075 }
4e6dfe71
GS
2076 else
2077 PerlLIO_close(p[that]); /* close child's end of pipe */
2078
1f852d0d
NIS
2079 LOCK_FDPID_MUTEX;
2080 sv = *av_fetch(PL_fdpid,p[This],TRUE);
2081 UNLOCK_FDPID_MUTEX;
862a34c6 2082 SvUPGRADE(sv,SVt_IV);
45977657 2083 SvIV_set(sv, pid);
1f852d0d
NIS
2084 PL_forkprocess = pid;
2085 /* If we managed to get status pipe check for exec fail */
2086 if (did_pipes && pid > 0) {
2087 int errkid;
2088 int n = 0, n1;
2089
2090 while (n < sizeof(int)) {
2091 n1 = PerlLIO_read(pp[0],
2092 (void*)(((char*)&errkid)+n),
2093 (sizeof(int)) - n);
2094 if (n1 <= 0)
2095 break;
2096 n += n1;
2097 }
2098 PerlLIO_close(pp[0]);
2099 did_pipes = 0;
2100 if (n) { /* Error */
2101 int pid2, status;
8c51524e 2102 PerlLIO_close(p[This]);
1f852d0d
NIS
2103 if (n != sizeof(int))
2104 Perl_croak(aTHX_ "panic: kid popen errno read");
2105 do {
2106 pid2 = wait4pid(pid, &status, 0);
2107 } while (pid2 == -1 && errno == EINTR);
2108 errno = errkid; /* Propagate errno from kid */
2109 return Nullfp;
2110 }
2111 }
2112 if (did_pipes)
2113 PerlLIO_close(pp[0]);
2114 return PerlIO_fdopen(p[This], mode);
2115#else
4a7d1889
NIS
2116 Perl_croak(aTHX_ "List form of piped open not implemented");
2117 return (PerlIO *) NULL;
1f852d0d 2118#endif
4a7d1889
NIS
2119}
2120
5f05dabc 2121 /* VMS' my_popen() is in VMS.c, same with OS/2. */
cd39f2b6 2122#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
760ac839 2123PerlIO *
864dbfa3 2124Perl_my_popen(pTHX_ char *cmd, char *mode)
a687059c
LW
2125{
2126 int p[2];
8ac85365 2127 register I32 This, that;
d8a83dd3 2128 register Pid_t pid;
79072805 2129 SV *sv;
770526c1 2130 I32 doexec = !(*cmd == '-' && cmd[1] == '\0');
e446cec8
IZ
2131 I32 did_pipes = 0;
2132 int pp[2];
a687059c 2133
45bc9206 2134 PERL_FLUSHALL_FOR_CHILD;
ddcf38b7
IZ
2135#ifdef OS2
2136 if (doexec) {
23da6c43 2137 return my_syspopen(aTHX_ cmd,mode);
ddcf38b7 2138 }
a1d180c4 2139#endif
8ac85365
NIS
2140 This = (*mode == 'w');
2141 that = !This;
3280af22 2142 if (doexec && PL_tainting) {
bbce6d69 2143 taint_env();
2144 taint_proper("Insecure %s%s", "EXEC");
d48672a2 2145 }
c2267164
IZ
2146 if (PerlProc_pipe(p) < 0)
2147 return Nullfp;
e446cec8
IZ
2148 if (doexec && PerlProc_pipe(pp) >= 0)
2149 did_pipes = 1;
52e18b1f 2150 while ((pid = PerlProc_fork()) < 0) {
a687059c 2151 if (errno != EAGAIN) {
6ad3d225 2152 PerlLIO_close(p[This]);
b5ac89c3 2153 PerlLIO_close(p[that]);
e446cec8
IZ
2154 if (did_pipes) {
2155 PerlLIO_close(pp[0]);
2156 PerlLIO_close(pp[1]);
2157 }
a687059c 2158 if (!doexec)
cea2e8a9 2159 Perl_croak(aTHX_ "Can't fork");
a687059c
LW
2160 return Nullfp;
2161 }
2162 sleep(5);
2163 }
2164 if (pid == 0) {
79072805
LW
2165 GV* tmpgv;
2166
30ac6d9b
GS
2167#undef THIS
2168#undef THAT
a687059c 2169#define THIS that
8ac85365 2170#define THAT This
e446cec8
IZ
2171 if (did_pipes) {
2172 PerlLIO_close(pp[0]);
2173#if defined(HAS_FCNTL) && defined(F_SETFD)
2174 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
2175#endif
2176 }
a687059c 2177 if (p[THIS] != (*mode == 'r')) {
6ad3d225
GS
2178 PerlLIO_dup2(p[THIS], *mode == 'r');
2179 PerlLIO_close(p[THIS]);
b5ac89c3
NIS
2180 if (p[THAT] != (*mode == 'r')) /* if dup2() didn't close it */
2181 PerlLIO_close(p[THAT]);
a687059c 2182 }
b5ac89c3
NIS
2183 else
2184 PerlLIO_close(p[THAT]);
4435c477 2185#ifndef OS2
a687059c 2186 if (doexec) {
a0d0e21e 2187#if !defined(HAS_FCNTL) || !defined(F_SETFD)
ae986130
LW
2188#ifndef NOFILE
2189#define NOFILE 20
2190#endif
a080fe3d 2191 {
3aed30dc 2192 int fd;
a080fe3d
NIS
2193
2194 for (fd = PL_maxsysfd + 1; fd < NOFILE; fd++)
2195 if (fd != pp[1])
3aed30dc 2196 PerlLIO_close(fd);
a080fe3d 2197 }
ae986130 2198#endif
a080fe3d
NIS
2199 /* may or may not use the shell */
2200 do_exec3(cmd, pp[1], did_pipes);
6ad3d225 2201 PerlProc__exit(1);
a687059c 2202 }
4435c477 2203#endif /* defined OS2 */
306196c3 2204 if ((tmpgv = gv_fetchpv("$",TRUE, SVt_PV))) {
4d76a344 2205 SvREADONLY_off(GvSV(tmpgv));
7766f137 2206 sv_setiv(GvSV(tmpgv), PerlProc_getpid());
4d76a344
RGS
2207 SvREADONLY_on(GvSV(tmpgv));
2208 }
2209#ifdef THREADS_HAVE_PIDS
2210 PL_ppid = (IV)getppid();
2211#endif
3280af22
NIS
2212 PL_forkprocess = 0;
2213 hv_clear(PL_pidstatus); /* we have no children */
a687059c
LW
2214 return Nullfp;
2215#undef THIS
2216#undef THAT
2217 }
b5ac89c3 2218 do_execfree(); /* free any memory malloced by child on vfork */
e446cec8
IZ
2219 if (did_pipes)
2220 PerlLIO_close(pp[1]);
8ac85365 2221 if (p[that] < p[This]) {
6ad3d225
GS
2222 PerlLIO_dup2(p[This], p[that]);
2223 PerlLIO_close(p[This]);
8ac85365 2224 p[This] = p[that];
62b28dd9 2225 }
b5ac89c3
NIS
2226 else
2227 PerlLIO_close(p[that]);
2228
4755096e 2229 LOCK_FDPID_MUTEX;
3280af22 2230 sv = *av_fetch(PL_fdpid,p[This],TRUE);
4755096e 2231 UNLOCK_FDPID_MUTEX;
862a34c6 2232 SvUPGRADE(sv,SVt_IV);
45977657 2233 SvIV_set(sv, pid);
3280af22 2234 PL_forkprocess = pid;
e446cec8
IZ
2235 if (did_pipes && pid > 0) {
2236 int errkid;
2237 int n = 0, n1;
2238
2239 while (n < sizeof(int)) {
2240 n1 = PerlLIO_read(pp[0],
2241 (void*)(((char*)&errkid)+n),
2242 (sizeof(int)) - n);
2243 if (n1 <= 0)
2244 break;
2245 n += n1;
2246 }
2f96c702
IZ
2247 PerlLIO_close(pp[0]);
2248 did_pipes = 0;
e446cec8 2249 if (n) { /* Error */
faa466a7 2250 int pid2, status;
8c51524e 2251 PerlLIO_close(p[This]);
e446cec8 2252 if (n != sizeof(int))
cea2e8a9 2253 Perl_croak(aTHX_ "panic: kid popen errno read");
faa466a7
RG
2254 do {
2255 pid2 = wait4pid(pid, &status, 0);
2256 } while (pid2 == -1 && errno == EINTR);
e446cec8
IZ
2257 errno = errkid; /* Propagate errno from kid */
2258 return Nullfp;
2259 }
2260 }
2261 if (did_pipes)
2262 PerlLIO_close(pp[0]);
8ac85365 2263 return PerlIO_fdopen(p[This], mode);
a687059c 2264}
7c0587c8 2265#else
85ca448a 2266#if defined(atarist) || defined(EPOC)
7c0587c8 2267FILE *popen();
760ac839 2268PerlIO *
864dbfa3 2269Perl_my_popen(pTHX_ char *cmd, char *mode)
7c0587c8 2270{
45bc9206 2271 PERL_FLUSHALL_FOR_CHILD;
a1d180c4
NIS
2272 /* Call system's popen() to get a FILE *, then import it.
2273 used 0 for 2nd parameter to PerlIO_importFILE;
2274 apparently not used
2275 */
2276 return PerlIO_importFILE(popen(cmd, mode), 0);
7c0587c8 2277}
2b96b0a5
JH
2278#else
2279#if defined(DJGPP)
2280FILE *djgpp_popen();
2281PerlIO *
2282Perl_my_popen(pTHX_ char *cmd, char *mode)
2283{
2284 PERL_FLUSHALL_FOR_CHILD;
2285 /* Call system's popen() to get a FILE *, then import it.
2286 used 0 for 2nd parameter to PerlIO_importFILE;
2287 apparently not used
2288 */
2289 return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
2290}
2291#endif
7c0587c8
LW
2292#endif
2293
2294#endif /* !DOSISH */
a687059c 2295
52e18b1f
GS
2296/* this is called in parent before the fork() */
2297void
2298Perl_atfork_lock(void)
2299{
27da23d5 2300 dVAR;
3db8f154 2301#if defined(USE_ITHREADS)
52e18b1f
GS
2302 /* locks must be held in locking order (if any) */
2303# ifdef MYMALLOC
2304 MUTEX_LOCK(&PL_malloc_mutex);
2305# endif
2306 OP_REFCNT_LOCK;
2307#endif
2308}
2309
2310/* this is called in both parent and child after the fork() */
2311void
2312Perl_atfork_unlock(void)
2313{
27da23d5 2314 dVAR;
3db8f154 2315#if defined(USE_ITHREADS)
52e18b1f
GS
2316 /* locks must be released in same order as in atfork_lock() */
2317# ifdef MYMALLOC
2318 MUTEX_UNLOCK(&PL_malloc_mutex);
2319# endif
2320 OP_REFCNT_UNLOCK;
2321#endif
2322}
2323
2324Pid_t
2325Perl_my_fork(void)
2326{
2327#if defined(HAS_FORK)
2328 Pid_t pid;
3db8f154 2329#if defined(USE_ITHREADS) && !defined(HAS_PTHREAD_ATFORK)
52e18b1f
GS
2330 atfork_lock();
2331 pid = fork();
2332 atfork_unlock();
2333#else
2334 /* atfork_lock() and atfork_unlock() are installed as pthread_atfork()
2335 * handlers elsewhere in the code */
2336 pid = fork();
2337#endif
2338 return pid;
2339#else
2340 /* this "canna happen" since nothing should be calling here if !HAS_FORK */
2341 Perl_croak_nocontext("fork() not available");
b961a566 2342 return 0;
52e18b1f
GS
2343#endif /* HAS_FORK */
2344}
2345
748a9306 2346#ifdef DUMP_FDS
35ff7856 2347void
864dbfa3 2348Perl_dump_fds(pTHX_ char *s)
ae986130
LW
2349{
2350 int fd;
c623ac67 2351 Stat_t tmpstatbuf;
ae986130 2352
bf49b057 2353 PerlIO_printf(Perl_debug_log,"%s", s);
ae986130 2354 for (fd = 0; fd < 32; fd++) {
6ad3d225 2355 if (PerlLIO_fstat(fd,&tmpstatbuf) >= 0)
bf49b057 2356 PerlIO_printf(Perl_debug_log," %d",fd);
ae986130 2357 }
bf49b057 2358 PerlIO_printf(Perl_debug_log,"\n");
27da23d5 2359 return;
ae986130 2360}
35ff7856 2361#endif /* DUMP_FDS */
ae986130 2362
fe14fcc3 2363#ifndef HAS_DUP2
fec02dd3 2364int
ba106d47 2365dup2(int oldfd, int newfd)
a687059c 2366{
a0d0e21e 2367#if defined(HAS_FCNTL) && defined(F_DUPFD)
fec02dd3
AD
2368 if (oldfd == newfd)
2369 return oldfd;
6ad3d225 2370 PerlLIO_close(newfd);
fec02dd3 2371 return fcntl(oldfd, F_DUPFD, newfd);
62b28dd9 2372#else
fc36a67e 2373#define DUP2_MAX_FDS 256
2374 int fdtmp[DUP2_MAX_FDS];
79072805 2375 I32 fdx = 0;
ae986130
LW
2376 int fd;
2377
fe14fcc3 2378 if (oldfd == newfd)
fec02dd3 2379 return oldfd;
6ad3d225 2380 PerlLIO_close(newfd);
fc36a67e 2381 /* good enough for low fd's... */
6ad3d225 2382 while ((fd = PerlLIO_dup(oldfd)) != newfd && fd >= 0) {
fc36a67e 2383 if (fdx >= DUP2_MAX_FDS) {
6ad3d225 2384 PerlLIO_close(fd);
fc36a67e 2385 fd = -1;
2386 break;
2387 }
ae986130 2388 fdtmp[fdx++] = fd;
fc36a67e 2389 }
ae986130 2390 while (fdx > 0)
6ad3d225 2391 PerlLIO_close(fdtmp[--fdx]);
fec02dd3 2392 return fd;
62b28dd9 2393#endif
a687059c
LW
2394}
2395#endif
2396
64ca3a65 2397#ifndef PERL_MICRO
ff68c719 2398#ifdef HAS_SIGACTION
2399
abea2c45
HS
2400#ifdef MACOS_TRADITIONAL
2401/* We don't want restart behavior on MacOS */
2402#undef SA_RESTART
2403#endif
2404
ff68c719 2405Sighandler_t
864dbfa3 2406Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2407{
27da23d5 2408 dVAR;
ff68c719 2409 struct sigaction act, oact;
2410
a10b1e10
JH
2411#ifdef USE_ITHREADS
2412 /* only "parent" interpreter can diddle signals */
2413 if (PL_curinterp != aTHX)
2414 return SIG_ERR;
2415#endif
2416
ff68c719 2417 act.sa_handler = handler;
2418 sigemptyset(&act.sa_mask);
2419 act.sa_flags = 0;
2420#ifdef SA_RESTART
4ffa73a3
JH
2421 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2422 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2423#endif
358837b8 2424#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
85264bed
CS
2425 if (signo == SIGCHLD && handler == (Sighandler_t)SIG_IGN)
2426 act.sa_flags |= SA_NOCLDWAIT;
2427#endif
ff68c719 2428 if (sigaction(signo, &act, &oact) == -1)
36477c24 2429 return SIG_ERR;
ff68c719 2430 else
36477c24 2431 return oact.sa_handler;
ff68c719 2432}
2433
2434Sighandler_t
864dbfa3 2435Perl_rsignal_state(pTHX_ int signo)
ff68c719 2436{
2437 struct sigaction oact;
2438
2439 if (sigaction(signo, (struct sigaction *)NULL, &oact) == -1)
3aed30dc 2440 return SIG_ERR;
ff68c719 2441 else
3aed30dc 2442 return oact.sa_handler;
ff68c719 2443}
2444
2445int
864dbfa3 2446Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2447{
27da23d5 2448 dVAR;
ff68c719 2449 struct sigaction act;
2450
a10b1e10
JH
2451#ifdef USE_ITHREADS
2452 /* only "parent" interpreter can diddle signals */
2453 if (PL_curinterp != aTHX)
2454 return -1;
2455#endif
2456
ff68c719 2457 act.sa_handler = handler;
2458 sigemptyset(&act.sa_mask);
2459 act.sa_flags = 0;
2460#ifdef SA_RESTART
4ffa73a3
JH
2461 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
2462 act.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
0a8e0eff 2463#endif
36b5d377 2464#if defined(SA_NOCLDWAIT) && !defined(BSDish) /* See [perl #18849] */
85264bed
CS
2465 if (signo == SIGCHLD && handler == (Sighandler_t)SIG_IGN)
2466 act.sa_flags |= SA_NOCLDWAIT;
2467#endif
ff68c719 2468 return sigaction(signo, &act, save);
2469}
2470
2471int
864dbfa3 2472Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2473{
27da23d5 2474 dVAR;
a10b1e10
JH
2475#ifdef USE_ITHREADS
2476 /* only "parent" interpreter can diddle signals */
2477 if (PL_curinterp != aTHX)
2478 return -1;
2479#endif
2480
ff68c719 2481 return sigaction(signo, save, (struct sigaction *)NULL);
2482}
2483
2484#else /* !HAS_SIGACTION */
2485
2486Sighandler_t
864dbfa3 2487Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
ff68c719 2488{
39f1703b 2489#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2490 /* only "parent" interpreter can diddle signals */
2491 if (PL_curinterp != aTHX)
2492 return SIG_ERR;
2493#endif
2494
6ad3d225 2495 return PerlProc_signal(signo, handler);
ff68c719 2496}
2497
ff68c719 2498static
2499Signal_t
4e35701f 2500sig_trap(int signo)
ff68c719 2501{
27da23d5
JH
2502 dVAR;
2503 PL_sig_trapped++;
ff68c719 2504}
2505
2506Sighandler_t
864dbfa3 2507Perl_rsignal_state(pTHX_ int signo)
ff68c719 2508{
27da23d5 2509 dVAR;
ff68c719 2510 Sighandler_t oldsig;
2511
39f1703b 2512#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2513 /* only "parent" interpreter can diddle signals */
2514 if (PL_curinterp != aTHX)
2515 return SIG_ERR;
2516#endif
2517
27da23d5 2518 PL_sig_trapped = 0;
6ad3d225
GS
2519 oldsig = PerlProc_signal(signo, sig_trap);
2520 PerlProc_signal(signo, oldsig);
27da23d5 2521 if (PL_sig_trapped)
3aed30dc 2522 PerlProc_kill(PerlProc_getpid(), signo);
ff68c719 2523 return oldsig;
2524}
2525
2526int
864dbfa3 2527Perl_rsignal_save(pTHX_ int signo, Sighandler_t handler, Sigsave_t *save)
ff68c719 2528{
39f1703b 2529#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2530 /* only "parent" interpreter can diddle signals */
2531 if (PL_curinterp != aTHX)
2532 return -1;
2533#endif
6ad3d225 2534 *save = PerlProc_signal(signo, handler);
ff68c719 2535 return (*save == SIG_ERR) ? -1 : 0;
2536}
2537
2538int
864dbfa3 2539Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
ff68c719 2540{
39f1703b 2541#if defined(USE_ITHREADS) && !defined(WIN32)
a10b1e10
JH
2542 /* only "parent" interpreter can diddle signals */
2543 if (PL_curinterp != aTHX)
2544 return -1;
2545#endif
6ad3d225 2546 return (PerlProc_signal(signo, *save) == SIG_ERR) ? -1 : 0;
ff68c719 2547}
2548
2549#endif /* !HAS_SIGACTION */
64ca3a65 2550#endif /* !PERL_MICRO */
ff68c719 2551
5f05dabc 2552 /* VMS' my_pclose() is in VMS.c; same with OS/2 */
cd39f2b6 2553#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
79072805 2554I32
864dbfa3 2555Perl_my_pclose(pTHX_ PerlIO *ptr)
a687059c 2556{
ff68c719 2557 Sigsave_t hstat, istat, qstat;
a687059c 2558 int status;
a0d0e21e 2559 SV **svp;
d8a83dd3
JH
2560 Pid_t pid;
2561 Pid_t pid2;
03136e13 2562 bool close_failed;
b7953727 2563 int saved_errno = 0;
22fae026
TM
2564#ifdef WIN32
2565 int saved_win32_errno;
2566#endif
a687059c 2567
4755096e 2568 LOCK_FDPID_MUTEX;
3280af22 2569 svp = av_fetch(PL_fdpid,PerlIO_fileno(ptr),TRUE);
4755096e 2570 UNLOCK_FDPID_MUTEX;
25d92023 2571 pid = (SvTYPE(*svp) == SVt_IV) ? SvIVX(*svp) : -1;
a0d0e21e 2572 SvREFCNT_dec(*svp);
3280af22 2573 *svp = &PL_sv_undef;
ddcf38b7
IZ
2574#ifdef OS2
2575 if (pid == -1) { /* Opened by popen. */
2576 return my_syspclose(ptr);
2577 }
a1d180c4 2578#endif
03136e13
CS
2579 if ((close_failed = (PerlIO_close(ptr) == EOF))) {
2580 saved_errno = errno;
22fae026
TM
2581#ifdef WIN32
2582 saved_win32_errno = GetLastError();
2583#endif
03136e13 2584 }
7c0587c8 2585#ifdef UTS
6ad3d225 2586 if(PerlProc_kill(pid, 0) < 0) { return(pid); } /* HOM 12/23/91 */
7c0587c8 2587#endif
64ca3a65 2588#ifndef PERL_MICRO
ff68c719 2589 rsignal_save(SIGHUP, SIG_IGN, &hstat);
2590 rsignal_save(SIGINT, SIG_IGN, &istat);
2591 rsignal_save(SIGQUIT, SIG_IGN, &qstat);
64ca3a65 2592#endif
748a9306 2593 do {
1d3434b8
GS
2594 pid2 = wait4pid(pid, &status, 0);
2595 } while (pid2 == -1 && errno == EINTR);
64ca3a65 2596#ifndef PERL_MICRO
ff68c719 2597 rsignal_restore(SIGHUP, &hstat);
2598 rsignal_restore(SIGINT, &istat);
2599 rsignal_restore(SIGQUIT, &qstat);
64ca3a65 2600#endif
03136e13 2601 if (close_failed) {
ce6e1103 2602 SETERRNO(saved_errno, 0);
03136e13
CS
2603 return -1;
2604 }
1d3434b8 2605 return(pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status));
20188a90 2606}
4633a7c4
LW
2607#endif /* !DOSISH */
2608
2986a63f 2609#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL)
79072805 2610I32
d8a83dd3 2611Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
20188a90 2612{
27da23d5 2613 I32 result = 0;
b7953727
JH
2614 if (!pid)
2615 return -1;
2616#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
2617 {
cf28e18a 2618 char spid[TYPE_CHARS(IV)];
20188a90 2619
3aed30dc 2620 if (pid > 0) {
27da23d5 2621 SV** svp;
7b0972df 2622 sprintf(spid, "%"IVdf, (IV)pid);
3aed30dc
HS
2623 svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE);
2624 if (svp && *svp != &PL_sv_undef) {
2625 *statusp = SvIVX(*svp);
2626 (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD);
2627 return pid;
2628 }
2629 }
2630 else {
2631 HE *entry;
2632
2633 hv_iterinit(PL_pidstatus);
2634 if ((entry = hv_iternext(PL_pidstatus))) {
27da23d5
JH
2635 SV *sv = hv_iterval(PL_pidstatus,entry);
2636
3aed30dc 2637 pid = atoi(hv_iterkey(entry,(I32*)statusp));
3aed30dc
HS
2638 *statusp = SvIVX(sv);
2639 sprintf(spid, "%"IVdf, (IV)pid);
2640 (void)hv_delete(PL_pidstatus,spid,strlen(spid),G_DISCARD);
2641 return pid;
2642 }
20188a90
LW
2643 }
2644 }
68a29c53 2645#endif
79072805 2646#ifdef HAS_WAITPID
367f3c24
IZ
2647# ifdef HAS_WAITPID_RUNTIME
2648 if (!HAS_WAITPID_RUNTIME)
2649 goto hard_way;
2650# endif
cddd4526 2651 result = PerlProc_waitpid(pid,statusp,flags);
dfcfdb64 2652 goto finish;
367f3c24
IZ
2653#endif
2654#if !defined(HAS_WAITPID) && defined(HAS_WAIT4)
cddd4526 2655 result = wait4((pid==-1)?0:pid,statusp,flags,Null(struct rusage *));
dfcfdb64 2656 goto finish;
367f3c24
IZ
2657#endif
2658#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
27da23d5 2659#if defined(HAS_WAITPID) && defined(HAS_WAITPID_RUNTIME)
367f3c24 2660 hard_way:
27da23d5 2661#endif
a0d0e21e 2662 {
a0d0e21e 2663 if (flags)
cea2e8a9 2664 Perl_croak(aTHX_ "Can't do waitpid with flags");
a0d0e21e 2665 else {
76e3520e 2666 while ((result = PerlProc_wait(statusp)) != pid && pid > 0 && result >= 0)
a0d0e21e
LW
2667 pidgone(result,*statusp);
2668 if (result < 0)
2669 *statusp = -1;
2670 }
a687059c
LW
2671 }
2672#endif
27da23d5 2673#if defined(HAS_WAITPID) || defined(HAS_WAIT4)
dfcfdb64 2674 finish:
27da23d5 2675#endif
cddd4526
NIS
2676 if (result < 0 && errno == EINTR) {
2677 PERL_ASYNC_CHECK();
2678 }
2679 return result;
a687059c 2680}
2986a63f 2681#endif /* !DOSISH || OS2 || WIN32 || NETWARE */
a687059c 2682
7c0587c8 2683void
d8a83dd3 2684Perl_pidgone(pTHX_ Pid_t pid, int status)
a687059c 2685{
79072805 2686 register SV *sv;
cf28e18a 2687 char spid[TYPE_CHARS(IV)];
a687059c 2688
7b0972df 2689 sprintf(spid, "%"IVdf, (IV)pid);
3280af22 2690 sv = *hv_fetch(PL_pidstatus,spid,strlen(spid),TRUE);
862a34c6 2691 SvUPGRADE(sv,SVt_IV);
45977657 2692 SvIV_set(sv, status);
20188a90 2693 return;
a687059c
LW
2694}
2695
85ca448a 2696#if defined(atarist) || defined(OS2) || defined(EPOC)
7c0587c8 2697int pclose();
ddcf38b7
IZ
2698#ifdef HAS_FORK
2699int /* Cannot prototype with I32
2700 in os2ish.h. */
ba106d47 2701my_syspclose(PerlIO *ptr)
ddcf38b7 2702#else
79072805 2703I32
864dbfa3 2704Perl_my_pclose(pTHX_ PerlIO *ptr)
a1d180c4 2705#endif
a687059c 2706{
760ac839
LW
2707 /* Needs work for PerlIO ! */
2708 FILE *f = PerlIO_findFILE(ptr);
2709 I32 result = pclose(f);
2b96b0a5
JH
2710 PerlIO_releaseFILE(ptr,f);
2711 return result;
2712}
2713#endif
2714
933fea7f 2715#if defined(DJGPP)
2b96b0a5
JH
2716int djgpp_pclose();
2717I32
2718Perl_my_pclose(pTHX_ PerlIO *ptr)
2719{
2720 /* Needs work for PerlIO ! */
2721 FILE *f = PerlIO_findFILE(ptr);
2722 I32 result = djgpp_pclose(f);
933fea7f 2723 result = (result << 8) & 0xff00;
760ac839
LW
2724 PerlIO_releaseFILE(ptr,f);
2725 return result;
a687059c 2726}
7c0587c8 2727#endif
9f68db38
LW
2728
2729void
864dbfa3 2730Perl_repeatcpy(pTHX_ register char *to, register const char *from, I32 len, register I32 count)
9f68db38 2731{
79072805 2732 register I32 todo;
08105a92 2733 register const char *frombase = from;
9f68db38
LW
2734
2735 if (len == 1) {
08105a92 2736 register const char c = *from;
9f68db38 2737 while (count-- > 0)
5926133d 2738 *to++ = c;
9f68db38
LW
2739 return;
2740 }
2741 while (count-- > 0) {
2742 for (todo = len; todo > 0; todo--) {
2743 *to++ = *from++;
2744 }
2745 from = frombase;
2746 }
2747}
0f85fab0 2748
fe14fcc3 2749#ifndef HAS_RENAME
79072805 2750I32
4373e329 2751Perl_same_dirent(pTHX_ const char *a, const char *b)
62b28dd9 2752{
93a17b20
LW
2753 char *fa = strrchr(a,'/');
2754 char *fb = strrchr(b,'/');
c623ac67
GS
2755 Stat_t tmpstatbuf1;
2756 Stat_t tmpstatbuf2;
46fc3d4c 2757 SV *tmpsv = sv_newmortal();
62b28dd9
LW
2758
2759 if (fa)
2760 fa++;
2761 else
2762 fa = a;
2763 if (fb)
2764 fb++;
2765 else
2766 fb = b;
2767 if (strNE(a,b))
2768 return FALSE;
2769 if (fa == a)
616d8c9c 2770 sv_setpvn(tmpsv, ".", 1);
62b28dd9 2771 else
46fc3d4c 2772 sv_setpvn(tmpsv, a, fa - a);
95a20fc0 2773 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf1) < 0)
62b28dd9
LW
2774 return FALSE;
2775 if (fb == b)
616d8c9c 2776 sv_setpvn(tmpsv, ".", 1);
62b28dd9 2777 else
46fc3d4c 2778 sv_setpvn(tmpsv, b, fb - b);
95a20fc0 2779 if (PerlLIO_stat(SvPVX_const(tmpsv), &tmpstatbuf2) < 0)
62b28dd9
LW
2780 return FALSE;
2781 return tmpstatbuf1.st_dev == tmpstatbuf2.st_dev &&
2782 tmpstatbuf1.st_ino == tmpstatbuf2.st_ino;
2783}
fe14fcc3
LW
2784#endif /* !HAS_RENAME */
2785
491527d0 2786char*
e1ec3a88 2787Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char **search_ext, I32 flags)
491527d0 2788{
e1ec3a88 2789 const char *xfound = Nullch;
491527d0 2790 char *xfailed = Nullch;
0f31cffe 2791 char tmpbuf[MAXPATHLEN];
491527d0 2792 register char *s;
5f74f29c 2793 I32 len = 0;
491527d0
GS
2794 int retval;
2795#if defined(DOSISH) && !defined(OS2) && !defined(atarist)
2796# define SEARCH_EXTS ".bat", ".cmd", NULL
2797# define MAX_EXT_LEN 4
2798#endif
2799#ifdef OS2
2800# define SEARCH_EXTS ".cmd", ".btm", ".bat", ".pl", NULL
2801# define MAX_EXT_LEN 4
2802#endif
2803#ifdef VMS
2804# define SEARCH_EXTS ".pl", ".com", NULL
2805# define MAX_EXT_LEN 4
2806#endif
2807 /* additional extensions to try in each dir if scriptname not found */
2808#ifdef SEARCH_EXTS
e1ec3a88
AL
2809 const char *exts[] = { SEARCH_EXTS };
2810 const char **ext = search_ext ? search_ext : exts;
491527d0 2811 int extidx = 0, i = 0;
e1ec3a88 2812 const char *curext = Nullch;
491527d0 2813#else
53c1dcc0 2814 PERL_UNUSED_ARG(search_ext);
491527d0
GS
2815# define MAX_EXT_LEN 0
2816#endif
2817
2818 /*
2819 * If dosearch is true and if scriptname does not contain path
2820 * delimiters, search the PATH for scriptname.
2821 *
2822 * If SEARCH_EXTS is also defined, will look for each
2823 * scriptname{SEARCH_EXTS} whenever scriptname is not found
2824 * while searching the PATH.
2825 *
2826 * Assuming SEARCH_EXTS is C<".foo",".bar",NULL>, PATH search
2827 * proceeds as follows:
2828 * If DOSISH or VMSISH:
2829 * + look for ./scriptname{,.foo,.bar}
2830 * + search the PATH for scriptname{,.foo,.bar}
2831 *
2832 * If !DOSISH:
2833 * + look *only* in the PATH for scriptname{,.foo,.bar} (note
2834 * this will not look in '.' if it's not in the PATH)
2835 */
84486fc6 2836 tmpbuf[0] = '\0';
491527d0
GS
2837
2838#ifdef VMS
2839# ifdef ALWAYS_DEFTYPES
2840 len = strlen(scriptname);
2841 if (!(len == 1 && *scriptname == '-') && scriptname[len-1] != ':') {
2842 int hasdir, idx = 0, deftypes = 1;
2843 bool seen_dot = 1;
2844
2845 hasdir = !dosearch || (strpbrk(scriptname,":[</") != Nullch) ;
2846# else
2847 if (dosearch) {
2848 int hasdir, idx = 0, deftypes = 1;
2849 bool seen_dot = 1;
2850
2851 hasdir = (strpbrk(scriptname,":[</") != Nullch) ;
2852# endif
2853 /* The first time through, just add SEARCH_EXTS to whatever we
2854 * already have, so we can check for default file types. */
2855 while (deftypes ||
84486fc6 2856 (!hasdir && my_trnlnm("DCL$PATH",tmpbuf,idx++)) )
491527d0
GS
2857 {
2858 if (deftypes) {
2859 deftypes = 0;
84486fc6 2860 *tmpbuf = '\0';
491527d0 2861 }
84486fc6
GS
2862 if ((strlen(tmpbuf) + strlen(scriptname)
2863 + MAX_EXT_LEN) >= sizeof tmpbuf)
491527d0 2864 continue; /* don't search dir with too-long name */
84486fc6 2865 strcat(tmpbuf, scriptname);
491527d0
GS
2866#else /* !VMS */
2867
2868#ifdef DOSISH
2869 if (strEQ(scriptname, "-"))
2870 dosearch = 0;
2871 if (dosearch) { /* Look in '.' first. */
fe2774ed 2872 const char *cur = scriptname;
491527d0
GS
2873#ifdef SEARCH_EXTS
2874 if ((curext = strrchr(scriptname,'.'))) /* possible current ext */
2875 while (ext[i])
2876 if (strEQ(ext[i++],curext)) {
2877 extidx = -1; /* already has an ext */
2878 break;
2879 }
2880 do {
2881#endif
2882 DEBUG_p(PerlIO_printf(Perl_debug_log,
2883 "Looking for %s\n",cur));
017f25f1
IZ
2884 if (PerlLIO_stat(cur,&PL_statbuf) >= 0
2885 && !S_ISDIR(PL_statbuf.st_mode)) {
491527d0
GS
2886 dosearch = 0;
2887 scriptname = cur;
2888#ifdef SEARCH_EXTS
2889 break;
2890#endif
2891 }
2892#ifdef SEARCH_EXTS
2893 if (cur == scriptname) {
2894 len = strlen(scriptname);
84486fc6 2895 if (len+MAX_EXT_LEN+1 >= sizeof(tmpbuf))
491527d0 2896 break;
490a0e98 2897 /* FIXME? Convert to memcpy */
84486fc6 2898 cur = strcpy(tmpbuf, scriptname);
491527d0
GS
2899 }
2900 } while (extidx >= 0 && ext[extidx] /* try an extension? */
84486fc6 2901 && strcpy(tmpbuf+len, ext[extidx++]));
491527d0
GS
2902#endif
2903 }
2904#endif
2905
cd39f2b6
JH
2906#ifdef MACOS_TRADITIONAL
2907 if (dosearch && !strchr(scriptname, ':') &&
2908 (s = PerlEnv_getenv("Commands")))
2909#else
491527d0
GS
2910 if (dosearch && !strchr(scriptname, '/')
2911#ifdef DOSISH
2912 && !strchr(scriptname, '\\')
2913#endif
cd39f2b6
JH
2914 && (s = PerlEnv_getenv("PATH")))
2915#endif
2916 {
491527d0 2917 bool seen_dot = 0;
92f0c265 2918
3280af22
NIS
2919 PL_bufend = s + strlen(s);
2920 while (s < PL_bufend) {
cd39f2b6
JH
2921#ifdef MACOS_TRADITIONAL
2922 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
2923 ',',
2924 &len);
2925#else
491527d0
GS
2926#if defined(atarist) || defined(DOSISH)
2927 for (len = 0; *s
2928# ifdef atarist
2929 && *s != ','
2930# endif
2931 && *s != ';'; len++, s++) {
84486fc6
GS
2932 if (len < sizeof tmpbuf)
2933 tmpbuf[len] = *s;
491527d0 2934 }
84486fc6
GS
2935 if (len < sizeof tmpbuf)
2936 tmpbuf[len] = '\0';
491527d0 2937#else /* ! (atarist || DOSISH) */
3280af22 2938 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, PL_bufend,
491527d0
GS
2939 ':',
2940 &len);
2941#endif /* ! (atarist || DOSISH) */
cd39f2b6 2942#endif /* MACOS_TRADITIONAL */
3280af22 2943 if (s < PL_bufend)
491527d0 2944 s++;
84486fc6 2945 if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
491527d0 2946 continue; /* don't search dir with too-long name */
cd39f2b6
JH
2947#ifdef MACOS_TRADITIONAL
2948 if (len && tmpbuf[len - 1] != ':')
2949 tmpbuf[len++] = ':';
2950#else
491527d0 2951 if (len
490a0e98 2952# if defined(atarist) || defined(__MINT__) || defined(DOSISH)
84486fc6
GS
2953 && tmpbuf[len - 1] != '/'
2954 && tmpbuf[len - 1] != '\\'
490a0e98 2955# endif
491527d0 2956 )
84486fc6
GS
2957 tmpbuf[len++] = '/';
2958 if (len == 2 && tmpbuf[0] == '.')
491527d0 2959 seen_dot = 1;
cd39f2b6 2960#endif
490a0e98
NC
2961 /* FIXME? Convert to memcpy by storing previous strlen(scriptname)
2962 */
84486fc6 2963 (void)strcpy(tmpbuf + len, scriptname);
491527d0
GS
2964#endif /* !VMS */
2965
2966#ifdef SEARCH_EXTS
84486fc6 2967 len = strlen(tmpbuf);
491527d0
GS
2968 if (extidx > 0) /* reset after previous loop */
2969 extidx = 0;
2970 do {
2971#endif
84486fc6 2972 DEBUG_p(PerlIO_printf(Perl_debug_log, "Looking for %s\n",tmpbuf));
3280af22 2973 retval = PerlLIO_stat(tmpbuf,&PL_statbuf);
017f25f1
IZ
2974 if (S_ISDIR(PL_statbuf.st_mode)) {
2975 retval = -1;
2976 }
491527d0
GS
2977#ifdef SEARCH_EXTS
2978 } while ( retval < 0 /* not there */
2979 && extidx>=0 && ext[extidx] /* try an extension? */
84486fc6 2980 && strcpy(tmpbuf+len, ext[extidx++])
491527d0
GS
2981 );
2982#endif
2983 if (retval < 0)
2984 continue;
3280af22
NIS
2985 if (S_ISREG(PL_statbuf.st_mode)
2986 && cando(S_IRUSR,TRUE,&PL_statbuf)
73811745 2987#if !defined(DOSISH) && !defined(MACOS_TRADITIONAL)
3280af22 2988 && cando(S_IXUSR,TRUE,&PL_statbuf)
491527d0
GS
2989#endif
2990 )
2991 {
3aed30dc 2992 xfound = tmpbuf; /* bingo! */
491527d0
GS
2993 break;
2994 }
2995 if (!xfailed)
84486fc6 2996 xfailed = savepv(tmpbuf);
491527d0
GS
2997 }
2998#ifndef DOSISH
017f25f1 2999 if (!xfound && !seen_dot && !xfailed &&
a1d180c4 3000 (PerlLIO_stat(scriptname,&PL_statbuf) < 0
017f25f1 3001 || S_ISDIR(PL_statbuf.st_mode)))
491527d0
GS
3002#endif
3003 seen_dot = 1; /* Disable message. */
9ccb31f9
GS
3004 if (!xfound) {
3005 if (flags & 1) { /* do or die? */
3aed30dc 3006 Perl_croak(aTHX_ "Can't %s %s%s%s",
9ccb31f9
GS
3007 (xfailed ? "execute" : "find"),
3008 (xfailed ? xfailed : scriptname),
3009 (xfailed ? "" : " on PATH"),
3010 (xfailed || seen_dot) ? "" : ", '.' not in PATH");
3011 }
3012 scriptname = Nullch;
3013 }
43c5f42d 3014 Safefree(xfailed);
491527d0
GS
3015 scriptname = xfound;
3016 }
9ccb31f9 3017 return (scriptname ? savepv(scriptname) : Nullch);
491527d0
GS
3018}
3019
ba869deb
GS
3020#ifndef PERL_GET_CONTEXT_DEFINED
3021
3022void *
3023Perl_get_context(void)
3024{
27da23d5 3025 dVAR;
3db8f154 3026#if defined(USE_ITHREADS)
ba869deb
GS
3027# ifdef OLD_PTHREADS_API
3028 pthread_addr_t t;
3029 if (pthread_getspecific(PL_thr_key, &t))
3030 Perl_croak_nocontext("panic: pthread_getspecific");
3031 return (void*)t;
3032# else
bce813aa 3033# ifdef I_MACH_CTHREADS
8b8b35ab 3034 return (void*)cthread_data(cthread_self());
bce813aa 3035# else
8b8b35ab
JH
3036 return (void*)PTHREAD_GETSPECIFIC(PL_thr_key);
3037# endif
c44d3fdb 3038# endif
ba869deb
GS
3039#else
3040 return (void*)NULL;
3041#endif
3042}
3043
3044void
3045Perl_set_context(void *t)
3046{
8772537c 3047 dVAR;
3db8f154 3048#if defined(USE_ITHREADS)
c44d3fdb
GS
3049# ifdef I_MACH_CTHREADS
3050 cthread_set_data(cthread_self(), t);
3051# else
ba869deb
GS
3052 if (pthread_setspecific(PL_thr_key, t))
3053 Perl_croak_nocontext("panic: pthread_setspecific");
c44d3fdb 3054# endif
b464bac0 3055#else
8772537c 3056 PERL_UNUSED_ARG(t);
ba869deb
GS
3057#endif
3058}
3059
3060#endif /* !PERL_GET_CONTEXT_DEFINED */
491527d0 3061
27da23d5 3062#if defined(PERL_GLOBAL_STRUCT) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
22239a37 3063struct perl_vars *
864dbfa3 3064Perl_GetVars(pTHX)
22239a37 3065{
533c011a 3066 return &PL_Vars;
22239a37 3067}
31fb1209
NIS
3068#endif
3069
1cb0ed9b 3070char **
864dbfa3 3071Perl_get_op_names(pTHX)
31fb1209 3072{
27da23d5 3073 return (char **)PL_op_name;
31fb1209
NIS
3074}
3075
1cb0ed9b 3076char **
864dbfa3 3077Perl_get_op_descs(pTHX)
31fb1209 3078{
27da23d5 3079 return (char **)PL_op_desc;
31fb1209 3080}
9e6b2b00 3081
e1ec3a88 3082const char *
864dbfa3 3083Perl_get_no_modify(pTHX)
9e6b2b00 3084{
e1ec3a88 3085 return PL_no_modify;
9e6b2b00
GS
3086}
3087
3088U32 *
864dbfa3 3089Perl_get_opargs(pTHX)
9e6b2b00 3090{
27da23d5 3091 return (U32 *)PL_opargs;
9e6b2b00 3092}
51aa15f3 3093
0cb96387
GS
3094PPADDR_t*
3095Perl_get_ppaddr(pTHX)
3096{
27da23d5 3097 dVAR;
12ae5dfc 3098 return (PPADDR_t*)PL_ppaddr;
0cb96387
GS
3099}
3100
a6c40364
GS
3101#ifndef HAS_GETENV_LEN
3102char *
bf4acbe4 3103Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
a6c40364 3104{
8772537c 3105 char * const env_trans = PerlEnv_getenv(env_elem);
a6c40364
GS
3106 if (env_trans)
3107 *len = strlen(env_trans);
3108 return env_trans;
f675dbe5
CB
3109}
3110#endif
3111
dc9e4912
GS
3112
3113MGVTBL*
864dbfa3 3114Perl_get_vtbl(pTHX_ int vtbl_id)
dc9e4912 3115{
27da23d5 3116 const MGVTBL* result = Null(MGVTBL*);
dc9e4912
GS
3117
3118 switch(vtbl_id) {
3119 case want_vtbl_sv:
3120 result = &PL_vtbl_sv;
3121 break;
3122 case want_vtbl_env:
3123 result = &PL_vtbl_env;
3124 break;
3125 case want_vtbl_envelem:
3126 result = &PL_vtbl_envelem;
3127 break;
3128 case want_vtbl_sig:
3129 result = &PL_vtbl_sig;
3130 break;
3131 case want_vtbl_sigelem:
3132 result = &PL_vtbl_sigelem;
3133 break;
3134 case want_vtbl_pack:
3135 result = &PL_vtbl_pack;
3136 break;
3137 case want_vtbl_packelem:
3138 result = &PL_vtbl_packelem;
3139 break;
3140 case want_vtbl_dbline:
3141 result = &PL_vtbl_dbline;
3142 break;
3143 case want_vtbl_isa:
3144 result = &PL_vtbl_isa;
3145 break;
3146 case want_vtbl_isaelem:
3147 result = &PL_vtbl_isaelem;
3148 break;
3149 case want_vtbl_arylen:
3150 result = &PL_vtbl_arylen;
3151 break;
3152 case want_vtbl_glob:
3153 result = &PL_vtbl_glob;
3154 break;
3155 case want_vtbl_mglob:
3156 result = &PL_vtbl_mglob;
3157 break;
3158 case want_vtbl_nkeys:
3159 result = &PL_vtbl_nkeys;
3160 break;
3161 case want_vtbl_taint:
3162 result = &PL_vtbl_taint;
3163 break;
3164 case want_vtbl_substr:
3165 result = &PL_vtbl_substr;
3166 break;
3167 case want_vtbl_vec:
3168 result = &PL_vtbl_vec;
3169 break;
3170 case want_vtbl_pos:
3171 result = &PL_vtbl_pos;
3172 break;
3173 case want_vtbl_bm:
3174 result = &PL_vtbl_bm;
3175 break;
3176 case want_vtbl_fm:
3177 result = &PL_vtbl_fm;
3178 break;
3179 case want_vtbl_uvar:
3180 result = &PL_vtbl_uvar;
3181 break;
dc9e4912
GS
3182 case want_vtbl_defelem:
3183 result = &PL_vtbl_defelem;
3184 break;
3185 case want_vtbl_regexp:
3186 result = &PL_vtbl_regexp;
3187 break;
3188 case want_vtbl_regdata:
3189 result = &PL_vtbl_regdata;
3190 break;
3191 case want_vtbl_regdatum:
3192 result = &PL_vtbl_regdatum;
3193 break;
3c90161d 3194#ifdef USE_LOCALE_COLLATE
dc9e4912
GS
3195 case want_vtbl_collxfrm:
3196 result = &PL_vtbl_collxfrm;
3197 break;
3c90161d 3198#endif
dc9e4912
GS
3199 case want_vtbl_amagic:
3200 result = &PL_vtbl_amagic;
3201 break;
3202 case want_vtbl_amagicelem:
3203 result = &PL_vtbl_amagicelem;
3204 break;
810b8aa5
GS
3205 case want_vtbl_backref:
3206 result = &PL_vtbl_backref;
3207 break;
7e8c5dac
HS
3208 case want_vtbl_utf8:
3209 result = &PL_vtbl_utf8;
3210 break;
dc9e4912 3211 }
27da23d5 3212 return (MGVTBL*)result;
dc9e4912
GS
3213}
3214
767df6a1 3215I32
864dbfa3 3216Perl_my_fflush_all(pTHX)
767df6a1 3217{
f800e14d 3218#if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
ce720889 3219 return PerlIO_flush(NULL);
767df6a1 3220#else
8fbdfb7c 3221# if defined(HAS__FWALK)
f13a2bc0 3222 extern int fflush(FILE *);
74cac757
JH
3223 /* undocumented, unprototyped, but very useful BSDism */
3224 extern void _fwalk(int (*)(FILE *));
8fbdfb7c 3225 _fwalk(&fflush);
74cac757 3226 return 0;
8fa7f367 3227# else
8fbdfb7c 3228# if defined(FFLUSH_ALL) && defined(HAS_STDIO_STREAM_ARRAY)
8fa7f367 3229 long open_max = -1;
8fbdfb7c 3230# ifdef PERL_FFLUSH_ALL_FOPEN_MAX
d2201af2 3231 open_max = PERL_FFLUSH_ALL_FOPEN_MAX;
8fbdfb7c 3232# else
8fa7f367 3233# if defined(HAS_SYSCONF) && defined(_SC_OPEN_MAX)
767df6a1 3234 open_max = sysconf(_SC_OPEN_MAX);
8fa7f367
JH
3235# else
3236# ifdef FOPEN_MAX
74cac757 3237 open_max = FOPEN_MAX;
8fa7f367
JH
3238# else
3239# ifdef OPEN_MAX
74cac757 3240 open_max = OPEN_MAX;
8fa7f367
JH
3241# else
3242# ifdef _NFILE
d2201af2 3243 open_max = _NFILE;
8fa7f367
JH
3244# endif
3245# endif
74cac757 3246# endif
767df6a1
JH
3247# endif
3248# endif
767df6a1
JH
3249 if (open_max > 0) {
3250 long i;
3251 for (i = 0; i < open_max; i++)
d2201af2
AD
3252 if (STDIO_STREAM_ARRAY[i]._file >= 0 &&
3253 STDIO_STREAM_ARRAY[i]._file < open_max &&
3254 STDIO_STREAM_ARRAY[i]._flag)
3255 PerlIO_flush(&STDIO_STREAM_ARRAY[i]);
767df6a1
JH
3256 return 0;
3257 }
8fbdfb7c 3258# endif
93189314 3259 SETERRNO(EBADF,RMS_IFI);
767df6a1 3260 return EOF;
74cac757 3261# endif
767df6a1
JH
3262#endif
3263}
097ee67d 3264
69282e91 3265void
e1ec3a88 3266Perl_report_evil_fh(pTHX_ const GV *gv, const IO *io, I32 op)
bc37a18f 3267{
e1ec3a88 3268 const char *func =
66fc2fa5
JH
3269 op == OP_READLINE ? "readline" : /* "<HANDLE>" not nice */
3270 op == OP_LEAVEWRITE ? "write" : /* "write exit" not nice */
bc37a18f 3271 PL_op_desc[op];
e1ec3a88
AL
3272 const char *pars = OP_IS_FILETEST(op) ? "" : "()";
3273 const char *type = OP_IS_SOCKET(op)
3aed30dc
HS
3274 || (gv && io && IoTYPE(io) == IoTYPE_SOCKET)
3275 ? "socket" : "filehandle";
e1ec3a88 3276 const char *name = NULL;
bc37a18f 3277
66fc2fa5 3278 if (gv && isGV(gv)) {
f62cb720 3279 name = GvENAME(gv);
66fc2fa5
JH
3280 }
3281
4c80c0b2 3282 if (op == OP_phoney_OUTPUT_ONLY || op == OP_phoney_INPUT_ONLY) {
3aed30dc 3283 if (ckWARN(WARN_IO)) {
fd322ea4 3284 const char *direction = (op == OP_phoney_INPUT_ONLY) ? "in" : "out";
3aed30dc
HS
3285 if (name && *name)
3286 Perl_warner(aTHX_ packWARN(WARN_IO),
3287 "Filehandle %s opened only for %sput",
fd322ea4 3288 name, direction);
3aed30dc
HS
3289 else
3290 Perl_warner(aTHX_ packWARN(WARN_IO),
fd322ea4 3291 "Filehandle opened only for %sput", direction);
3aed30dc 3292 }
2dd78f96
JH
3293 }
3294 else {
e1ec3a88 3295 const char *vile;
3aed30dc
HS
3296 I32 warn_type;
3297
3298 if (gv && io && IoTYPE(io) == IoTYPE_CLOSED) {
3299 vile = "closed";
3300 warn_type = WARN_CLOSED;
3301 }
3302 else {
3303 vile = "unopened";
3304 warn_type = WARN_UNOPENED;
3305 }
3306
3307 if (ckWARN(warn_type)) {
3308 if (name && *name) {
3309 Perl_warner(aTHX_ packWARN(warn_type),
3310 "%s%s on %s %s %s", func, pars, vile, type, name);
3311 if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3312 Perl_warner(
3313 aTHX_ packWARN(warn_type),
3314 "\t(Are you trying to call %s%s on dirhandle %s?)\n",
3315 func, pars, name
3316 );
3317 }
3318 else {
3319 Perl_warner(aTHX_ packWARN(warn_type),
3320 "%s%s on %s %s", func, pars, vile, type);
3321 if (gv && io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
3322 Perl_warner(
3323 aTHX_ packWARN(warn_type),
3324 "\t(Are you trying to call %s%s on dirhandle?)\n",
3325 func, pars
3326 );
3327 }
3328 }
bc37a18f 3329 }
69282e91 3330}
a926ef6b
JH
3331
3332#ifdef EBCDIC
cbebf344
JH
3333/* in ASCII order, not that it matters */
3334static const char controllablechars[] = "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
3335
a926ef6b
JH
3336int
3337Perl_ebcdic_control(pTHX_ int ch)
3338{
3aed30dc 3339 if (ch > 'a') {
e1ec3a88 3340 const char *ctlp;
3aed30dc
HS
3341
3342 if (islower(ch))
3343 ch = toupper(ch);
3344
3345 if ((ctlp = strchr(controllablechars, ch)) == 0) {
3346 Perl_die(aTHX_ "unrecognised control character '%c'\n", ch);
a926ef6b 3347 }
3aed30dc
HS
3348
3349 if (ctlp == controllablechars)
3350 return('\177'); /* DEL */
3351 else
3352 return((unsigned char)(ctlp - controllablechars - 1));
3353 } else { /* Want uncontrol */
3354 if (ch == '\177' || ch == -1)
3355 return('?');
3356 else if (ch == '\157')
3357 return('\177');
3358 else if (ch == '\174')
3359 return('\000');
3360 else if (ch == '^') /* '\137' in 1047, '\260' in 819 */
3361 return('\036');
3362 else if (ch == '\155')
3363 return('\037');
3364 else if (0 < ch && ch < (sizeof(controllablechars) - 1))
3365 return(controllablechars[ch+1]);
3366 else
3367 Perl_die(aTHX_ "invalid control request: '\\%03o'\n", ch & 0xFF);
3368 }
a926ef6b
JH
3369}
3370#endif
e72cf795 3371
f6adc668 3372/* To workaround core dumps from the uninitialised tm_zone we get the
e72cf795
JH
3373 * system to give us a reasonable struct to copy. This fix means that
3374 * strftime uses the tm_zone and tm_gmtoff values returned by
3375 * localtime(time()). That should give the desired result most of the
3376 * time. But probably not always!
3377 *
f6adc668
JH
3378 * This does not address tzname aspects of NETaa14816.
3379 *
e72cf795 3380 */
f6adc668 3381
e72cf795
JH
3382#ifdef HAS_GNULIBC
3383# ifndef STRUCT_TM_HASZONE
3384# define STRUCT_TM_HASZONE
3385# endif
3386#endif
3387
f6adc668
JH
3388#ifdef STRUCT_TM_HASZONE /* Backward compat */
3389# ifndef HAS_TM_TM_ZONE
3390# define HAS_TM_TM_ZONE
3391# endif
3392#endif
3393
e72cf795 3394void
f1208910 3395Perl_init_tm(pTHX_ struct tm *ptm) /* see mktime, strftime and asctime */
e72cf795 3396{
f6adc668 3397#ifdef HAS_TM_TM_ZONE
e72cf795 3398 Time_t now;
1b6737cc 3399 const struct tm* my_tm;
e72cf795 3400 (void)time(&now);
82c57498 3401 my_tm = localtime(&now);
ca46b8ee
SP
3402 if (my_tm)
3403 Copy(my_tm, ptm, 1, struct tm);
1b6737cc
AL
3404#else
3405 PERL_UNUSED_ARG(ptm);
e72cf795
JH
3406#endif
3407}
3408
3409/*
3410 * mini_mktime - normalise struct tm values without the localtime()
3411 * semantics (and overhead) of mktime().
3412 */
3413void
f1208910 3414Perl_mini_mktime(pTHX_ struct tm *ptm)
e72cf795
JH
3415{
3416 int yearday;
3417 int secs;
3418 int month, mday, year, jday;
3419 int odd_cent, odd_year;
3420
3421#define DAYS_PER_YEAR 365
3422#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
3423#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
3424#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
3425#define SECS_PER_HOUR (60*60)
3426#define SECS_PER_DAY (24*SECS_PER_HOUR)
3427/* parentheses deliberately absent on these two, otherwise they don't work */
3428#define MONTH_TO_DAYS 153/5
3429#define DAYS_TO_MONTH 5/153
3430/* offset to bias by March (month 4) 1st between month/mday & year finding */
3431#define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
3432/* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
3433#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
3434
3435/*
3436 * Year/day algorithm notes:
3437 *
3438 * With a suitable offset for numeric value of the month, one can find
3439 * an offset into the year by considering months to have 30.6 (153/5) days,
3440 * using integer arithmetic (i.e., with truncation). To avoid too much
3441 * messing about with leap days, we consider January and February to be
3442 * the 13th and 14th month of the previous year. After that transformation,
3443 * we need the month index we use to be high by 1 from 'normal human' usage,
3444 * so the month index values we use run from 4 through 15.
3445 *
3446 * Given that, and the rules for the Gregorian calendar (leap years are those
3447 * divisible by 4 unless also divisible by 100, when they must be divisible
3448 * by 400 instead), we can simply calculate the number of days since some
3449 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
3450 * the days we derive from our month index, and adding in the day of the
3451 * month. The value used here is not adjusted for the actual origin which
3452 * it normally would use (1 January A.D. 1), since we're not exposing it.
3453 * We're only building the value so we can turn around and get the
3454 * normalised values for the year, month, day-of-month, and day-of-year.
3455 *
3456 * For going backward, we need to bias the value we're using so that we find
3457 * the right year value. (Basically, we don't want the contribution of
3458 * March 1st to the number to apply while deriving the year). Having done
3459 * that, we 'count up' the contribution to the year number by accounting for
3460 * full quadracenturies (400-year periods) with their extra leap days, plus
3461 * the contribution from full centuries (to avoid counting in the lost leap
3462 * days), plus the contribution from full quad-years (to count in the normal
3463 * leap days), plus the leftover contribution from any non-leap years.
3464 * At this point, if we were working with an actual leap day, we'll have 0
3465 * days left over. This is also true for March 1st, however. So, we have
3466 * to special-case that result, and (earlier) keep track of the 'odd'
3467 * century and year contributions. If we got 4 extra centuries in a qcent,
3468 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
3469 * Otherwise, we add back in the earlier bias we removed (the 123 from
3470 * figuring in March 1st), find the month index (integer division by 30.6),
3471 * and the remainder is the day-of-month. We then have to convert back to
3472 * 'real' months (including fixing January and February from being 14/15 in
3473 * the previous year to being in the proper year). After that, to get
3474 * tm_yday, we work with the normalised year and get a new yearday value for
3475 * January 1st, which we subtract from the yearday value we had earlier,
3476 * representing the date we've re-built. This is done from January 1
3477 * because tm_yday is 0-origin.
3478 *
3479 * Since POSIX time routines are only guaranteed to work for times since the
3480 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
3481 * applies Gregorian calendar rules even to dates before the 16th century
3482 * doesn't bother me. Besides, you'd need cultural context for a given
3483 * date to know whether it was Julian or Gregorian calendar, and that's
3484 * outside the scope for this routine. Since we convert back based on the
3485 * same rules we used to build the yearday, you'll only get strange results
3486 * for input which needed normalising, or for the 'odd' century years which
3487 * were leap years in the Julian calander but not in the Gregorian one.
3488 * I can live with that.
3489 *
3490 * This algorithm also fails to handle years before A.D. 1 gracefully, but
3491 * that's still outside the scope for POSIX time manipulation, so I don't
3492 * care.
3493 */
3494
3495 year = 1900 + ptm->tm_year;
3496 month = ptm->tm_mon;
3497 mday = ptm->tm_mday;
3498 /* allow given yday with no month & mday to dominate the result */
3499 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
3500 month = 0;
3501 mday = 0;
3502 jday = 1 + ptm->tm_yday;
3503 }
3504 else {
3505 jday = 0;
3506 }
3507 if (month >= 2)
3508 month+=2;
3509 else
3510 month+=14, year--;
3511 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
3512 yearday += month*MONTH_TO_DAYS + mday + jday;
3513 /*
3514 * Note that we don't know when leap-seconds were or will be,
3515 * so we have to trust the user if we get something which looks
3516 * like a sensible leap-second. Wild values for seconds will
3517 * be rationalised, however.
3518 */
3519 if ((unsigned) ptm->tm_sec <= 60) {
3520 secs = 0;
3521 }
3522 else {
3523 secs = ptm->tm_sec;
3524 ptm->tm_sec = 0;
3525 }
3526 secs += 60 * ptm->tm_min;
3527 secs += SECS_PER_HOUR * ptm->tm_hour;
3528 if (secs < 0) {
3529 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
3530 /* got negative remainder, but need positive time */
3531 /* back off an extra day to compensate */
3532 yearday += (secs/SECS_PER_DAY)-1;
3533 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
3534 }
3535 else {
3536 yearday += (secs/SECS_PER_DAY);
3537 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
3538 }
3539 }
3540 else if (secs >= SECS_PER_DAY) {
3541 yearday += (secs/SECS_PER_DAY);
3542 secs %= SECS_PER_DAY;
3543 }
3544 ptm->tm_hour = secs/SECS_PER_HOUR;
3545 secs %= SECS_PER_HOUR;
3546 ptm->tm_min = secs/60;
3547 secs %= 60;
3548 ptm->tm_sec += secs;
3549 /* done with time of day effects */
3550 /*
3551 * The algorithm for yearday has (so far) left it high by 428.
3552 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
3553 * bias it by 123 while trying to figure out what year it
3554 * really represents. Even with this tweak, the reverse
3555 * translation fails for years before A.D. 0001.
3556 * It would still fail for Feb 29, but we catch that one below.
3557 */
3558 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
3559 yearday -= YEAR_ADJUST;
3560 year = (yearday / DAYS_PER_QCENT) * 400;
3561 yearday %= DAYS_PER_QCENT;
3562 odd_cent = yearday / DAYS_PER_CENT;
3563 year += odd_cent * 100;
3564 yearday %= DAYS_PER_CENT;
3565 year += (yearday / DAYS_PER_QYEAR) * 4;
3566 yearday %= DAYS_PER_QYEAR;
3567 odd_year = yearday / DAYS_PER_YEAR;
3568 year += odd_year;
3569 yearday %= DAYS_PER_YEAR;
3570 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
3571 month = 1;
3572 yearday = 29;
3573 }
3574 else {
3575 yearday += YEAR_ADJUST; /* recover March 1st crock */
3576 month = yearday*DAYS_TO_MONTH;
3577 yearday -= month*MONTH_TO_DAYS;
3578 /* recover other leap-year adjustment */
3579 if (month > 13) {
3580 month-=14;
3581 year++;
3582 }
3583 else {
3584 month-=2;
3585 }
3586 }
3587 ptm->tm_year = year - 1900;
3588 if (yearday) {
3589 ptm->tm_mday = yearday;
3590 ptm->tm_mon = month;
3591 }
3592 else {
3593 ptm->tm_mday = 31;
3594 ptm->tm_mon = month - 1;
3595 }
3596 /* re-build yearday based on Jan 1 to get tm_yday */
3597 year--;
3598 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
3599 yearday += 14*MONTH_TO_DAYS + 1;
3600 ptm->tm_yday = jday - yearday;
3601 /* fix tm_wday if not overridden by caller */
3602 if ((unsigned)ptm->tm_wday > 6)
3603 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
3604}
b3c85772
JH
3605
3606char *
e1ec3a88 3607Perl_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
3608{
3609#ifdef HAS_STRFTIME
3610 char *buf;
3611 int buflen;
3612 struct tm mytm;
3613 int len;
3614
3615 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3616 mytm.tm_sec = sec;
3617 mytm.tm_min = min;
3618 mytm.tm_hour = hour;
3619 mytm.tm_mday = mday;
3620 mytm.tm_mon = mon;
3621 mytm.tm_year = year;
3622 mytm.tm_wday = wday;
3623 mytm.tm_yday = yday;
3624 mytm.tm_isdst = isdst;
3625 mini_mktime(&mytm);
c473feec
SR
3626 /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */
3627#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE))
3628 STMT_START {
3629 struct tm mytm2;
3630 mytm2 = mytm;
3631 mktime(&mytm2);
3632#ifdef HAS_TM_TM_GMTOFF
3633 mytm.tm_gmtoff = mytm2.tm_gmtoff;
3634#endif
3635#ifdef HAS_TM_TM_ZONE
3636 mytm.tm_zone = mytm2.tm_zone;
3637#endif
3638 } STMT_END;
3639#endif
b3c85772
JH
3640 buflen = 64;
3641 New(0, buf, buflen, char);
3642 len = strftime(buf, buflen, fmt, &mytm);
3643 /*
877f6a72 3644 ** The following is needed to handle to the situation where
b3c85772
JH
3645 ** tmpbuf overflows. Basically we want to allocate a buffer
3646 ** and try repeatedly. The reason why it is so complicated
3647 ** is that getting a return value of 0 from strftime can indicate
3648 ** one of the following:
3649 ** 1. buffer overflowed,
3650 ** 2. illegal conversion specifier, or
3651 ** 3. the format string specifies nothing to be returned(not
3652 ** an error). This could be because format is an empty string
3653 ** or it specifies %p that yields an empty string in some locale.
3654 ** If there is a better way to make it portable, go ahead by
3655 ** all means.
3656 */
3657 if ((len > 0 && len < buflen) || (len == 0 && *fmt == '\0'))
3658 return buf;
3659 else {
3660 /* Possibly buf overflowed - try again with a bigger buf */
e1ec3a88
AL
3661 const int fmtlen = strlen(fmt);
3662 const int bufsize = fmtlen + buflen;
877f6a72 3663
b3c85772
JH
3664 New(0, buf, bufsize, char);
3665 while (buf) {
3666 buflen = strftime(buf, bufsize, fmt, &mytm);
3667 if (buflen > 0 && buflen < bufsize)
3668 break;
3669 /* heuristic to prevent out-of-memory errors */
3670 if (bufsize > 100*fmtlen) {
3671 Safefree(buf);
3672 buf = NULL;
3673 break;
3674 }
e1ec3a88 3675 Renew(buf, bufsize*2, char);
b3c85772
JH
3676 }
3677 return buf;
3678 }
3679#else
3680 Perl_croak(aTHX_ "panic: no strftime");
27da23d5 3681 return NULL;
b3c85772
JH
3682#endif
3683}
3684
877f6a72
NIS
3685
3686#define SV_CWD_RETURN_UNDEF \
3687sv_setsv(sv, &PL_sv_undef); \
3688return FALSE
3689
3690#define SV_CWD_ISDOT(dp) \
3691 (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
3aed30dc 3692 (dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
877f6a72
NIS
3693
3694/*
ccfc67b7
JH
3695=head1 Miscellaneous Functions
3696
89423764 3697=for apidoc getcwd_sv
877f6a72
NIS
3698
3699Fill the sv with current working directory
3700
3701=cut
3702*/
3703
3704/* Originally written in Perl by John Bazik; rewritten in C by Ben Sugars.
3705 * rewritten again by dougm, optimized for use with xs TARG, and to prefer
3706 * getcwd(3) if available
3707 * Comments from the orignal:
3708 * This is a faster version of getcwd. It's also more dangerous
3709 * because you might chdir out of a directory that you can't chdir
3710 * back into. */
3711
877f6a72 3712int
89423764 3713Perl_getcwd_sv(pTHX_ register SV *sv)
877f6a72
NIS
3714{
3715#ifndef PERL_MICRO
3716
ea715489
JH
3717#ifndef INCOMPLETE_TAINTS
3718 SvTAINTED_on(sv);
3719#endif
3720
8f95b30d
JH
3721#ifdef HAS_GETCWD
3722 {
60e110a8
DM
3723 char buf[MAXPATHLEN];
3724
3aed30dc 3725 /* Some getcwd()s automatically allocate a buffer of the given
60e110a8
DM
3726 * size from the heap if they are given a NULL buffer pointer.
3727 * The problem is that this behaviour is not portable. */
3aed30dc 3728 if (getcwd(buf, sizeof(buf) - 1)) {
4373e329 3729 sv_setpvn(sv, buf, strlen(buf));
3aed30dc
HS
3730 return TRUE;
3731 }
3732 else {
3733 sv_setsv(sv, &PL_sv_undef);
3734 return FALSE;
3735 }
8f95b30d
JH
3736 }
3737
3738#else
3739
c623ac67 3740 Stat_t statbuf;
877f6a72 3741 int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino;
4373e329 3742 int pathlen=0;
877f6a72 3743 Direntry_t *dp;
877f6a72 3744
862a34c6 3745 SvUPGRADE(sv, SVt_PV);
877f6a72 3746
877f6a72 3747 if (PerlLIO_lstat(".", &statbuf) < 0) {
3aed30dc 3748 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3749 }
3750
3751 orig_cdev = statbuf.st_dev;
3752 orig_cino = statbuf.st_ino;
3753 cdev = orig_cdev;
3754 cino = orig_cino;
3755
3756 for (;;) {
4373e329 3757 DIR *dir;
3aed30dc
HS
3758 odev = cdev;
3759 oino = cino;
3760
3761 if (PerlDir_chdir("..") < 0) {
3762 SV_CWD_RETURN_UNDEF;
3763 }
3764 if (PerlLIO_stat(".", &statbuf) < 0) {
3765 SV_CWD_RETURN_UNDEF;
3766 }
3767
3768 cdev = statbuf.st_dev;
3769 cino = statbuf.st_ino;
3770
3771 if (odev == cdev && oino == cino) {
3772 break;
3773 }
3774 if (!(dir = PerlDir_open("."))) {
3775 SV_CWD_RETURN_UNDEF;
3776 }
3777
3778 while ((dp = PerlDir_read(dir)) != NULL) {
877f6a72 3779#ifdef DIRNAMLEN
4373e329 3780 const int namelen = dp->d_namlen;
877f6a72 3781#else
4373e329 3782 const int namelen = strlen(dp->d_name);
877f6a72 3783#endif
3aed30dc
HS
3784 /* skip . and .. */
3785 if (SV_CWD_ISDOT(dp)) {
3786 continue;
3787 }
3788
3789 if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) {
3790 SV_CWD_RETURN_UNDEF;
3791 }
3792
3793 tdev = statbuf.st_dev;
3794 tino = statbuf.st_ino;
3795 if (tino == oino && tdev == odev) {
3796 break;
3797 }
cb5953d6
JH
3798 }
3799
3aed30dc
HS
3800 if (!dp) {
3801 SV_CWD_RETURN_UNDEF;
3802 }
3803
3804 if (pathlen + namelen + 1 >= MAXPATHLEN) {
3805 SV_CWD_RETURN_UNDEF;
3806 }
877f6a72 3807
3aed30dc
HS
3808 SvGROW(sv, pathlen + namelen + 1);
3809
3810 if (pathlen) {
3811 /* shift down */
95a20fc0 3812 Move(SvPVX_const(sv), SvPVX(sv) + namelen + 1, pathlen, char);
3aed30dc 3813 }
877f6a72 3814
3aed30dc
HS
3815 /* prepend current directory to the front */
3816 *SvPVX(sv) = '/';
3817 Move(dp->d_name, SvPVX(sv)+1, namelen, char);
3818 pathlen += (namelen + 1);
877f6a72
NIS
3819
3820#ifdef VOID_CLOSEDIR
3aed30dc 3821 PerlDir_close(dir);
877f6a72 3822#else
3aed30dc
HS
3823 if (PerlDir_close(dir) < 0) {
3824 SV_CWD_RETURN_UNDEF;
3825 }
877f6a72
NIS
3826#endif
3827 }
3828
60e110a8 3829 if (pathlen) {
3aed30dc
HS
3830 SvCUR_set(sv, pathlen);
3831 *SvEND(sv) = '\0';
3832 SvPOK_only(sv);
877f6a72 3833
95a20fc0 3834 if (PerlDir_chdir(SvPVX_const(sv)) < 0) {
3aed30dc
HS
3835 SV_CWD_RETURN_UNDEF;
3836 }
877f6a72
NIS
3837 }
3838 if (PerlLIO_stat(".", &statbuf) < 0) {
3aed30dc 3839 SV_CWD_RETURN_UNDEF;
877f6a72
NIS
3840 }
3841
3842 cdev = statbuf.st_dev;
3843 cino = statbuf.st_ino;
3844
3845 if (cdev != orig_cdev || cino != orig_cino) {
3aed30dc
HS
3846 Perl_croak(aTHX_ "Unstable directory path, "
3847 "current directory changed unexpectedly");
877f6a72 3848 }
877f6a72
NIS
3849
3850 return TRUE;
793b8d8e
JH
3851#endif
3852
877f6a72
NIS
3853#else
3854 return FALSE;
3855#endif
3856}
3857
f4758303 3858/*
b0f01acb
JP
3859=for apidoc scan_version
3860
3861Returns a pointer to the next character after the parsed
3862version string, as well as upgrading the passed in SV to
3863an RV.
3864
3865Function must be called with an already existing SV like
3866
137d6fc0
JP
3867 sv = newSV(0);
3868 s = scan_version(s,SV *sv, bool qv);
b0f01acb
JP
3869
3870Performs some preprocessing to the string to ensure that
3871it has the correct characteristics of a version. Flags the
3872object if it contains an underscore (which denotes this
137d6fc0
JP
3873is a alpha version). The boolean qv denotes that the version
3874should be interpreted as if it had multiple decimals, even if
3875it doesn't.
b0f01acb
JP
3876
3877=cut
3878*/
3879
9137345a 3880const char *
e1ec3a88 3881Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv)
b0f01acb 3882{
e568f1a0 3883 const char *start = s;
9137345a
JP
3884 const char *pos;
3885 const char *last;
3886 int saw_period = 0;
3887 int saw_under = 0;
3888 int width = 3;
3889 AV *av = newAV();
3890 SV* hv = newSVrv(rv, "version"); /* create an SV and upgrade the RV */
3891 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
3a242bf8
NC
3892#ifndef NODEFAULT_SHAREKEYS
3893 HvSHAREKEYS_on(hv); /* key-sharing on by default */
3894#endif
9137345a
JP
3895
3896 if (*s == 'v') {
3897 s++; /* get past 'v' */
3898 qv = 1; /* force quoted version processing */
3899 }
3900
3901 last = pos = s;
3902
3903 /* pre-scan the input string to check for decimals/underbars */
ad63d80f
JP
3904 while ( *pos == '.' || *pos == '_' || isDIGIT(*pos) )
3905 {
3906 if ( *pos == '.' )
3907 {
3908 if ( saw_under )
5f89c282 3909 Perl_croak(aTHX_ "Invalid version format (underscores before decimal)");
ad63d80f 3910 saw_period++ ;
9137345a 3911 last = pos;
46314c13 3912 }
ad63d80f
JP
3913 else if ( *pos == '_' )
3914 {
3915 if ( saw_under )
5f89c282 3916 Perl_croak(aTHX_ "Invalid version format (multiple underscores)");
ad63d80f 3917 saw_under = 1;
9137345a 3918 width = pos - last - 1; /* natural width of sub-version */
ad63d80f
JP
3919 }
3920 pos++;
3921 }
ad63d80f 3922
9137345a 3923 if ( saw_period > 1 ) {
137d6fc0
JP
3924 qv = 1; /* force quoted version processing */
3925 }
9137345a
JP
3926
3927 pos = s;
3928
3929 if ( qv )
3930 hv_store((HV *)hv, "qv", 2, &PL_sv_yes, 0);
3931 if ( saw_under ) {
3932 hv_store((HV *)hv, "alpha", 5, &PL_sv_yes, 0);
3933 }
3934 if ( !qv && width < 3 )
3935 hv_store((HV *)hv, "width", 5, newSViv(width), 0);
3936
ad63d80f 3937 while (isDIGIT(*pos))
46314c13 3938 pos++;
ad63d80f
JP
3939 if (!isALPHA(*pos)) {
3940 I32 rev;
3941
ad63d80f
JP
3942 for (;;) {
3943 rev = 0;
3944 {
129318bd 3945 /* this is atoi() that delimits on underscores */
9137345a 3946 const char *end = pos;
129318bd
JP
3947 I32 mult = 1;
3948 I32 orev;
9137345a 3949
129318bd
JP
3950 /* the following if() will only be true after the decimal
3951 * point of a version originally created with a bare
3952 * floating point number, i.e. not quoted in any way
3953 */
13f8f398 3954 if ( !qv && s > start+1 && saw_period == 1 ) {
c76df65e 3955 mult *= 100;
129318bd
JP
3956 while ( s < end ) {
3957 orev = rev;
3958 rev += (*s - '0') * mult;
3959 mult /= 10;
32fdb065 3960 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
3961 Perl_croak(aTHX_ "Integer overflow in version");
3962 s++;
9137345a
JP
3963 if ( *s == '_' )
3964 s++;
129318bd
JP
3965 }
3966 }
3967 else {
3968 while (--end >= s) {
3969 orev = rev;
3970 rev += (*end - '0') * mult;
3971 mult *= 10;
32fdb065 3972 if ( PERL_ABS(orev) > PERL_ABS(rev) )
129318bd
JP
3973 Perl_croak(aTHX_ "Integer overflow in version");
3974 }
3975 }
3976 }
9137345a 3977
129318bd 3978 /* Append revision */
9137345a
JP
3979 av_push(av, newSViv(rev));
3980 if ( *pos == '.' && isDIGIT(pos[1]) )
3981 s = ++pos;
3982 else if ( *pos == '_' && isDIGIT(pos[1]) )
ad63d80f
JP
3983 s = ++pos;
3984 else if ( isDIGIT(*pos) )
3985 s = pos;
b0f01acb 3986 else {
ad63d80f
JP
3987 s = pos;
3988 break;
3989 }
9137345a
JP
3990 if ( qv ) {
3991 while ( isDIGIT(*pos) )
3992 pos++;
3993 }
3994 else {
3995 int digits = 0;
3996 while ( ( isDIGIT(*pos) || *pos == '_' ) && digits < 3 ) {
3997 if ( *pos != '_' )
3998 digits++;
3999 pos++;
4000 }
b0f01acb
JP
4001 }
4002 }
4003 }
9137345a
JP
4004 if ( qv ) { /* quoted versions always get at least three terms*/
4005 I32 len = av_len(av);
4edfc503
NC
4006 /* This for loop appears to trigger a compiler bug on OS X, as it
4007 loops infinitely. Yes, len is negative. No, it makes no sense.
4008 Compiler in question is:
4009 gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)
4010 for ( len = 2 - len; len > 0; len-- )
4011 av_push((AV *)sv, newSViv(0));
4012 */
4013 len = 2 - len;
4014 while (len-- > 0)
9137345a 4015 av_push(av, newSViv(0));
b9381830 4016 }
9137345a
JP
4017
4018 if ( av_len(av) == -1 ) /* oops, someone forgot to pass a value */
4019 av_push(av, newSViv(0));
4020
4021 /* And finally, store the AV in the hash */
4022 hv_store((HV *)hv, "version", 7, (SV *)av, 0);
4023 return s;
b0f01acb
JP
4024}
4025
4026/*
4027=for apidoc new_version
4028
4029Returns a new version object based on the passed in SV:
4030
4031 SV *sv = new_version(SV *ver);
4032
4033Does not alter the passed in ver SV. See "upg_version" if you
4034want to upgrade the SV.
4035
4036=cut
4037*/
4038
4039SV *
4040Perl_new_version(pTHX_ SV *ver)
4041{
129318bd 4042 SV *rv = newSV(0);
d7aa5382
JP
4043 if ( sv_derived_from(ver,"version") ) /* can just copy directly */
4044 {
4045 I32 key;
53c1dcc0 4046 AV * const av = newAV();
9137345a
JP
4047 AV *sav;
4048 /* This will get reblessed later if a derived class*/
53c1dcc0 4049 SV* const hv = newSVrv(rv, "version");
9137345a 4050 (void)sv_upgrade(hv, SVt_PVHV); /* needs to be an HV type */
3a242bf8
NC
4051#ifndef NODEFAULT_SHAREKEYS
4052 HvSHAREKEYS_on(hv); /* key-sharing on by default */
4053#endif
9137345a
JP
4054
4055 if ( SvROK(ver) )
4056 ver = SvRV(ver);
4057
4058 /* Begin copying all of the elements */
4059 if ( hv_exists((HV *)ver, "qv", 2) )
4060 hv_store((HV *)hv, "qv", 2, &PL_sv_yes, 0);
4061
4062 if ( hv_exists((HV *)ver, "alpha", 5) )
4063 hv_store((HV *)hv, "alpha", 5, &PL_sv_yes, 0);
4064
4065 if ( hv_exists((HV*)ver, "width", 5 ) )
d7aa5382 4066 {
53c1dcc0 4067 const I32 width = SvIV(*hv_fetch((HV*)ver, "width", 5, FALSE));
9137345a 4068 hv_store((HV *)hv, "width", 5, newSViv(width), 0);
d7aa5382 4069 }
9137345a
JP
4070
4071 sav = (AV *)*hv_fetch((HV*)ver, "version", 7, FALSE);
4072 /* This will get reblessed later if a derived class*/
4073 for ( key = 0; key <= av_len(sav); key++ )
4074 {
4075 const I32 rev = SvIV(*av_fetch(sav, key, FALSE));
4076 av_push(av, newSViv(rev));
4077 }
4078
4079 hv_store((HV *)hv, "version", 7, (SV *)av, 0);
d7aa5382
JP
4080 return rv;
4081 }
ad63d80f 4082#ifdef SvVOK
137d6fc0
JP
4083 if ( SvVOK(ver) ) { /* already a v-string */
4084 char *version;
b0f01acb 4085 MAGIC* mg = mg_find(ver,PERL_MAGIC_vstring);
a4d60858
NC
4086 const STRLEN len = mg->mg_len;
4087 version = savepvn( (const char*)mg->mg_ptr, len);
4088 sv_setpvn(rv,version,len);
137d6fc0 4089 Safefree(version);
b0f01acb 4090 }
137d6fc0 4091 else {
ad63d80f 4092#endif
137d6fc0
JP
4093 sv_setsv(rv,ver); /* make a duplicate */
4094#ifdef SvVOK
26ec6fc3 4095 }
137d6fc0
JP
4096#endif
4097 upg_version(rv);
b0f01acb
JP
4098 return rv;
4099}
4100
4101/*
4102=for apidoc upg_version
4103
4104In-place upgrade of the supplied SV to a version object.
4105
4106 SV *sv = upg_version(SV *sv);
4107
4108Returns a pointer to the upgraded SV.
4109
4110=cut
4111*/
4112
4113SV *
ad63d80f 4114Perl_upg_version(pTHX_ SV *ver)
b0f01acb 4115{
137d6fc0
JP
4116 char *version;
4117 bool qv = 0;
4118
4119 if ( SvNOK(ver) ) /* may get too much accuracy */
4120 {
4121 char tbuf[64];
4122 sprintf(tbuf,"%.9"NVgf, SvNVX(ver));
4123 version = savepv(tbuf);
4124 }
ad63d80f 4125#ifdef SvVOK
137d6fc0 4126 else if ( SvVOK(ver) ) { /* already a v-string */
ad63d80f
JP
4127 MAGIC* mg = mg_find(ver,PERL_MAGIC_vstring);
4128 version = savepvn( (const char*)mg->mg_ptr,mg->mg_len );
137d6fc0 4129 qv = 1;
b0f01acb 4130 }
ad63d80f 4131#endif
137d6fc0
JP
4132 else /* must be a string or something like a string */
4133 {
9137345a 4134 version = savepv(SvPV_nolen(ver));
137d6fc0
JP
4135 }
4136 (void)scan_version(version, ver, qv);
4137 Safefree(version);
ad63d80f 4138 return ver;
b0f01acb
JP
4139}
4140
4141
4142/*
4143=for apidoc vnumify
4144
ad63d80f
JP
4145Accepts a version object and returns the normalized floating
4146point representation. Call like:
b0f01acb 4147
ad63d80f 4148 sv = vnumify(rv);
b0f01acb 4149
ad63d80f
JP
4150NOTE: you can pass either the object directly or the SV
4151contained within the RV.
b0f01acb
JP
4152
4153=cut
4154*/
4155
4156SV *
ad63d80f 4157Perl_vnumify(pTHX_ SV *vs)
b0f01acb 4158{
ad63d80f 4159 I32 i, len, digit;
9137345a
JP
4160 int width;
4161 bool alpha = FALSE;
53c1dcc0 4162 SV * const sv = newSV(0);
9137345a 4163 AV *av;
ad63d80f
JP
4164 if ( SvROK(vs) )
4165 vs = SvRV(vs);
9137345a
JP
4166
4167 /* see if various flags exist */
4168 if ( hv_exists((HV*)vs, "alpha", 5 ) )
4169 alpha = TRUE;
4170 if ( hv_exists((HV*)vs, "width", 5 ) )
4171 width = SvIV(*hv_fetch((HV*)vs, "width", 5, FALSE));
4172 else
4173 width = 3;
4174
4175
4176 /* attempt to retrieve the version array */
4177 if ( !(av = (AV *)*hv_fetch((HV*)vs, "version", 7, FALSE) ) ) {
53c1dcc0 4178 sv_catpvn(sv,"0",1);
9137345a
JP
4179 return sv;
4180 }
4181
4182 len = av_len(av);
46314c13
JP
4183 if ( len == -1 )
4184 {
b66123c5 4185 sv_catpvn(sv,"0",1);
46314c13
JP
4186 return sv;
4187 }
9137345a
JP
4188
4189 digit = SvIV(*av_fetch(av, 0, 0));
c0fd1b42 4190 Perl_sv_setpvf(aTHX_ sv,"%d.", (int)PERL_ABS(digit));
13f8f398 4191 for ( i = 1 ; i < len ; i++ )
b0f01acb 4192 {
9137345a
JP
4193 digit = SvIV(*av_fetch(av, i, 0));
4194 if ( width < 3 ) {
53c1dcc0
AL
4195 const int denom = (int)pow(10,(3-width));
4196 const div_t term = div((int)PERL_ABS(digit),denom);
9137345a
JP
4197 Perl_sv_catpvf(aTHX_ sv,"%0*d_%d", width, term.quot, term.rem);
4198 }
4199 else {
4200 Perl_sv_catpvf(aTHX_ sv,"%0*d", width, (int)digit);
4201 }
b0f01acb 4202 }
13f8f398
JP
4203
4204 if ( len > 0 )
4205 {
9137345a
JP
4206 digit = SvIV(*av_fetch(av, len, 0));
4207 if ( alpha && width == 3 ) /* alpha version */
4208 Perl_sv_catpv(aTHX_ sv,"_");
4209 /* Don't display additional trailing zeros */
4210 if ( digit > 0 )
4211 Perl_sv_catpvf(aTHX_ sv,"%0*d", width, (int)digit);
13f8f398 4212 }
9137345a 4213 else /* len == 1 */
13f8f398 4214 {
b66123c5 4215 sv_catpvn(sv,"000",3);
13f8f398 4216 }
b0f01acb
JP
4217 return sv;
4218}
4219
4220/*
b9381830 4221=for apidoc vnormal
b0f01acb 4222
ad63d80f
JP
4223Accepts a version object and returns the normalized string
4224representation. Call like:
b0f01acb 4225
b9381830 4226 sv = vnormal(rv);
b0f01acb 4227
ad63d80f
JP
4228NOTE: you can pass either the object directly or the SV
4229contained within the RV.
b0f01acb
JP
4230
4231=cut
4232*/
4233
4234SV *
b9381830 4235Perl_vnormal(pTHX_ SV *vs)
b0f01acb 4236{
ad63d80f 4237 I32 i, len, digit;
9137345a 4238 bool alpha = FALSE;
137d6fc0 4239 SV *sv = newSV(0);
9137345a 4240 AV *av;
ad63d80f
JP
4241 if ( SvROK(vs) )
4242 vs = SvRV(vs);
9137345a
JP
4243
4244 if ( hv_exists((HV*)vs, "alpha", 5 ) )
4245 alpha = TRUE;
4246 av = (AV *)*hv_fetch((HV*)vs, "version", 7, FALSE);
4247
4248 len = av_len(av);
4249 if ( len == -1 ) {
b66123c5 4250 sv_catpvn(sv,"",0);
46314c13
JP
4251 return sv;
4252 }
9137345a
JP
4253 digit = SvIV(*av_fetch(av, 0, 0));
4254 Perl_sv_setpvf(aTHX_ sv,"v%"IVdf,(IV)digit);
4255 for ( i = 1 ; i <= len-1 ; i++ ) {
4256 digit = SvIV(*av_fetch(av, i, 0));
4257 Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
4258 }
4259
4260 if ( len > 0 ) {
4261 /* handle last digit specially */
4262 digit = SvIV(*av_fetch(av, len, 0));
4263 if ( alpha )
4264 Perl_sv_catpvf(aTHX_ sv, "_%"IVdf, (IV)digit);
ad63d80f 4265 else
9137345a 4266 Perl_sv_catpvf(aTHX_ sv, ".%"IVdf, (IV)digit);
b0f01acb 4267 }
9137345a 4268
137d6fc0
JP
4269 if ( len <= 2 ) { /* short version, must be at least three */
4270 for ( len = 2 - len; len != 0; len-- )
b66123c5 4271 sv_catpvn(sv,".0",2);
137d6fc0
JP
4272 }
4273
b0f01acb 4274 return sv;
9137345a 4275}
b0f01acb 4276
ad63d80f 4277/*
b9381830
JP
4278=for apidoc vstringify
4279
4280In order to maintain maximum compatibility with earlier versions
4281of Perl, this function will return either the floating point
4282notation or the multiple dotted notation, depending on whether
4283the original version contained 1 or more dots, respectively
4284
4285=cut
4286*/
4287
4288SV *
4289Perl_vstringify(pTHX_ SV *vs)
4290{
9137345a 4291 I32 qv = 0;
b9381830
JP
4292 if ( SvROK(vs) )
4293 vs = SvRV(vs);
b9381830 4294
9137345a
JP
4295 if ( hv_exists((HV *)vs, "qv", 2) )
4296 qv = 1;
4297
4298 if ( qv )
b9381830 4299 return vnormal(vs);
9137345a
JP
4300 else
4301 return vnumify(vs);
b9381830
JP
4302}
4303
4304/*
ad63d80f
JP
4305=for apidoc vcmp
4306
4307Version object aware cmp. Both operands must already have been
4308converted into version objects.
4309
4310=cut
4311*/
4312
4313int
9137345a 4314Perl_vcmp(pTHX_ SV *lhv, SV *rhv)
ad63d80f
JP
4315{
4316 I32 i,l,m,r,retval;
9137345a
JP
4317 bool lalpha = FALSE;
4318 bool ralpha = FALSE;
4319 I32 left = 0;
4320 I32 right = 0;
4321 AV *lav, *rav;
4322 if ( SvROK(lhv) )
4323 lhv = SvRV(lhv);
4324 if ( SvROK(rhv) )
4325 rhv = SvRV(rhv);
4326
4327 /* get the left hand term */
4328 lav = (AV *)*hv_fetch((HV*)lhv, "version", 7, FALSE);
4329 if ( hv_exists((HV*)lhv, "alpha", 5 ) )
4330 lalpha = TRUE;
4331
4332 /* and the right hand term */
4333 rav = (AV *)*hv_fetch((HV*)rhv, "version", 7, FALSE);
4334 if ( hv_exists((HV*)rhv, "alpha", 5 ) )
4335 ralpha = TRUE;
4336
4337 l = av_len(lav);
4338 r = av_len(rav);
ad63d80f
JP
4339 m = l < r ? l : r;
4340 retval = 0;
4341 i = 0;
4342 while ( i <= m && retval == 0 )
4343 {
9137345a
JP
4344 left = SvIV(*av_fetch(lav,i,0));
4345 right = SvIV(*av_fetch(rav,i,0));
4346 if ( left < right )
ad63d80f 4347 retval = -1;
9137345a 4348 if ( left > right )
ad63d80f
JP
4349 retval = +1;
4350 i++;
4351 }
4352
9137345a
JP
4353 /* tiebreaker for alpha with identical terms */
4354 if ( retval == 0 && l == r && left == right && ( lalpha || ralpha ) )
4355 {
4356 if ( lalpha && !ralpha )
4357 {
4358 retval = -1;
4359 }
4360 else if ( ralpha && !lalpha)
4361 {
4362 retval = +1;
4363 }
4364 }
4365
137d6fc0 4366 if ( l != r && retval == 0 ) /* possible match except for trailing 0's */
129318bd 4367 {
137d6fc0 4368 if ( l < r )
129318bd 4369 {
137d6fc0
JP
4370 while ( i <= r && retval == 0 )
4371 {
9137345a 4372 if ( SvIV(*av_fetch(rav,i,0)) != 0 )
137d6fc0
JP
4373 retval = -1; /* not a match after all */
4374 i++;
4375 }
4376 }
4377 else
4378 {
4379 while ( i <= l && retval == 0 )
4380 {
9137345a 4381 if ( SvIV(*av_fetch(lav,i,0)) != 0 )
137d6fc0
JP
4382 retval = +1; /* not a match after all */
4383 i++;
4384 }
129318bd
JP
4385 }
4386 }
ad63d80f
JP
4387 return retval;
4388}
4389
c95c94b1 4390#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET) && defined(SOCK_DGRAM) && defined(HAS_SELECT)
2bc69dc4
NIS
4391# define EMULATE_SOCKETPAIR_UDP
4392#endif
4393
4394#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee
NC
4395static int
4396S_socketpair_udp (int fd[2]) {
e10bb1e9 4397 dTHX;
02fc2eee
NC
4398 /* Fake a datagram socketpair using UDP to localhost. */
4399 int sockets[2] = {-1, -1};
4400 struct sockaddr_in addresses[2];
4401 int i;
3aed30dc 4402 Sock_size_t size = sizeof(struct sockaddr_in);
ae92b34e 4403 unsigned short port;
02fc2eee
NC
4404 int got;
4405
3aed30dc 4406 memset(&addresses, 0, sizeof(addresses));
02fc2eee
NC
4407 i = 1;
4408 do {
3aed30dc
HS
4409 sockets[i] = PerlSock_socket(AF_INET, SOCK_DGRAM, PF_INET);
4410 if (sockets[i] == -1)
4411 goto tidy_up_and_fail;
4412
4413 addresses[i].sin_family = AF_INET;
4414 addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4415 addresses[i].sin_port = 0; /* kernel choses port. */
4416 if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i],
4417 sizeof(struct sockaddr_in)) == -1)
4418 goto tidy_up_and_fail;
02fc2eee
NC
4419 } while (i--);
4420
4421 /* Now have 2 UDP sockets. Find out which port each is connected to, and
4422 for each connect the other socket to it. */
4423 i = 1;
4424 do {
3aed30dc
HS
4425 if (PerlSock_getsockname(sockets[i], (struct sockaddr *) &addresses[i],
4426 &size) == -1)
4427 goto tidy_up_and_fail;
4428 if (size != sizeof(struct sockaddr_in))
4429 goto abort_tidy_up_and_fail;
4430 /* !1 is 0, !0 is 1 */
4431 if (PerlSock_connect(sockets[!i], (struct sockaddr *) &addresses[i],
4432 sizeof(struct sockaddr_in)) == -1)
4433 goto tidy_up_and_fail;
02fc2eee
NC
4434 } while (i--);
4435
4436 /* Now we have 2 sockets connected to each other. I don't trust some other
4437 process not to have already sent a packet to us (by random) so send
4438 a packet from each to the other. */
4439 i = 1;
4440 do {
3aed30dc
HS
4441 /* I'm going to send my own port number. As a short.
4442 (Who knows if someone somewhere has sin_port as a bitfield and needs
4443 this routine. (I'm assuming crays have socketpair)) */
4444 port = addresses[i].sin_port;
4445 got = PerlLIO_write(sockets[i], &port, sizeof(port));
4446 if (got != sizeof(port)) {
4447 if (got == -1)
4448 goto tidy_up_and_fail;
4449 goto abort_tidy_up_and_fail;
4450 }
02fc2eee
NC
4451 } while (i--);
4452
4453 /* Packets sent. I don't trust them to have arrived though.
4454 (As I understand it Solaris TCP stack is multithreaded. Non-blocking
4455 connect to localhost will use a second kernel thread. In 2.6 the
4456 first thread running the connect() returns before the second completes,
4457 so EINPROGRESS> In 2.7 the improved stack is faster and connect()
4458 returns 0. Poor programs have tripped up. One poor program's authors'
4459 had a 50-1 reverse stock split. Not sure how connected these were.)
4460 So I don't trust someone not to have an unpredictable UDP stack.
4461 */
4462
4463 {
3aed30dc
HS
4464 struct timeval waitfor = {0, 100000}; /* You have 0.1 seconds */
4465 int max = sockets[1] > sockets[0] ? sockets[1] : sockets[0];
4466 fd_set rset;
4467
4468 FD_ZERO(&rset);
4469 FD_SET(sockets[0], &rset);
4470 FD_SET(sockets[1], &rset);
4471
4472 got = PerlSock_select(max + 1, &rset, NULL, NULL, &waitfor);
4473 if (got != 2 || !FD_ISSET(sockets[0], &rset)
4474 || !FD_ISSET(sockets[1], &rset)) {
4475 /* I hope this is portable and appropriate. */
4476 if (got == -1)
4477 goto tidy_up_and_fail;
4478 goto abort_tidy_up_and_fail;
4479 }
02fc2eee 4480 }
f4758303 4481
02fc2eee
NC
4482 /* And the paranoia department even now doesn't trust it to have arrive
4483 (hence MSG_DONTWAIT). Or that what arrives was sent by us. */
4484 {
3aed30dc
HS
4485 struct sockaddr_in readfrom;
4486 unsigned short buffer[2];
02fc2eee 4487
3aed30dc
HS
4488 i = 1;
4489 do {
02fc2eee 4490#ifdef MSG_DONTWAIT
3aed30dc
HS
4491 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4492 sizeof(buffer), MSG_DONTWAIT,
4493 (struct sockaddr *) &readfrom, &size);
02fc2eee 4494#else
3aed30dc
HS
4495 got = PerlSock_recvfrom(sockets[i], (char *) &buffer,
4496 sizeof(buffer), 0,
4497 (struct sockaddr *) &readfrom, &size);
e10bb1e9 4498#endif
02fc2eee 4499
3aed30dc
HS
4500 if (got == -1)
4501 goto tidy_up_and_fail;
4502 if (got != sizeof(port)
4503 || size != sizeof(struct sockaddr_in)
4504 /* Check other socket sent us its port. */
4505 || buffer[0] != (unsigned short) addresses[!i].sin_port
4506 /* Check kernel says we got the datagram from that socket */
4507 || readfrom.sin_family != addresses[!i].sin_family
4508 || readfrom.sin_addr.s_addr != addresses[!i].sin_addr.s_addr
4509 || readfrom.sin_port != addresses[!i].sin_port)
4510 goto abort_tidy_up_and_fail;
4511 } while (i--);
02fc2eee
NC
4512 }
4513 /* My caller (my_socketpair) has validated that this is non-NULL */
4514 fd[0] = sockets[0];
4515 fd[1] = sockets[1];
4516 /* I hereby declare this connection open. May God bless all who cross
4517 her. */
4518 return 0;
4519
4520 abort_tidy_up_and_fail:
4521 errno = ECONNABORTED;
4522 tidy_up_and_fail:
4523 {
4373e329 4524 const int save_errno = errno;
3aed30dc
HS
4525 if (sockets[0] != -1)
4526 PerlLIO_close(sockets[0]);
4527 if (sockets[1] != -1)
4528 PerlLIO_close(sockets[1]);
4529 errno = save_errno;
4530 return -1;
02fc2eee
NC
4531 }
4532}
85ca448a 4533#endif /* EMULATE_SOCKETPAIR_UDP */
02fc2eee 4534
b5ac89c3 4535#if !defined(HAS_SOCKETPAIR) && defined(HAS_SOCKET) && defined(AF_INET) && defined(PF_INET)
02fc2eee
NC
4536int
4537Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
4538 /* Stevens says that family must be AF_LOCAL, protocol 0.
2948e0bd 4539 I'm going to enforce that, then ignore it, and use TCP (or UDP). */
e10bb1e9 4540 dTHX;
02fc2eee
NC
4541 int listener = -1;
4542 int connector = -1;
4543 int acceptor = -1;
4544 struct sockaddr_in listen_addr;
4545 struct sockaddr_in connect_addr;
4546 Sock_size_t size;
4547
50458334
JH
4548 if (protocol
4549#ifdef AF_UNIX
4550 || family != AF_UNIX
4551#endif
3aed30dc
HS
4552 ) {
4553 errno = EAFNOSUPPORT;
4554 return -1;
02fc2eee 4555 }
2948e0bd 4556 if (!fd) {
3aed30dc
HS
4557 errno = EINVAL;
4558 return -1;
2948e0bd 4559 }
02fc2eee 4560
2bc69dc4 4561#ifdef EMULATE_SOCKETPAIR_UDP
02fc2eee 4562 if (type == SOCK_DGRAM)
3aed30dc 4563 return S_socketpair_udp(fd);
2bc69dc4 4564#endif
02fc2eee 4565
3aed30dc 4566 listener = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4567 if (listener == -1)
3aed30dc
HS
4568 return -1;
4569 memset(&listen_addr, 0, sizeof(listen_addr));
02fc2eee 4570 listen_addr.sin_family = AF_INET;
3aed30dc 4571 listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
02fc2eee 4572 listen_addr.sin_port = 0; /* kernel choses port. */
3aed30dc
HS
4573 if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr,
4574 sizeof(listen_addr)) == -1)
4575 goto tidy_up_and_fail;
e10bb1e9 4576 if (PerlSock_listen(listener, 1) == -1)
3aed30dc 4577 goto tidy_up_and_fail;
02fc2eee 4578
3aed30dc 4579 connector = PerlSock_socket(AF_INET, type, 0);
02fc2eee 4580 if (connector == -1)
3aed30dc 4581 goto tidy_up_and_fail;
02fc2eee 4582 /* We want to find out the port number to connect to. */
3aed30dc
HS
4583 size = sizeof(connect_addr);
4584 if (PerlSock_getsockname(listener, (struct sockaddr *) &connect_addr,
4585 &size) == -1)
4586 goto tidy_up_and_fail;
4587 if (size != sizeof(connect_addr))
4588 goto abort_tidy_up_and_fail;
e10bb1e9 4589 if (PerlSock_connect(connector, (struct sockaddr *) &connect_addr,
3aed30dc
HS
4590 sizeof(connect_addr)) == -1)
4591 goto tidy_up_and_fail;
02fc2eee 4592
3aed30dc
HS
4593 size = sizeof(listen_addr);
4594 acceptor = PerlSock_accept(listener, (struct sockaddr *) &listen_addr,
4595 &size);
02fc2eee 4596 if (acceptor == -1)
3aed30dc
HS
4597 goto tidy_up_and_fail;
4598 if (size != sizeof(listen_addr))
4599 goto abort_tidy_up_and_fail;
4600 PerlLIO_close(listener);
02fc2eee
NC
4601 /* Now check we are talking to ourself by matching port and host on the
4602 two sockets. */
3aed30dc
HS
4603 if (PerlSock_getsockname(connector, (struct sockaddr *) &connect_addr,
4604 &size) == -1)
4605 goto tidy_up_and_fail;
4606 if (size != sizeof(connect_addr)
4607 || listen_addr.sin_family != connect_addr.sin_family
4608 || listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
4609 || listen_addr.sin_port != connect_addr.sin_port) {
4610 goto abort_tidy_up_and_fail;
02fc2eee
NC
4611 }
4612 fd[0] = connector;
4613 fd[1] = acceptor;
4614 return 0;
4615
4616 abort_tidy_up_and_fail:
27da23d5
JH
4617#ifdef ECONNABORTED
4618 errno = ECONNABORTED; /* This would be the standard thing to do. */
4619#else
4620# ifdef ECONNREFUSED
4621 errno = ECONNREFUSED; /* E.g. Symbian does not have ECONNABORTED. */
4622# else
4623 errno = ETIMEDOUT; /* Desperation time. */
4624# endif
4625#endif
02fc2eee
NC
4626 tidy_up_and_fail:
4627 {
3aed30dc
HS
4628 int save_errno = errno;
4629 if (listener != -1)
4630 PerlLIO_close(listener);
4631 if (connector != -1)
4632 PerlLIO_close(connector);
4633 if (acceptor != -1)
4634 PerlLIO_close(acceptor);
4635 errno = save_errno;
4636 return -1;
02fc2eee
NC
4637 }
4638}
85ca448a 4639#else
48ea76d1
JH
4640/* In any case have a stub so that there's code corresponding
4641 * to the my_socketpair in global.sym. */
4642int
4643Perl_my_socketpair (int family, int type, int protocol, int fd[2]) {
daf16542 4644#ifdef HAS_SOCKETPAIR
48ea76d1 4645 return socketpair(family, type, protocol, fd);
daf16542
JH
4646#else
4647 return -1;
4648#endif
48ea76d1
JH
4649}
4650#endif
4651
68795e93
NIS
4652/*
4653
4654=for apidoc sv_nosharing
4655
4656Dummy routine which "shares" an SV when there is no sharing module present.
4657Exists to avoid test for a NULL function pointer and because it could potentially warn under
4658some level of strict-ness.
4659
4660=cut
4661*/
4662
4663void
4664Perl_sv_nosharing(pTHX_ SV *sv)
4665{
53c1dcc0 4666 PERL_UNUSED_ARG(sv);
68795e93
NIS
4667}
4668
4669/*
4670=for apidoc sv_nolocking
4671
4672Dummy routine which "locks" an SV when there is no locking module present.
4673Exists to avoid test for a NULL function pointer and because it could potentially warn under
4674some level of strict-ness.
4675
4676=cut
4677*/
4678
4679void
4680Perl_sv_nolocking(pTHX_ SV *sv)
4681{
53c1dcc0 4682 PERL_UNUSED_ARG(sv);
68795e93
NIS
4683}
4684
4685
4686/*
4687=for apidoc sv_nounlocking
4688
4689Dummy routine which "unlocks" an SV when there is no locking module present.
4690Exists to avoid test for a NULL function pointer and because it could potentially warn under
4691some level of strict-ness.
4692
4693=cut
4694*/
4695
4696void
4697Perl_sv_nounlocking(pTHX_ SV *sv)
4698{
53c1dcc0 4699 PERL_UNUSED_ARG(sv);
68795e93
NIS
4700}
4701
a05d7ebb 4702U32
e1ec3a88 4703Perl_parse_unicode_opts(pTHX_ const char **popt)
a05d7ebb 4704{
e1ec3a88 4705 const char *p = *popt;
a05d7ebb
JH
4706 U32 opt = 0;
4707
4708 if (*p) {
4709 if (isDIGIT(*p)) {
4710 opt = (U32) atoi(p);
4711 while (isDIGIT(*p)) p++;
7c91f477 4712 if (*p && *p != '\n' && *p != '\r')
a05d7ebb
JH
4713 Perl_croak(aTHX_ "Unknown Unicode option letter '%c'", *p);
4714 }
4715 else {
4716 for (; *p; p++) {
4717 switch (*p) {
4718 case PERL_UNICODE_STDIN:
4719 opt |= PERL_UNICODE_STDIN_FLAG; break;
4720 case PERL_UNICODE_STDOUT:
4721 opt |= PERL_UNICODE_STDOUT_FLAG; break;
4722 case PERL_UNICODE_STDERR:
4723 opt |= PERL_UNICODE_STDERR_FLAG; break;
4724 case PERL_UNICODE_STD:
4725 opt |= PERL_UNICODE_STD_FLAG; break;
4726 case PERL_UNICODE_IN:
4727 opt |= PERL_UNICODE_IN_FLAG; break;
4728 case PERL_UNICODE_OUT:
4729 opt |= PERL_UNICODE_OUT_FLAG; break;
4730 case PERL_UNICODE_INOUT:
4731 opt |= PERL_UNICODE_INOUT_FLAG; break;
4732 case PERL_UNICODE_LOCALE:
4733 opt |= PERL_UNICODE_LOCALE_FLAG; break;
4734 case PERL_UNICODE_ARGV:
4735 opt |= PERL_UNICODE_ARGV_FLAG; break;
4736 default:
7c91f477
JH
4737 if (*p != '\n' && *p != '\r')
4738 Perl_croak(aTHX_
4739 "Unknown Unicode option letter '%c'", *p);
a05d7ebb
JH
4740 }
4741 }
4742 }
4743 }
4744 else
4745 opt = PERL_UNICODE_DEFAULT_FLAGS;
4746
4747 if (opt & ~PERL_UNICODE_ALL_FLAGS)
06e66572 4748 Perl_croak(aTHX_ "Unknown Unicode option value %"UVuf,
a05d7ebb
JH
4749 (UV) (opt & ~PERL_UNICODE_ALL_FLAGS));
4750
4751 *popt = p;
4752
4753 return opt;
4754}
4755
132efe8b
JH
4756U32
4757Perl_seed(pTHX)
4758{
4759 /*
4760 * This is really just a quick hack which grabs various garbage
4761 * values. It really should be a real hash algorithm which
4762 * spreads the effect of every input bit onto every output bit,
4763 * if someone who knows about such things would bother to write it.
4764 * Might be a good idea to add that function to CORE as well.
4765 * No numbers below come from careful analysis or anything here,
4766 * except they are primes and SEED_C1 > 1E6 to get a full-width
4767 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
4768 * probably be bigger too.
4769 */
4770#if RANDBITS > 16
4771# define SEED_C1 1000003
4772#define SEED_C4 73819
4773#else
4774# define SEED_C1 25747
4775#define SEED_C4 20639
4776#endif
4777#define SEED_C2 3
4778#define SEED_C3 269
4779#define SEED_C5 26107
4780
4781#ifndef PERL_NO_DEV_RANDOM
4782 int fd;
4783#endif
4784 U32 u;
4785#ifdef VMS
4786# include <starlet.h>
4787 /* when[] = (low 32 bits, high 32 bits) of time since epoch
4788 * in 100-ns units, typically incremented ever 10 ms. */
4789 unsigned int when[2];
4790#else
4791# ifdef HAS_GETTIMEOFDAY
4792 struct timeval when;
4793# else
4794 Time_t when;
4795# endif
4796#endif
4797
4798/* This test is an escape hatch, this symbol isn't set by Configure. */
4799#ifndef PERL_NO_DEV_RANDOM
4800#ifndef PERL_RANDOM_DEVICE
4801 /* /dev/random isn't used by default because reads from it will block
4802 * if there isn't enough entropy available. You can compile with
4803 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
4804 * is enough real entropy to fill the seed. */
4805# define PERL_RANDOM_DEVICE "/dev/urandom"
4806#endif
4807 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
4808 if (fd != -1) {
27da23d5 4809 if (PerlLIO_read(fd, (void*)&u, sizeof u) != sizeof u)
132efe8b
JH
4810 u = 0;
4811 PerlLIO_close(fd);
4812 if (u)
4813 return u;
4814 }
4815#endif
4816
4817#ifdef VMS
4818 _ckvmssts(sys$gettim(when));
4819 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
4820#else
4821# ifdef HAS_GETTIMEOFDAY
4822 PerlProc_gettimeofday(&when,NULL);
4823 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
4824# else
4825 (void)time(&when);
4826 u = (U32)SEED_C1 * when;
4827# endif
4828#endif
4829 u += SEED_C3 * (U32)PerlProc_getpid();
4830 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
4831#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
4832 u += SEED_C5 * (U32)PTR2UV(&when);
4833#endif
4834 return u;
4835}
4836
bed60192 4837UV
a783c5f4 4838Perl_get_hash_seed(pTHX)
bed60192 4839{
e1ec3a88 4840 const char *s = PerlEnv_getenv("PERL_HASH_SEED");
bed60192
JH
4841 UV myseed = 0;
4842
4843 if (s)
4844 while (isSPACE(*s)) s++;
4845 if (s && isDIGIT(*s))
4846 myseed = (UV)Atoul(s);
4847 else
4848#ifdef USE_HASH_SEED_EXPLICIT
4849 if (s)
4850#endif
4851 {
4852 /* Compute a random seed */
4853 (void)seedDrand01((Rand_seed_t)seed());
bed60192
JH
4854 myseed = (UV)(Drand01() * (NV)UV_MAX);
4855#if RANDBITS < (UVSIZE * 8)
4856 /* Since there are not enough randbits to to reach all
4857 * the bits of a UV, the low bits might need extra
4858 * help. Sum in another random number that will
4859 * fill in the low bits. */
4860 myseed +=
4861 (UV)(Drand01() * (NV)((1 << ((UVSIZE * 8 - RANDBITS))) - 1));
4862#endif /* RANDBITS < (UVSIZE * 8) */
6cfd5ea7
JH
4863 if (myseed == 0) { /* Superparanoia. */
4864 myseed = (UV)(Drand01() * (NV)UV_MAX); /* One more chance. */
4865 if (myseed == 0)
4866 Perl_croak(aTHX_ "Your random numbers are not that random");
4867 }
bed60192 4868 }
008fb0c0 4869 PL_rehash_seed_set = TRUE;
bed60192
JH
4870
4871 return myseed;
4872}
27da23d5 4873
ed221c57
AL
4874#ifdef USE_ITHREADS
4875bool
4876Perl_stashpv_hvname_match(pTHX_ const COP *c, const HV *hv)
4877{
4878 const char * const stashpv = CopSTASHPV(c);
4879 const char * const name = HvNAME_get(hv);
4880
4881 if (stashpv == name)
4882 return TRUE;
4883 if (stashpv && name)
4884 if (strEQ(stashpv, name))
4885 return TRUE;
4886 return FALSE;
4887}
4888#endif
4889
4890
27da23d5
JH
4891#ifdef PERL_GLOBAL_STRUCT
4892
4893struct perl_vars *
4894Perl_init_global_struct(pTHX)
4895{
4896 struct perl_vars *plvarsp = NULL;
4897#ifdef PERL_GLOBAL_STRUCT
4898# define PERL_GLOBAL_STRUCT_INIT
4899# include "opcode.h" /* the ppaddr and check */
4900 IV nppaddr = sizeof(Gppaddr)/sizeof(Perl_ppaddr_t);
4901 IV ncheck = sizeof(Gcheck) /sizeof(Perl_check_t);
4902# ifdef PERL_GLOBAL_STRUCT_PRIVATE
4903 /* PerlMem_malloc() because can't use even safesysmalloc() this early. */
4904 plvarsp = (struct perl_vars*)PerlMem_malloc(sizeof(struct perl_vars));
4905 if (!plvarsp)
4906 exit(1);
4907# else
4908 plvarsp = PL_VarsPtr;
4909# endif /* PERL_GLOBAL_STRUCT_PRIVATE */
aadb217d
JH
4910# undef PERLVAR
4911# undef PERLVARA
4912# undef PERLVARI
4913# undef PERLVARIC
4914# undef PERLVARISC
27da23d5
JH
4915# define PERLVAR(var,type) /**/
4916# define PERLVARA(var,n,type) /**/
4917# define PERLVARI(var,type,init) plvarsp->var = init;
4918# define PERLVARIC(var,type,init) plvarsp->var = init;
4919# define PERLVARISC(var,init) Copy(init, plvarsp->var, sizeof(init), char);
4920# include "perlvars.h"
4921# undef PERLVAR
4922# undef PERLVARA
4923# undef PERLVARI
4924# undef PERLVARIC
4925# undef PERLVARISC
4926# ifdef PERL_GLOBAL_STRUCT
4927 plvarsp->Gppaddr = PerlMem_malloc(nppaddr * sizeof(Perl_ppaddr_t));
4928 if (!plvarsp->Gppaddr)
4929 exit(1);
4930 plvarsp->Gcheck = PerlMem_malloc(ncheck * sizeof(Perl_check_t));
4931 if (!plvarsp->Gcheck)
4932 exit(1);
4933 Copy(Gppaddr, plvarsp->Gppaddr, nppaddr, Perl_ppaddr_t);
4934 Copy(Gcheck, plvarsp->Gcheck, ncheck, Perl_check_t);
4935# endif
4936# ifdef PERL_SET_VARS
4937 PERL_SET_VARS(plvarsp);
4938# endif
4939# undef PERL_GLOBAL_STRUCT_INIT
4940#endif
4941 return plvarsp;
4942}
4943
4944#endif /* PERL_GLOBAL_STRUCT */
4945
4946#ifdef PERL_GLOBAL_STRUCT
4947
4948void
4949Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
4950{
4951#ifdef PERL_GLOBAL_STRUCT
4952# ifdef PERL_UNSET_VARS
4953 PERL_UNSET_VARS(plvarsp);
4954# endif
4955 free(plvarsp->Gppaddr);
4956 free(plvarsp->Gcheck);
4957# ifdef PERL_GLOBAL_STRUCT_PRIVATE
4958 free(plvarsp);
4959# endif
4960#endif
4961}
4962
4963#endif /* PERL_GLOBAL_STRUCT */
4964
66610fdd
RGS
4965/*
4966 * Local variables:
4967 * c-indentation-style: bsd
4968 * c-basic-offset: 4
4969 * indent-tabs-mode: t
4970 * End:
4971 *
37442d52
RGS
4972 * ex: set ts=8 sts=4 sw=4 noet:
4973 */