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