This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fixing eval in the compiler
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4eb8286e 3 * Copyright (c) 1991-1999, Larry Wall
79072805
LW
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
a0d0e21e
LW
8 */
9
10/*
11 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
79072805
LW
12 */
13
14#include "EXTERN.h"
15#include "perl.h"
79072805 16
c07a80fd 17#ifdef OVR_DBL_DIG
18/* Use an overridden DBL_DIG */
19# ifdef DBL_DIG
20# undef DBL_DIG
21# endif
22# define DBL_DIG OVR_DBL_DIG
23#else
a0d0e21e
LW
24/* The following is all to get DBL_DIG, in order to pick a nice
25 default value for printing floating point numbers in Gconvert.
26 (see config.h)
27*/
28#ifdef I_LIMITS
29#include <limits.h>
30#endif
31#ifdef I_FLOAT
32#include <float.h>
33#endif
34#ifndef HAS_DBL_DIG
35#define DBL_DIG 15 /* A guess that works lots of places */
36#endif
c07a80fd 37#endif
38
76e3520e
GS
39#ifdef PERL_OBJECT
40#define FCALL this->*f
41#define VTBL this->*vtbl
42
43#else /* !PERL_OBJECT */
44
36477c24 45static IV asIV _((SV* sv));
46static UV asUV _((SV* sv));
a0d0e21e 47static SV *more_sv _((void));
cbe51380
GS
48static void more_xiv _((void));
49static void more_xnv _((void));
50static void more_xpv _((void));
51static void more_xrv _((void));
a0d0e21e
LW
52static XPVIV *new_xiv _((void));
53static XPVNV *new_xnv _((void));
54static XPV *new_xpv _((void));
55static XRV *new_xrv _((void));
56static void del_xiv _((XPVIV* p));
57static void del_xnv _((XPVNV* p));
58static void del_xpv _((XPV* p));
59static void del_xrv _((XRV* p));
a0d0e21e 60static void sv_unglob _((SV* sv));
810b8aa5
GS
61static void sv_add_backref _((SV *tsv, SV *sv));
62static void sv_del_backref _((SV *sv));
a0d0e21e 63
d665c133
GS
64#ifndef PURIFY
65static void *my_safemalloc(MEM_SIZE size);
66#endif
67
4561caa4 68typedef void (*SVFUNC) _((SV*));
76e3520e
GS
69#define VTBL *vtbl
70#define FCALL *f
71
72#endif /* PERL_OBJECT */
4561caa4 73
6fc92669 74#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
2c5424a7 75
a0d0e21e 76#ifdef PURIFY
79072805 77
053fc874
GS
78#define new_SV(p) \
79 STMT_START { \
80 LOCK_SV_MUTEX; \
81 (p) = (SV*)safemalloc(sizeof(SV)); \
82 reg_add(p); \
83 UNLOCK_SV_MUTEX; \
84 SvANY(p) = 0; \
85 SvREFCNT(p) = 1; \
86 SvFLAGS(p) = 0; \
87 } STMT_END
88
89#define del_SV(p) \
90 STMT_START { \
91 LOCK_SV_MUTEX; \
92 reg_remove(p); \
93 Safefree((char*)(p)); \
94 UNLOCK_SV_MUTEX; \
95 } STMT_END
4561caa4
CS
96
97static SV **registry;
00db4c45 98static I32 registry_size;
4561caa4
CS
99
100#define REGHASH(sv,size) ((((U32)(sv)) >> 2) % (size))
101
102#define REG_REPLACE(sv,a,b) \
053fc874
GS
103 STMT_START { \
104 void* p = sv->sv_any; \
105 I32 h = REGHASH(sv, registry_size); \
106 I32 i = h; \
107 while (registry[i] != (a)) { \
108 if (++i >= registry_size) \
109 i = 0; \
110 if (i == h) \
111 die("SV registry bug"); \
112 } \
113 registry[i] = (b); \
114 } STMT_END
4561caa4
CS
115
116#define REG_ADD(sv) REG_REPLACE(sv,Nullsv,sv)
117#define REG_REMOVE(sv) REG_REPLACE(sv,sv,Nullsv)
118
119static void
120reg_add(sv)
121SV* sv;
122{
3280af22 123 if (PL_sv_count >= (registry_size >> 1))
4561caa4
CS
124 {
125 SV **oldreg = registry;
00db4c45 126 I32 oldsize = registry_size;
4561caa4 127
00db4c45
GS
128 registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
129 Newz(707, registry, registry_size, SV*);
4561caa4
CS
130
131 if (oldreg) {
132 I32 i;
133
134 for (i = 0; i < oldsize; ++i) {
135 SV* oldsv = oldreg[i];
136 if (oldsv)
137 REG_ADD(oldsv);
138 }
139 Safefree(oldreg);
140 }
141 }
142
143 REG_ADD(sv);
3280af22 144 ++PL_sv_count;
4561caa4
CS
145}
146
147static void
148reg_remove(sv)
149SV* sv;
150{
151 REG_REMOVE(sv);
3280af22 152 --PL_sv_count;
4561caa4
CS
153}
154
155static void
156visit(f)
157SVFUNC f;
158{
159 I32 i;
160
00db4c45 161 for (i = 0; i < registry_size; ++i) {
4561caa4 162 SV* sv = registry[i];
00db4c45 163 if (sv && SvTYPE(sv) != SVTYPEMASK)
4561caa4
CS
164 (*f)(sv);
165 }
166}
a0d0e21e 167
4633a7c4
LW
168void
169sv_add_arena(ptr, size, flags)
170char* ptr;
171U32 size;
172U32 flags;
173{
174 if (!(flags & SVf_FAKE))
6ad3d225 175 Safefree(ptr);
4633a7c4
LW
176}
177
4561caa4
CS
178#else /* ! PURIFY */
179
180/*
181 * "A time to plant, and a time to uproot what was planted..."
182 */
183
053fc874
GS
184#define plant_SV(p) \
185 STMT_START { \
186 SvANY(p) = (void *)PL_sv_root; \
187 SvFLAGS(p) = SVTYPEMASK; \
188 PL_sv_root = (p); \
189 --PL_sv_count; \
190 } STMT_END
a0d0e21e 191
fba3b22e 192/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
193#define uproot_SV(p) \
194 STMT_START { \
195 (p) = PL_sv_root; \
196 PL_sv_root = (SV*)SvANY(p); \
197 ++PL_sv_count; \
198 } STMT_END
199
200#define new_SV(p) \
201 STMT_START { \
202 LOCK_SV_MUTEX; \
203 if (PL_sv_root) \
204 uproot_SV(p); \
205 else \
206 (p) = more_sv(); \
207 UNLOCK_SV_MUTEX; \
208 SvANY(p) = 0; \
209 SvREFCNT(p) = 1; \
210 SvFLAGS(p) = 0; \
211 } STMT_END
463ee0b2 212
a0d0e21e 213#ifdef DEBUGGING
4561caa4 214
053fc874
GS
215#define del_SV(p) \
216 STMT_START { \
217 LOCK_SV_MUTEX; \
218 if (PL_debug & 32768) \
219 del_sv(p); \
220 else \
221 plant_SV(p); \
222 UNLOCK_SV_MUTEX; \
223 } STMT_END
a0d0e21e 224
76e3520e 225STATIC void
8ac85365 226del_sv(SV *p)
463ee0b2 227{
3280af22 228 if (PL_debug & 32768) {
4633a7c4 229 SV* sva;
a0d0e21e
LW
230 SV* sv;
231 SV* svend;
232 int ok = 0;
3280af22 233 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
234 sv = sva + 1;
235 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
236 if (p >= sv && p < svend)
237 ok = 1;
238 }
239 if (!ok) {
240 warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
241 return;
242 }
243 }
4561caa4 244 plant_SV(p);
463ee0b2 245}
a0d0e21e 246
4561caa4
CS
247#else /* ! DEBUGGING */
248
249#define del_SV(p) plant_SV(p)
250
251#endif /* DEBUGGING */
463ee0b2 252
4633a7c4 253void
8ac85365 254sv_add_arena(char *ptr, U32 size, U32 flags)
463ee0b2 255{
4633a7c4 256 SV* sva = (SV*)ptr;
463ee0b2
LW
257 register SV* sv;
258 register SV* svend;
4633a7c4
LW
259 Zero(sva, size, char);
260
261 /* The first SV in an arena isn't an SV. */
3280af22 262 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
263 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
264 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
265
3280af22
NIS
266 PL_sv_arenaroot = sva;
267 PL_sv_root = sva + 1;
4633a7c4
LW
268
269 svend = &sva[SvREFCNT(sva) - 1];
270 sv = sva + 1;
463ee0b2 271 while (sv < svend) {
a0d0e21e 272 SvANY(sv) = (void *)(SV*)(sv + 1);
8990e307 273 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
274 sv++;
275 }
276 SvANY(sv) = 0;
4633a7c4
LW
277 SvFLAGS(sv) = SVTYPEMASK;
278}
279
fba3b22e 280/* sv_mutex must be held while calling more_sv() */
76e3520e 281STATIC SV*
8ac85365 282more_sv(void)
4633a7c4 283{
4561caa4
CS
284 register SV* sv;
285
3280af22
NIS
286 if (PL_nice_chunk) {
287 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
288 PL_nice_chunk = Nullch;
c07a80fd 289 }
1edc1566 290 else {
291 char *chunk; /* must use New here to match call to */
292 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
293 sv_add_arena(chunk, 1008, 0);
294 }
4561caa4
CS
295 uproot_SV(sv);
296 return sv;
463ee0b2
LW
297}
298
76e3520e 299STATIC void
8ac85365 300visit(SVFUNC f)
8990e307 301{
4633a7c4 302 SV* sva;
8990e307
LW
303 SV* sv;
304 register SV* svend;
305
3280af22 306 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 307 svend = &sva[SvREFCNT(sva)];
4561caa4
CS
308 for (sv = sva + 1; sv < svend; ++sv) {
309 if (SvTYPE(sv) != SVTYPEMASK)
76e3520e 310 (FCALL)(sv);
8990e307
LW
311 }
312 }
313}
314
4561caa4
CS
315#endif /* PURIFY */
316
76e3520e 317STATIC void
8ac85365 318do_report_used(SV *sv)
4561caa4
CS
319{
320 if (SvTYPE(sv) != SVTYPEMASK) {
d1bf51dd 321 /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
4561caa4
CS
322 PerlIO_printf(PerlIO_stderr(), "****\n");
323 sv_dump(sv);
324 }
325}
326
8990e307 327void
8ac85365 328sv_report_used(void)
4561caa4 329{
ac4c12e7 330 visit(FUNC_NAME_TO_PTR(do_report_used));
4561caa4
CS
331}
332
76e3520e 333STATIC void
8ac85365 334do_clean_objs(SV *sv)
8990e307 335{
a0d0e21e 336 SV* rv;
8990e307 337
4561caa4 338 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
d1bf51dd 339 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
4561caa4
CS
340 SvROK_off(sv);
341 SvRV(sv) = 0;
342 SvREFCNT_dec(rv);
a5f75d66 343 }
4561caa4
CS
344
345 /* XXX Might want to check arrays, etc. */
346}
347
348#ifndef DISABLE_DESTRUCTOR_KLUDGE
76e3520e 349STATIC void
8ac85365 350do_clean_named_objs(SV *sv)
4561caa4 351{
51ae5c03
JPC
352 if (SvTYPE(sv) == SVt_PVGV) {
353 if ( SvOBJECT(GvSV(sv)) ||
354 GvAV(sv) && SvOBJECT(GvAV(sv)) ||
355 GvHV(sv) && SvOBJECT(GvHV(sv)) ||
356 GvIO(sv) && SvOBJECT(GvIO(sv)) ||
357 GvCV(sv) && SvOBJECT(GvCV(sv)) )
358 {
359 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
360 SvREFCNT_dec(sv);
361 }
51ae5c03 362 }
4561caa4 363}
a5f75d66 364#endif
4561caa4
CS
365
366void
8ac85365 367sv_clean_objs(void)
4561caa4 368{
3280af22 369 PL_in_clean_objs = TRUE;
2d0f3c12 370 visit(FUNC_NAME_TO_PTR(do_clean_objs));
4561caa4 371#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 372 /* some barnacles may yet remain, clinging to typeglobs */
ac4c12e7 373 visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
4561caa4 374#endif
3280af22 375 PL_in_clean_objs = FALSE;
4561caa4
CS
376}
377
76e3520e 378STATIC void
8ac85365 379do_clean_all(SV *sv)
4561caa4 380{
01bc8b8d 381 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
4561caa4
CS
382 SvFLAGS(sv) |= SVf_BREAK;
383 SvREFCNT_dec(sv);
8990e307
LW
384}
385
386void
8ac85365 387sv_clean_all(void)
8990e307 388{
3280af22 389 PL_in_clean_all = TRUE;
ac4c12e7 390 visit(FUNC_NAME_TO_PTR(do_clean_all));
3280af22 391 PL_in_clean_all = FALSE;
8990e307 392}
463ee0b2 393
4633a7c4 394void
8ac85365 395sv_free_arenas(void)
4633a7c4
LW
396{
397 SV* sva;
398 SV* svanext;
399
400 /* Free arenas here, but be careful about fake ones. (We assume
401 contiguity of the fake ones with the corresponding real ones.) */
402
3280af22 403 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
404 svanext = (SV*) SvANY(sva);
405 while (svanext && SvFAKE(svanext))
406 svanext = (SV*) SvANY(svanext);
407
408 if (!SvFAKE(sva))
1edc1566 409 Safefree((void *)sva);
4633a7c4 410 }
5f05dabc 411
3280af22
NIS
412 if (PL_nice_chunk)
413 Safefree(PL_nice_chunk);
414 PL_nice_chunk = Nullch;
415 PL_nice_chunk_size = 0;
416 PL_sv_arenaroot = 0;
417 PL_sv_root = 0;
4633a7c4
LW
418}
419
76e3520e 420STATIC XPVIV*
8ac85365 421new_xiv(void)
463ee0b2 422{
ea7c11a3 423 IV* xiv;
cbe51380
GS
424 LOCK_SV_MUTEX;
425 if (!PL_xiv_root)
426 more_xiv();
427 xiv = PL_xiv_root;
428 /*
429 * See comment in more_xiv() -- RAM.
430 */
431 PL_xiv_root = *(IV**)xiv;
432 UNLOCK_SV_MUTEX;
433 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
434}
435
76e3520e 436STATIC void
8ac85365 437del_xiv(XPVIV *p)
463ee0b2 438{
23e6a22f 439 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 440 LOCK_SV_MUTEX;
3280af22
NIS
441 *(IV**)xiv = PL_xiv_root;
442 PL_xiv_root = xiv;
cbe51380 443 UNLOCK_SV_MUTEX;
463ee0b2
LW
444}
445
cbe51380 446STATIC void
8ac85365 447more_xiv(void)
463ee0b2 448{
ea7c11a3
SM
449 register IV* xiv;
450 register IV* xivend;
8c52afec
IZ
451 XPV* ptr;
452 New(705, ptr, 1008/sizeof(XPV), XPV);
3280af22
NIS
453 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
454 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 455
ea7c11a3
SM
456 xiv = (IV*) ptr;
457 xivend = &xiv[1008 / sizeof(IV) - 1];
458 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 459 PL_xiv_root = xiv;
463ee0b2 460 while (xiv < xivend) {
ea7c11a3 461 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
462 xiv++;
463 }
ea7c11a3 464 *(IV**)xiv = 0;
463ee0b2
LW
465}
466
76e3520e 467STATIC XPVNV*
8ac85365 468new_xnv(void)
463ee0b2
LW
469{
470 double* xnv;
cbe51380
GS
471 LOCK_SV_MUTEX;
472 if (!PL_xnv_root)
473 more_xnv();
474 xnv = PL_xnv_root;
475 PL_xnv_root = *(double**)xnv;
476 UNLOCK_SV_MUTEX;
477 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
478}
479
76e3520e 480STATIC void
8ac85365 481del_xnv(XPVNV *p)
463ee0b2 482{
23e6a22f 483 double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 484 LOCK_SV_MUTEX;
3280af22
NIS
485 *(double**)xnv = PL_xnv_root;
486 PL_xnv_root = xnv;
cbe51380 487 UNLOCK_SV_MUTEX;
463ee0b2
LW
488}
489
cbe51380 490STATIC void
8ac85365 491more_xnv(void)
463ee0b2 492{
463ee0b2
LW
493 register double* xnv;
494 register double* xnvend;
8c52afec 495 New(711, xnv, 1008/sizeof(double), double);
463ee0b2
LW
496 xnvend = &xnv[1008 / sizeof(double) - 1];
497 xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
3280af22 498 PL_xnv_root = xnv;
463ee0b2
LW
499 while (xnv < xnvend) {
500 *(double**)xnv = (double*)(xnv + 1);
501 xnv++;
502 }
503 *(double**)xnv = 0;
463ee0b2
LW
504}
505
76e3520e 506STATIC XRV*
8ac85365 507new_xrv(void)
ed6116ce
LW
508{
509 XRV* xrv;
cbe51380
GS
510 LOCK_SV_MUTEX;
511 if (!PL_xrv_root)
512 more_xrv();
513 xrv = PL_xrv_root;
514 PL_xrv_root = (XRV*)xrv->xrv_rv;
515 UNLOCK_SV_MUTEX;
516 return xrv;
ed6116ce
LW
517}
518
76e3520e 519STATIC void
8ac85365 520del_xrv(XRV *p)
ed6116ce 521{
cbe51380 522 LOCK_SV_MUTEX;
3280af22
NIS
523 p->xrv_rv = (SV*)PL_xrv_root;
524 PL_xrv_root = p;
cbe51380 525 UNLOCK_SV_MUTEX;
ed6116ce
LW
526}
527
cbe51380 528STATIC void
8ac85365 529more_xrv(void)
ed6116ce 530{
ed6116ce
LW
531 register XRV* xrv;
532 register XRV* xrvend;
3280af22
NIS
533 New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
534 xrv = PL_xrv_root;
ed6116ce
LW
535 xrvend = &xrv[1008 / sizeof(XRV) - 1];
536 while (xrv < xrvend) {
537 xrv->xrv_rv = (SV*)(xrv + 1);
538 xrv++;
539 }
540 xrv->xrv_rv = 0;
ed6116ce
LW
541}
542
76e3520e 543STATIC XPV*
8ac85365 544new_xpv(void)
463ee0b2
LW
545{
546 XPV* xpv;
cbe51380
GS
547 LOCK_SV_MUTEX;
548 if (!PL_xpv_root)
549 more_xpv();
550 xpv = PL_xpv_root;
551 PL_xpv_root = (XPV*)xpv->xpv_pv;
552 UNLOCK_SV_MUTEX;
553 return xpv;
463ee0b2
LW
554}
555
76e3520e 556STATIC void
8ac85365 557del_xpv(XPV *p)
463ee0b2 558{
cbe51380 559 LOCK_SV_MUTEX;
3280af22
NIS
560 p->xpv_pv = (char*)PL_xpv_root;
561 PL_xpv_root = p;
cbe51380 562 UNLOCK_SV_MUTEX;
463ee0b2
LW
563}
564
cbe51380 565STATIC void
8ac85365 566more_xpv(void)
463ee0b2 567{
463ee0b2
LW
568 register XPV* xpv;
569 register XPV* xpvend;
3280af22
NIS
570 New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
571 xpv = PL_xpv_root;
463ee0b2
LW
572 xpvend = &xpv[1008 / sizeof(XPV) - 1];
573 while (xpv < xpvend) {
574 xpv->xpv_pv = (char*)(xpv + 1);
575 xpv++;
576 }
577 xpv->xpv_pv = 0;
463ee0b2
LW
578}
579
580#ifdef PURIFY
8990e307 581#define new_XIV() (void*)safemalloc(sizeof(XPVIV))
6ad3d225 582#define del_XIV(p) Safefree((char*)p)
463ee0b2 583#else
85e6fe83 584#define new_XIV() (void*)new_xiv()
8ac85365 585#define del_XIV(p) del_xiv((XPVIV*) p)
463ee0b2
LW
586#endif
587
588#ifdef PURIFY
8990e307 589#define new_XNV() (void*)safemalloc(sizeof(XPVNV))
6ad3d225 590#define del_XNV(p) Safefree((char*)p)
463ee0b2 591#else
85e6fe83 592#define new_XNV() (void*)new_xnv()
8ac85365 593#define del_XNV(p) del_xnv((XPVNV*) p)
463ee0b2
LW
594#endif
595
596#ifdef PURIFY
8990e307 597#define new_XRV() (void*)safemalloc(sizeof(XRV))
6ad3d225 598#define del_XRV(p) Safefree((char*)p)
ed6116ce 599#else
85e6fe83 600#define new_XRV() (void*)new_xrv()
8ac85365 601#define del_XRV(p) del_xrv((XRV*) p)
ed6116ce
LW
602#endif
603
604#ifdef PURIFY
8990e307 605#define new_XPV() (void*)safemalloc(sizeof(XPV))
6ad3d225 606#define del_XPV(p) Safefree((char*)p)
463ee0b2 607#else
85e6fe83 608#define new_XPV() (void*)new_xpv()
8ac85365 609#define del_XPV(p) del_xpv((XPV *)p)
463ee0b2
LW
610#endif
611
8c52afec
IZ
612#ifdef PURIFY
613# define my_safemalloc(s) safemalloc(s)
86058a2d 614# define my_safefree(s) safefree(s)
8c52afec 615#else
9d8a25dc 616STATIC void*
d665c133 617my_safemalloc(MEM_SIZE size)
8c52afec
IZ
618{
619 char *p;
620 New(717, p, size, char);
621 return (void*)p;
622}
623# define my_safefree(s) Safefree(s)
624#endif
625
626#define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
627#define del_XPVIV(p) my_safefree((char*)p)
628
629#define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
630#define del_XPVNV(p) my_safefree((char*)p)
631
632#define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
633#define del_XPVMG(p) my_safefree((char*)p)
634
635#define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
636#define del_XPVLV(p) my_safefree((char*)p)
637
638#define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
639#define del_XPVAV(p) my_safefree((char*)p)
640
641#define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
642#define del_XPVHV(p) my_safefree((char*)p)
643
644#define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
645#define del_XPVCV(p) my_safefree((char*)p)
646
647#define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
648#define del_XPVGV(p) my_safefree((char*)p)
649
650#define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
651#define del_XPVBM(p) my_safefree((char*)p)
652
653#define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
654#define del_XPVFM(p) my_safefree((char*)p)
655
656#define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
657#define del_XPVIO(p) my_safefree((char*)p)
8990e307 658
79072805 659bool
8ac85365 660sv_upgrade(register SV *sv, U32 mt)
79072805
LW
661{
662 char* pv;
663 U32 cur;
664 U32 len;
a0d0e21e 665 IV iv;
79072805
LW
666 double nv;
667 MAGIC* magic;
668 HV* stash;
669
670 if (SvTYPE(sv) == mt)
671 return TRUE;
672
a5f75d66
AD
673 if (mt < SVt_PVIV)
674 (void)SvOOK_off(sv);
675
79072805
LW
676 switch (SvTYPE(sv)) {
677 case SVt_NULL:
678 pv = 0;
679 cur = 0;
680 len = 0;
681 iv = 0;
682 nv = 0.0;
683 magic = 0;
684 stash = 0;
685 break;
79072805
LW
686 case SVt_IV:
687 pv = 0;
688 cur = 0;
689 len = 0;
463ee0b2
LW
690 iv = SvIVX(sv);
691 nv = (double)SvIVX(sv);
79072805
LW
692 del_XIV(SvANY(sv));
693 magic = 0;
694 stash = 0;
ed6116ce 695 if (mt == SVt_NV)
463ee0b2 696 mt = SVt_PVNV;
ed6116ce
LW
697 else if (mt < SVt_PVIV)
698 mt = SVt_PVIV;
79072805
LW
699 break;
700 case SVt_NV:
701 pv = 0;
702 cur = 0;
703 len = 0;
463ee0b2 704 nv = SvNVX(sv);
1bd302c3 705 iv = I_V(nv);
79072805
LW
706 magic = 0;
707 stash = 0;
708 del_XNV(SvANY(sv));
709 SvANY(sv) = 0;
ed6116ce 710 if (mt < SVt_PVNV)
79072805
LW
711 mt = SVt_PVNV;
712 break;
ed6116ce
LW
713 case SVt_RV:
714 pv = (char*)SvRV(sv);
715 cur = 0;
716 len = 0;
a0d0e21e 717 iv = (IV)pv;
ed6116ce
LW
718 nv = (double)(unsigned long)pv;
719 del_XRV(SvANY(sv));
720 magic = 0;
721 stash = 0;
722 break;
79072805 723 case SVt_PV:
463ee0b2 724 pv = SvPVX(sv);
79072805
LW
725 cur = SvCUR(sv);
726 len = SvLEN(sv);
727 iv = 0;
728 nv = 0.0;
729 magic = 0;
730 stash = 0;
731 del_XPV(SvANY(sv));
748a9306
LW
732 if (mt <= SVt_IV)
733 mt = SVt_PVIV;
734 else if (mt == SVt_NV)
735 mt = SVt_PVNV;
79072805
LW
736 break;
737 case SVt_PVIV:
463ee0b2 738 pv = SvPVX(sv);
79072805
LW
739 cur = SvCUR(sv);
740 len = SvLEN(sv);
463ee0b2 741 iv = SvIVX(sv);
79072805
LW
742 nv = 0.0;
743 magic = 0;
744 stash = 0;
745 del_XPVIV(SvANY(sv));
746 break;
747 case SVt_PVNV:
463ee0b2 748 pv = SvPVX(sv);
79072805
LW
749 cur = SvCUR(sv);
750 len = SvLEN(sv);
463ee0b2
LW
751 iv = SvIVX(sv);
752 nv = SvNVX(sv);
79072805
LW
753 magic = 0;
754 stash = 0;
755 del_XPVNV(SvANY(sv));
756 break;
757 case SVt_PVMG:
463ee0b2 758 pv = SvPVX(sv);
79072805
LW
759 cur = SvCUR(sv);
760 len = SvLEN(sv);
463ee0b2
LW
761 iv = SvIVX(sv);
762 nv = SvNVX(sv);
79072805
LW
763 magic = SvMAGIC(sv);
764 stash = SvSTASH(sv);
765 del_XPVMG(SvANY(sv));
766 break;
767 default:
463ee0b2 768 croak("Can't upgrade that kind of scalar");
79072805
LW
769 }
770
771 switch (mt) {
772 case SVt_NULL:
463ee0b2 773 croak("Can't upgrade to undef");
79072805
LW
774 case SVt_IV:
775 SvANY(sv) = new_XIV();
463ee0b2 776 SvIVX(sv) = iv;
79072805
LW
777 break;
778 case SVt_NV:
779 SvANY(sv) = new_XNV();
463ee0b2 780 SvNVX(sv) = nv;
79072805 781 break;
ed6116ce
LW
782 case SVt_RV:
783 SvANY(sv) = new_XRV();
784 SvRV(sv) = (SV*)pv;
ed6116ce 785 break;
79072805
LW
786 case SVt_PV:
787 SvANY(sv) = new_XPV();
463ee0b2 788 SvPVX(sv) = pv;
79072805
LW
789 SvCUR(sv) = cur;
790 SvLEN(sv) = len;
791 break;
792 case SVt_PVIV:
793 SvANY(sv) = new_XPVIV();
463ee0b2 794 SvPVX(sv) = pv;
79072805
LW
795 SvCUR(sv) = cur;
796 SvLEN(sv) = len;
463ee0b2 797 SvIVX(sv) = iv;
79072805 798 if (SvNIOK(sv))
a0d0e21e 799 (void)SvIOK_on(sv);
79072805
LW
800 SvNOK_off(sv);
801 break;
802 case SVt_PVNV:
803 SvANY(sv) = new_XPVNV();
463ee0b2 804 SvPVX(sv) = pv;
79072805
LW
805 SvCUR(sv) = cur;
806 SvLEN(sv) = len;
463ee0b2
LW
807 SvIVX(sv) = iv;
808 SvNVX(sv) = nv;
79072805
LW
809 break;
810 case SVt_PVMG:
811 SvANY(sv) = new_XPVMG();
463ee0b2 812 SvPVX(sv) = pv;
79072805
LW
813 SvCUR(sv) = cur;
814 SvLEN(sv) = len;
463ee0b2
LW
815 SvIVX(sv) = iv;
816 SvNVX(sv) = nv;
79072805
LW
817 SvMAGIC(sv) = magic;
818 SvSTASH(sv) = stash;
819 break;
820 case SVt_PVLV:
821 SvANY(sv) = new_XPVLV();
463ee0b2 822 SvPVX(sv) = pv;
79072805
LW
823 SvCUR(sv) = cur;
824 SvLEN(sv) = len;
463ee0b2
LW
825 SvIVX(sv) = iv;
826 SvNVX(sv) = nv;
79072805
LW
827 SvMAGIC(sv) = magic;
828 SvSTASH(sv) = stash;
829 LvTARGOFF(sv) = 0;
830 LvTARGLEN(sv) = 0;
831 LvTARG(sv) = 0;
832 LvTYPE(sv) = 0;
833 break;
834 case SVt_PVAV:
835 SvANY(sv) = new_XPVAV();
463ee0b2
LW
836 if (pv)
837 Safefree(pv);
2304df62 838 SvPVX(sv) = 0;
d1bf51dd 839 AvMAX(sv) = -1;
93965878 840 AvFILLp(sv) = -1;
463ee0b2
LW
841 SvIVX(sv) = 0;
842 SvNVX(sv) = 0.0;
843 SvMAGIC(sv) = magic;
844 SvSTASH(sv) = stash;
845 AvALLOC(sv) = 0;
79072805
LW
846 AvARYLEN(sv) = 0;
847 AvFLAGS(sv) = 0;
848 break;
849 case SVt_PVHV:
850 SvANY(sv) = new_XPVHV();
463ee0b2
LW
851 if (pv)
852 Safefree(pv);
853 SvPVX(sv) = 0;
854 HvFILL(sv) = 0;
855 HvMAX(sv) = 0;
856 HvKEYS(sv) = 0;
857 SvNVX(sv) = 0.0;
79072805
LW
858 SvMAGIC(sv) = magic;
859 SvSTASH(sv) = stash;
79072805
LW
860 HvRITER(sv) = 0;
861 HvEITER(sv) = 0;
862 HvPMROOT(sv) = 0;
863 HvNAME(sv) = 0;
79072805
LW
864 break;
865 case SVt_PVCV:
866 SvANY(sv) = new_XPVCV();
748a9306 867 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 868 SvPVX(sv) = pv;
79072805
LW
869 SvCUR(sv) = cur;
870 SvLEN(sv) = len;
463ee0b2
LW
871 SvIVX(sv) = iv;
872 SvNVX(sv) = nv;
79072805
LW
873 SvMAGIC(sv) = magic;
874 SvSTASH(sv) = stash;
79072805
LW
875 break;
876 case SVt_PVGV:
877 SvANY(sv) = new_XPVGV();
463ee0b2 878 SvPVX(sv) = pv;
79072805
LW
879 SvCUR(sv) = cur;
880 SvLEN(sv) = len;
463ee0b2
LW
881 SvIVX(sv) = iv;
882 SvNVX(sv) = nv;
79072805
LW
883 SvMAGIC(sv) = magic;
884 SvSTASH(sv) = stash;
93a17b20 885 GvGP(sv) = 0;
79072805
LW
886 GvNAME(sv) = 0;
887 GvNAMELEN(sv) = 0;
888 GvSTASH(sv) = 0;
a5f75d66 889 GvFLAGS(sv) = 0;
79072805
LW
890 break;
891 case SVt_PVBM:
892 SvANY(sv) = new_XPVBM();
463ee0b2 893 SvPVX(sv) = pv;
79072805
LW
894 SvCUR(sv) = cur;
895 SvLEN(sv) = len;
463ee0b2
LW
896 SvIVX(sv) = iv;
897 SvNVX(sv) = nv;
79072805
LW
898 SvMAGIC(sv) = magic;
899 SvSTASH(sv) = stash;
900 BmRARE(sv) = 0;
901 BmUSEFUL(sv) = 0;
902 BmPREVIOUS(sv) = 0;
903 break;
904 case SVt_PVFM:
905 SvANY(sv) = new_XPVFM();
748a9306 906 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 907 SvPVX(sv) = pv;
79072805
LW
908 SvCUR(sv) = cur;
909 SvLEN(sv) = len;
463ee0b2
LW
910 SvIVX(sv) = iv;
911 SvNVX(sv) = nv;
79072805
LW
912 SvMAGIC(sv) = magic;
913 SvSTASH(sv) = stash;
79072805 914 break;
8990e307
LW
915 case SVt_PVIO:
916 SvANY(sv) = new_XPVIO();
748a9306 917 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
918 SvPVX(sv) = pv;
919 SvCUR(sv) = cur;
920 SvLEN(sv) = len;
921 SvIVX(sv) = iv;
922 SvNVX(sv) = nv;
923 SvMAGIC(sv) = magic;
924 SvSTASH(sv) = stash;
85e6fe83 925 IoPAGE_LEN(sv) = 60;
8990e307
LW
926 break;
927 }
928 SvFLAGS(sv) &= ~SVTYPEMASK;
929 SvFLAGS(sv) |= mt;
79072805
LW
930 return TRUE;
931}
932
79072805 933int
8ac85365 934sv_backoff(register SV *sv)
79072805
LW
935{
936 assert(SvOOK(sv));
463ee0b2
LW
937 if (SvIVX(sv)) {
938 char *s = SvPVX(sv);
939 SvLEN(sv) += SvIVX(sv);
940 SvPVX(sv) -= SvIVX(sv);
79072805 941 SvIV_set(sv, 0);
463ee0b2 942 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
943 }
944 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 945 return 0;
79072805
LW
946}
947
948char *
22c35a8c 949sv_grow(register SV *sv, register STRLEN newlen)
79072805
LW
950{
951 register char *s;
952
55497cff 953#ifdef HAS_64K_LIMIT
79072805 954 if (newlen >= 0x10000) {
d1bf51dd 955 PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
79072805
LW
956 my_exit(1);
957 }
55497cff 958#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
959 if (SvROK(sv))
960 sv_unref(sv);
79072805
LW
961 if (SvTYPE(sv) < SVt_PV) {
962 sv_upgrade(sv, SVt_PV);
463ee0b2 963 s = SvPVX(sv);
79072805
LW
964 }
965 else if (SvOOK(sv)) { /* pv is offset? */
966 sv_backoff(sv);
463ee0b2 967 s = SvPVX(sv);
79072805
LW
968 if (newlen > SvLEN(sv))
969 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
970#ifdef HAS_64K_LIMIT
971 if (newlen >= 0x10000)
972 newlen = 0xFFFF;
973#endif
79072805
LW
974 }
975 else
463ee0b2 976 s = SvPVX(sv);
79072805 977 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 978 if (SvLEN(sv) && s) {
1fe09876 979#if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
8d6dde3e
IZ
980 STRLEN l = malloced_size((void*)SvPVX(sv));
981 if (newlen <= l) {
982 SvLEN_set(sv, l);
983 return s;
984 } else
c70c8a0a 985#endif
79072805 986 Renew(s,newlen,char);
8d6dde3e 987 }
79072805
LW
988 else
989 New(703,s,newlen,char);
990 SvPV_set(sv, s);
991 SvLEN_set(sv, newlen);
992 }
993 return s;
994}
995
996void
8ac85365 997sv_setiv(register SV *sv, IV i)
79072805 998{
2213622d 999 SV_CHECK_THINKFIRST(sv);
463ee0b2
LW
1000 switch (SvTYPE(sv)) {
1001 case SVt_NULL:
79072805 1002 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1003 break;
1004 case SVt_NV:
1005 sv_upgrade(sv, SVt_PVNV);
1006 break;
ed6116ce 1007 case SVt_RV:
463ee0b2 1008 case SVt_PV:
79072805 1009 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1010 break;
a0d0e21e
LW
1011
1012 case SVt_PVGV:
a0d0e21e
LW
1013 case SVt_PVAV:
1014 case SVt_PVHV:
1015 case SVt_PVCV:
1016 case SVt_PVFM:
1017 case SVt_PVIO:
11343788
MB
1018 {
1019 dTHR;
1020 croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
22c35a8c 1021 PL_op_desc[PL_op->op_type]);
11343788 1022 }
463ee0b2 1023 }
a0d0e21e 1024 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1025 SvIVX(sv) = i;
463ee0b2 1026 SvTAINT(sv);
79072805
LW
1027}
1028
1029void
ef50df4b
GS
1030sv_setiv_mg(register SV *sv, IV i)
1031{
1032 sv_setiv(sv,i);
1033 SvSETMAGIC(sv);
1034}
1035
1036void
8ac85365 1037sv_setuv(register SV *sv, UV u)
55497cff 1038{
25da4f38
IZ
1039 sv_setiv(sv, 0);
1040 SvIsUV_on(sv);
1041 SvUVX(sv) = u;
55497cff 1042}
1043
1044void
ef50df4b
GS
1045sv_setuv_mg(register SV *sv, UV u)
1046{
1047 sv_setuv(sv,u);
1048 SvSETMAGIC(sv);
1049}
1050
1051void
8ac85365 1052sv_setnv(register SV *sv, double num)
79072805 1053{
2213622d 1054 SV_CHECK_THINKFIRST(sv);
a0d0e21e
LW
1055 switch (SvTYPE(sv)) {
1056 case SVt_NULL:
1057 case SVt_IV:
79072805 1058 sv_upgrade(sv, SVt_NV);
a0d0e21e 1059 break;
a0d0e21e
LW
1060 case SVt_RV:
1061 case SVt_PV:
1062 case SVt_PVIV:
79072805 1063 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1064 break;
827b7e14 1065
a0d0e21e 1066 case SVt_PVGV:
a0d0e21e
LW
1067 case SVt_PVAV:
1068 case SVt_PVHV:
1069 case SVt_PVCV:
1070 case SVt_PVFM:
1071 case SVt_PVIO:
11343788
MB
1072 {
1073 dTHR;
1074 croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
22c35a8c 1075 PL_op_name[PL_op->op_type]);
11343788 1076 }
79072805 1077 }
463ee0b2 1078 SvNVX(sv) = num;
a0d0e21e 1079 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1080 SvTAINT(sv);
79072805
LW
1081}
1082
ef50df4b
GS
1083void
1084sv_setnv_mg(register SV *sv, double num)
1085{
1086 sv_setnv(sv,num);
1087 SvSETMAGIC(sv);
1088}
1089
76e3520e 1090STATIC void
8ac85365 1091not_a_number(SV *sv)
a0d0e21e 1092{
11343788 1093 dTHR;
a0d0e21e
LW
1094 char tmpbuf[64];
1095 char *d = tmpbuf;
1096 char *s;
dc28f22b
GA
1097 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1098 /* each *s can expand to 4 chars + "...\0",
1099 i.e. need room for 8 chars */
a0d0e21e 1100
dc28f22b 1101 for (s = SvPVX(sv); *s && d < limit; s++) {
bbce6d69 1102 int ch = *s & 0xFF;
1103 if (ch & 128 && !isPRINT_LC(ch)) {
a0d0e21e
LW
1104 *d++ = 'M';
1105 *d++ = '-';
1106 ch &= 127;
1107 }
bbce6d69 1108 if (ch == '\n') {
1109 *d++ = '\\';
1110 *d++ = 'n';
1111 }
1112 else if (ch == '\r') {
1113 *d++ = '\\';
1114 *d++ = 'r';
1115 }
1116 else if (ch == '\f') {
1117 *d++ = '\\';
1118 *d++ = 'f';
1119 }
1120 else if (ch == '\\') {
1121 *d++ = '\\';
1122 *d++ = '\\';
1123 }
1124 else if (isPRINT_LC(ch))
a0d0e21e
LW
1125 *d++ = ch;
1126 else {
1127 *d++ = '^';
bbce6d69 1128 *d++ = toCTRL(ch);
a0d0e21e
LW
1129 }
1130 }
1131 if (*s) {
1132 *d++ = '.';
1133 *d++ = '.';
1134 *d++ = '.';
1135 }
1136 *d = '\0';
1137
533c011a 1138 if (PL_op)
599cee73 1139 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
22c35a8c 1140 PL_op_name[PL_op->op_type]);
a0d0e21e 1141 else
599cee73 1142 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
a0d0e21e
LW
1143}
1144
25da4f38
IZ
1145/* the number can be converted to _integer_ with atol() */
1146#define IS_NUMBER_TO_INT_BY_ATOL 0x01
1147#define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1148#define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
1149#define IS_NUMBER_NEG 0x08 /* not good to cache UV */
1150
1151/* Actually, ISO C leaves conversion of UV to IV undefined, but
1152 until proven guilty, assume that things are not that bad... */
1153
a0d0e21e 1154IV
8ac85365 1155sv_2iv(register SV *sv)
79072805
LW
1156{
1157 if (!sv)
1158 return 0;
8990e307 1159 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1160 mg_get(sv);
1161 if (SvIOKp(sv))
1162 return SvIVX(sv);
748a9306 1163 if (SvNOKp(sv)) {
25da4f38 1164 return I_V(SvNVX(sv));
748a9306 1165 }
36477c24 1166 if (SvPOKp(sv) && SvLEN(sv))
1167 return asIV(sv);
3fe9a6f1 1168 if (!SvROK(sv)) {
d008e5eb 1169 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1170 dTHR;
d008e5eb 1171 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1172 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1173 }
36477c24 1174 return 0;
3fe9a6f1 1175 }
463ee0b2 1176 }
ed6116ce 1177 if (SvTHINKFIRST(sv)) {
a0d0e21e 1178 if (SvROK(sv)) {
a0d0e21e
LW
1179 SV* tmpstr;
1180 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1181 return SvIV(tmpstr);
a0d0e21e
LW
1182 return (IV)SvRV(sv);
1183 }
ed6116ce 1184 if (SvREADONLY(sv)) {
748a9306 1185 if (SvNOKp(sv)) {
25da4f38 1186 return I_V(SvNVX(sv));
748a9306 1187 }
36477c24 1188 if (SvPOKp(sv) && SvLEN(sv))
1189 return asIV(sv);
d008e5eb
GS
1190 {
1191 dTHR;
1192 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1193 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1194 }
ed6116ce
LW
1195 return 0;
1196 }
79072805 1197 }
25da4f38
IZ
1198 if (SvIOKp(sv)) {
1199 if (SvIsUV(sv)) {
1200 return (IV)(SvUVX(sv));
1201 }
1202 else {
1203 return SvIVX(sv);
1204 }
463ee0b2 1205 }
748a9306 1206 if (SvNOKp(sv)) {
25da4f38
IZ
1207 /* We can cache the IV/UV value even if it not good enough
1208 * to reconstruct NV, since the conversion to PV will prefer
1209 * NV over IV/UV. XXXX 64-bit?
1210 */
1211
1212 if (SvTYPE(sv) == SVt_NV)
1213 sv_upgrade(sv, SVt_PVNV);
1214
a5f75d66 1215 (void)SvIOK_on(sv);
25da4f38 1216 if (SvNVX(sv) < (double)IV_MAX + 0.5)
748a9306 1217 SvIVX(sv) = I_V(SvNVX(sv));
25da4f38 1218 else {
ff68c719 1219 SvUVX(sv) = U_V(SvNVX(sv));
25da4f38
IZ
1220 SvIsUV_on(sv);
1221 ret_iv_max:
1222 DEBUG_c(PerlIO_printf(Perl_debug_log,
1223 "0x%lx 2iv(%lu => %ld) (as unsigned)\n",
1224 (unsigned long)sv,
1225 (unsigned long)SvUVX(sv), (long)(IV)SvUVX(sv)));
1226 return (IV)SvUVX(sv);
1227 }
748a9306
LW
1228 }
1229 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1230 I32 numtype = looks_like_number(sv);
1231
1232 /* We want to avoid a possible problem when we cache an IV which
1233 may be later translated to an NV, and the resulting NV is not
1234 the translation of the initial data.
1235
1236 This means that if we cache such an IV, we need to cache the
1237 NV as well. Moreover, we trade speed for space, and do not
1238 cache the NV if not needed.
1239 */
1240 if (numtype & IS_NUMBER_NOT_IV) {
1241 /* May be not an integer. Need to cache NV if we cache IV
1242 * - otherwise future conversion to NV will be wrong. */
1243 double d;
1244
1245 SET_NUMERIC_STANDARD();
1246 d = atof(SvPVX(sv));
1247
1248 if (SvTYPE(sv) < SVt_PVNV)
1249 sv_upgrade(sv, SVt_PVNV);
1250 SvNVX(sv) = d;
1251 (void)SvNOK_on(sv);
1252 (void)SvIOK_on(sv);
1253 DEBUG_c(PerlIO_printf(Perl_debug_log,
1254 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1255 SvNVX(sv)));
1256 if (SvNVX(sv) < (double)IV_MAX + 0.5)
1257 SvIVX(sv) = I_V(SvNVX(sv));
1258 else {
1259 SvUVX(sv) = U_V(SvNVX(sv));
1260 SvIsUV_on(sv);
1261 goto ret_iv_max;
1262 }
1263 }
1264 else if (numtype) {
1265 /* The NV may be reconstructed from IV - safe to cache IV,
1266 which may be calculated by atol(). */
1267 if (SvTYPE(sv) == SVt_PV)
1268 sv_upgrade(sv, SVt_PVIV);
1269 (void)SvIOK_on(sv);
1270 SvIVX(sv) = atol(SvPVX(sv)); /* XXXX 64-bit? */
1271 }
1272 else { /* Not a number. Cache 0. */
1273 dTHR;
1274
1275 if (SvTYPE(sv) < SVt_PVIV)
1276 sv_upgrade(sv, SVt_PVIV);
1277 SvIVX(sv) = 0;
1278 (void)SvIOK_on(sv);
1279 if (ckWARN(WARN_NUMERIC))
1280 not_a_number(sv);
1281 }
93a17b20 1282 }
79072805 1283 else {
11343788 1284 dTHR;
599cee73 1285 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1286 warner(WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1287 if (SvTYPE(sv) < SVt_IV)
1288 /* Typically the caller expects that sv_any is not NULL now. */
1289 sv_upgrade(sv, SVt_IV);
a0d0e21e 1290 return 0;
79072805 1291 }
760ac839 1292 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
a0d0e21e 1293 (unsigned long)sv,(long)SvIVX(sv)));
25da4f38 1294 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1295}
1296
ff68c719 1297UV
8ac85365 1298sv_2uv(register SV *sv)
ff68c719 1299{
1300 if (!sv)
1301 return 0;
1302 if (SvGMAGICAL(sv)) {
1303 mg_get(sv);
1304 if (SvIOKp(sv))
1305 return SvUVX(sv);
1306 if (SvNOKp(sv))
1307 return U_V(SvNVX(sv));
36477c24 1308 if (SvPOKp(sv) && SvLEN(sv))
1309 return asUV(sv);
3fe9a6f1 1310 if (!SvROK(sv)) {
d008e5eb 1311 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1312 dTHR;
d008e5eb 1313 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1314 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1315 }
36477c24 1316 return 0;
3fe9a6f1 1317 }
ff68c719 1318 }
1319 if (SvTHINKFIRST(sv)) {
1320 if (SvROK(sv)) {
ff68c719 1321 SV* tmpstr;
1322 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1323 return SvUV(tmpstr);
ff68c719 1324 return (UV)SvRV(sv);
1325 }
1326 if (SvREADONLY(sv)) {
1327 if (SvNOKp(sv)) {
1328 return U_V(SvNVX(sv));
1329 }
36477c24 1330 if (SvPOKp(sv) && SvLEN(sv))
1331 return asUV(sv);
d008e5eb
GS
1332 {
1333 dTHR;
1334 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1335 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1336 }
ff68c719 1337 return 0;
1338 }
1339 }
25da4f38
IZ
1340 if (SvIOKp(sv)) {
1341 if (SvIsUV(sv)) {
1342 return SvUVX(sv);
1343 }
1344 else {
1345 return (UV)SvIVX(sv);
1346 }
ff68c719 1347 }
1348 if (SvNOKp(sv)) {
25da4f38
IZ
1349 /* We can cache the IV/UV value even if it not good enough
1350 * to reconstruct NV, since the conversion to PV will prefer
1351 * NV over IV/UV. XXXX 64-bit?
1352 */
1353 if (SvTYPE(sv) == SVt_NV)
1354 sv_upgrade(sv, SVt_PVNV);
ff68c719 1355 (void)SvIOK_on(sv);
25da4f38
IZ
1356 if (SvNVX(sv) >= -0.5) {
1357 SvIsUV_on(sv);
1358 SvUVX(sv) = U_V(SvNVX(sv));
1359 }
1360 else {
1361 SvIVX(sv) = I_V(SvNVX(sv));
1362 ret_zero:
1363 DEBUG_c(PerlIO_printf(Perl_debug_log,
1364 "0x%lx 2uv(%ld => %lu) (as signed)\n",
1365 (unsigned long)sv,(long)SvIVX(sv),
1366 (long)(UV)SvIVX(sv)));
1367 return (UV)SvIVX(sv);
1368 }
ff68c719 1369 }
1370 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1371 I32 numtype = looks_like_number(sv);
1372
1373 /* We want to avoid a possible problem when we cache a UV which
1374 may be later translated to an NV, and the resulting NV is not
1375 the translation of the initial data.
1376
1377 This means that if we cache such a UV, we need to cache the
1378 NV as well. Moreover, we trade speed for space, and do not
1379 cache the NV if not needed.
1380 */
1381 if (numtype & IS_NUMBER_NOT_IV) {
1382 /* May be not an integer. Need to cache NV if we cache IV
1383 * - otherwise future conversion to NV will be wrong. */
1384 double d;
1385
1386 SET_NUMERIC_STANDARD();
1387 d = atof(SvPVX(sv)); /* XXXX 64-bit? */
1388
1389 if (SvTYPE(sv) < SVt_PVNV)
1390 sv_upgrade(sv, SVt_PVNV);
1391 SvNVX(sv) = d;
1392 (void)SvNOK_on(sv);
1393 (void)SvIOK_on(sv);
1394 DEBUG_c(PerlIO_printf(Perl_debug_log,
1395 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1396 SvNVX(sv)));
1397 if (SvNVX(sv) < -0.5) {
1398 SvIVX(sv) = I_V(SvNVX(sv));
1399 goto ret_zero;
1400 } else {
1401 SvUVX(sv) = U_V(SvNVX(sv));
1402 SvIsUV_on(sv);
1403 }
1404 }
1405 else if (numtype & IS_NUMBER_NEG) {
1406 /* The NV may be reconstructed from IV - safe to cache IV,
1407 which may be calculated by atol(). */
1408 if (SvTYPE(sv) == SVt_PV)
1409 sv_upgrade(sv, SVt_PVIV);
1410 (void)SvIOK_on(sv);
1411 SvIVX(sv) = (IV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1412 }
1413 else if (numtype) { /* Non-negative */
1414 /* The NV may be reconstructed from UV - safe to cache UV,
1415 which may be calculated by strtoul()/atol. */
1416 if (SvTYPE(sv) == SVt_PV)
1417 sv_upgrade(sv, SVt_PVIV);
1418 (void)SvIOK_on(sv);
1419 (void)SvIsUV_on(sv);
1420#ifdef HAS_STRTOUL
1421 SvUVX(sv) = strtoul(SvPVX(sv), Null(char**), 10); /* XXXX 64-bit? */
1422#else /* no atou(), but we know the number fits into IV... */
1423 /* The only problem may be if it is negative... */
1424 SvUVX(sv) = (UV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1425#endif
1426 }
1427 else { /* Not a number. Cache 0. */
1428 dTHR;
1429
1430 if (SvTYPE(sv) < SVt_PVIV)
1431 sv_upgrade(sv, SVt_PVIV);
1432 SvUVX(sv) = 0; /* We assume that 0s have the
1433 same bitmap in IV and UV. */
1434 (void)SvIOK_on(sv);
1435 (void)SvIsUV_on(sv);
1436 if (ckWARN(WARN_NUMERIC))
1437 not_a_number(sv);
1438 }
ff68c719 1439 }
1440 else {
d008e5eb 1441 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1442 dTHR;
d008e5eb 1443 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1444 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1445 }
25da4f38
IZ
1446 if (SvTYPE(sv) < SVt_IV)
1447 /* Typically the caller expects that sv_any is not NULL now. */
1448 sv_upgrade(sv, SVt_IV);
ff68c719 1449 return 0;
1450 }
25da4f38 1451
ff68c719 1452 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1453 (unsigned long)sv,SvUVX(sv)));
25da4f38 1454 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 1455}
1456
79072805 1457double
8ac85365 1458sv_2nv(register SV *sv)
79072805
LW
1459{
1460 if (!sv)
1461 return 0.0;
8990e307 1462 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1463 mg_get(sv);
1464 if (SvNOKp(sv))
1465 return SvNVX(sv);
a0d0e21e 1466 if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1467 dTHR;
599cee73 1468 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1469 not_a_number(sv);
36477c24 1470 SET_NUMERIC_STANDARD();
463ee0b2 1471 return atof(SvPVX(sv));
a0d0e21e 1472 }
25da4f38
IZ
1473 if (SvIOKp(sv)) {
1474 if (SvIsUV(sv))
1475 return (double)SvUVX(sv);
1476 else
1477 return (double)SvIVX(sv);
1478 }
16d20bd9 1479 if (!SvROK(sv)) {
d008e5eb 1480 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1481 dTHR;
d008e5eb 1482 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1483 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1484 }
16d20bd9
AD
1485 return 0;
1486 }
463ee0b2 1487 }
ed6116ce 1488 if (SvTHINKFIRST(sv)) {
a0d0e21e 1489 if (SvROK(sv)) {
a0d0e21e
LW
1490 SV* tmpstr;
1491 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
9e7bc3e8 1492 return SvNV(tmpstr);
a0d0e21e
LW
1493 return (double)(unsigned long)SvRV(sv);
1494 }
ed6116ce 1495 if (SvREADONLY(sv)) {
d008e5eb 1496 dTHR;
748a9306 1497 if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 1498 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1499 not_a_number(sv);
36477c24 1500 SET_NUMERIC_STANDARD();
ed6116ce 1501 return atof(SvPVX(sv));
a0d0e21e 1502 }
25da4f38
IZ
1503 if (SvIOKp(sv)) {
1504 if (SvIsUV(sv))
1505 return (double)SvUVX(sv);
1506 else
1507 return (double)SvIVX(sv);
1508 }
599cee73 1509 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1510 warner(WARN_UNINITIALIZED, PL_warn_uninit);
ed6116ce
LW
1511 return 0.0;
1512 }
79072805
LW
1513 }
1514 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
1515 if (SvTYPE(sv) == SVt_IV)
1516 sv_upgrade(sv, SVt_PVNV);
1517 else
1518 sv_upgrade(sv, SVt_NV);
36477c24 1519 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1520 DEBUG_c(PerlIO_printf(Perl_debug_log,
1521 "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
79072805
LW
1522 }
1523 else if (SvTYPE(sv) < SVt_PVNV)
1524 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
1525 if (SvIOKp(sv) &&
1526 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 1527 {
25da4f38 1528 SvNVX(sv) = SvIsUV(sv) ? (double)SvUVX(sv) : (double)SvIVX(sv);
93a17b20 1529 }
748a9306 1530 else if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1531 dTHR;
599cee73 1532 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1533 not_a_number(sv);
36477c24 1534 SET_NUMERIC_STANDARD();
463ee0b2 1535 SvNVX(sv) = atof(SvPVX(sv));
93a17b20 1536 }
79072805 1537 else {
11343788 1538 dTHR;
599cee73 1539 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1540 warner(WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1541 if (SvTYPE(sv) < SVt_NV)
1542 /* Typically the caller expects that sv_any is not NULL now. */
1543 sv_upgrade(sv, SVt_NV);
a0d0e21e 1544 return 0.0;
79072805
LW
1545 }
1546 SvNOK_on(sv);
36477c24 1547 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1548 DEBUG_c(PerlIO_printf(Perl_debug_log,
1549 "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
463ee0b2 1550 return SvNVX(sv);
79072805
LW
1551}
1552
76e3520e 1553STATIC IV
8ac85365 1554asIV(SV *sv)
36477c24 1555{
1556 I32 numtype = looks_like_number(sv);
1557 double d;
1558
25da4f38
IZ
1559 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1560 return atol(SvPVX(sv)); /* XXXX 64-bit? */
d008e5eb
GS
1561 if (!numtype) {
1562 dTHR;
1563 if (ckWARN(WARN_NUMERIC))
1564 not_a_number(sv);
1565 }
36477c24 1566 SET_NUMERIC_STANDARD();
1567 d = atof(SvPVX(sv));
25da4f38 1568 return I_V(d);
36477c24 1569}
1570
76e3520e 1571STATIC UV
8ac85365 1572asUV(SV *sv)
36477c24 1573{
1574 I32 numtype = looks_like_number(sv);
1575
84902520 1576#ifdef HAS_STRTOUL
25da4f38 1577 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
84902520
TB
1578 return strtoul(SvPVX(sv), Null(char**), 10);
1579#endif
d008e5eb
GS
1580 if (!numtype) {
1581 dTHR;
1582 if (ckWARN(WARN_NUMERIC))
1583 not_a_number(sv);
1584 }
36477c24 1585 SET_NUMERIC_STANDARD();
1586 return U_V(atof(SvPVX(sv)));
1587}
1588
25da4f38
IZ
1589/*
1590 * Returns a combination of (advisory only - can get false negatives)
1591 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1592 * IS_NUMBER_NEG
1593 * 0 if does not look like number.
1594 *
1595 * In fact possible values are 0 and
1596 * IS_NUMBER_TO_INT_BY_ATOL 123
1597 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1598 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1599 * with a possible addition of IS_NUMBER_NEG.
1600 */
1601
36477c24 1602I32
8ac85365 1603looks_like_number(SV *sv)
36477c24 1604{
25da4f38
IZ
1605 /* XXXX 64-bit? It may be not IS_NUMBER_TO_INT_BY_ATOL, but
1606 * using atof() may lose precision. */
36477c24 1607 register char *s;
1608 register char *send;
1609 register char *sbegin;
25da4f38
IZ
1610 register char *nbegin;
1611 I32 numtype = 0;
36477c24 1612 STRLEN len;
1613
1614 if (SvPOK(sv)) {
1615 sbegin = SvPVX(sv);
1616 len = SvCUR(sv);
1617 }
1618 else if (SvPOKp(sv))
1619 sbegin = SvPV(sv, len);
1620 else
1621 return 1;
1622 send = sbegin + len;
1623
1624 s = sbegin;
1625 while (isSPACE(*s))
1626 s++;
25da4f38
IZ
1627 if (*s == '-') {
1628 s++;
1629 numtype = IS_NUMBER_NEG;
1630 }
1631 else if (*s == '+')
36477c24 1632 s++;
ff0cee69 1633
25da4f38
IZ
1634 nbegin = s;
1635 /*
1636 * we return 1 if the number can be converted to _integer_ with atol()
1637 * and 2 if you need (int)atof().
1638 */
1639
ff0cee69 1640 /* next must be digit or '.' */
1641 if (isDIGIT(*s)) {
1642 do {
1643 s++;
1644 } while (isDIGIT(*s));
25da4f38
IZ
1645
1646 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1647 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1648 else
1649 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1650
ff0cee69 1651 if (*s == '.') {
1652 s++;
25da4f38 1653 numtype |= IS_NUMBER_NOT_IV;
ff0cee69 1654 while (isDIGIT(*s)) /* optional digits after "." */
1655 s++;
1656 }
36477c24 1657 }
ff0cee69 1658 else if (*s == '.') {
1659 s++;
25da4f38 1660 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
ff0cee69 1661 /* no digits before '.' means we need digits after it */
1662 if (isDIGIT(*s)) {
1663 do {
1664 s++;
1665 } while (isDIGIT(*s));
1666 }
1667 else
1668 return 0;
1669 }
1670 else
1671 return 0;
1672
ff0cee69 1673 /* we can have an optional exponent part */
36477c24 1674 if (*s == 'e' || *s == 'E') {
25da4f38
IZ
1675 numtype &= ~IS_NUMBER_NEG;
1676 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
36477c24 1677 s++;
1678 if (*s == '+' || *s == '-')
1679 s++;
ff0cee69 1680 if (isDIGIT(*s)) {
1681 do {
1682 s++;
1683 } while (isDIGIT(*s));
1684 }
1685 else
1686 return 0;
36477c24 1687 }
1688 while (isSPACE(*s))
1689 s++;
1690 if (s >= send)
1691 return numtype;
1692 if (len == 10 && memEQ(sbegin, "0 but true", 10))
25da4f38 1693 return IS_NUMBER_TO_INT_BY_ATOL;
36477c24 1694 return 0;
1695}
1696
79072805 1697char *
1fa8b10d
JD
1698sv_2pv_nolen(register SV *sv)
1699{
1700 STRLEN n_a;
1701 return sv_2pv(sv, &n_a);
1702}
1703
25da4f38
IZ
1704/* We assume that buf is at least TYPE_CHARS(UV) long. */
1705STATIC char *
1706uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1707{
1708 STRLEN len;
1709 char *ptr = buf + TYPE_CHARS(UV);
1710 char *ebuf = ptr;
1711 int sign;
1712 char *p;
1713
1714 if (is_uv)
1715 sign = 0;
1716 else if (iv >= 0) {
1717 uv = iv;
1718 sign = 0;
1719 } else {
1720 uv = -iv;
1721 sign = 1;
1722 }
1723 do {
1724 *--ptr = '0' + (uv % 10);
1725 } while (uv /= 10);
1726 if (sign)
1727 *--ptr = '-';
1728 *peob = ebuf;
1729 return ptr;
1730}
1731
1fa8b10d 1732char *
8ac85365 1733sv_2pv(register SV *sv, STRLEN *lp)
79072805
LW
1734{
1735 register char *s;
1736 int olderrno;
46fc3d4c 1737 SV *tsv;
25da4f38
IZ
1738 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
1739 char *tmpbuf = tbuf;
79072805 1740
463ee0b2
LW
1741 if (!sv) {
1742 *lp = 0;
1743 return "";
1744 }
8990e307 1745 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1746 mg_get(sv);
1747 if (SvPOKp(sv)) {
1748 *lp = SvCUR(sv);
1749 return SvPVX(sv);
1750 }
25da4f38
IZ
1751 if (SvIOKp(sv)) { /* XXXX 64-bit? */
1752 if (SvIsUV(sv))
1753 (void)sprintf(tmpbuf,"%lu",(unsigned long)SvUVX(sv));
1754 else
1755 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
46fc3d4c 1756 tsv = Nullsv;
a0d0e21e 1757 goto tokensave;
463ee0b2
LW
1758 }
1759 if (SvNOKp(sv)) {
36477c24 1760 SET_NUMERIC_STANDARD();
96827780 1761 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1762 tsv = Nullsv;
a0d0e21e 1763 goto tokensave;
463ee0b2 1764 }
16d20bd9 1765 if (!SvROK(sv)) {
d008e5eb 1766 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1767 dTHR;
d008e5eb 1768 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1769 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1770 }
16d20bd9
AD
1771 *lp = 0;
1772 return "";
1773 }
463ee0b2 1774 }
ed6116ce
LW
1775 if (SvTHINKFIRST(sv)) {
1776 if (SvROK(sv)) {
a0d0e21e
LW
1777 SV* tmpstr;
1778 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
9e7bc3e8 1779 return SvPV(tmpstr,*lp);
ed6116ce
LW
1780 sv = (SV*)SvRV(sv);
1781 if (!sv)
1782 s = "NULLREF";
1783 else {
f9277f47
IZ
1784 MAGIC *mg;
1785
ed6116ce 1786 switch (SvTYPE(sv)) {
f9277f47
IZ
1787 case SVt_PVMG:
1788 if ( ((SvFLAGS(sv) &
1789 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 1790 == (SVs_OBJECT|SVs_RMG))
57668c4d 1791 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
f9277f47 1792 && (mg = mg_find(sv, 'r'))) {
5c0ca799 1793 dTHR;
2cd61cdb 1794 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 1795
2cd61cdb 1796 if (!mg->mg_ptr) {
8782bef2
GB
1797 char *fptr = "msix";
1798 char reflags[6];
1799 char ch;
1800 int left = 0;
1801 int right = 4;
1802 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1803
1804 while(ch = *fptr++) {
1805 if(reganch & 1) {
1806 reflags[left++] = ch;
1807 }
1808 else {
1809 reflags[right--] = ch;
1810 }
1811 reganch >>= 1;
1812 }
1813 if(left != 4) {
1814 reflags[left] = '-';
1815 left = 5;
1816 }
1817
1818 mg->mg_len = re->prelen + 4 + left;
1819 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1820 Copy("(?", mg->mg_ptr, 2, char);
1821 Copy(reflags, mg->mg_ptr+2, left, char);
1822 Copy(":", mg->mg_ptr+left+2, 1, char);
1823 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
1824 mg->mg_ptr[mg->mg_len - 1] = ')';
1825 mg->mg_ptr[mg->mg_len] = 0;
1826 }
3280af22 1827 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
1828 *lp = mg->mg_len;
1829 return mg->mg_ptr;
f9277f47
IZ
1830 }
1831 /* Fall through */
ed6116ce
LW
1832 case SVt_NULL:
1833 case SVt_IV:
1834 case SVt_NV:
1835 case SVt_RV:
1836 case SVt_PV:
1837 case SVt_PVIV:
1838 case SVt_PVNV:
f9277f47 1839 case SVt_PVBM: s = "SCALAR"; break;
ed6116ce
LW
1840 case SVt_PVLV: s = "LVALUE"; break;
1841 case SVt_PVAV: s = "ARRAY"; break;
1842 case SVt_PVHV: s = "HASH"; break;
1843 case SVt_PVCV: s = "CODE"; break;
1844 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 1845 case SVt_PVFM: s = "FORMAT"; break;
36477c24 1846 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
1847 default: s = "UNKNOWN"; break;
1848 }
46fc3d4c 1849 tsv = NEWSV(0,0);
ed6116ce 1850 if (SvOBJECT(sv))
46fc3d4c 1851 sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 1852 else
46fc3d4c 1853 sv_setpv(tsv, s);
25da4f38 1854 /* XXXX 64-bit? */
46fc3d4c 1855 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
a0d0e21e 1856 goto tokensaveref;
463ee0b2 1857 }
ed6116ce
LW
1858 *lp = strlen(s);
1859 return s;
79072805 1860 }
ed6116ce 1861 if (SvREADONLY(sv)) {
25da4f38
IZ
1862 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1863 /* XXXX 64-bit? IV may have better precision... */
36477c24 1864 SET_NUMERIC_STANDARD();
96827780 1865 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1866 tsv = Nullsv;
a0d0e21e 1867 goto tokensave;
ed6116ce 1868 }
8bb9dbe4 1869 if (SvIOKp(sv)) {
25da4f38
IZ
1870 char *ebuf;
1871
1872 if (SvIsUV(sv))
1873 tmpbuf = uiv_2buf(tbuf, 0, SvUVX(sv), 1, &ebuf);
1874 else
1875 tmpbuf = uiv_2buf(tbuf, SvIVX(sv), 0, 0, &ebuf);
1876 *ebuf = 0;
46fc3d4c 1877 tsv = Nullsv;
8bb9dbe4
LW
1878 goto tokensave;
1879 }
d008e5eb
GS
1880 {
1881 dTHR;
1882 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1883 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1884 }
ed6116ce
LW
1885 *lp = 0;
1886 return "";
79072805 1887 }
79072805 1888 }
25da4f38
IZ
1889 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1890 /* XXXX 64-bit? IV may have better precision... */
79072805
LW
1891 if (SvTYPE(sv) < SVt_PVNV)
1892 sv_upgrade(sv, SVt_PVNV);
1893 SvGROW(sv, 28);
463ee0b2 1894 s = SvPVX(sv);
79072805 1895 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 1896#ifdef apollo
463ee0b2 1897 if (SvNVX(sv) == 0.0)
79072805
LW
1898 (void)strcpy(s,"0");
1899 else
1900#endif /*apollo*/
bbce6d69 1901 {
36477c24 1902 SET_NUMERIC_STANDARD();
a0d0e21e 1903 Gconvert(SvNVX(sv), DBL_DIG, 0, s);
bbce6d69 1904 }
79072805 1905 errno = olderrno;
a0d0e21e
LW
1906#ifdef FIXNEGATIVEZERO
1907 if (*s == '-' && s[1] == '0' && !s[2])
1908 strcpy(s,"0");
1909#endif
79072805
LW
1910 while (*s) s++;
1911#ifdef hcx
1912 if (s[-1] == '.')
46fc3d4c 1913 *--s = '\0';
79072805
LW
1914#endif
1915 }
748a9306 1916 else if (SvIOKp(sv)) {
25da4f38
IZ
1917 U32 isIOK = SvIOK(sv);
1918 char buf[TYPE_CHARS(UV)];
1919 char *ebuf, *ptr;
1920
79072805
LW
1921 if (SvTYPE(sv) < SVt_PVIV)
1922 sv_upgrade(sv, SVt_PVIV);
25da4f38
IZ
1923 if (SvIsUV(sv)) {
1924 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
1925 sv_setpvn(sv, ptr, ebuf - ptr);
1926 SvIsUV_on(sv);
1927 }
1928 else {
1929 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
1930 sv_setpvn(sv, ptr, ebuf - ptr);
1931 }
46fc3d4c 1932 s = SvEND(sv);
25da4f38 1933 if (isIOK)
64f14228
GA
1934 SvIOK_on(sv);
1935 else
1936 SvIOKp_on(sv);
79072805
LW
1937 }
1938 else {
11343788 1939 dTHR;
599cee73 1940 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1941 warner(WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e 1942 *lp = 0;
25da4f38
IZ
1943 if (SvTYPE(sv) < SVt_PV)
1944 /* Typically the caller expects that sv_any is not NULL now. */
1945 sv_upgrade(sv, SVt_PV);
a0d0e21e 1946 return "";
79072805 1947 }
463ee0b2
LW
1948 *lp = s - SvPVX(sv);
1949 SvCUR_set(sv, *lp);
79072805 1950 SvPOK_on(sv);
760ac839 1951 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
463ee0b2 1952 return SvPVX(sv);
a0d0e21e
LW
1953
1954 tokensave:
1955 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
1956 /* Sneaky stuff here */
1957
1958 tokensaveref:
46fc3d4c 1959 if (!tsv)
96827780 1960 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 1961 sv_2mortal(tsv);
1962 *lp = SvCUR(tsv);
1963 return SvPVX(tsv);
a0d0e21e
LW
1964 }
1965 else {
1966 STRLEN len;
46fc3d4c 1967 char *t;
1968
1969 if (tsv) {
1970 sv_2mortal(tsv);
1971 t = SvPVX(tsv);
1972 len = SvCUR(tsv);
1973 }
1974 else {
96827780
MB
1975 t = tmpbuf;
1976 len = strlen(tmpbuf);
46fc3d4c 1977 }
a0d0e21e 1978#ifdef FIXNEGATIVEZERO
46fc3d4c 1979 if (len == 2 && t[0] == '-' && t[1] == '0') {
1980 t = "0";
1981 len = 1;
1982 }
a0d0e21e
LW
1983#endif
1984 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 1985 *lp = len;
a0d0e21e
LW
1986 s = SvGROW(sv, len + 1);
1987 SvCUR_set(sv, len);
46fc3d4c 1988 (void)strcpy(s, t);
6bf554b4 1989 SvPOKp_on(sv);
a0d0e21e
LW
1990 return s;
1991 }
463ee0b2
LW
1992}
1993
1994/* This function is only called on magical items */
1995bool
8ac85365 1996sv_2bool(register SV *sv)
463ee0b2 1997{
8990e307 1998 if (SvGMAGICAL(sv))
463ee0b2
LW
1999 mg_get(sv);
2000
a0d0e21e
LW
2001 if (!SvOK(sv))
2002 return 0;
2003 if (SvROK(sv)) {
11343788 2004 dTHR;
a0d0e21e
LW
2005 SV* tmpsv;
2006 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
9e7bc3e8 2007 return SvTRUE(tmpsv);
a0d0e21e
LW
2008 return SvRV(sv) != 0;
2009 }
463ee0b2 2010 if (SvPOKp(sv)) {
11343788
MB
2011 register XPV* Xpvtmp;
2012 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2013 (*Xpvtmp->xpv_pv > '0' ||
2014 Xpvtmp->xpv_cur > 1 ||
2015 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
2016 return 1;
2017 else
2018 return 0;
2019 }
2020 else {
2021 if (SvIOKp(sv))
2022 return SvIVX(sv) != 0;
2023 else {
2024 if (SvNOKp(sv))
2025 return SvNVX(sv) != 0.0;
2026 else
2027 return FALSE;
2028 }
2029 }
79072805
LW
2030}
2031
2032/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 2033 * to be reused, since it may destroy the source string if it is marked
79072805
LW
2034 * as temporary.
2035 */
2036
2037void
8ac85365 2038sv_setsv(SV *dstr, register SV *sstr)
79072805 2039{
11343788 2040 dTHR;
8990e307
LW
2041 register U32 sflags;
2042 register int dtype;
2043 register int stype;
463ee0b2 2044
79072805
LW
2045 if (sstr == dstr)
2046 return;
2213622d 2047 SV_CHECK_THINKFIRST(dstr);
79072805 2048 if (!sstr)
3280af22 2049 sstr = &PL_sv_undef;
8990e307
LW
2050 stype = SvTYPE(sstr);
2051 dtype = SvTYPE(dstr);
79072805 2052
a0d0e21e 2053 SvAMAGIC_off(dstr);
9e7bc3e8 2054
463ee0b2 2055 /* There's a lot of redundancy below but we're going for speed here */
79072805 2056
8990e307 2057 switch (stype) {
79072805 2058 case SVt_NULL:
aece5585 2059 undef_sstr:
20408e3c
GS
2060 if (dtype != SVt_PVGV) {
2061 (void)SvOK_off(dstr);
2062 return;
2063 }
2064 break;
463ee0b2 2065 case SVt_IV:
aece5585
GA
2066 if (SvIOK(sstr)) {
2067 switch (dtype) {
2068 case SVt_NULL:
8990e307 2069 sv_upgrade(dstr, SVt_IV);
aece5585
GA
2070 break;
2071 case SVt_NV:
8990e307 2072 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2073 break;
2074 case SVt_RV:
2075 case SVt_PV:
a0d0e21e 2076 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2077 break;
2078 }
2079 (void)SvIOK_only(dstr);
2080 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2081 if (SvIsUV(sstr))
2082 SvIsUV_on(dstr);
aece5585
GA
2083 SvTAINT(dstr);
2084 return;
8990e307 2085 }
aece5585
GA
2086 goto undef_sstr;
2087
463ee0b2 2088 case SVt_NV:
aece5585
GA
2089 if (SvNOK(sstr)) {
2090 switch (dtype) {
2091 case SVt_NULL:
2092 case SVt_IV:
8990e307 2093 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2094 break;
2095 case SVt_RV:
2096 case SVt_PV:
2097 case SVt_PVIV:
a0d0e21e 2098 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2099 break;
2100 }
2101 SvNVX(dstr) = SvNVX(sstr);
2102 (void)SvNOK_only(dstr);
2103 SvTAINT(dstr);
2104 return;
8990e307 2105 }
aece5585
GA
2106 goto undef_sstr;
2107
ed6116ce 2108 case SVt_RV:
8990e307 2109 if (dtype < SVt_RV)
ed6116ce 2110 sv_upgrade(dstr, SVt_RV);
c07a80fd 2111 else if (dtype == SVt_PVGV &&
2112 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2113 sstr = SvRV(sstr);
a5f75d66 2114 if (sstr == dstr) {
3280af22 2115 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2116 GvIMPORTED_on(dstr);
2117 GvMULTI_on(dstr);
2118 return;
2119 }
c07a80fd 2120 goto glob_assign;
2121 }
ed6116ce 2122 break;
463ee0b2 2123 case SVt_PV:
fc36a67e 2124 case SVt_PVFM:
8990e307 2125 if (dtype < SVt_PV)
463ee0b2 2126 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
2127 break;
2128 case SVt_PVIV:
8990e307 2129 if (dtype < SVt_PVIV)
463ee0b2 2130 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
2131 break;
2132 case SVt_PVNV:
8990e307 2133 if (dtype < SVt_PVNV)
463ee0b2 2134 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 2135 break;
4633a7c4
LW
2136 case SVt_PVAV:
2137 case SVt_PVHV:
2138 case SVt_PVCV:
4633a7c4 2139 case SVt_PVIO:
533c011a 2140 if (PL_op)
4633a7c4 2141 croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 2142 PL_op_name[PL_op->op_type]);
4633a7c4
LW
2143 else
2144 croak("Bizarre copy of %s", sv_reftype(sstr, 0));
2145 break;
2146
79072805 2147 case SVt_PVGV:
8990e307 2148 if (dtype <= SVt_PVGV) {
c07a80fd 2149 glob_assign:
a5f75d66 2150 if (dtype != SVt_PVGV) {
a0d0e21e
LW
2151 char *name = GvNAME(sstr);
2152 STRLEN len = GvNAMELEN(sstr);
463ee0b2 2153 sv_upgrade(dstr, SVt_PVGV);
a0d0e21e 2154 sv_magic(dstr, dstr, '*', name, len);
85aff577 2155 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
2156 GvNAME(dstr) = savepvn(name, len);
2157 GvNAMELEN(dstr) = len;
2158 SvFAKE_on(dstr); /* can coerce to non-glob */
2159 }
7bac28a0 2160 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
2161 else if (PL_curstackinfo->si_type == PERLSI_SORT
2162 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
7bac28a0 2163 croak("Can't redefine active sort subroutine %s",
2164 GvNAME(dstr));
a0d0e21e 2165 (void)SvOK_off(dstr);
a5f75d66 2166 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 2167 gp_free((GV*)dstr);
79072805 2168 GvGP(dstr) = gp_ref(GvGP(sstr));
8990e307 2169 SvTAINT(dstr);
3280af22 2170 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2171 GvIMPORTED_on(dstr);
2172 GvMULTI_on(dstr);
79072805
LW
2173 return;
2174 }
2175 /* FALL THROUGH */
2176
2177 default:
973f89ab
CS
2178 if (SvGMAGICAL(sstr)) {
2179 mg_get(sstr);
2180 if (SvTYPE(sstr) != stype) {
2181 stype = SvTYPE(sstr);
2182 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2183 goto glob_assign;
2184 }
2185 }
ded42b9f 2186 if (stype == SVt_PVLV)
6fc92669 2187 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 2188 else
6fc92669 2189 (void)SvUPGRADE(dstr, stype);
79072805
LW
2190 }
2191
8990e307
LW
2192 sflags = SvFLAGS(sstr);
2193
2194 if (sflags & SVf_ROK) {
2195 if (dtype >= SVt_PV) {
2196 if (dtype == SVt_PVGV) {
2197 SV *sref = SvREFCNT_inc(SvRV(sstr));
2198 SV *dref = 0;
a5f75d66 2199 int intro = GvINTRO(dstr);
a0d0e21e
LW
2200
2201 if (intro) {
2202 GP *gp;
2203 GvGP(dstr)->gp_refcnt--;
a5f75d66 2204 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 2205 Newz(602,gp, 1, GP);
44a8e56a 2206 GvGP(dstr) = gp_ref(gp);
a0d0e21e 2207 GvSV(dstr) = NEWSV(72,0);
3280af22 2208 GvLINE(dstr) = PL_curcop->cop_line;
1edc1566 2209 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 2210 }
a5f75d66 2211 GvMULTI_on(dstr);
8990e307
LW
2212 switch (SvTYPE(sref)) {
2213 case SVt_PVAV:
a0d0e21e
LW
2214 if (intro)
2215 SAVESPTR(GvAV(dstr));
2216 else
2217 dref = (SV*)GvAV(dstr);
8990e307 2218 GvAV(dstr) = (AV*)sref;
3280af22 2219 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2220 GvIMPORTED_AV_on(dstr);
8990e307
LW
2221 break;
2222 case SVt_PVHV:
a0d0e21e
LW
2223 if (intro)
2224 SAVESPTR(GvHV(dstr));
2225 else
2226 dref = (SV*)GvHV(dstr);
8990e307 2227 GvHV(dstr) = (HV*)sref;
3280af22 2228 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2229 GvIMPORTED_HV_on(dstr);
8990e307
LW
2230 break;
2231 case SVt_PVCV:
8ebc5c01 2232 if (intro) {
2233 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2234 SvREFCNT_dec(GvCV(dstr));
2235 GvCV(dstr) = Nullcv;
68dc0745 2236 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 2237 PL_sub_generation++;
8ebc5c01 2238 }
a0d0e21e 2239 SAVESPTR(GvCV(dstr));
8ebc5c01 2240 }
68dc0745 2241 else
2242 dref = (SV*)GvCV(dstr);
2243 if (GvCV(dstr) != (CV*)sref) {
748a9306 2244 CV* cv = GvCV(dstr);
4633a7c4 2245 if (cv) {
68dc0745 2246 if (!GvCVGEN((GV*)dstr) &&
2247 (CvROOT(cv) || CvXSUB(cv)))
2248 {
fe5e78ed
GS
2249 SV *const_sv = cv_const_sv(cv);
2250 bool const_changed = TRUE;
2251 if(const_sv)
2252 const_changed = sv_cmp(const_sv,
2253 op_const_sv(CvSTART((CV*)sref),
2254 Nullcv));
7bac28a0 2255 /* ahem, death to those who redefine
2256 * active sort subs */
3280af22
NIS
2257 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2258 PL_sortcop == CvSTART(cv))
7bac28a0 2259 croak(
2260 "Can't redefine active sort subroutine %s",
2261 GvENAME((GV*)dstr));
599cee73 2262 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2f34f9d4
IZ
2263 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2264 && HvNAME(GvSTASH(CvGV(cv)))
2265 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2266 "autouse")))
599cee73 2267 warner(WARN_REDEFINE, const_sv ?
fe5e78ed
GS
2268 "Constant subroutine %s redefined"
2269 : "Subroutine %s redefined",
2f34f9d4
IZ
2270 GvENAME((GV*)dstr));
2271 }
9607fc9c 2272 }
3fe9a6f1 2273 cv_ckproto(cv, (GV*)dstr,
2274 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 2275 }
a5f75d66 2276 GvCV(dstr) = (CV*)sref;
7a4c00b4 2277 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 2278 GvASSUMECV_on(dstr);
3280af22 2279 PL_sub_generation++;
a5f75d66 2280 }
3280af22 2281 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2282 GvIMPORTED_CV_on(dstr);
8990e307 2283 break;
91bba347
LW
2284 case SVt_PVIO:
2285 if (intro)
2286 SAVESPTR(GvIOp(dstr));
2287 else
2288 dref = (SV*)GvIOp(dstr);
2289 GvIOp(dstr) = (IO*)sref;
2290 break;
8990e307 2291 default:
a0d0e21e
LW
2292 if (intro)
2293 SAVESPTR(GvSV(dstr));
2294 else
2295 dref = (SV*)GvSV(dstr);
8990e307 2296 GvSV(dstr) = sref;
3280af22 2297 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2298 GvIMPORTED_SV_on(dstr);
8990e307
LW
2299 break;
2300 }
2301 if (dref)
2302 SvREFCNT_dec(dref);
a0d0e21e
LW
2303 if (intro)
2304 SAVEFREESV(sref);
8990e307
LW
2305 SvTAINT(dstr);
2306 return;
2307 }
a0d0e21e 2308 if (SvPVX(dstr)) {
760ac839 2309 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
2310 if (SvLEN(dstr))
2311 Safefree(SvPVX(dstr));
a0d0e21e
LW
2312 SvLEN(dstr)=SvCUR(dstr)=0;
2313 }
8990e307 2314 }
a0d0e21e 2315 (void)SvOK_off(dstr);
8990e307 2316 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 2317 SvROK_on(dstr);
8990e307 2318 if (sflags & SVp_NOK) {
ed6116ce
LW
2319 SvNOK_on(dstr);
2320 SvNVX(dstr) = SvNVX(sstr);
2321 }
8990e307 2322 if (sflags & SVp_IOK) {
a0d0e21e 2323 (void)SvIOK_on(dstr);
ed6116ce 2324 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2325 if (SvIsUV(sstr))
2326 SvIsUV_on(dstr);
ed6116ce 2327 }
a0d0e21e
LW
2328 if (SvAMAGIC(sstr)) {
2329 SvAMAGIC_on(dstr);
2330 }
ed6116ce 2331 }
8990e307 2332 else if (sflags & SVp_POK) {
79072805
LW
2333
2334 /*
2335 * Check to see if we can just swipe the string. If so, it's a
2336 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
2337 * It might even be a win on short strings if SvPVX(dstr)
2338 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
2339 */
2340
ff68c719 2341 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 2342 SvREFCNT(sstr) == 1 && /* and no other references to it? */
a5f75d66
AD
2343 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2344 {
adbc6bb1 2345 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
2346 if (SvOOK(dstr)) {
2347 SvFLAGS(dstr) &= ~SVf_OOK;
2348 Safefree(SvPVX(dstr) - SvIVX(dstr));
2349 }
50483b2c 2350 else if (SvLEN(dstr))
a5f75d66 2351 Safefree(SvPVX(dstr));
79072805 2352 }
a5f75d66 2353 (void)SvPOK_only(dstr);
463ee0b2 2354 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
2355 SvLEN_set(dstr, SvLEN(sstr));
2356 SvCUR_set(dstr, SvCUR(sstr));
79072805 2357 SvTEMP_off(dstr);
a5f75d66 2358 (void)SvOK_off(sstr);
79072805
LW
2359 SvPV_set(sstr, Nullch);
2360 SvLEN_set(sstr, 0);
a5f75d66
AD
2361 SvCUR_set(sstr, 0);
2362 SvTEMP_off(sstr);
79072805
LW
2363 }
2364 else { /* have to copy actual string */
8990e307
LW
2365 STRLEN len = SvCUR(sstr);
2366
2367 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2368 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2369 SvCUR_set(dstr, len);
2370 *SvEND(dstr) = '\0';
a0d0e21e 2371 (void)SvPOK_only(dstr);
79072805
LW
2372 }
2373 /*SUPPRESS 560*/
8990e307 2374 if (sflags & SVp_NOK) {
79072805 2375 SvNOK_on(dstr);
463ee0b2 2376 SvNVX(dstr) = SvNVX(sstr);
79072805 2377 }
8990e307 2378 if (sflags & SVp_IOK) {
a0d0e21e 2379 (void)SvIOK_on(dstr);
463ee0b2 2380 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2381 if (SvIsUV(sstr))
2382 SvIsUV_on(dstr);
79072805
LW
2383 }
2384 }
8990e307 2385 else if (sflags & SVp_NOK) {
463ee0b2 2386 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 2387 (void)SvNOK_only(dstr);
79072805 2388 if (SvIOK(sstr)) {
a0d0e21e 2389 (void)SvIOK_on(dstr);
463ee0b2 2390 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2391 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2392 if (SvIsUV(sstr))
2393 SvIsUV_on(dstr);
79072805
LW
2394 }
2395 }
8990e307 2396 else if (sflags & SVp_IOK) {
a0d0e21e 2397 (void)SvIOK_only(dstr);
463ee0b2 2398 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2399 if (SvIsUV(sstr))
2400 SvIsUV_on(dstr);
79072805
LW
2401 }
2402 else {
20408e3c 2403 if (dtype == SVt_PVGV) {
599cee73
PM
2404 if (ckWARN(WARN_UNSAFE))
2405 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
20408e3c
GS
2406 }
2407 else
2408 (void)SvOK_off(dstr);
a0d0e21e 2409 }
463ee0b2 2410 SvTAINT(dstr);
79072805
LW
2411}
2412
2413void
ef50df4b
GS
2414sv_setsv_mg(SV *dstr, register SV *sstr)
2415{
2416 sv_setsv(dstr,sstr);
2417 SvSETMAGIC(dstr);
2418}
2419
2420void
8ac85365 2421sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
79072805 2422{
c6f8c383 2423 register char *dptr;
4561caa4
CS
2424 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2425 elicit a warning, but it won't hurt. */
2213622d 2426 SV_CHECK_THINKFIRST(sv);
463ee0b2 2427 if (!ptr) {
a0d0e21e 2428 (void)SvOK_off(sv);
463ee0b2
LW
2429 return;
2430 }
6fc92669 2431 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2432
79072805 2433 SvGROW(sv, len + 1);
c6f8c383
GA
2434 dptr = SvPVX(sv);
2435 Move(ptr,dptr,len,char);
2436 dptr[len] = '\0';
79072805 2437 SvCUR_set(sv, len);
a0d0e21e 2438 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2439 SvTAINT(sv);
79072805
LW
2440}
2441
2442void
ef50df4b
GS
2443sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2444{
2445 sv_setpvn(sv,ptr,len);
2446 SvSETMAGIC(sv);
2447}
2448
2449void
8ac85365 2450sv_setpv(register SV *sv, register const char *ptr)
79072805
LW
2451{
2452 register STRLEN len;
2453
2213622d 2454 SV_CHECK_THINKFIRST(sv);
463ee0b2 2455 if (!ptr) {
a0d0e21e 2456 (void)SvOK_off(sv);
463ee0b2
LW
2457 return;
2458 }
79072805 2459 len = strlen(ptr);
6fc92669 2460 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2461
79072805 2462 SvGROW(sv, len + 1);
463ee0b2 2463 Move(ptr,SvPVX(sv),len+1,char);
79072805 2464 SvCUR_set(sv, len);
a0d0e21e 2465 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
2466 SvTAINT(sv);
2467}
2468
2469void
ef50df4b
GS
2470sv_setpv_mg(register SV *sv, register const char *ptr)
2471{
2472 sv_setpv(sv,ptr);
2473 SvSETMAGIC(sv);
2474}
2475
2476void
8ac85365 2477sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 2478{
2213622d 2479 SV_CHECK_THINKFIRST(sv);
c6f8c383 2480 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 2481 if (!ptr) {
a0d0e21e 2482 (void)SvOK_off(sv);
463ee0b2
LW
2483 return;
2484 }
a0ed51b3 2485 (void)SvOOK_off(sv);
50483b2c 2486 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
2487 Safefree(SvPVX(sv));
2488 Renew(ptr, len+1, char);
2489 SvPVX(sv) = ptr;
2490 SvCUR_set(sv, len);
2491 SvLEN_set(sv, len+1);
2492 *SvEND(sv) = '\0';
a0d0e21e 2493 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2494 SvTAINT(sv);
79072805
LW
2495}
2496
ef50df4b
GS
2497void
2498sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2499{
51c1089b 2500 sv_usepvn(sv,ptr,len);
ef50df4b
GS
2501 SvSETMAGIC(sv);
2502}
2503
6fc92669
GS
2504void
2505sv_force_normal(register SV *sv)
0f15f207 2506{
2213622d
GA
2507 if (SvREADONLY(sv)) {
2508 dTHR;
3280af22 2509 if (PL_curcop != &PL_compiling)
22c35a8c 2510 croak(PL_no_modify);
0f15f207 2511 }
2213622d
GA
2512 if (SvROK(sv))
2513 sv_unref(sv);
6fc92669
GS
2514 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2515 sv_unglob(sv);
0f15f207
MB
2516}
2517
79072805 2518void
8ac85365
NIS
2519sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
2520
2521
79072805
LW
2522{
2523 register STRLEN delta;
2524
a0d0e21e 2525 if (!ptr || !SvPOKp(sv))
79072805 2526 return;
2213622d 2527 SV_CHECK_THINKFIRST(sv);
79072805
LW
2528 if (SvTYPE(sv) < SVt_PVIV)
2529 sv_upgrade(sv,SVt_PVIV);
2530
2531 if (!SvOOK(sv)) {
50483b2c
JD
2532 if (!SvLEN(sv)) { /* make copy of shared string */
2533 char *pvx = SvPVX(sv);
2534 STRLEN len = SvCUR(sv);
2535 SvGROW(sv, len + 1);
2536 Move(pvx,SvPVX(sv),len,char);
2537 *SvEND(sv) = '\0';
2538 }
463ee0b2 2539 SvIVX(sv) = 0;
79072805
LW
2540 SvFLAGS(sv) |= SVf_OOK;
2541 }
25da4f38 2542 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 2543 delta = ptr - SvPVX(sv);
79072805
LW
2544 SvLEN(sv) -= delta;
2545 SvCUR(sv) -= delta;
463ee0b2
LW
2546 SvPVX(sv) += delta;
2547 SvIVX(sv) += delta;
79072805
LW
2548}
2549
2550void
08105a92 2551sv_catpvn(register SV *sv, register const char *ptr, register STRLEN len)
79072805 2552{
463ee0b2 2553 STRLEN tlen;
748a9306 2554 char *junk;
a0d0e21e 2555
748a9306 2556 junk = SvPV_force(sv, tlen);
463ee0b2 2557 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2558 if (ptr == junk)
2559 ptr = SvPVX(sv);
463ee0b2 2560 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
2561 SvCUR(sv) += len;
2562 *SvEND(sv) = '\0';
a0d0e21e 2563 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2564 SvTAINT(sv);
79072805
LW
2565}
2566
2567void
08105a92 2568sv_catpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2569{
2570 sv_catpvn(sv,ptr,len);
2571 SvSETMAGIC(sv);
2572}
2573
2574void
8ac85365 2575sv_catsv(SV *dstr, register SV *sstr)
79072805
LW
2576{
2577 char *s;
463ee0b2 2578 STRLEN len;
79072805
LW
2579 if (!sstr)
2580 return;
463ee0b2
LW
2581 if (s = SvPV(sstr, len))
2582 sv_catpvn(dstr,s,len);
79072805
LW
2583}
2584
2585void
ef50df4b
GS
2586sv_catsv_mg(SV *dstr, register SV *sstr)
2587{
2588 sv_catsv(dstr,sstr);
2589 SvSETMAGIC(dstr);
2590}
2591
2592void
08105a92 2593sv_catpv(register SV *sv, register const char *ptr)
79072805
LW
2594{
2595 register STRLEN len;
463ee0b2 2596 STRLEN tlen;
748a9306 2597 char *junk;
79072805 2598
79072805
LW
2599 if (!ptr)
2600 return;
748a9306 2601 junk = SvPV_force(sv, tlen);
79072805 2602 len = strlen(ptr);
463ee0b2 2603 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2604 if (ptr == junk)
2605 ptr = SvPVX(sv);
463ee0b2 2606 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 2607 SvCUR(sv) += len;
a0d0e21e 2608 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2609 SvTAINT(sv);
79072805
LW
2610}
2611
ef50df4b 2612void
08105a92 2613sv_catpv_mg(register SV *sv, register const char *ptr)
ef50df4b 2614{
51c1089b 2615 sv_catpv(sv,ptr);
ef50df4b
GS
2616 SvSETMAGIC(sv);
2617}
2618
79072805 2619SV *
8ac85365 2620newSV(STRLEN len)
79072805
LW
2621{
2622 register SV *sv;
2623
4561caa4 2624 new_SV(sv);
79072805
LW
2625 if (len) {
2626 sv_upgrade(sv, SVt_PV);
2627 SvGROW(sv, len + 1);
2628 }
2629 return sv;
2630}
2631
1edc1566 2632/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2633
79072805 2634void
08105a92 2635sv_magic(register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
2636{
2637 MAGIC* mg;
2638
0f15f207
MB
2639 if (SvREADONLY(sv)) {
2640 dTHR;
3280af22 2641 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
22c35a8c 2642 croak(PL_no_modify);
0f15f207 2643 }
4633a7c4 2644 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
2645 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2646 if (how == 't')
565764a8 2647 mg->mg_len |= 1;
463ee0b2 2648 return;
748a9306 2649 }
463ee0b2
LW
2650 }
2651 else {
c6f8c383 2652 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 2653 }
79072805
LW
2654 Newz(702,mg, 1, MAGIC);
2655 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 2656
79072805 2657 SvMAGIC(sv) = mg;
c277df42 2658 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 2659 mg->mg_obj = obj;
85e6fe83 2660 else {
11343788 2661 dTHR;
8990e307 2662 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
2663 mg->mg_flags |= MGf_REFCOUNTED;
2664 }
79072805 2665 mg->mg_type = how;
565764a8 2666 mg->mg_len = namlen;
1edc1566 2667 if (name)
2668 if (namlen >= 0)
2669 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 2670 else if (namlen == HEf_SVKEY)
1edc1566 2671 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2672
79072805
LW
2673 switch (how) {
2674 case 0:
22c35a8c 2675 mg->mg_virtual = &PL_vtbl_sv;
79072805 2676 break;
a0d0e21e 2677 case 'A':
22c35a8c 2678 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
2679 break;
2680 case 'a':
22c35a8c 2681 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
2682 break;
2683 case 'c':
2684 mg->mg_virtual = 0;
2685 break;
79072805 2686 case 'B':
22c35a8c 2687 mg->mg_virtual = &PL_vtbl_bm;
79072805 2688 break;
6cef1e77 2689 case 'D':
22c35a8c 2690 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
2691 break;
2692 case 'd':
22c35a8c 2693 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 2694 break;
79072805 2695 case 'E':
22c35a8c 2696 mg->mg_virtual = &PL_vtbl_env;
79072805 2697 break;
55497cff 2698 case 'f':
22c35a8c 2699 mg->mg_virtual = &PL_vtbl_fm;
55497cff 2700 break;
79072805 2701 case 'e':
22c35a8c 2702 mg->mg_virtual = &PL_vtbl_envelem;
79072805 2703 break;
93a17b20 2704 case 'g':
22c35a8c 2705 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 2706 break;
463ee0b2 2707 case 'I':
22c35a8c 2708 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
2709 break;
2710 case 'i':
22c35a8c 2711 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 2712 break;
16660edb 2713 case 'k':
22c35a8c 2714 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 2715 break;
79072805 2716 case 'L':
a0d0e21e 2717 SvRMAGICAL_on(sv);
93a17b20
LW
2718 mg->mg_virtual = 0;
2719 break;
2720 case 'l':
22c35a8c 2721 mg->mg_virtual = &PL_vtbl_dbline;
79072805 2722 break;
f93b4edd
MB
2723#ifdef USE_THREADS
2724 case 'm':
22c35a8c 2725 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
2726 break;
2727#endif /* USE_THREADS */
36477c24 2728#ifdef USE_LOCALE_COLLATE
bbce6d69 2729 case 'o':
22c35a8c 2730 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 2731 break;
36477c24 2732#endif /* USE_LOCALE_COLLATE */
463ee0b2 2733 case 'P':
22c35a8c 2734 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
2735 break;
2736 case 'p':
a0d0e21e 2737 case 'q':
22c35a8c 2738 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 2739 break;
c277df42 2740 case 'r':
22c35a8c 2741 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 2742 break;
79072805 2743 case 'S':
22c35a8c 2744 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
2745 break;
2746 case 's':
22c35a8c 2747 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 2748 break;
463ee0b2 2749 case 't':
22c35a8c 2750 mg->mg_virtual = &PL_vtbl_taint;
565764a8 2751 mg->mg_len = 1;
463ee0b2 2752 break;
79072805 2753 case 'U':
22c35a8c 2754 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
2755 break;
2756 case 'v':
22c35a8c 2757 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
2758 break;
2759 case 'x':
22c35a8c 2760 mg->mg_virtual = &PL_vtbl_substr;
79072805 2761 break;
5f05dabc 2762 case 'y':
22c35a8c 2763 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 2764 break;
79072805 2765 case '*':
22c35a8c 2766 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
2767 break;
2768 case '#':
22c35a8c 2769 mg->mg_virtual = &PL_vtbl_arylen;
79072805 2770 break;
a0d0e21e 2771 case '.':
22c35a8c 2772 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 2773 break;
810b8aa5
GS
2774 case '<':
2775 mg->mg_virtual = &PL_vtbl_backref;
2776 break;
4633a7c4
LW
2777 case '~': /* Reserved for use by extensions not perl internals. */
2778 /* Useful for attaching extension internal data to perl vars. */
2779 /* Note that multiple extensions may clash if magical scalars */
2780 /* etc holding private data from one are passed to another. */
2781 SvRMAGICAL_on(sv);
a0d0e21e 2782 break;
79072805 2783 default:
463ee0b2
LW
2784 croak("Don't know how to handle magic of type '%c'", how);
2785 }
8990e307
LW
2786 mg_magical(sv);
2787 if (SvGMAGICAL(sv))
2788 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
2789}
2790
2791int
8ac85365 2792sv_unmagic(SV *sv, int type)
463ee0b2
LW
2793{
2794 MAGIC* mg;
2795 MAGIC** mgp;
91bba347 2796 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
2797 return 0;
2798 mgp = &SvMAGIC(sv);
2799 for (mg = *mgp; mg; mg = *mgp) {
2800 if (mg->mg_type == type) {
2801 MGVTBL* vtbl = mg->mg_virtual;
2802 *mgp = mg->mg_moremagic;
76e3520e
GS
2803 if (vtbl && (vtbl->svt_free != NULL))
2804 (VTBL->svt_free)(sv, mg);
463ee0b2 2805 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 2806 if (mg->mg_len >= 0)
1edc1566 2807 Safefree(mg->mg_ptr);
565764a8 2808 else if (mg->mg_len == HEf_SVKEY)
1edc1566 2809 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
2810 if (mg->mg_flags & MGf_REFCOUNTED)
2811 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
2812 Safefree(mg);
2813 }
2814 else
2815 mgp = &mg->mg_moremagic;
79072805 2816 }
91bba347 2817 if (!SvMAGIC(sv)) {
463ee0b2 2818 SvMAGICAL_off(sv);
8990e307 2819 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
2820 }
2821
2822 return 0;
79072805
LW
2823}
2824
810b8aa5
GS
2825SV *
2826sv_rvweaken(SV *sv)
2827{
2828 SV *tsv;
2829 if (!SvOK(sv)) /* let undefs pass */
2830 return sv;
2831 if (!SvROK(sv))
2832 croak("Can't weaken a nonreference");
2833 else if (SvWEAKREF(sv)) {
2834 dTHR;
2835 if (ckWARN(WARN_MISC))
2836 warner(WARN_MISC, "Reference is already weak");
2837 return sv;
2838 }
2839 tsv = SvRV(sv);
2840 sv_add_backref(tsv, sv);
2841 SvWEAKREF_on(sv);
2842 SvREFCNT_dec(tsv);
2843 return sv;
2844}
2845
2846STATIC void
2847sv_add_backref(SV *tsv, SV *sv)
2848{
2849 AV *av;
2850 MAGIC *mg;
2851 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
2852 av = (AV*)mg->mg_obj;
2853 else {
2854 av = newAV();
2855 sv_magic(tsv, (SV*)av, '<', NULL, 0);
2856 SvREFCNT_dec(av); /* for sv_magic */
2857 }
2858 av_push(av,sv);
2859}
2860
2861STATIC void
2862sv_del_backref(SV *sv)
2863{
2864 AV *av;
2865 SV **svp;
2866 I32 i;
2867 SV *tsv = SvRV(sv);
2868 MAGIC *mg;
2869 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
2870 croak("panic: del_backref");
2871 av = (AV *)mg->mg_obj;
2872 svp = AvARRAY(av);
2873 i = AvFILLp(av);
2874 while (i >= 0) {
2875 if (svp[i] == sv) {
2876 svp[i] = &PL_sv_undef; /* XXX */
2877 }
2878 i--;
2879 }
2880}
2881
79072805 2882void
8ac85365 2883sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
2884{
2885 register char *big;
2886 register char *mid;
2887 register char *midend;
2888 register char *bigend;
2889 register I32 i;
6ff81951
GS
2890 STRLEN curlen;
2891
79072805 2892
8990e307
LW
2893 if (!bigstr)
2894 croak("Can't modify non-existent substring");
6ff81951
GS
2895 SvPV_force(bigstr, curlen);
2896 if (offset + len > curlen) {
2897 SvGROW(bigstr, offset+len+1);
2898 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2899 SvCUR_set(bigstr, offset+len);
2900 }
79072805
LW
2901
2902 i = littlelen - len;
2903 if (i > 0) { /* string might grow */
a0d0e21e 2904 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
2905 mid = big + offset + len;
2906 midend = bigend = big + SvCUR(bigstr);
2907 bigend += i;
2908 *bigend = '\0';
2909 while (midend > mid) /* shove everything down */
2910 *--bigend = *--midend;
2911 Move(little,big+offset,littlelen,char);
2912 SvCUR(bigstr) += i;
2913 SvSETMAGIC(bigstr);
2914 return;
2915 }
2916 else if (i == 0) {
463ee0b2 2917 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
2918 SvSETMAGIC(bigstr);
2919 return;
2920 }
2921
463ee0b2 2922 big = SvPVX(bigstr);
79072805
LW
2923 mid = big + offset;
2924 midend = mid + len;
2925 bigend = big + SvCUR(bigstr);
2926
2927 if (midend > bigend)
463ee0b2 2928 croak("panic: sv_insert");
79072805
LW
2929
2930 if (mid - big > bigend - midend) { /* faster to shorten from end */
2931 if (littlelen) {
2932 Move(little, mid, littlelen,char);
2933 mid += littlelen;
2934 }
2935 i = bigend - midend;
2936 if (i > 0) {
2937 Move(midend, mid, i,char);
2938 mid += i;
2939 }
2940 *mid = '\0';
2941 SvCUR_set(bigstr, mid - big);
2942 }
2943 /*SUPPRESS 560*/
2944 else if (i = mid - big) { /* faster from front */
2945 midend -= littlelen;
2946 mid = midend;
2947 sv_chop(bigstr,midend-i);
2948 big += i;
2949 while (i--)
2950 *--midend = *--big;
2951 if (littlelen)
2952 Move(little, mid, littlelen,char);
2953 }
2954 else if (littlelen) {
2955 midend -= littlelen;
2956 sv_chop(bigstr,midend);
2957 Move(little,midend,littlelen,char);
2958 }
2959 else {
2960 sv_chop(bigstr,midend);
2961 }
2962 SvSETMAGIC(bigstr);
2963}
2964
2965/* make sv point to what nstr did */
2966
2967void
8ac85365 2968sv_replace(register SV *sv, register SV *nsv)
79072805
LW
2969{
2970 U32 refcnt = SvREFCNT(sv);
2213622d 2971 SV_CHECK_THINKFIRST(sv);
79072805
LW
2972 if (SvREFCNT(nsv) != 1)
2973 warn("Reference miscount in sv_replace()");
93a17b20 2974 if (SvMAGICAL(sv)) {
a0d0e21e
LW
2975 if (SvMAGICAL(nsv))
2976 mg_free(nsv);
2977 else
2978 sv_upgrade(nsv, SVt_PVMG);
93a17b20 2979 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 2980 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
2981 SvMAGICAL_off(sv);
2982 SvMAGIC(sv) = 0;
2983 }
79072805
LW
2984 SvREFCNT(sv) = 0;
2985 sv_clear(sv);
477f5d66 2986 assert(!SvREFCNT(sv));
79072805
LW
2987 StructCopy(nsv,sv,SV);
2988 SvREFCNT(sv) = refcnt;
1edc1566 2989 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 2990 del_SV(nsv);
79072805
LW
2991}
2992
2993void
8ac85365 2994sv_clear(register SV *sv)
79072805 2995{
ec12f114 2996 HV* stash;
79072805
LW
2997 assert(sv);
2998 assert(SvREFCNT(sv) == 0);
2999
ed6116ce 3000 if (SvOBJECT(sv)) {
e858de61 3001 dTHR;
3280af22 3002 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 3003 djSP;
8ebc5c01 3004 GV* destructor;
837485b6 3005 SV tmpref;
a0d0e21e 3006
837485b6
GS
3007 Zero(&tmpref, 1, SV);
3008 sv_upgrade(&tmpref, SVt_RV);
3009 SvROK_on(&tmpref);
3010 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
3011 SvREFCNT(&tmpref) = 1;
8ebc5c01 3012
4e8e7886
GS
3013 do {
3014 stash = SvSTASH(sv);
3015 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3016 if (destructor) {
3017 ENTER;
e788e7d3 3018 PUSHSTACKi(PERLSI_DESTROY);
837485b6 3019 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
3020 EXTEND(SP, 2);
3021 PUSHMARK(SP);
837485b6 3022 PUSHs(&tmpref);
4e8e7886
GS
3023 PUTBACK;
3024 perl_call_sv((SV*)GvCV(destructor),
3025 G_DISCARD|G_EVAL|G_KEEPERR);
3026 SvREFCNT(sv)--;
d3acc0f7 3027 POPSTACK;
3095d977 3028 SPAGAIN;
4e8e7886
GS
3029 LEAVE;
3030 }
3031 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 3032
837485b6 3033 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
3034
3035 if (SvREFCNT(sv)) {
3036 if (PL_in_clean_objs)
3037 croak("DESTROY created new reference to dead object '%s'",
3038 HvNAME(stash));
3039 /* DESTROY gave object new lease on life */
3040 return;
3041 }
a0d0e21e 3042 }
4e8e7886 3043
a0d0e21e 3044 if (SvOBJECT(sv)) {
4e8e7886 3045 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
3046 SvOBJECT_off(sv); /* Curse the object. */
3047 if (SvTYPE(sv) != SVt_PVIO)
3280af22 3048 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 3049 }
463ee0b2 3050 }
c07a80fd 3051 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 3052 mg_free(sv);
ec12f114 3053 stash = NULL;
79072805 3054 switch (SvTYPE(sv)) {
8990e307 3055 case SVt_PVIO:
df0bd2f4
GS
3056 if (IoIFP(sv) &&
3057 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 3058 IoIFP(sv) != PerlIO_stdout() &&
3059 IoIFP(sv) != PerlIO_stderr())
93578b34 3060 {
5f05dabc 3061 io_close((IO*)sv);
93578b34 3062 }
1236053a
GS
3063 if (IoDIRP(sv)) {
3064 PerlDir_close(IoDIRP(sv));
3065 IoDIRP(sv) = 0;
93578b34 3066 }
8990e307
LW
3067 Safefree(IoTOP_NAME(sv));
3068 Safefree(IoFMT_NAME(sv));
3069 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 3070 /* FALL THROUGH */
79072805 3071 case SVt_PVBM:
a0d0e21e 3072 goto freescalar;
79072805 3073 case SVt_PVCV:
748a9306 3074 case SVt_PVFM:
85e6fe83 3075 cv_undef((CV*)sv);
a0d0e21e 3076 goto freescalar;
79072805 3077 case SVt_PVHV:
85e6fe83 3078 hv_undef((HV*)sv);
a0d0e21e 3079 break;
79072805 3080 case SVt_PVAV:
85e6fe83 3081 av_undef((AV*)sv);
a0d0e21e 3082 break;
02270b4e
GS
3083 case SVt_PVLV:
3084 SvREFCNT_dec(LvTARG(sv));
3085 goto freescalar;
a0d0e21e 3086 case SVt_PVGV:
1edc1566 3087 gp_free((GV*)sv);
a0d0e21e 3088 Safefree(GvNAME(sv));
ec12f114
JPC
3089 /* cannot decrease stash refcount yet, as we might recursively delete
3090 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3091 of stash until current sv is completely gone.
3092 -- JohnPC, 27 Mar 1998 */
3093 stash = GvSTASH(sv);
a0d0e21e 3094 /* FALL THROUGH */
79072805 3095 case SVt_PVMG:
79072805
LW
3096 case SVt_PVNV:
3097 case SVt_PVIV:
a0d0e21e
LW
3098 freescalar:
3099 (void)SvOOK_off(sv);
79072805
LW
3100 /* FALL THROUGH */
3101 case SVt_PV:
a0d0e21e 3102 case SVt_RV:
810b8aa5
GS
3103 if (SvROK(sv)) {
3104 if (SvWEAKREF(sv))
3105 sv_del_backref(sv);
3106 else
3107 SvREFCNT_dec(SvRV(sv));
3108 }
1edc1566 3109 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 3110 Safefree(SvPVX(sv));
79072805 3111 break;
a0d0e21e 3112/*
79072805 3113 case SVt_NV:
79072805 3114 case SVt_IV:
79072805
LW
3115 case SVt_NULL:
3116 break;
a0d0e21e 3117*/
79072805
LW
3118 }
3119
3120 switch (SvTYPE(sv)) {
3121 case SVt_NULL:
3122 break;
79072805
LW
3123 case SVt_IV:
3124 del_XIV(SvANY(sv));
3125 break;
3126 case SVt_NV:
3127 del_XNV(SvANY(sv));
3128 break;
ed6116ce
LW
3129 case SVt_RV:
3130 del_XRV(SvANY(sv));
3131 break;
79072805
LW
3132 case SVt_PV:
3133 del_XPV(SvANY(sv));
3134 break;
3135 case SVt_PVIV:
3136 del_XPVIV(SvANY(sv));
3137 break;
3138 case SVt_PVNV:
3139 del_XPVNV(SvANY(sv));
3140 break;
3141 case SVt_PVMG:
3142 del_XPVMG(SvANY(sv));
3143 break;
3144 case SVt_PVLV:
3145 del_XPVLV(SvANY(sv));
3146 break;
3147 case SVt_PVAV:
3148 del_XPVAV(SvANY(sv));
3149 break;
3150 case SVt_PVHV:
3151 del_XPVHV(SvANY(sv));
3152 break;
3153 case SVt_PVCV:
3154 del_XPVCV(SvANY(sv));
3155 break;
3156 case SVt_PVGV:
3157 del_XPVGV(SvANY(sv));
ec12f114
JPC
3158 /* code duplication for increased performance. */
3159 SvFLAGS(sv) &= SVf_BREAK;
3160 SvFLAGS(sv) |= SVTYPEMASK;
3161 /* decrease refcount of the stash that owns this GV, if any */
3162 if (stash)
3163 SvREFCNT_dec(stash);
3164 return; /* not break, SvFLAGS reset already happened */
79072805
LW
3165 case SVt_PVBM:
3166 del_XPVBM(SvANY(sv));
3167 break;
3168 case SVt_PVFM:
3169 del_XPVFM(SvANY(sv));
3170 break;
8990e307
LW
3171 case SVt_PVIO:
3172 del_XPVIO(SvANY(sv));
3173 break;
79072805 3174 }
a0d0e21e 3175 SvFLAGS(sv) &= SVf_BREAK;
8990e307 3176 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
3177}
3178
3179SV *
8ac85365 3180sv_newref(SV *sv)
79072805 3181{
463ee0b2 3182 if (sv)
dce16143 3183 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
3184 return sv;
3185}
3186
3187void
8ac85365 3188sv_free(SV *sv)
79072805 3189{
dce16143
MB
3190 int refcount_is_zero;
3191
79072805
LW
3192 if (!sv)
3193 return;
a0d0e21e
LW
3194 if (SvREFCNT(sv) == 0) {
3195 if (SvFLAGS(sv) & SVf_BREAK)
3196 return;
3280af22 3197 if (PL_in_clean_all) /* All is fair */
1edc1566 3198 return;
d689ffdd
JP
3199 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3200 /* make sure SvREFCNT(sv)==0 happens very seldom */
3201 SvREFCNT(sv) = (~(U32)0)/2;
3202 return;
3203 }
79072805
LW
3204 warn("Attempt to free unreferenced scalar");
3205 return;
3206 }
dce16143
MB
3207 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3208 if (!refcount_is_zero)
8990e307 3209 return;
463ee0b2
LW
3210#ifdef DEBUGGING
3211 if (SvTEMP(sv)) {
7f20e9dd 3212 warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
79072805 3213 return;
79072805 3214 }
463ee0b2 3215#endif
d689ffdd
JP
3216 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3217 /* make sure SvREFCNT(sv)==0 happens very seldom */
3218 SvREFCNT(sv) = (~(U32)0)/2;
3219 return;
3220 }
79072805 3221 sv_clear(sv);
477f5d66
CS
3222 if (! SvREFCNT(sv))
3223 del_SV(sv);
79072805
LW
3224}
3225
3226STRLEN
8ac85365 3227sv_len(register SV *sv)
79072805 3228{
748a9306 3229 char *junk;
463ee0b2 3230 STRLEN len;
79072805
LW
3231
3232 if (!sv)
3233 return 0;
3234
8990e307 3235 if (SvGMAGICAL(sv))
565764a8 3236 len = mg_length(sv);
8990e307 3237 else
748a9306 3238 junk = SvPV(sv, len);
463ee0b2 3239 return len;
79072805
LW
3240}
3241
a0ed51b3
LW
3242STRLEN
3243sv_len_utf8(register SV *sv)
3244{
dfe13c55
GS
3245 U8 *s;
3246 U8 *send;
a0ed51b3
LW
3247 STRLEN len;
3248
3249 if (!sv)
3250 return 0;
3251
3252#ifdef NOTYET
3253 if (SvGMAGICAL(sv))
3254 len = mg_length(sv);
3255 else
3256#endif
dfe13c55 3257 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3258 send = s + len;
3259 len = 0;
3260 while (s < send) {
3261 s += UTF8SKIP(s);
3262 len++;
3263 }
3264 return len;
3265}
3266
3267void
3268sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
3269{
dfe13c55
GS
3270 U8 *start;
3271 U8 *s;
3272 U8 *send;
a0ed51b3
LW
3273 I32 uoffset = *offsetp;
3274 STRLEN len;
3275
3276 if (!sv)
3277 return;
3278
dfe13c55 3279 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3280 send = s + len;
3281 while (s < send && uoffset--)
3282 s += UTF8SKIP(s);
bb40f870
GA
3283 if (s >= send)
3284 s = send;
a0ed51b3
LW
3285 *offsetp = s - start;
3286 if (lenp) {
3287 I32 ulen = *lenp;
3288 start = s;
3289 while (s < send && ulen--)
3290 s += UTF8SKIP(s);
bb40f870
GA
3291 if (s >= send)
3292 s = send;
a0ed51b3
LW
3293 *lenp = s - start;
3294 }
3295 return;
3296}
3297
3298void
3299sv_pos_b2u(register SV *sv, I32* offsetp)
3300{
dfe13c55
GS
3301 U8 *s;
3302 U8 *send;
a0ed51b3
LW
3303 STRLEN len;
3304
3305 if (!sv)
3306 return;
3307
dfe13c55 3308 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3309 if (len < *offsetp)
3310 croak("panic: bad byte offset");
3311 send = s + *offsetp;
3312 len = 0;
3313 while (s < send) {
3314 s += UTF8SKIP(s);
3315 ++len;
3316 }
3317 if (s != send) {
3318 warn("Malformed UTF-8 character");
3319 --len;
3320 }
3321 *offsetp = len;
3322 return;
3323}
3324
79072805 3325I32
8ac85365 3326sv_eq(register SV *str1, register SV *str2)
79072805
LW
3327{
3328 char *pv1;
463ee0b2 3329 STRLEN cur1;
79072805 3330 char *pv2;
463ee0b2 3331 STRLEN cur2;
79072805
LW
3332
3333 if (!str1) {
3334 pv1 = "";
3335 cur1 = 0;
3336 }
463ee0b2
LW
3337 else
3338 pv1 = SvPV(str1, cur1);
79072805
LW
3339
3340 if (!str2)
3341 return !cur1;
463ee0b2
LW
3342 else
3343 pv2 = SvPV(str2, cur2);
79072805
LW
3344
3345 if (cur1 != cur2)
3346 return 0;
3347
36477c24 3348 return memEQ(pv1, pv2, cur1);
79072805
LW
3349}
3350
3351I32
8ac85365 3352sv_cmp(register SV *str1, register SV *str2)
79072805 3353{
bbce6d69 3354 STRLEN cur1 = 0;
8ac85365 3355 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
bbce6d69 3356 STRLEN cur2 = 0;
8ac85365 3357 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
79072805 3358 I32 retval;
79072805 3359
bbce6d69 3360 if (!cur1)
3361 return cur2 ? -1 : 0;
16660edb 3362
bbce6d69 3363 if (!cur2)
3364 return 1;
79072805 3365
bbce6d69 3366 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
16660edb 3367
bbce6d69 3368 if (retval)
3369 return retval < 0 ? -1 : 1;
16660edb 3370
bbce6d69 3371 if (cur1 == cur2)
3372 return 0;
3373 else
3374 return cur1 < cur2 ? -1 : 1;
3375}
16660edb 3376
bbce6d69 3377I32
8ac85365 3378sv_cmp_locale(register SV *sv1, register SV *sv2)
bbce6d69 3379{
36477c24 3380#ifdef USE_LOCALE_COLLATE
16660edb 3381
bbce6d69 3382 char *pv1, *pv2;
3383 STRLEN len1, len2;
3384 I32 retval;
16660edb 3385
3280af22 3386 if (PL_collation_standard)
bbce6d69 3387 goto raw_compare;
16660edb 3388
bbce6d69 3389 len1 = 0;
8ac85365 3390 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 3391 len2 = 0;
8ac85365 3392 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 3393
bbce6d69 3394 if (!pv1 || !len1) {
3395 if (pv2 && len2)
3396 return -1;
3397 else
3398 goto raw_compare;
3399 }
3400 else {
3401 if (!pv2 || !len2)
3402 return 1;
3403 }
16660edb 3404
bbce6d69 3405 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 3406
bbce6d69 3407 if (retval)
16660edb 3408 return retval < 0 ? -1 : 1;
3409
bbce6d69 3410 /*
3411 * When the result of collation is equality, that doesn't mean
3412 * that there are no differences -- some locales exclude some
3413 * characters from consideration. So to avoid false equalities,
3414 * we use the raw string as a tiebreaker.
3415 */
16660edb 3416
bbce6d69 3417 raw_compare:
3418 /* FALL THROUGH */
16660edb 3419
36477c24 3420#endif /* USE_LOCALE_COLLATE */
16660edb 3421
bbce6d69 3422 return sv_cmp(sv1, sv2);
3423}
79072805 3424
36477c24 3425#ifdef USE_LOCALE_COLLATE
7a4c00b4 3426/*
3427 * Any scalar variable may carry an 'o' magic that contains the
3428 * scalar data of the variable transformed to such a format that
3429 * a normal memory comparison can be used to compare the data
3430 * according to the locale settings.
3431 */
bbce6d69 3432char *
8ac85365 3433sv_collxfrm(SV *sv, STRLEN *nxp)
bbce6d69 3434{
7a4c00b4 3435 MAGIC *mg;
16660edb 3436
8ac85365 3437 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 3438 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 3439 char *s, *xf;
3440 STRLEN len, xlen;
3441
7a4c00b4 3442 if (mg)
3443 Safefree(mg->mg_ptr);
bbce6d69 3444 s = SvPV(sv, len);
3445 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 3446 if (SvREADONLY(sv)) {
3447 SAVEFREEPV(xf);
3448 *nxp = xlen;
3280af22 3449 return xf + sizeof(PL_collation_ix);
ff0cee69 3450 }
7a4c00b4 3451 if (! mg) {
3452 sv_magic(sv, 0, 'o', 0, 0);
3453 mg = mg_find(sv, 'o');
3454 assert(mg);
bbce6d69 3455 }
7a4c00b4 3456 mg->mg_ptr = xf;
565764a8 3457 mg->mg_len = xlen;
7a4c00b4 3458 }
3459 else {
ff0cee69 3460 if (mg) {
3461 mg->mg_ptr = NULL;
565764a8 3462 mg->mg_len = -1;
ff0cee69 3463 }
bbce6d69 3464 }
3465 }
7a4c00b4 3466 if (mg && mg->mg_ptr) {
565764a8 3467 *nxp = mg->mg_len;
3280af22 3468 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 3469 }
3470 else {
3471 *nxp = 0;
3472 return NULL;
16660edb 3473 }
79072805
LW
3474}
3475
36477c24 3476#endif /* USE_LOCALE_COLLATE */
bbce6d69 3477
79072805 3478char *
76e3520e 3479sv_gets(register SV *sv, register PerlIO *fp, I32 append)
79072805 3480{
aeea060c 3481 dTHR;
c07a80fd 3482 char *rsptr;
3483 STRLEN rslen;
3484 register STDCHAR rslast;
3485 register STDCHAR *bp;
3486 register I32 cnt;
3487 I32 i;
3488
2213622d 3489 SV_CHECK_THINKFIRST(sv);
6fc92669 3490 (void)SvUPGRADE(sv, SVt_PV);
99491443 3491
ff68c719 3492 SvSCREAM_off(sv);
c07a80fd 3493
3280af22 3494 if (RsSNARF(PL_rs)) {
c07a80fd 3495 rsptr = NULL;
3496 rslen = 0;
3497 }
3280af22 3498 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
3499 I32 recsize, bytesread;
3500 char *buffer;
3501
3502 /* Grab the size of the record we're getting */
3280af22 3503 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 3504 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 3505 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
3506 /* Go yank in */
3507#ifdef VMS
3508 /* VMS wants read instead of fread, because fread doesn't respect */
3509 /* RMS record boundaries. This is not necessarily a good thing to be */
3510 /* doing, but we've got no other real choice */
3511 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3512#else
3513 bytesread = PerlIO_read(fp, buffer, recsize);
3514#endif
3515 SvCUR_set(sv, bytesread);
e670df4e 3516 buffer[bytesread] = '\0';
5b2b9c68
HM
3517 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3518 }
3280af22 3519 else if (RsPARA(PL_rs)) {
c07a80fd 3520 rsptr = "\n\n";
3521 rslen = 2;
3522 }
3523 else
3280af22 3524 rsptr = SvPV(PL_rs, rslen);
c07a80fd 3525 rslast = rslen ? rsptr[rslen - 1] : '\0';
3526
3280af22 3527 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 3528 do { /* to make sure file boundaries work right */
760ac839 3529 if (PerlIO_eof(fp))
a0d0e21e 3530 return 0;
760ac839 3531 i = PerlIO_getc(fp);
79072805 3532 if (i != '\n') {
a0d0e21e
LW
3533 if (i == -1)
3534 return 0;
760ac839 3535 PerlIO_ungetc(fp,i);
79072805
LW
3536 break;
3537 }
3538 } while (i != EOF);
3539 }
c07a80fd 3540
760ac839
LW
3541 /* See if we know enough about I/O mechanism to cheat it ! */
3542
3543 /* This used to be #ifdef test - it is made run-time test for ease
3544 of abstracting out stdio interface. One call should be cheap
3545 enough here - and may even be a macro allowing compile
3546 time optimization.
3547 */
3548
3549 if (PerlIO_fast_gets(fp)) {
3550
3551 /*
3552 * We're going to steal some values from the stdio struct
3553 * and put EVERYTHING in the innermost loop into registers.
3554 */
3555 register STDCHAR *ptr;
3556 STRLEN bpx;
3557 I32 shortbuffered;
3558
16660edb 3559#if defined(VMS) && defined(PERLIO_IS_STDIO)
3560 /* An ungetc()d char is handled separately from the regular
3561 * buffer, so we getc() it back out and stuff it in the buffer.
3562 */
3563 i = PerlIO_getc(fp);
3564 if (i == EOF) return 0;
3565 *(--((*fp)->_ptr)) = (unsigned char) i;
3566 (*fp)->_cnt++;
3567#endif
c07a80fd 3568
c2960299 3569 /* Here is some breathtakingly efficient cheating */
c07a80fd 3570
760ac839 3571 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 3572 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
3573 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3574 if (cnt > 80 && SvLEN(sv) > append) {
3575 shortbuffered = cnt - SvLEN(sv) + append + 1;
3576 cnt -= shortbuffered;
3577 }
3578 else {
3579 shortbuffered = 0;
bbce6d69 3580 /* remember that cnt can be negative */
3581 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
3582 }
3583 }
3584 else
3585 shortbuffered = 0;
c07a80fd 3586 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
760ac839 3587 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 3588 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3589 "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
16660edb 3590 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3591 "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3592 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3593 (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
3594 for (;;) {
3595 screamer:
93a17b20 3596 if (cnt > 0) {
c07a80fd 3597 if (rslen) {
760ac839
LW
3598 while (cnt > 0) { /* this | eat */
3599 cnt--;
c07a80fd 3600 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3601 goto thats_all_folks; /* screams | sed :-) */
3602 }
3603 }
3604 else {
36477c24 3605 Copy(ptr, bp, cnt, char); /* this | eat */
c07a80fd 3606 bp += cnt; /* screams | dust */
3607 ptr += cnt; /* louder | sed :-) */
a5f75d66 3608 cnt = 0;
93a17b20 3609 }
79072805
LW
3610 }
3611
748a9306 3612 if (shortbuffered) { /* oh well, must extend */
79072805
LW
3613 cnt = shortbuffered;
3614 shortbuffered = 0;
c07a80fd 3615 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3616 SvCUR_set(sv, bpx);
3617 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 3618 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
3619 continue;
3620 }
3621
16660edb 3622 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3623 "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3624 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 3625 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3626 "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3627 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3628 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
16660edb 3629 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 3630 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3631 another abstraction. */
760ac839 3632 i = PerlIO_getc(fp); /* get more characters */
16660edb 3633 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3634 "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3635 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3636 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
760ac839
LW
3637 cnt = PerlIO_get_cnt(fp);
3638 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 3639 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3640 "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
79072805 3641
748a9306
LW
3642 if (i == EOF) /* all done for ever? */
3643 goto thats_really_all_folks;
3644
c07a80fd 3645 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3646 SvCUR_set(sv, bpx);
3647 SvGROW(sv, bpx + cnt + 2);
c07a80fd 3648 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3649
760ac839 3650 *bp++ = i; /* store character from PerlIO_getc */
79072805 3651
c07a80fd 3652 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 3653 goto thats_all_folks;
79072805
LW
3654 }
3655
3656thats_all_folks:
c07a80fd 3657 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 3658 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 3659 goto screamer; /* go back to the fray */
79072805
LW
3660thats_really_all_folks:
3661 if (shortbuffered)
3662 cnt += shortbuffered;
16660edb 3663 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3664 "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3665 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 3666 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3667 "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3668 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3669 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 3670 *bp = '\0';
760ac839 3671 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 3672 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 3673 "Screamer: done, len=%ld, string=|%.*s|\n",
3674 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
3675 }
3676 else
79072805 3677 {
760ac839 3678 /*The big, slow, and stupid way */
c07a80fd 3679 STDCHAR buf[8192];
79072805 3680
760ac839 3681screamer2:
c07a80fd 3682 if (rslen) {
760ac839
LW
3683 register STDCHAR *bpe = buf + sizeof(buf);
3684 bp = buf;
3685 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3686 ; /* keep reading */
3687 cnt = bp - buf;
c07a80fd 3688 }
3689 else {
760ac839 3690 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 3691 /* Accomodate broken VAXC compiler, which applies U8 cast to
3692 * both args of ?: operator, causing EOF to change into 255
3693 */
3694 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 3695 }
79072805
LW
3696
3697 if (append)
760ac839 3698 sv_catpvn(sv, (char *) buf, cnt);
79072805 3699 else
760ac839 3700 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 3701
3702 if (i != EOF && /* joy */
3703 (!rslen ||
3704 SvCUR(sv) < rslen ||
36477c24 3705 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
3706 {
3707 append = -1;
63e4d877
CS
3708 /*
3709 * If we're reading from a TTY and we get a short read,
3710 * indicating that the user hit his EOF character, we need
3711 * to notice it now, because if we try to read from the TTY
3712 * again, the EOF condition will disappear.
3713 *
3714 * The comparison of cnt to sizeof(buf) is an optimization
3715 * that prevents unnecessary calls to feof().
3716 *
3717 * - jik 9/25/96
3718 */
3719 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3720 goto screamer2;
79072805
LW
3721 }
3722 }
3723
3280af22 3724 if (RsPARA(PL_rs)) { /* have to do this both before and after */
c07a80fd 3725 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 3726 i = PerlIO_getc(fp);
79072805 3727 if (i != '\n') {
760ac839 3728 PerlIO_ungetc(fp,i);
79072805
LW
3729 break;
3730 }
3731 }
3732 }
c07a80fd 3733
a868473f
NIS
3734#ifdef WIN32
3735 win32_strip_return(sv);
3736#endif
3737
c07a80fd 3738 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
3739}
3740
760ac839 3741
79072805 3742void
8ac85365 3743sv_inc(register SV *sv)
79072805
LW
3744{
3745 register char *d;
463ee0b2 3746 int flags;
79072805
LW
3747
3748 if (!sv)
3749 return;
b23a5f78
GB
3750 if (SvGMAGICAL(sv))
3751 mg_get(sv);
ed6116ce 3752 if (SvTHINKFIRST(sv)) {
0f15f207
MB
3753 if (SvREADONLY(sv)) {
3754 dTHR;
3280af22 3755 if (PL_curcop != &PL_compiling)
22c35a8c 3756 croak(PL_no_modify);
0f15f207 3757 }
a0d0e21e 3758 if (SvROK(sv)) {
b5be31e9 3759 IV i;
9e7bc3e8
JD
3760 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
3761 return;
b5be31e9
SM
3762 i = (IV)SvRV(sv);
3763 sv_unref(sv);
3764 sv_setiv(sv, i);
a0d0e21e 3765 }
ed6116ce 3766 }
8990e307 3767 flags = SvFLAGS(sv);
8990e307 3768 if (flags & SVp_NOK) {
a0d0e21e 3769 (void)SvNOK_only(sv);
55497cff 3770 SvNVX(sv) += 1.0;
3771 return;
3772 }
3773 if (flags & SVp_IOK) {
25da4f38
IZ
3774 if (SvIsUV(sv)) {
3775 if (SvUVX(sv) == UV_MAX)
3776 sv_setnv(sv, (double)UV_MAX + 1.0);
3777 else
3778 (void)SvIOK_only_UV(sv);
3779 ++SvUVX(sv);
3780 } else {
3781 if (SvIVX(sv) == IV_MAX)
3782 sv_setnv(sv, (double)IV_MAX + 1.0);
3783 else {
3784 (void)SvIOK_only(sv);
3785 ++SvIVX(sv);
3786 }
55497cff 3787 }
79072805
LW
3788 return;
3789 }
8990e307 3790 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
4633a7c4
LW
3791 if ((flags & SVTYPEMASK) < SVt_PVNV)
3792 sv_upgrade(sv, SVt_NV);
463ee0b2 3793 SvNVX(sv) = 1.0;
a0d0e21e 3794 (void)SvNOK_only(sv);
79072805
LW
3795 return;
3796 }
463ee0b2 3797 d = SvPVX(sv);
79072805
LW
3798 while (isALPHA(*d)) d++;
3799 while (isDIGIT(*d)) d++;
3800 if (*d) {
36477c24 3801 SET_NUMERIC_STANDARD();
bbce6d69 3802 sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
79072805
LW
3803 return;
3804 }
3805 d--;
463ee0b2 3806 while (d >= SvPVX(sv)) {
79072805
LW
3807 if (isDIGIT(*d)) {
3808 if (++*d <= '9')
3809 return;
3810 *(d--) = '0';
3811 }
3812 else {
9d116dd7
JH
3813#ifdef EBCDIC
3814 /* MKS: The original code here died if letters weren't consecutive.
3815 * at least it didn't have to worry about non-C locales. The
3816 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3817 * arranged in order (although not consecutively) and that only
3818 * [A-Za-z] are accepted by isALPHA in the C locale.
3819 */
3820 if (*d != 'z' && *d != 'Z') {
3821 do { ++*d; } while (!isALPHA(*d));
3822 return;
3823 }
3824 *(d--) -= 'z' - 'a';
3825#else
79072805
LW
3826 ++*d;
3827 if (isALPHA(*d))
3828 return;
3829 *(d--) -= 'z' - 'a' + 1;
9d116dd7 3830#endif
79072805
LW
3831 }
3832 }
3833 /* oh,oh, the number grew */
3834 SvGROW(sv, SvCUR(sv) + 2);
3835 SvCUR(sv)++;
463ee0b2 3836 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
3837 *d = d[-1];
3838 if (isDIGIT(d[1]))
3839 *d = '1';
3840 else
3841 *d = d[1];
3842}
3843
3844void
8ac85365 3845sv_dec(register SV *sv)
79072805 3846{
463ee0b2
LW
3847 int flags;
3848
79072805
LW
3849 if (!sv)
3850 return;
b23a5f78
GB
3851 if (SvGMAGICAL(sv))
3852 mg_get(sv);
ed6116ce 3853 if (SvTHINKFIRST(sv)) {
0f15f207
MB
3854 if (SvREADONLY(sv)) {
3855 dTHR;
3280af22 3856 if (PL_curcop != &PL_compiling)
22c35a8c 3857 croak(PL_no_modify);
0f15f207 3858 }
a0d0e21e 3859 if (SvROK(sv)) {
b5be31e9 3860 IV i;
9e7bc3e8
JD
3861 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
3862 return;
b5be31e9
SM
3863 i = (IV)SvRV(sv);
3864 sv_unref(sv);
3865 sv_setiv(sv, i);
a0d0e21e 3866 }
ed6116ce 3867 }
8990e307 3868 flags = SvFLAGS(sv);
8990e307 3869 if (flags & SVp_NOK) {
463ee0b2 3870 SvNVX(sv) -= 1.0;
a0d0e21e 3871 (void)SvNOK_only(sv);
79072805
LW
3872 return;
3873 }
55497cff 3874 if (flags & SVp_IOK) {
25da4f38
IZ
3875 if (SvIsUV(sv)) {
3876 if (SvUVX(sv) == 0) {
3877 (void)SvIOK_only(sv);
3878 SvIVX(sv) = -1;
3879 }
3880 else {
3881 (void)SvIOK_only_UV(sv);
3882 --SvUVX(sv);
3883 }
3884 } else {
3885 if (SvIVX(sv) == IV_MIN)
3886 sv_setnv(sv, (double)IV_MIN - 1.0);
3887 else {
3888 (void)SvIOK_only(sv);
3889 --SvIVX(sv);
3890 }
55497cff 3891 }
3892 return;
3893 }
8990e307 3894 if (!(flags & SVp_POK)) {
4633a7c4
LW
3895 if ((flags & SVTYPEMASK) < SVt_PVNV)
3896 sv_upgrade(sv, SVt_NV);
463ee0b2 3897 SvNVX(sv) = -1.0;
a0d0e21e 3898 (void)SvNOK_only(sv);
79072805
LW
3899 return;
3900 }
36477c24 3901 SET_NUMERIC_STANDARD();
bbce6d69 3902 sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
3903}
3904
3905/* Make a string that will exist for the duration of the expression
3906 * evaluation. Actually, it may have to last longer than that, but
3907 * hopefully we won't free it until it has been assigned to a
3908 * permanent location. */
3909
3910SV *
8ac85365 3911sv_mortalcopy(SV *oldstr)
79072805 3912{
11343788 3913 dTHR;
463ee0b2 3914 register SV *sv;
79072805 3915
4561caa4 3916 new_SV(sv);
79072805 3917 sv_setsv(sv,oldstr);
677b06e3
GS
3918 EXTEND_MORTAL(1);
3919 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
3920 SvTEMP_on(sv);
3921 return sv;
3922}
3923
3924SV *
8ac85365 3925sv_newmortal(void)
8990e307 3926{
11343788 3927 dTHR;
8990e307
LW
3928 register SV *sv;
3929
4561caa4 3930 new_SV(sv);
8990e307 3931 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
3932 EXTEND_MORTAL(1);
3933 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
3934 return sv;
3935}
3936
3937/* same thing without the copying */
3938
3939SV *
8ac85365 3940sv_2mortal(register SV *sv)
79072805 3941{
11343788 3942 dTHR;
79072805
LW
3943 if (!sv)
3944 return sv;
d689ffdd 3945 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 3946 return sv;
677b06e3
GS
3947 EXTEND_MORTAL(1);
3948 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 3949 SvTEMP_on(sv);
79072805
LW
3950 return sv;
3951}
3952
3953SV *
08105a92 3954newSVpv(const char *s, STRLEN len)
79072805 3955{
463ee0b2 3956 register SV *sv;
79072805 3957
4561caa4 3958 new_SV(sv);
79072805
LW
3959 if (!len)
3960 len = strlen(s);
3961 sv_setpvn(sv,s,len);
3962 return sv;
3963}
3964
9da1e3b5 3965SV *
08105a92 3966newSVpvn(const char *s, STRLEN len)
9da1e3b5
MUN
3967{
3968 register SV *sv;
3969
3970 new_SV(sv);
9da1e3b5
MUN
3971 sv_setpvn(sv,s,len);
3972 return sv;
3973}
3974
46fc3d4c 3975SV *
3976newSVpvf(const char* pat, ...)
46fc3d4c 3977{
3978 register SV *sv;
3979 va_list args;
3980
3981 new_SV(sv);
46fc3d4c 3982 va_start(args, pat);
fc36a67e 3983 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 3984 va_end(args);
3985 return sv;
3986}
3987
3988
79072805 3989SV *
8ac85365 3990newSVnv(double n)
79072805 3991{
463ee0b2 3992 register SV *sv;
79072805 3993
4561caa4 3994 new_SV(sv);
79072805
LW
3995 sv_setnv(sv,n);
3996 return sv;
3997}
3998
3999SV *
8ac85365 4000newSViv(IV i)
79072805 4001{
463ee0b2 4002 register SV *sv;
79072805 4003
4561caa4 4004 new_SV(sv);
79072805
LW
4005 sv_setiv(sv,i);
4006 return sv;
4007}
4008
2304df62 4009SV *
d689ffdd 4010newRV_noinc(SV *tmpRef)
2304df62 4011{
11343788 4012 dTHR;
2304df62
AD
4013 register SV *sv;
4014
4561caa4 4015 new_SV(sv);
2304df62 4016 sv_upgrade(sv, SVt_RV);
76e3520e 4017 SvTEMP_off(tmpRef);
d689ffdd 4018 SvRV(sv) = tmpRef;
2304df62 4019 SvROK_on(sv);
2304df62
AD
4020 return sv;
4021}
4022
5f05dabc 4023SV *
d689ffdd 4024newRV(SV *tmpRef)
5f05dabc 4025{
5f6447b6 4026 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 4027}
5f05dabc 4028
79072805
LW
4029/* make an exact duplicate of old */
4030
4031SV *
8ac85365 4032newSVsv(register SV *old)
79072805 4033{
463ee0b2 4034 register SV *sv;
79072805
LW
4035
4036 if (!old)
4037 return Nullsv;
8990e307 4038 if (SvTYPE(old) == SVTYPEMASK) {
79072805
LW
4039 warn("semi-panic: attempt to dup freed string");
4040 return Nullsv;
4041 }
4561caa4 4042 new_SV(sv);
ff68c719 4043 if (SvTEMP(old)) {
4044 SvTEMP_off(old);
463ee0b2 4045 sv_setsv(sv,old);
ff68c719 4046 SvTEMP_on(old);
79072805
LW
4047 }
4048 else
463ee0b2
LW
4049 sv_setsv(sv,old);
4050 return sv;
79072805
LW
4051}
4052
4053void
8ac85365 4054sv_reset(register char *s, HV *stash)
79072805
LW
4055{
4056 register HE *entry;
4057 register GV *gv;
4058 register SV *sv;
4059 register I32 i;
4060 register PMOP *pm;
4061 register I32 max;
463ee0b2 4062 char todo[256];
79072805 4063
49d8d3a1
MB
4064 if (!stash)
4065 return;
4066
79072805
LW
4067 if (!*s) { /* reset ?? searches */
4068 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 4069 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
4070 }
4071 return;
4072 }
4073
4074 /* reset variables */
4075
4076 if (!HvARRAY(stash))
4077 return;
463ee0b2
LW
4078
4079 Zero(todo, 256, char);
79072805
LW
4080 while (*s) {
4081 i = *s;
4082 if (s[1] == '-') {
4083 s += 2;
4084 }
4085 max = *s++;
4086 for ( ; i <= max; i++) {
463ee0b2
LW
4087 todo[i] = 1;
4088 }
a0d0e21e 4089 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 4090 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
4091 entry;
4092 entry = HeNEXT(entry))
4093 {
1edc1566 4094 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 4095 continue;
1edc1566 4096 gv = (GV*)HeVAL(entry);
79072805 4097 sv = GvSV(gv);
9e35f4b3
GS
4098 if (SvTHINKFIRST(sv)) {
4099 if (!SvREADONLY(sv) && SvROK(sv))
4100 sv_unref(sv);
4101 continue;
4102 }
a0d0e21e 4103 (void)SvOK_off(sv);
79072805
LW
4104 if (SvTYPE(sv) >= SVt_PV) {
4105 SvCUR_set(sv, 0);
463ee0b2
LW
4106 if (SvPVX(sv) != Nullch)
4107 *SvPVX(sv) = '\0';
44a8e56a 4108 SvTAINT(sv);
79072805
LW
4109 }
4110 if (GvAV(gv)) {
4111 av_clear(GvAV(gv));
4112 }
44a8e56a 4113 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 4114 hv_clear(GvHV(gv));
a0d0e21e 4115#ifndef VMS /* VMS has no environ array */
3280af22 4116 if (gv == PL_envgv)
79072805 4117 environ[0] = Nullch;
a0d0e21e 4118#endif
79072805
LW
4119 }
4120 }
4121 }
4122 }
4123}
4124
46fc3d4c 4125IO*
8ac85365 4126sv_2io(SV *sv)
46fc3d4c 4127{
4128 IO* io;
4129 GV* gv;
2d8e6c8d 4130 STRLEN n_a;
46fc3d4c 4131
4132 switch (SvTYPE(sv)) {
4133 case SVt_PVIO:
4134 io = (IO*)sv;
4135 break;
4136 case SVt_PVGV:
4137 gv = (GV*)sv;
4138 io = GvIO(gv);
4139 if (!io)
4140 croak("Bad filehandle: %s", GvNAME(gv));
4141 break;
4142 default:
4143 if (!SvOK(sv))
22c35a8c 4144 croak(PL_no_usym, "filehandle");
46fc3d4c 4145 if (SvROK(sv))
4146 return sv_2io(SvRV(sv));
2d8e6c8d 4147 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
46fc3d4c 4148 if (gv)
4149 io = GvIO(gv);
4150 else
4151 io = 0;
4152 if (!io)
2d8e6c8d 4153 croak("Bad filehandle: %s", SvPV(sv,n_a));
46fc3d4c 4154 break;
4155 }
4156 return io;
4157}
4158
79072805 4159CV *
8ac85365 4160sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
4161{
4162 GV *gv;
4163 CV *cv;
2d8e6c8d 4164 STRLEN n_a;
79072805
LW
4165
4166 if (!sv)
93a17b20 4167 return *gvp = Nullgv, Nullcv;
79072805 4168 switch (SvTYPE(sv)) {
79072805
LW
4169 case SVt_PVCV:
4170 *st = CvSTASH(sv);
4171 *gvp = Nullgv;
4172 return (CV*)sv;
4173 case SVt_PVHV:
4174 case SVt_PVAV:
4175 *gvp = Nullgv;
4176 return Nullcv;
8990e307
LW
4177 case SVt_PVGV:
4178 gv = (GV*)sv;
a0d0e21e 4179 *gvp = gv;
8990e307
LW
4180 *st = GvESTASH(gv);
4181 goto fix_gv;
4182
79072805 4183 default:
a0d0e21e
LW
4184 if (SvGMAGICAL(sv))
4185 mg_get(sv);
4186 if (SvROK(sv)) {
0f4592ef 4187 dTHR;
f5284f61
IZ
4188 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
4189 tryAMAGICunDEREF(to_cv);
4190
62f274bf
GS
4191 sv = SvRV(sv);
4192 if (SvTYPE(sv) == SVt_PVCV) {
4193 cv = (CV*)sv;
4194 *gvp = Nullgv;
4195 *st = CvSTASH(cv);
4196 return cv;
4197 }
4198 else if(isGV(sv))
4199 gv = (GV*)sv;
4200 else
a0d0e21e 4201 croak("Not a subroutine reference");
a0d0e21e 4202 }
62f274bf 4203 else if (isGV(sv))
79072805
LW
4204 gv = (GV*)sv;
4205 else
2d8e6c8d 4206 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
79072805
LW
4207 *gvp = gv;
4208 if (!gv)
4209 return Nullcv;
4210 *st = GvESTASH(gv);
8990e307 4211 fix_gv:
8ebc5c01 4212 if (lref && !GvCVu(gv)) {
4633a7c4 4213 SV *tmpsv;
748a9306 4214 ENTER;
4633a7c4 4215 tmpsv = NEWSV(704,0);
16660edb 4216 gv_efullname3(tmpsv, gv, Nullch);
f6ec51f7
GS
4217 /* XXX this is probably not what they think they're getting.
4218 * It has the same effect as "sub name;", i.e. just a forward
4219 * declaration! */
774d564b 4220 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
4221 newSVOP(OP_CONST, 0, tmpsv),
4222 Nullop,
8990e307 4223 Nullop);
748a9306 4224 LEAVE;
8ebc5c01 4225 if (!GvCVu(gv))
2d8e6c8d 4226 croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
8990e307 4227 }
8ebc5c01 4228 return GvCVu(gv);
79072805
LW
4229 }
4230}
4231
79072805 4232I32
4e35701f 4233sv_true(register SV *sv)
79072805 4234{
4e35701f 4235 dTHR;
8990e307
LW
4236 if (!sv)
4237 return 0;
79072805 4238 if (SvPOK(sv)) {
4e35701f
NIS
4239 register XPV* tXpv;
4240 if ((tXpv = (XPV*)SvANY(sv)) &&
4241 (*tXpv->xpv_pv > '0' ||
4242 tXpv->xpv_cur > 1 ||
4243 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
4244 return 1;
4245 else
4246 return 0;
4247 }
4248 else {
4249 if (SvIOK(sv))
463ee0b2 4250 return SvIVX(sv) != 0;
79072805
LW
4251 else {
4252 if (SvNOK(sv))
463ee0b2 4253 return SvNVX(sv) != 0.0;
79072805 4254 else
463ee0b2 4255 return sv_2bool(sv);
79072805
LW
4256 }
4257 }
4258}
79072805 4259
ff68c719 4260IV
4e35701f 4261sv_iv(register SV *sv)
85e6fe83 4262{
25da4f38
IZ
4263 if (SvIOK(sv)) {
4264 if (SvIsUV(sv))
4265 return (IV)SvUVX(sv);
ff68c719 4266 return SvIVX(sv);
25da4f38 4267 }
ff68c719 4268 return sv_2iv(sv);
85e6fe83 4269}
85e6fe83 4270
ff68c719 4271UV
4e35701f 4272sv_uv(register SV *sv)
ff68c719 4273{
25da4f38
IZ
4274 if (SvIOK(sv)) {
4275 if (SvIsUV(sv))
4276 return SvUVX(sv);
4277 return (UV)SvIVX(sv);
4278 }
ff68c719 4279 return sv_2uv(sv);
4280}
85e6fe83 4281
ff68c719 4282double
4e35701f 4283sv_nv(register SV *sv)
79072805 4284{
ff68c719 4285 if (SvNOK(sv))
4286 return SvNVX(sv);
4287 return sv_2nv(sv);
79072805 4288}
79072805 4289
79072805 4290char *
1fa8b10d
JD
4291sv_pv(SV *sv)
4292{
4293 STRLEN n_a;
4294
4295 if (SvPOK(sv))
4296 return SvPVX(sv);
4297
4298 return sv_2pv(sv, &n_a);
4299}
4300
4301char *
8ac85365 4302sv_pvn(SV *sv, STRLEN *lp)
79072805 4303{
85e6fe83
LW
4304 if (SvPOK(sv)) {
4305 *lp = SvCUR(sv);
a0d0e21e 4306 return SvPVX(sv);
85e6fe83 4307 }
463ee0b2 4308 return sv_2pv(sv, lp);
79072805 4309}
79072805 4310
a0d0e21e 4311char *
8ac85365 4312sv_pvn_force(SV *sv, STRLEN *lp)
a0d0e21e
LW
4313{
4314 char *s;
4315
6fc92669
GS
4316 if (SvTHINKFIRST(sv) && !SvROK(sv))
4317 sv_force_normal(sv);
a0d0e21e
LW
4318
4319 if (SvPOK(sv)) {
4320 *lp = SvCUR(sv);
4321 }
4322 else {
748a9306 4323 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
6fc92669
GS
4324 dTHR;
4325 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
4326 PL_op_name[PL_op->op_type]);
a0d0e21e 4327 }
4633a7c4
LW
4328 else
4329 s = sv_2pv(sv, lp);
a0d0e21e
LW
4330 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
4331 STRLEN len = *lp;
4332
4333 if (SvROK(sv))
4334 sv_unref(sv);
4335 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
4336 SvGROW(sv, len + 1);
4337 Move(s,SvPVX(sv),len,char);
4338 SvCUR_set(sv, len);
4339 *SvEND(sv) = '\0';
4340 }
4341 if (!SvPOK(sv)) {
4342 SvPOK_on(sv); /* validate pointer */
4343 SvTAINT(sv);
760ac839 4344 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
a0d0e21e
LW
4345 (unsigned long)sv,SvPVX(sv)));
4346 }
4347 }
4348 return SvPVX(sv);
4349}
4350
4351char *
8ac85365 4352sv_reftype(SV *sv, int ob)
a0d0e21e
LW
4353{
4354 if (ob && SvOBJECT(sv))
4355 return HvNAME(SvSTASH(sv));
4356 else {
4357 switch (SvTYPE(sv)) {
4358 case SVt_NULL:
4359 case SVt_IV:
4360 case SVt_NV:
4361 case SVt_RV:
4362 case SVt_PV:
4363 case SVt_PVIV:
4364 case SVt_PVNV:
4365 case SVt_PVMG:
4366 case SVt_PVBM:
4367 if (SvROK(sv))
4368 return "REF";
4369 else
4370 return "SCALAR";
4371 case SVt_PVLV: return "LVALUE";
4372 case SVt_PVAV: return "ARRAY";
4373 case SVt_PVHV: return "HASH";
4374 case SVt_PVCV: return "CODE";
4375 case SVt_PVGV: return "GLOB";
1d2dff63 4376 case SVt_PVFM: return "FORMAT";
a0d0e21e
LW
4377 default: return "UNKNOWN";
4378 }
4379 }
4380}
4381
463ee0b2 4382int
8ac85365 4383sv_isobject(SV *sv)
85e6fe83 4384{
68dc0745 4385 if (!sv)
4386 return 0;
4387 if (SvGMAGICAL(sv))
4388 mg_get(sv);
85e6fe83
LW
4389 if (!SvROK(sv))
4390 return 0;
4391 sv = (SV*)SvRV(sv);
4392 if (!SvOBJECT(sv))
4393 return 0;
4394 return 1;
4395}
4396
4397int
08105a92 4398sv_isa(SV *sv, const char *name)
463ee0b2 4399{
68dc0745 4400 if (!sv)
4401 return 0;
4402 if (SvGMAGICAL(sv))
4403 mg_get(sv);
ed6116ce 4404 if (!SvROK(sv))
463ee0b2 4405 return 0;
ed6116ce
LW
4406 sv = (SV*)SvRV(sv);
4407 if (!SvOBJECT(sv))
463ee0b2
LW
4408 return 0;
4409
4410 return strEQ(HvNAME(SvSTASH(sv)), name);
4411}
4412
4413SV*
08105a92 4414newSVrv(SV *rv, const char *classname)
463ee0b2 4415{
11343788 4416 dTHR;
463ee0b2
LW
4417 SV *sv;
4418
4561caa4 4419 new_SV(sv);
51cf62d8 4420
2213622d 4421 SV_CHECK_THINKFIRST(rv);
51cf62d8 4422 SvAMAGIC_off(rv);
51cf62d8
OT
4423
4424 if (SvTYPE(rv) < SVt_RV)
4425 sv_upgrade(rv, SVt_RV);
4426
4427 (void)SvOK_off(rv);
053fc874 4428 SvRV(rv) = sv;
ed6116ce 4429 SvROK_on(rv);
463ee0b2 4430
a0d0e21e
LW
4431 if (classname) {
4432 HV* stash = gv_stashpv(classname, TRUE);
4433 (void)sv_bless(rv, stash);
4434 }
4435 return sv;
4436}
4437
4438SV*
08105a92 4439sv_setref_pv(SV *rv, const char *classname, void *pv)
a0d0e21e 4440{
189b2af5 4441 if (!pv) {
3280af22 4442 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
4443 SvSETMAGIC(rv);
4444 }
a0d0e21e
LW
4445 else
4446 sv_setiv(newSVrv(rv,classname), (IV)pv);
4447 return rv;
4448}
4449
4450SV*
08105a92 4451sv_setref_iv(SV *rv, const char *classname, IV iv)
a0d0e21e
LW
4452{
4453 sv_setiv(newSVrv(rv,classname), iv);
4454 return rv;
4455}
4456
4457SV*
08105a92 4458sv_setref_nv(SV *rv, const char *classname, double nv)
a0d0e21e
LW
4459{
4460 sv_setnv(newSVrv(rv,classname), nv);
4461 return rv;
4462}
463ee0b2 4463
a0d0e21e 4464SV*
e65f3abd 4465sv_setref_pvn(SV *rv, const char *classname, char *pv, STRLEN n)
a0d0e21e
LW
4466{
4467 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
4468 return rv;
4469}
4470
a0d0e21e 4471SV*
8ac85365 4472sv_bless(SV *sv, HV *stash)
a0d0e21e 4473{
11343788 4474 dTHR;
76e3520e 4475 SV *tmpRef;
a0d0e21e
LW
4476 if (!SvROK(sv))
4477 croak("Can't bless non-reference value");
76e3520e
GS
4478 tmpRef = SvRV(sv);
4479 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4480 if (SvREADONLY(tmpRef))
22c35a8c 4481 croak(PL_no_modify);
76e3520e
GS
4482 if (SvOBJECT(tmpRef)) {
4483 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 4484 --PL_sv_objcount;
76e3520e 4485 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 4486 }
a0d0e21e 4487 }
76e3520e
GS
4488 SvOBJECT_on(tmpRef);
4489 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 4490 ++PL_sv_objcount;
76e3520e
GS
4491 (void)SvUPGRADE(tmpRef, SVt_PVMG);
4492 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e 4493
2e3febc6
CS
4494 if (Gv_AMG(stash))
4495 SvAMAGIC_on(sv);
4496 else
4497 SvAMAGIC_off(sv);
a0d0e21e
LW
4498
4499 return sv;
4500}
4501
76e3520e 4502STATIC void
8ac85365 4503sv_unglob(SV *sv)
a0d0e21e
LW
4504{
4505 assert(SvTYPE(sv) == SVt_PVGV);
4506 SvFAKE_off(sv);
4507 if (GvGP(sv))
1edc1566 4508 gp_free((GV*)sv);
e826b3c7
GS
4509 if (GvSTASH(sv)) {
4510 SvREFCNT_dec(GvSTASH(sv));
4511 GvSTASH(sv) = Nullhv;
4512 }
a0d0e21e
LW
4513 sv_unmagic(sv, '*');
4514 Safefree(GvNAME(sv));
a5f75d66 4515 GvMULTI_off(sv);
a0d0e21e
LW
4516 SvFLAGS(sv) &= ~SVTYPEMASK;
4517 SvFLAGS(sv) |= SVt_PVMG;
4518}
4519
ed6116ce 4520void
8ac85365 4521sv_unref(SV *sv)
ed6116ce 4522{
a0d0e21e 4523 SV* rv = SvRV(sv);
810b8aa5
GS
4524
4525 if (SvWEAKREF(sv)) {
4526 sv_del_backref(sv);
4527 SvWEAKREF_off(sv);
4528 SvRV(sv) = 0;
4529 return;
4530 }
ed6116ce
LW
4531 SvRV(sv) = 0;
4532 SvROK_off(sv);
4633a7c4
LW
4533 if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4534 SvREFCNT_dec(rv);
8e07c86e 4535 else
4633a7c4 4536 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 4537}
8990e307 4538
bbce6d69 4539void
8ac85365 4540sv_taint(SV *sv)
bbce6d69 4541{
4542 sv_magic((sv), Nullsv, 't', Nullch, 0);
4543}
4544
4545void
8ac85365 4546sv_untaint(SV *sv)
bbce6d69 4547{
13f57bf8 4548 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 4549 MAGIC *mg = mg_find(sv, 't');
4550 if (mg)
565764a8 4551 mg->mg_len &= ~1;
36477c24 4552 }
bbce6d69 4553}
4554
4555bool
8ac85365 4556sv_tainted(SV *sv)
bbce6d69 4557{
13f57bf8 4558 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 4559 MAGIC *mg = mg_find(sv, 't');
565764a8 4560 if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
36477c24 4561 return TRUE;
4562 }
4563 return FALSE;
bbce6d69 4564}
4565
84902520 4566void
8ac85365 4567sv_setpviv(SV *sv, IV iv)
84902520 4568{
25da4f38
IZ
4569 char buf[TYPE_CHARS(UV)];
4570 char *ebuf;
4571 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
84902520 4572
25da4f38 4573 sv_setpvn(sv, ptr, ebuf - ptr);
84902520
TB
4574}
4575
ef50df4b
GS
4576
4577void
4578sv_setpviv_mg(SV *sv, IV iv)
4579{
25da4f38
IZ
4580 char buf[TYPE_CHARS(UV)];
4581 char *ebuf;
4582 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
4583
4584 sv_setpvn(sv, ptr, ebuf - ptr);
ef50df4b
GS
4585 SvSETMAGIC(sv);
4586}
4587
46fc3d4c 4588void
4589sv_setpvf(SV *sv, const char* pat, ...)
46fc3d4c 4590{
4591 va_list args;
46fc3d4c 4592 va_start(args, pat);
fc36a67e 4593 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 4594 va_end(args);
4595}
4596
ef50df4b 4597
ef50df4b
GS
4598void
4599sv_setpvf_mg(SV *sv, const char* pat, ...)
ef50df4b
GS
4600{
4601 va_list args;
ef50df4b 4602 va_start(args, pat);
ef50df4b
GS
4603 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4604 va_end(args);
4605 SvSETMAGIC(sv);
4606}
4607
46fc3d4c 4608void
4609sv_catpvf(SV *sv, const char* pat, ...)
46fc3d4c 4610{
4611 va_list args;
46fc3d4c 4612 va_start(args, pat);
fc36a67e 4613 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 4614 va_end(args);
4615}
4616
ef50df4b
GS
4617void
4618sv_catpvf_mg(SV *sv, const char* pat, ...)
ef50df4b
GS
4619{
4620 va_list args;
ef50df4b 4621 va_start(args, pat);
ef50df4b
GS
4622 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4623 va_end(args);
4624 SvSETMAGIC(sv);
4625}
4626
46fc3d4c 4627void
ad8d18a8 4628sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
46fc3d4c 4629{
4630 sv_setpvn(sv, "", 0);
4631 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4632}
4633
4634void
ad8d18a8 4635sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
46fc3d4c 4636{
e858de61 4637 dTHR;
46fc3d4c 4638 char *p;
4639 char *q;
4640 char *patend;
fc36a67e 4641 STRLEN origlen;
46fc3d4c 4642 I32 svix = 0;
c635e13b 4643 static char nullstr[] = "(null)";
46fc3d4c 4644
4645 /* no matter what, this is a string now */
fc36a67e 4646 (void)SvPV_force(sv, origlen);
46fc3d4c 4647
fc36a67e 4648 /* special-case "", "%s", and "%_" */
46fc3d4c 4649 if (patlen == 0)
4650 return;
fc36a67e 4651 if (patlen == 2 && pat[0] == '%') {
4652 switch (pat[1]) {
4653 case 's':
c635e13b 4654 if (args) {
4655 char *s = va_arg(*args, char*);
4656 sv_catpv(sv, s ? s : nullstr);
4657 }
fc36a67e 4658 else if (svix < svmax)
4659 sv_catsv(sv, *svargs);
4660 return;
4661 case '_':
4662 if (args) {
4663 sv_catsv(sv, va_arg(*args, SV*));
4664 return;
4665 }
4666 /* See comment on '_' below */
4667 break;
4668 }
46fc3d4c 4669 }
4670
4671 patend = (char*)pat + patlen;
4672 for (p = (char*)pat; p < patend; p = q) {
4673 bool alt = FALSE;
4674 bool left = FALSE;
4675 char fill = ' ';
4676 char plus = 0;
4677 char intsize = 0;
4678 STRLEN width = 0;
fc36a67e 4679 STRLEN zeros = 0;
46fc3d4c 4680 bool has_precis = FALSE;
4681 STRLEN precis = 0;
4682
4683 char esignbuf[4];
dfe13c55 4684 U8 utf8buf[10];
46fc3d4c 4685 STRLEN esignlen = 0;
4686
4687 char *eptr = Nullch;
fc36a67e 4688 STRLEN elen = 0;
4689 char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
46fc3d4c 4690 char c;
4691 int i;
4692 unsigned base;
4693 IV iv;
4694 UV uv;
4695 double nv;
4696 STRLEN have;
4697 STRLEN need;
4698 STRLEN gap;
4699
4700 for (q = p; q < patend && *q != '%'; ++q) ;
4701 if (q > p) {
4702 sv_catpvn(sv, p, q - p);
4703 p = q;
4704 }
4705 if (q++ >= patend)
4706 break;
4707
fc36a67e 4708 /* FLAGS */
4709
46fc3d4c 4710 while (*q) {
4711 switch (*q) {
4712 case ' ':
4713 case '+':
4714 plus = *q++;
4715 continue;
4716
4717 case '-':
4718 left = TRUE;
4719 q++;
4720 continue;
4721
4722 case '0':
4723 fill = *q++;
4724 continue;
4725
4726 case '#':
4727 alt = TRUE;
4728 q++;
4729 continue;
4730
fc36a67e 4731 default:
4732 break;
4733 }
4734 break;
4735 }
46fc3d4c 4736
fc36a67e 4737 /* WIDTH */
4738
4739 switch (*q) {
4740 case '1': case '2': case '3':
4741 case '4': case '5': case '6':
4742 case '7': case '8': case '9':
4743 width = 0;
4744 while (isDIGIT(*q))
4745 width = width * 10 + (*q++ - '0');
4746 break;
4747
4748 case '*':
4749 if (args)
4750 i = va_arg(*args, int);
4751 else
4752 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4753 left |= (i < 0);
4754 width = (i < 0) ? -i : i;
4755 q++;
4756 break;
4757 }
4758
4759 /* PRECISION */
46fc3d4c 4760
fc36a67e 4761 if (*q == '.') {
4762 q++;
4763 if (*q == '*') {
46fc3d4c 4764 if (args)
4765 i = va_arg(*args, int);
4766 else
4767 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
fc36a67e 4768 precis = (i < 0) ? 0 : i;
46fc3d4c 4769 q++;
fc36a67e 4770 }
4771 else {
4772 precis = 0;
4773 while (isDIGIT(*q))
4774 precis = precis * 10 + (*q++ - '0');
4775 }
4776 has_precis = TRUE;
4777 }
46fc3d4c 4778
fc36a67e 4779 /* SIZE */
46fc3d4c 4780
fc36a67e 4781 switch (*q) {
4782 case 'l':
4783#if 0 /* when quads have better support within Perl */
4784 if (*(q + 1) == 'l') {
4785 intsize = 'q';
4786 q += 2;
46fc3d4c 4787 break;
4788 }
fc36a67e 4789#endif
4790 /* FALL THROUGH */
4791 case 'h':
4792 case 'V':
4793 intsize = *q++;
46fc3d4c 4794 break;
4795 }
4796
fc36a67e 4797 /* CONVERSION */
4798
46fc3d4c 4799 switch (c = *q++) {
4800
4801 /* STRINGS */
4802
4803 case '%':
4804 eptr = q - 1;
4805 elen = 1;
4806 goto string;
4807
4808 case 'c':
a0ed51b3
LW
4809 if (IN_UTF8) {
4810 if (args)
4811 uv = va_arg(*args, int);
4812 else
4813 uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4814
dfe13c55
GS
4815 eptr = (char*)utf8buf;
4816 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
a0ed51b3
LW
4817 goto string;
4818 }
46fc3d4c 4819 if (args)
4820 c = va_arg(*args, int);
4821 else
4822 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4823 eptr = &c;
4824 elen = 1;
4825 goto string;
4826
46fc3d4c 4827 case 's':
4828 if (args) {
fc36a67e 4829 eptr = va_arg(*args, char*);
c635e13b 4830 if (eptr)
4831 elen = strlen(eptr);
4832 else {
4833 eptr = nullstr;
4834 elen = sizeof nullstr - 1;
4835 }
46fc3d4c 4836 }
a0ed51b3 4837 else if (svix < svmax) {
46fc3d4c 4838 eptr = SvPVx(svargs[svix++], elen);
a0ed51b3
LW
4839 if (IN_UTF8) {
4840 if (has_precis && precis < elen) {
4841 I32 p = precis;
4842 sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4843 precis = p;
4844 }
4845 if (width) { /* fudge width (can't fudge elen) */
4846 width += elen - sv_len_utf8(svargs[svix - 1]);
4847 }
4848 }
4849 }
46fc3d4c 4850 goto string;
4851
fc36a67e 4852 case '_':
4853 /*
4854 * The "%_" hack might have to be changed someday,
4855 * if ISO or ANSI decide to use '_' for something.
4856 * So we keep it hidden from users' code.
4857 */
4858 if (!args)
4859 goto unknown;
4860 eptr = SvPVx(va_arg(*args, SV*), elen);
4861
46fc3d4c 4862 string:
4863 if (has_precis && elen > precis)
4864 elen = precis;
4865 break;
4866
4867 /* INTEGERS */
4868
fc36a67e 4869 case 'p':
4870 if (args)
4871 uv = (UV)va_arg(*args, void*);
4872 else
4873 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4874 base = 16;
4875 goto integer;
4876
46fc3d4c 4877 case 'D':
4878 intsize = 'l';
4879 /* FALL THROUGH */
4880 case 'd':
4881 case 'i':
4882 if (args) {
4883 switch (intsize) {
4884 case 'h': iv = (short)va_arg(*args, int); break;
4885 default: iv = va_arg(*args, int); break;
4886 case 'l': iv = va_arg(*args, long); break;
fc36a67e 4887 case 'V': iv = va_arg(*args, IV); break;
46fc3d4c 4888 }
4889 }
4890 else {
4891 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4892 switch (intsize) {
4893 case 'h': iv = (short)iv; break;
4894 default: iv = (int)iv; break;
4895 case 'l': iv = (long)iv; break;
fc36a67e 4896 case 'V': break;
46fc3d4c 4897 }
4898 }
4899 if (iv >= 0) {
4900 uv = iv;
4901 if (plus)
4902 esignbuf[esignlen++] = plus;
4903 }
4904 else {
4905 uv = -iv;
4906 esignbuf[esignlen++] = '-';
4907 }
4908 base = 10;
4909 goto integer;
4910
fc36a67e 4911 case 'U':
4912 intsize = 'l';
4913 /* FALL THROUGH */
4914 case 'u':
4915 base = 10;
4916 goto uns_integer;
4917
4f19785b
WSI
4918 case 'b':
4919 base = 2;
4920 goto uns_integer;
4921
46fc3d4c 4922 case 'O':
4923 intsize = 'l';
4924 /* FALL THROUGH */
4925 case 'o':
4926 base = 8;
4927 goto uns_integer;
4928
4929 case 'X':
46fc3d4c 4930 case 'x':
4931 base = 16;
46fc3d4c 4932
4933 uns_integer:
4934 if (args) {
4935 switch (intsize) {
4936 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
4937 default: uv = va_arg(*args, unsigned); break;
4938 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 4939 case 'V': uv = va_arg(*args, UV); break;
46fc3d4c 4940 }
4941 }
4942 else {
4943 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4944 switch (intsize) {
4945 case 'h': uv = (unsigned short)uv; break;
4946 default: uv = (unsigned)uv; break;
4947 case 'l': uv = (unsigned long)uv; break;
fc36a67e 4948 case 'V': break;
46fc3d4c 4949 }
4950 }
4951
4952 integer:
46fc3d4c 4953 eptr = ebuf + sizeof ebuf;
fc36a67e 4954 switch (base) {
4955 unsigned dig;
4956 case 16:
c10ed8b9
HS
4957 if (!uv)
4958 alt = FALSE;
fc36a67e 4959 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4960 do {
4961 dig = uv & 15;
4962 *--eptr = p[dig];
4963 } while (uv >>= 4);
4964 if (alt) {
46fc3d4c 4965 esignbuf[esignlen++] = '0';
fc36a67e 4966 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 4967 }
fc36a67e 4968 break;
4969 case 8:
4970 do {
4971 dig = uv & 7;
4972 *--eptr = '0' + dig;
4973 } while (uv >>= 3);
4974 if (alt && *eptr != '0')
4975 *--eptr = '0';
4976 break;
4f19785b
WSI
4977 case 2:
4978 do {
4979 dig = uv & 1;
4980 *--eptr = '0' + dig;
4981 } while (uv >>= 1);
4982 if (alt && *eptr != '0')
4983 *--eptr = '0';
4984 break;
fc36a67e 4985 default: /* it had better be ten or less */
4986 do {
4987 dig = uv % base;
4988 *--eptr = '0' + dig;
4989 } while (uv /= base);
4990 break;
46fc3d4c 4991 }
4992 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
4993 if (has_precis) {
4994 if (precis > elen)
4995 zeros = precis - elen;
4996 else if (precis == 0 && elen == 1 && *eptr == '0')
4997 elen = 0;
4998 }
46fc3d4c 4999 break;
5000
5001 /* FLOATING POINT */
5002
fc36a67e 5003 case 'F':
5004 c = 'f'; /* maybe %F isn't supported here */
5005 /* FALL THROUGH */
46fc3d4c 5006 case 'e': case 'E':
fc36a67e 5007 case 'f':
46fc3d4c 5008 case 'g': case 'G':
5009
5010 /* This is evil, but floating point is even more evil */
5011
fc36a67e 5012 if (args)
5013 nv = va_arg(*args, double);
5014 else
5015 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
5016
5017 need = 0;
5018 if (c != 'e' && c != 'E') {
5019 i = PERL_INT_MIN;
5020 (void)frexp(nv, &i);
5021 if (i == PERL_INT_MIN)
c635e13b 5022 die("panic: frexp");
5023 if (i > 0)
fc36a67e 5024 need = BIT_DIGITS(i);
5025 }
5026 need += has_precis ? precis : 6; /* known default */
5027 if (need < width)
5028 need = width;
5029
46fc3d4c 5030 need += 20; /* fudge factor */
80252599
GS
5031 if (PL_efloatsize < need) {
5032 Safefree(PL_efloatbuf);
5033 PL_efloatsize = need + 20; /* more fudge */
5034 New(906, PL_efloatbuf, PL_efloatsize, char);
46fc3d4c 5035 }
5036
5037 eptr = ebuf + sizeof ebuf;
5038 *--eptr = '\0';
5039 *--eptr = c;
5040 if (has_precis) {
5041 base = precis;
5042 do { *--eptr = '0' + (base % 10); } while (base /= 10);
5043 *--eptr = '.';
5044 }
5045 if (width) {
5046 base = width;
5047 do { *--eptr = '0' + (base % 10); } while (base /= 10);
5048 }
5049 if (fill == '0')
5050 *--eptr = fill;
84902520
TB
5051 if (left)
5052 *--eptr = '-';
46fc3d4c 5053 if (plus)
5054 *--eptr = plus;
5055 if (alt)
5056 *--eptr = '#';
5057 *--eptr = '%';
5058
80252599 5059 (void)sprintf(PL_efloatbuf, eptr, nv);
46fc3d4c 5060
80252599
GS
5061 eptr = PL_efloatbuf;
5062 elen = strlen(PL_efloatbuf);
46fc3d4c 5063
5064#ifdef LC_NUMERIC
5065 /*
5066 * User-defined locales may include arbitrary characters.
5067 * And, unfortunately, some system may alloc the "C" locale
5068 * to be overridden by a malicious user.
5069 */
5070 if (used_locale)
5071 *used_locale = TRUE;
5072#endif /* LC_NUMERIC */
5073
5074 break;
5075
fc36a67e 5076 /* SPECIAL */
5077
5078 case 'n':
5079 i = SvCUR(sv) - origlen;
5080 if (args) {
c635e13b 5081 switch (intsize) {
5082 case 'h': *(va_arg(*args, short*)) = i; break;
5083 default: *(va_arg(*args, int*)) = i; break;
5084 case 'l': *(va_arg(*args, long*)) = i; break;
5085 case 'V': *(va_arg(*args, IV*)) = i; break;
5086 }
fc36a67e 5087 }
5088 else if (svix < svmax)
5089 sv_setuv(svargs[svix++], (UV)i);
5090 continue; /* not "break" */
5091
5092 /* UNKNOWN */
5093
46fc3d4c 5094 default:
fc36a67e 5095 unknown:
599cee73 5096 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 5097 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 5098 SV *msg = sv_newmortal();
5099 sv_setpvf(msg, "Invalid conversion in %s: ",
533c011a 5100 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
c635e13b 5101 if (c)
5102 sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
5103 c & 0xFF);
5104 else
5105 sv_catpv(msg, "end of string");
599cee73 5106 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
c635e13b 5107 }
fb73857a 5108
5109 /* output mangled stuff ... */
5110 if (c == '\0')
5111 --q;
46fc3d4c 5112 eptr = p;
5113 elen = q - p;
fb73857a 5114
5115 /* ... right here, because formatting flags should not apply */
5116 SvGROW(sv, SvCUR(sv) + elen + 1);
5117 p = SvEND(sv);
5118 memcpy(p, eptr, elen);
5119 p += elen;
5120 *p = '\0';
5121 SvCUR(sv) = p - SvPVX(sv);
5122 continue; /* not "break" */
46fc3d4c 5123 }
5124
fc36a67e 5125 have = esignlen + zeros + elen;
46fc3d4c 5126 need = (have > width ? have : width);
5127 gap = need - have;
5128
7bc39d62 5129 SvGROW(sv, SvCUR(sv) + need + 1);
46fc3d4c 5130 p = SvEND(sv);
5131 if (esignlen && fill == '0') {
5132 for (i = 0; i < esignlen; i++)
5133 *p++ = esignbuf[i];
5134 }
5135 if (gap && !left) {
5136 memset(p, fill, gap);
5137 p += gap;
5138 }
5139 if (esignlen && fill != '0') {
5140 for (i = 0; i < esignlen; i++)
5141 *p++ = esignbuf[i];
5142 }
fc36a67e 5143 if (zeros) {
5144 for (i = zeros; i; i--)
5145 *p++ = '0';
5146 }
46fc3d4c 5147 if (elen) {
5148 memcpy(p, eptr, elen);
5149 p += elen;
5150 }
5151 if (gap && left) {
5152 memset(p, ' ', gap);
5153 p += gap;
5154 }
5155 *p = '\0';
5156 SvCUR(sv) = p - SvPVX(sv);
5157 }
5158}