This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
clean up some stray "global" symbols
[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
20ce7b12
GS
45static IV asIV (SV* sv);
46static UV asUV (SV* sv);
47static SV *more_sv (void);
48static void more_xiv (void);
49static void more_xnv (void);
50static void more_xpv (void);
51static void more_xrv (void);
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);
60static void sv_unglob (SV* sv);
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
20ce7b12 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
ba106d47
GS
119STATIC void
120reg_add(SV *sv)
4561caa4 121{
3280af22 122 if (PL_sv_count >= (registry_size >> 1))
4561caa4
CS
123 {
124 SV **oldreg = registry;
00db4c45 125 I32 oldsize = registry_size;
4561caa4 126
00db4c45
GS
127 registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
128 Newz(707, registry, registry_size, SV*);
4561caa4
CS
129
130 if (oldreg) {
131 I32 i;
132
133 for (i = 0; i < oldsize; ++i) {
134 SV* oldsv = oldreg[i];
135 if (oldsv)
136 REG_ADD(oldsv);
137 }
138 Safefree(oldreg);
139 }
140 }
141
142 REG_ADD(sv);
3280af22 143 ++PL_sv_count;
4561caa4
CS
144}
145
ba106d47
GS
146STATIC void
147reg_remove(SV *sv)
4561caa4
CS
148{
149 REG_REMOVE(sv);
3280af22 150 --PL_sv_count;
4561caa4
CS
151}
152
ba106d47
GS
153STATIC void
154visit(SVFUNC f)
4561caa4
CS
155{
156 I32 i;
157
00db4c45 158 for (i = 0; i < registry_size; ++i) {
4561caa4 159 SV* sv = registry[i];
00db4c45 160 if (sv && SvTYPE(sv) != SVTYPEMASK)
4561caa4
CS
161 (*f)(sv);
162 }
163}
a0d0e21e 164
4633a7c4 165void
ba106d47 166sv_add_arena(char *ptr, U32 size, U32 flags)
4633a7c4
LW
167{
168 if (!(flags & SVf_FAKE))
6ad3d225 169 Safefree(ptr);
4633a7c4
LW
170}
171
4561caa4
CS
172#else /* ! PURIFY */
173
174/*
175 * "A time to plant, and a time to uproot what was planted..."
176 */
177
053fc874
GS
178#define plant_SV(p) \
179 STMT_START { \
180 SvANY(p) = (void *)PL_sv_root; \
181 SvFLAGS(p) = SVTYPEMASK; \
182 PL_sv_root = (p); \
183 --PL_sv_count; \
184 } STMT_END
a0d0e21e 185
fba3b22e 186/* sv_mutex must be held while calling uproot_SV() */
053fc874
GS
187#define uproot_SV(p) \
188 STMT_START { \
189 (p) = PL_sv_root; \
190 PL_sv_root = (SV*)SvANY(p); \
191 ++PL_sv_count; \
192 } STMT_END
193
194#define new_SV(p) \
195 STMT_START { \
196 LOCK_SV_MUTEX; \
197 if (PL_sv_root) \
198 uproot_SV(p); \
199 else \
200 (p) = more_sv(); \
201 UNLOCK_SV_MUTEX; \
202 SvANY(p) = 0; \
203 SvREFCNT(p) = 1; \
204 SvFLAGS(p) = 0; \
205 } STMT_END
463ee0b2 206
a0d0e21e 207#ifdef DEBUGGING
4561caa4 208
053fc874
GS
209#define del_SV(p) \
210 STMT_START { \
211 LOCK_SV_MUTEX; \
212 if (PL_debug & 32768) \
213 del_sv(p); \
214 else \
215 plant_SV(p); \
216 UNLOCK_SV_MUTEX; \
217 } STMT_END
a0d0e21e 218
76e3520e 219STATIC void
8ac85365 220del_sv(SV *p)
463ee0b2 221{
3280af22 222 if (PL_debug & 32768) {
4633a7c4 223 SV* sva;
a0d0e21e
LW
224 SV* sv;
225 SV* svend;
226 int ok = 0;
3280af22 227 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
4633a7c4
LW
228 sv = sva + 1;
229 svend = &sva[SvREFCNT(sva)];
a0d0e21e
LW
230 if (p >= sv && p < svend)
231 ok = 1;
232 }
233 if (!ok) {
234 warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
235 return;
236 }
237 }
4561caa4 238 plant_SV(p);
463ee0b2 239}
a0d0e21e 240
4561caa4
CS
241#else /* ! DEBUGGING */
242
243#define del_SV(p) plant_SV(p)
244
245#endif /* DEBUGGING */
463ee0b2 246
4633a7c4 247void
8ac85365 248sv_add_arena(char *ptr, U32 size, U32 flags)
463ee0b2 249{
4633a7c4 250 SV* sva = (SV*)ptr;
463ee0b2
LW
251 register SV* sv;
252 register SV* svend;
4633a7c4
LW
253 Zero(sva, size, char);
254
255 /* The first SV in an arena isn't an SV. */
3280af22 256 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
257 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
258 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
259
3280af22
NIS
260 PL_sv_arenaroot = sva;
261 PL_sv_root = sva + 1;
4633a7c4
LW
262
263 svend = &sva[SvREFCNT(sva) - 1];
264 sv = sva + 1;
463ee0b2 265 while (sv < svend) {
a0d0e21e 266 SvANY(sv) = (void *)(SV*)(sv + 1);
8990e307 267 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
268 sv++;
269 }
270 SvANY(sv) = 0;
4633a7c4
LW
271 SvFLAGS(sv) = SVTYPEMASK;
272}
273
fba3b22e 274/* sv_mutex must be held while calling more_sv() */
76e3520e 275STATIC SV*
8ac85365 276more_sv(void)
4633a7c4 277{
4561caa4
CS
278 register SV* sv;
279
3280af22
NIS
280 if (PL_nice_chunk) {
281 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
282 PL_nice_chunk = Nullch;
c07a80fd 283 }
1edc1566 284 else {
285 char *chunk; /* must use New here to match call to */
286 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
287 sv_add_arena(chunk, 1008, 0);
288 }
4561caa4
CS
289 uproot_SV(sv);
290 return sv;
463ee0b2
LW
291}
292
76e3520e 293STATIC void
8ac85365 294visit(SVFUNC f)
8990e307 295{
4633a7c4 296 SV* sva;
8990e307
LW
297 SV* sv;
298 register SV* svend;
299
3280af22 300 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
4633a7c4 301 svend = &sva[SvREFCNT(sva)];
4561caa4
CS
302 for (sv = sva + 1; sv < svend; ++sv) {
303 if (SvTYPE(sv) != SVTYPEMASK)
76e3520e 304 (FCALL)(sv);
8990e307
LW
305 }
306 }
307}
308
4561caa4
CS
309#endif /* PURIFY */
310
76e3520e 311STATIC void
8ac85365 312do_report_used(SV *sv)
4561caa4
CS
313{
314 if (SvTYPE(sv) != SVTYPEMASK) {
d1bf51dd 315 /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
4561caa4
CS
316 PerlIO_printf(PerlIO_stderr(), "****\n");
317 sv_dump(sv);
318 }
319}
320
8990e307 321void
8ac85365 322sv_report_used(void)
4561caa4 323{
ac4c12e7 324 visit(FUNC_NAME_TO_PTR(do_report_used));
4561caa4
CS
325}
326
76e3520e 327STATIC void
8ac85365 328do_clean_objs(SV *sv)
8990e307 329{
a0d0e21e 330 SV* rv;
8990e307 331
4561caa4 332 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
d1bf51dd 333 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
4561caa4
CS
334 SvROK_off(sv);
335 SvRV(sv) = 0;
336 SvREFCNT_dec(rv);
a5f75d66 337 }
4561caa4
CS
338
339 /* XXX Might want to check arrays, etc. */
340}
341
342#ifndef DISABLE_DESTRUCTOR_KLUDGE
76e3520e 343STATIC void
8ac85365 344do_clean_named_objs(SV *sv)
4561caa4 345{
51ae5c03
JPC
346 if (SvTYPE(sv) == SVt_PVGV) {
347 if ( SvOBJECT(GvSV(sv)) ||
348 GvAV(sv) && SvOBJECT(GvAV(sv)) ||
349 GvHV(sv) && SvOBJECT(GvHV(sv)) ||
350 GvIO(sv) && SvOBJECT(GvIO(sv)) ||
351 GvCV(sv) && SvOBJECT(GvCV(sv)) )
352 {
353 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
354 SvREFCNT_dec(sv);
355 }
51ae5c03 356 }
4561caa4 357}
a5f75d66 358#endif
4561caa4
CS
359
360void
8ac85365 361sv_clean_objs(void)
4561caa4 362{
3280af22 363 PL_in_clean_objs = TRUE;
2d0f3c12 364 visit(FUNC_NAME_TO_PTR(do_clean_objs));
4561caa4 365#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 366 /* some barnacles may yet remain, clinging to typeglobs */
ac4c12e7 367 visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
4561caa4 368#endif
3280af22 369 PL_in_clean_objs = FALSE;
4561caa4
CS
370}
371
76e3520e 372STATIC void
8ac85365 373do_clean_all(SV *sv)
4561caa4 374{
01bc8b8d 375 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
4561caa4
CS
376 SvFLAGS(sv) |= SVf_BREAK;
377 SvREFCNT_dec(sv);
8990e307
LW
378}
379
380void
8ac85365 381sv_clean_all(void)
8990e307 382{
3280af22 383 PL_in_clean_all = TRUE;
ac4c12e7 384 visit(FUNC_NAME_TO_PTR(do_clean_all));
3280af22 385 PL_in_clean_all = FALSE;
8990e307 386}
463ee0b2 387
4633a7c4 388void
8ac85365 389sv_free_arenas(void)
4633a7c4
LW
390{
391 SV* sva;
392 SV* svanext;
393
394 /* Free arenas here, but be careful about fake ones. (We assume
395 contiguity of the fake ones with the corresponding real ones.) */
396
3280af22 397 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
398 svanext = (SV*) SvANY(sva);
399 while (svanext && SvFAKE(svanext))
400 svanext = (SV*) SvANY(svanext);
401
402 if (!SvFAKE(sva))
1edc1566 403 Safefree((void *)sva);
4633a7c4 404 }
5f05dabc 405
3280af22
NIS
406 if (PL_nice_chunk)
407 Safefree(PL_nice_chunk);
408 PL_nice_chunk = Nullch;
409 PL_nice_chunk_size = 0;
410 PL_sv_arenaroot = 0;
411 PL_sv_root = 0;
4633a7c4
LW
412}
413
76e3520e 414STATIC XPVIV*
8ac85365 415new_xiv(void)
463ee0b2 416{
ea7c11a3 417 IV* xiv;
cbe51380
GS
418 LOCK_SV_MUTEX;
419 if (!PL_xiv_root)
420 more_xiv();
421 xiv = PL_xiv_root;
422 /*
423 * See comment in more_xiv() -- RAM.
424 */
425 PL_xiv_root = *(IV**)xiv;
426 UNLOCK_SV_MUTEX;
427 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
463ee0b2
LW
428}
429
76e3520e 430STATIC void
8ac85365 431del_xiv(XPVIV *p)
463ee0b2 432{
23e6a22f 433 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
cbe51380 434 LOCK_SV_MUTEX;
3280af22
NIS
435 *(IV**)xiv = PL_xiv_root;
436 PL_xiv_root = xiv;
cbe51380 437 UNLOCK_SV_MUTEX;
463ee0b2
LW
438}
439
cbe51380 440STATIC void
8ac85365 441more_xiv(void)
463ee0b2 442{
ea7c11a3
SM
443 register IV* xiv;
444 register IV* xivend;
8c52afec
IZ
445 XPV* ptr;
446 New(705, ptr, 1008/sizeof(XPV), XPV);
3280af22
NIS
447 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
448 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
a0d0e21e 449
ea7c11a3
SM
450 xiv = (IV*) ptr;
451 xivend = &xiv[1008 / sizeof(IV) - 1];
452 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
3280af22 453 PL_xiv_root = xiv;
463ee0b2 454 while (xiv < xivend) {
ea7c11a3 455 *(IV**)xiv = (IV *)(xiv + 1);
463ee0b2
LW
456 xiv++;
457 }
ea7c11a3 458 *(IV**)xiv = 0;
463ee0b2
LW
459}
460
76e3520e 461STATIC XPVNV*
8ac85365 462new_xnv(void)
463ee0b2
LW
463{
464 double* xnv;
cbe51380
GS
465 LOCK_SV_MUTEX;
466 if (!PL_xnv_root)
467 more_xnv();
468 xnv = PL_xnv_root;
469 PL_xnv_root = *(double**)xnv;
470 UNLOCK_SV_MUTEX;
471 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
463ee0b2
LW
472}
473
76e3520e 474STATIC void
8ac85365 475del_xnv(XPVNV *p)
463ee0b2 476{
23e6a22f 477 double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
cbe51380 478 LOCK_SV_MUTEX;
3280af22
NIS
479 *(double**)xnv = PL_xnv_root;
480 PL_xnv_root = xnv;
cbe51380 481 UNLOCK_SV_MUTEX;
463ee0b2
LW
482}
483
cbe51380 484STATIC void
8ac85365 485more_xnv(void)
463ee0b2 486{
463ee0b2
LW
487 register double* xnv;
488 register double* xnvend;
8c52afec 489 New(711, xnv, 1008/sizeof(double), double);
463ee0b2
LW
490 xnvend = &xnv[1008 / sizeof(double) - 1];
491 xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
3280af22 492 PL_xnv_root = xnv;
463ee0b2
LW
493 while (xnv < xnvend) {
494 *(double**)xnv = (double*)(xnv + 1);
495 xnv++;
496 }
497 *(double**)xnv = 0;
463ee0b2
LW
498}
499
76e3520e 500STATIC XRV*
8ac85365 501new_xrv(void)
ed6116ce
LW
502{
503 XRV* xrv;
cbe51380
GS
504 LOCK_SV_MUTEX;
505 if (!PL_xrv_root)
506 more_xrv();
507 xrv = PL_xrv_root;
508 PL_xrv_root = (XRV*)xrv->xrv_rv;
509 UNLOCK_SV_MUTEX;
510 return xrv;
ed6116ce
LW
511}
512
76e3520e 513STATIC void
8ac85365 514del_xrv(XRV *p)
ed6116ce 515{
cbe51380 516 LOCK_SV_MUTEX;
3280af22
NIS
517 p->xrv_rv = (SV*)PL_xrv_root;
518 PL_xrv_root = p;
cbe51380 519 UNLOCK_SV_MUTEX;
ed6116ce
LW
520}
521
cbe51380 522STATIC void
8ac85365 523more_xrv(void)
ed6116ce 524{
ed6116ce
LW
525 register XRV* xrv;
526 register XRV* xrvend;
3280af22
NIS
527 New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
528 xrv = PL_xrv_root;
ed6116ce
LW
529 xrvend = &xrv[1008 / sizeof(XRV) - 1];
530 while (xrv < xrvend) {
531 xrv->xrv_rv = (SV*)(xrv + 1);
532 xrv++;
533 }
534 xrv->xrv_rv = 0;
ed6116ce
LW
535}
536
76e3520e 537STATIC XPV*
8ac85365 538new_xpv(void)
463ee0b2
LW
539{
540 XPV* xpv;
cbe51380
GS
541 LOCK_SV_MUTEX;
542 if (!PL_xpv_root)
543 more_xpv();
544 xpv = PL_xpv_root;
545 PL_xpv_root = (XPV*)xpv->xpv_pv;
546 UNLOCK_SV_MUTEX;
547 return xpv;
463ee0b2
LW
548}
549
76e3520e 550STATIC void
8ac85365 551del_xpv(XPV *p)
463ee0b2 552{
cbe51380 553 LOCK_SV_MUTEX;
3280af22
NIS
554 p->xpv_pv = (char*)PL_xpv_root;
555 PL_xpv_root = p;
cbe51380 556 UNLOCK_SV_MUTEX;
463ee0b2
LW
557}
558
cbe51380 559STATIC void
8ac85365 560more_xpv(void)
463ee0b2 561{
463ee0b2
LW
562 register XPV* xpv;
563 register XPV* xpvend;
3280af22
NIS
564 New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
565 xpv = PL_xpv_root;
463ee0b2
LW
566 xpvend = &xpv[1008 / sizeof(XPV) - 1];
567 while (xpv < xpvend) {
568 xpv->xpv_pv = (char*)(xpv + 1);
569 xpv++;
570 }
571 xpv->xpv_pv = 0;
463ee0b2
LW
572}
573
574#ifdef PURIFY
8990e307 575#define new_XIV() (void*)safemalloc(sizeof(XPVIV))
6ad3d225 576#define del_XIV(p) Safefree((char*)p)
463ee0b2 577#else
85e6fe83 578#define new_XIV() (void*)new_xiv()
8ac85365 579#define del_XIV(p) del_xiv((XPVIV*) p)
463ee0b2
LW
580#endif
581
582#ifdef PURIFY
8990e307 583#define new_XNV() (void*)safemalloc(sizeof(XPVNV))
6ad3d225 584#define del_XNV(p) Safefree((char*)p)
463ee0b2 585#else
85e6fe83 586#define new_XNV() (void*)new_xnv()
8ac85365 587#define del_XNV(p) del_xnv((XPVNV*) p)
463ee0b2
LW
588#endif
589
590#ifdef PURIFY
8990e307 591#define new_XRV() (void*)safemalloc(sizeof(XRV))
6ad3d225 592#define del_XRV(p) Safefree((char*)p)
ed6116ce 593#else
85e6fe83 594#define new_XRV() (void*)new_xrv()
8ac85365 595#define del_XRV(p) del_xrv((XRV*) p)
ed6116ce
LW
596#endif
597
598#ifdef PURIFY
8990e307 599#define new_XPV() (void*)safemalloc(sizeof(XPV))
6ad3d225 600#define del_XPV(p) Safefree((char*)p)
463ee0b2 601#else
85e6fe83 602#define new_XPV() (void*)new_xpv()
8ac85365 603#define del_XPV(p) del_xpv((XPV *)p)
463ee0b2
LW
604#endif
605
8c52afec
IZ
606#ifdef PURIFY
607# define my_safemalloc(s) safemalloc(s)
86058a2d 608# define my_safefree(s) safefree(s)
8c52afec 609#else
9d8a25dc 610STATIC void*
d665c133 611my_safemalloc(MEM_SIZE size)
8c52afec
IZ
612{
613 char *p;
614 New(717, p, size, char);
615 return (void*)p;
616}
617# define my_safefree(s) Safefree(s)
618#endif
619
620#define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
621#define del_XPVIV(p) my_safefree((char*)p)
622
623#define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
624#define del_XPVNV(p) my_safefree((char*)p)
625
626#define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
627#define del_XPVMG(p) my_safefree((char*)p)
628
629#define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
630#define del_XPVLV(p) my_safefree((char*)p)
631
632#define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
633#define del_XPVAV(p) my_safefree((char*)p)
634
635#define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
636#define del_XPVHV(p) my_safefree((char*)p)
637
638#define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
639#define del_XPVCV(p) my_safefree((char*)p)
640
641#define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
642#define del_XPVGV(p) my_safefree((char*)p)
643
644#define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
645#define del_XPVBM(p) my_safefree((char*)p)
646
647#define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
648#define del_XPVFM(p) my_safefree((char*)p)
649
650#define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
651#define del_XPVIO(p) my_safefree((char*)p)
8990e307 652
79072805 653bool
8ac85365 654sv_upgrade(register SV *sv, U32 mt)
79072805
LW
655{
656 char* pv;
657 U32 cur;
658 U32 len;
a0d0e21e 659 IV iv;
79072805
LW
660 double nv;
661 MAGIC* magic;
662 HV* stash;
663
664 if (SvTYPE(sv) == mt)
665 return TRUE;
666
a5f75d66
AD
667 if (mt < SVt_PVIV)
668 (void)SvOOK_off(sv);
669
79072805
LW
670 switch (SvTYPE(sv)) {
671 case SVt_NULL:
672 pv = 0;
673 cur = 0;
674 len = 0;
675 iv = 0;
676 nv = 0.0;
677 magic = 0;
678 stash = 0;
679 break;
79072805
LW
680 case SVt_IV:
681 pv = 0;
682 cur = 0;
683 len = 0;
463ee0b2
LW
684 iv = SvIVX(sv);
685 nv = (double)SvIVX(sv);
79072805
LW
686 del_XIV(SvANY(sv));
687 magic = 0;
688 stash = 0;
ed6116ce 689 if (mt == SVt_NV)
463ee0b2 690 mt = SVt_PVNV;
ed6116ce
LW
691 else if (mt < SVt_PVIV)
692 mt = SVt_PVIV;
79072805
LW
693 break;
694 case SVt_NV:
695 pv = 0;
696 cur = 0;
697 len = 0;
463ee0b2 698 nv = SvNVX(sv);
1bd302c3 699 iv = I_V(nv);
79072805
LW
700 magic = 0;
701 stash = 0;
702 del_XNV(SvANY(sv));
703 SvANY(sv) = 0;
ed6116ce 704 if (mt < SVt_PVNV)
79072805
LW
705 mt = SVt_PVNV;
706 break;
ed6116ce
LW
707 case SVt_RV:
708 pv = (char*)SvRV(sv);
709 cur = 0;
710 len = 0;
a0d0e21e 711 iv = (IV)pv;
ed6116ce
LW
712 nv = (double)(unsigned long)pv;
713 del_XRV(SvANY(sv));
714 magic = 0;
715 stash = 0;
716 break;
79072805 717 case SVt_PV:
463ee0b2 718 pv = SvPVX(sv);
79072805
LW
719 cur = SvCUR(sv);
720 len = SvLEN(sv);
721 iv = 0;
722 nv = 0.0;
723 magic = 0;
724 stash = 0;
725 del_XPV(SvANY(sv));
748a9306
LW
726 if (mt <= SVt_IV)
727 mt = SVt_PVIV;
728 else if (mt == SVt_NV)
729 mt = SVt_PVNV;
79072805
LW
730 break;
731 case SVt_PVIV:
463ee0b2 732 pv = SvPVX(sv);
79072805
LW
733 cur = SvCUR(sv);
734 len = SvLEN(sv);
463ee0b2 735 iv = SvIVX(sv);
79072805
LW
736 nv = 0.0;
737 magic = 0;
738 stash = 0;
739 del_XPVIV(SvANY(sv));
740 break;
741 case SVt_PVNV:
463ee0b2 742 pv = SvPVX(sv);
79072805
LW
743 cur = SvCUR(sv);
744 len = SvLEN(sv);
463ee0b2
LW
745 iv = SvIVX(sv);
746 nv = SvNVX(sv);
79072805
LW
747 magic = 0;
748 stash = 0;
749 del_XPVNV(SvANY(sv));
750 break;
751 case SVt_PVMG:
463ee0b2 752 pv = SvPVX(sv);
79072805
LW
753 cur = SvCUR(sv);
754 len = SvLEN(sv);
463ee0b2
LW
755 iv = SvIVX(sv);
756 nv = SvNVX(sv);
79072805
LW
757 magic = SvMAGIC(sv);
758 stash = SvSTASH(sv);
759 del_XPVMG(SvANY(sv));
760 break;
761 default:
463ee0b2 762 croak("Can't upgrade that kind of scalar");
79072805
LW
763 }
764
765 switch (mt) {
766 case SVt_NULL:
463ee0b2 767 croak("Can't upgrade to undef");
79072805
LW
768 case SVt_IV:
769 SvANY(sv) = new_XIV();
463ee0b2 770 SvIVX(sv) = iv;
79072805
LW
771 break;
772 case SVt_NV:
773 SvANY(sv) = new_XNV();
463ee0b2 774 SvNVX(sv) = nv;
79072805 775 break;
ed6116ce
LW
776 case SVt_RV:
777 SvANY(sv) = new_XRV();
778 SvRV(sv) = (SV*)pv;
ed6116ce 779 break;
79072805
LW
780 case SVt_PV:
781 SvANY(sv) = new_XPV();
463ee0b2 782 SvPVX(sv) = pv;
79072805
LW
783 SvCUR(sv) = cur;
784 SvLEN(sv) = len;
785 break;
786 case SVt_PVIV:
787 SvANY(sv) = new_XPVIV();
463ee0b2 788 SvPVX(sv) = pv;
79072805
LW
789 SvCUR(sv) = cur;
790 SvLEN(sv) = len;
463ee0b2 791 SvIVX(sv) = iv;
79072805 792 if (SvNIOK(sv))
a0d0e21e 793 (void)SvIOK_on(sv);
79072805
LW
794 SvNOK_off(sv);
795 break;
796 case SVt_PVNV:
797 SvANY(sv) = new_XPVNV();
463ee0b2 798 SvPVX(sv) = pv;
79072805
LW
799 SvCUR(sv) = cur;
800 SvLEN(sv) = len;
463ee0b2
LW
801 SvIVX(sv) = iv;
802 SvNVX(sv) = nv;
79072805
LW
803 break;
804 case SVt_PVMG:
805 SvANY(sv) = new_XPVMG();
463ee0b2 806 SvPVX(sv) = pv;
79072805
LW
807 SvCUR(sv) = cur;
808 SvLEN(sv) = len;
463ee0b2
LW
809 SvIVX(sv) = iv;
810 SvNVX(sv) = nv;
79072805
LW
811 SvMAGIC(sv) = magic;
812 SvSTASH(sv) = stash;
813 break;
814 case SVt_PVLV:
815 SvANY(sv) = new_XPVLV();
463ee0b2 816 SvPVX(sv) = pv;
79072805
LW
817 SvCUR(sv) = cur;
818 SvLEN(sv) = len;
463ee0b2
LW
819 SvIVX(sv) = iv;
820 SvNVX(sv) = nv;
79072805
LW
821 SvMAGIC(sv) = magic;
822 SvSTASH(sv) = stash;
823 LvTARGOFF(sv) = 0;
824 LvTARGLEN(sv) = 0;
825 LvTARG(sv) = 0;
826 LvTYPE(sv) = 0;
827 break;
828 case SVt_PVAV:
829 SvANY(sv) = new_XPVAV();
463ee0b2
LW
830 if (pv)
831 Safefree(pv);
2304df62 832 SvPVX(sv) = 0;
d1bf51dd 833 AvMAX(sv) = -1;
93965878 834 AvFILLp(sv) = -1;
463ee0b2
LW
835 SvIVX(sv) = 0;
836 SvNVX(sv) = 0.0;
837 SvMAGIC(sv) = magic;
838 SvSTASH(sv) = stash;
839 AvALLOC(sv) = 0;
79072805
LW
840 AvARYLEN(sv) = 0;
841 AvFLAGS(sv) = 0;
842 break;
843 case SVt_PVHV:
844 SvANY(sv) = new_XPVHV();
463ee0b2
LW
845 if (pv)
846 Safefree(pv);
847 SvPVX(sv) = 0;
848 HvFILL(sv) = 0;
849 HvMAX(sv) = 0;
850 HvKEYS(sv) = 0;
851 SvNVX(sv) = 0.0;
79072805
LW
852 SvMAGIC(sv) = magic;
853 SvSTASH(sv) = stash;
79072805
LW
854 HvRITER(sv) = 0;
855 HvEITER(sv) = 0;
856 HvPMROOT(sv) = 0;
857 HvNAME(sv) = 0;
79072805
LW
858 break;
859 case SVt_PVCV:
860 SvANY(sv) = new_XPVCV();
748a9306 861 Zero(SvANY(sv), 1, XPVCV);
463ee0b2 862 SvPVX(sv) = pv;
79072805
LW
863 SvCUR(sv) = cur;
864 SvLEN(sv) = len;
463ee0b2
LW
865 SvIVX(sv) = iv;
866 SvNVX(sv) = nv;
79072805
LW
867 SvMAGIC(sv) = magic;
868 SvSTASH(sv) = stash;
79072805
LW
869 break;
870 case SVt_PVGV:
871 SvANY(sv) = new_XPVGV();
463ee0b2 872 SvPVX(sv) = pv;
79072805
LW
873 SvCUR(sv) = cur;
874 SvLEN(sv) = len;
463ee0b2
LW
875 SvIVX(sv) = iv;
876 SvNVX(sv) = nv;
79072805
LW
877 SvMAGIC(sv) = magic;
878 SvSTASH(sv) = stash;
93a17b20 879 GvGP(sv) = 0;
79072805
LW
880 GvNAME(sv) = 0;
881 GvNAMELEN(sv) = 0;
882 GvSTASH(sv) = 0;
a5f75d66 883 GvFLAGS(sv) = 0;
79072805
LW
884 break;
885 case SVt_PVBM:
886 SvANY(sv) = new_XPVBM();
463ee0b2 887 SvPVX(sv) = pv;
79072805
LW
888 SvCUR(sv) = cur;
889 SvLEN(sv) = len;
463ee0b2
LW
890 SvIVX(sv) = iv;
891 SvNVX(sv) = nv;
79072805
LW
892 SvMAGIC(sv) = magic;
893 SvSTASH(sv) = stash;
894 BmRARE(sv) = 0;
895 BmUSEFUL(sv) = 0;
896 BmPREVIOUS(sv) = 0;
897 break;
898 case SVt_PVFM:
899 SvANY(sv) = new_XPVFM();
748a9306 900 Zero(SvANY(sv), 1, XPVFM);
463ee0b2 901 SvPVX(sv) = pv;
79072805
LW
902 SvCUR(sv) = cur;
903 SvLEN(sv) = len;
463ee0b2
LW
904 SvIVX(sv) = iv;
905 SvNVX(sv) = nv;
79072805
LW
906 SvMAGIC(sv) = magic;
907 SvSTASH(sv) = stash;
79072805 908 break;
8990e307
LW
909 case SVt_PVIO:
910 SvANY(sv) = new_XPVIO();
748a9306 911 Zero(SvANY(sv), 1, XPVIO);
8990e307
LW
912 SvPVX(sv) = pv;
913 SvCUR(sv) = cur;
914 SvLEN(sv) = len;
915 SvIVX(sv) = iv;
916 SvNVX(sv) = nv;
917 SvMAGIC(sv) = magic;
918 SvSTASH(sv) = stash;
85e6fe83 919 IoPAGE_LEN(sv) = 60;
8990e307
LW
920 break;
921 }
922 SvFLAGS(sv) &= ~SVTYPEMASK;
923 SvFLAGS(sv) |= mt;
79072805
LW
924 return TRUE;
925}
926
79072805 927int
8ac85365 928sv_backoff(register SV *sv)
79072805
LW
929{
930 assert(SvOOK(sv));
463ee0b2
LW
931 if (SvIVX(sv)) {
932 char *s = SvPVX(sv);
933 SvLEN(sv) += SvIVX(sv);
934 SvPVX(sv) -= SvIVX(sv);
79072805 935 SvIV_set(sv, 0);
463ee0b2 936 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
937 }
938 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 939 return 0;
79072805
LW
940}
941
942char *
22c35a8c 943sv_grow(register SV *sv, register STRLEN newlen)
79072805
LW
944{
945 register char *s;
946
55497cff 947#ifdef HAS_64K_LIMIT
79072805 948 if (newlen >= 0x10000) {
d1bf51dd 949 PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
79072805
LW
950 my_exit(1);
951 }
55497cff 952#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
953 if (SvROK(sv))
954 sv_unref(sv);
79072805
LW
955 if (SvTYPE(sv) < SVt_PV) {
956 sv_upgrade(sv, SVt_PV);
463ee0b2 957 s = SvPVX(sv);
79072805
LW
958 }
959 else if (SvOOK(sv)) { /* pv is offset? */
960 sv_backoff(sv);
463ee0b2 961 s = SvPVX(sv);
79072805
LW
962 if (newlen > SvLEN(sv))
963 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
964#ifdef HAS_64K_LIMIT
965 if (newlen >= 0x10000)
966 newlen = 0xFFFF;
967#endif
79072805
LW
968 }
969 else
463ee0b2 970 s = SvPVX(sv);
79072805 971 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 972 if (SvLEN(sv) && s) {
1fe09876 973#if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
8d6dde3e
IZ
974 STRLEN l = malloced_size((void*)SvPVX(sv));
975 if (newlen <= l) {
976 SvLEN_set(sv, l);
977 return s;
978 } else
c70c8a0a 979#endif
79072805 980 Renew(s,newlen,char);
8d6dde3e 981 }
79072805
LW
982 else
983 New(703,s,newlen,char);
984 SvPV_set(sv, s);
985 SvLEN_set(sv, newlen);
986 }
987 return s;
988}
989
990void
8ac85365 991sv_setiv(register SV *sv, IV i)
79072805 992{
2213622d 993 SV_CHECK_THINKFIRST(sv);
463ee0b2
LW
994 switch (SvTYPE(sv)) {
995 case SVt_NULL:
79072805 996 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
997 break;
998 case SVt_NV:
999 sv_upgrade(sv, SVt_PVNV);
1000 break;
ed6116ce 1001 case SVt_RV:
463ee0b2 1002 case SVt_PV:
79072805 1003 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1004 break;
a0d0e21e
LW
1005
1006 case SVt_PVGV:
a0d0e21e
LW
1007 case SVt_PVAV:
1008 case SVt_PVHV:
1009 case SVt_PVCV:
1010 case SVt_PVFM:
1011 case SVt_PVIO:
11343788
MB
1012 {
1013 dTHR;
1014 croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
22c35a8c 1015 PL_op_desc[PL_op->op_type]);
11343788 1016 }
463ee0b2 1017 }
a0d0e21e 1018 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1019 SvIVX(sv) = i;
463ee0b2 1020 SvTAINT(sv);
79072805
LW
1021}
1022
1023void
ef50df4b
GS
1024sv_setiv_mg(register SV *sv, IV i)
1025{
1026 sv_setiv(sv,i);
1027 SvSETMAGIC(sv);
1028}
1029
1030void
8ac85365 1031sv_setuv(register SV *sv, UV u)
55497cff 1032{
25da4f38
IZ
1033 sv_setiv(sv, 0);
1034 SvIsUV_on(sv);
1035 SvUVX(sv) = u;
55497cff 1036}
1037
1038void
ef50df4b
GS
1039sv_setuv_mg(register SV *sv, UV u)
1040{
1041 sv_setuv(sv,u);
1042 SvSETMAGIC(sv);
1043}
1044
1045void
8ac85365 1046sv_setnv(register SV *sv, double num)
79072805 1047{
2213622d 1048 SV_CHECK_THINKFIRST(sv);
a0d0e21e
LW
1049 switch (SvTYPE(sv)) {
1050 case SVt_NULL:
1051 case SVt_IV:
79072805 1052 sv_upgrade(sv, SVt_NV);
a0d0e21e 1053 break;
a0d0e21e
LW
1054 case SVt_RV:
1055 case SVt_PV:
1056 case SVt_PVIV:
79072805 1057 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1058 break;
827b7e14 1059
a0d0e21e 1060 case SVt_PVGV:
a0d0e21e
LW
1061 case SVt_PVAV:
1062 case SVt_PVHV:
1063 case SVt_PVCV:
1064 case SVt_PVFM:
1065 case SVt_PVIO:
11343788
MB
1066 {
1067 dTHR;
1068 croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
22c35a8c 1069 PL_op_name[PL_op->op_type]);
11343788 1070 }
79072805 1071 }
463ee0b2 1072 SvNVX(sv) = num;
a0d0e21e 1073 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1074 SvTAINT(sv);
79072805
LW
1075}
1076
ef50df4b
GS
1077void
1078sv_setnv_mg(register SV *sv, double num)
1079{
1080 sv_setnv(sv,num);
1081 SvSETMAGIC(sv);
1082}
1083
76e3520e 1084STATIC void
8ac85365 1085not_a_number(SV *sv)
a0d0e21e 1086{
11343788 1087 dTHR;
a0d0e21e
LW
1088 char tmpbuf[64];
1089 char *d = tmpbuf;
1090 char *s;
dc28f22b
GA
1091 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1092 /* each *s can expand to 4 chars + "...\0",
1093 i.e. need room for 8 chars */
a0d0e21e 1094
dc28f22b 1095 for (s = SvPVX(sv); *s && d < limit; s++) {
bbce6d69 1096 int ch = *s & 0xFF;
1097 if (ch & 128 && !isPRINT_LC(ch)) {
a0d0e21e
LW
1098 *d++ = 'M';
1099 *d++ = '-';
1100 ch &= 127;
1101 }
bbce6d69 1102 if (ch == '\n') {
1103 *d++ = '\\';
1104 *d++ = 'n';
1105 }
1106 else if (ch == '\r') {
1107 *d++ = '\\';
1108 *d++ = 'r';
1109 }
1110 else if (ch == '\f') {
1111 *d++ = '\\';
1112 *d++ = 'f';
1113 }
1114 else if (ch == '\\') {
1115 *d++ = '\\';
1116 *d++ = '\\';
1117 }
1118 else if (isPRINT_LC(ch))
a0d0e21e
LW
1119 *d++ = ch;
1120 else {
1121 *d++ = '^';
bbce6d69 1122 *d++ = toCTRL(ch);
a0d0e21e
LW
1123 }
1124 }
1125 if (*s) {
1126 *d++ = '.';
1127 *d++ = '.';
1128 *d++ = '.';
1129 }
1130 *d = '\0';
1131
533c011a 1132 if (PL_op)
599cee73 1133 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
22c35a8c 1134 PL_op_name[PL_op->op_type]);
a0d0e21e 1135 else
599cee73 1136 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
a0d0e21e
LW
1137}
1138
25da4f38
IZ
1139/* the number can be converted to _integer_ with atol() */
1140#define IS_NUMBER_TO_INT_BY_ATOL 0x01
1141#define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1142#define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
1143#define IS_NUMBER_NEG 0x08 /* not good to cache UV */
1144
1145/* Actually, ISO C leaves conversion of UV to IV undefined, but
1146 until proven guilty, assume that things are not that bad... */
1147
a0d0e21e 1148IV
8ac85365 1149sv_2iv(register SV *sv)
79072805
LW
1150{
1151 if (!sv)
1152 return 0;
8990e307 1153 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1154 mg_get(sv);
1155 if (SvIOKp(sv))
1156 return SvIVX(sv);
748a9306 1157 if (SvNOKp(sv)) {
25da4f38 1158 return I_V(SvNVX(sv));
748a9306 1159 }
36477c24 1160 if (SvPOKp(sv) && SvLEN(sv))
1161 return asIV(sv);
3fe9a6f1 1162 if (!SvROK(sv)) {
d008e5eb 1163 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1164 dTHR;
d008e5eb 1165 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1166 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1167 }
36477c24 1168 return 0;
3fe9a6f1 1169 }
463ee0b2 1170 }
ed6116ce 1171 if (SvTHINKFIRST(sv)) {
a0d0e21e 1172 if (SvROK(sv)) {
a0d0e21e
LW
1173 SV* tmpstr;
1174 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1175 return SvIV(tmpstr);
a0d0e21e
LW
1176 return (IV)SvRV(sv);
1177 }
ed6116ce 1178 if (SvREADONLY(sv)) {
748a9306 1179 if (SvNOKp(sv)) {
25da4f38 1180 return I_V(SvNVX(sv));
748a9306 1181 }
36477c24 1182 if (SvPOKp(sv) && SvLEN(sv))
1183 return asIV(sv);
d008e5eb
GS
1184 {
1185 dTHR;
1186 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1187 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1188 }
ed6116ce
LW
1189 return 0;
1190 }
79072805 1191 }
25da4f38
IZ
1192 if (SvIOKp(sv)) {
1193 if (SvIsUV(sv)) {
1194 return (IV)(SvUVX(sv));
1195 }
1196 else {
1197 return SvIVX(sv);
1198 }
463ee0b2 1199 }
748a9306 1200 if (SvNOKp(sv)) {
25da4f38
IZ
1201 /* We can cache the IV/UV value even if it not good enough
1202 * to reconstruct NV, since the conversion to PV will prefer
1203 * NV over IV/UV. XXXX 64-bit?
1204 */
1205
1206 if (SvTYPE(sv) == SVt_NV)
1207 sv_upgrade(sv, SVt_PVNV);
1208
a5f75d66 1209 (void)SvIOK_on(sv);
25da4f38 1210 if (SvNVX(sv) < (double)IV_MAX + 0.5)
748a9306 1211 SvIVX(sv) = I_V(SvNVX(sv));
25da4f38 1212 else {
ff68c719 1213 SvUVX(sv) = U_V(SvNVX(sv));
25da4f38
IZ
1214 SvIsUV_on(sv);
1215 ret_iv_max:
1216 DEBUG_c(PerlIO_printf(Perl_debug_log,
1217 "0x%lx 2iv(%lu => %ld) (as unsigned)\n",
1218 (unsigned long)sv,
1219 (unsigned long)SvUVX(sv), (long)(IV)SvUVX(sv)));
1220 return (IV)SvUVX(sv);
1221 }
748a9306
LW
1222 }
1223 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1224 I32 numtype = looks_like_number(sv);
1225
1226 /* We want to avoid a possible problem when we cache an IV which
1227 may be later translated to an NV, and the resulting NV is not
1228 the translation of the initial data.
1229
1230 This means that if we cache such an IV, we need to cache the
1231 NV as well. Moreover, we trade speed for space, and do not
1232 cache the NV if not needed.
1233 */
1234 if (numtype & IS_NUMBER_NOT_IV) {
1235 /* May be not an integer. Need to cache NV if we cache IV
1236 * - otherwise future conversion to NV will be wrong. */
1237 double d;
1238
1239 SET_NUMERIC_STANDARD();
1240 d = atof(SvPVX(sv));
1241
1242 if (SvTYPE(sv) < SVt_PVNV)
1243 sv_upgrade(sv, SVt_PVNV);
1244 SvNVX(sv) = d;
1245 (void)SvNOK_on(sv);
1246 (void)SvIOK_on(sv);
1247 DEBUG_c(PerlIO_printf(Perl_debug_log,
1248 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1249 SvNVX(sv)));
1250 if (SvNVX(sv) < (double)IV_MAX + 0.5)
1251 SvIVX(sv) = I_V(SvNVX(sv));
1252 else {
1253 SvUVX(sv) = U_V(SvNVX(sv));
1254 SvIsUV_on(sv);
1255 goto ret_iv_max;
1256 }
1257 }
1258 else if (numtype) {
1259 /* The NV may be reconstructed from IV - safe to cache IV,
1260 which may be calculated by atol(). */
1261 if (SvTYPE(sv) == SVt_PV)
1262 sv_upgrade(sv, SVt_PVIV);
1263 (void)SvIOK_on(sv);
1264 SvIVX(sv) = atol(SvPVX(sv)); /* XXXX 64-bit? */
1265 }
1266 else { /* Not a number. Cache 0. */
1267 dTHR;
1268
1269 if (SvTYPE(sv) < SVt_PVIV)
1270 sv_upgrade(sv, SVt_PVIV);
1271 SvIVX(sv) = 0;
1272 (void)SvIOK_on(sv);
1273 if (ckWARN(WARN_NUMERIC))
1274 not_a_number(sv);
1275 }
93a17b20 1276 }
79072805 1277 else {
11343788 1278 dTHR;
599cee73 1279 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1280 warner(WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1281 if (SvTYPE(sv) < SVt_IV)
1282 /* Typically the caller expects that sv_any is not NULL now. */
1283 sv_upgrade(sv, SVt_IV);
a0d0e21e 1284 return 0;
79072805 1285 }
760ac839 1286 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
a0d0e21e 1287 (unsigned long)sv,(long)SvIVX(sv)));
25da4f38 1288 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
1289}
1290
ff68c719 1291UV
8ac85365 1292sv_2uv(register SV *sv)
ff68c719 1293{
1294 if (!sv)
1295 return 0;
1296 if (SvGMAGICAL(sv)) {
1297 mg_get(sv);
1298 if (SvIOKp(sv))
1299 return SvUVX(sv);
1300 if (SvNOKp(sv))
1301 return U_V(SvNVX(sv));
36477c24 1302 if (SvPOKp(sv) && SvLEN(sv))
1303 return asUV(sv);
3fe9a6f1 1304 if (!SvROK(sv)) {
d008e5eb 1305 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1306 dTHR;
d008e5eb 1307 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1308 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1309 }
36477c24 1310 return 0;
3fe9a6f1 1311 }
ff68c719 1312 }
1313 if (SvTHINKFIRST(sv)) {
1314 if (SvROK(sv)) {
ff68c719 1315 SV* tmpstr;
1316 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
9e7bc3e8 1317 return SvUV(tmpstr);
ff68c719 1318 return (UV)SvRV(sv);
1319 }
1320 if (SvREADONLY(sv)) {
1321 if (SvNOKp(sv)) {
1322 return U_V(SvNVX(sv));
1323 }
36477c24 1324 if (SvPOKp(sv) && SvLEN(sv))
1325 return asUV(sv);
d008e5eb
GS
1326 {
1327 dTHR;
1328 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1329 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1330 }
ff68c719 1331 return 0;
1332 }
1333 }
25da4f38
IZ
1334 if (SvIOKp(sv)) {
1335 if (SvIsUV(sv)) {
1336 return SvUVX(sv);
1337 }
1338 else {
1339 return (UV)SvIVX(sv);
1340 }
ff68c719 1341 }
1342 if (SvNOKp(sv)) {
25da4f38
IZ
1343 /* We can cache the IV/UV value even if it not good enough
1344 * to reconstruct NV, since the conversion to PV will prefer
1345 * NV over IV/UV. XXXX 64-bit?
1346 */
1347 if (SvTYPE(sv) == SVt_NV)
1348 sv_upgrade(sv, SVt_PVNV);
ff68c719 1349 (void)SvIOK_on(sv);
25da4f38
IZ
1350 if (SvNVX(sv) >= -0.5) {
1351 SvIsUV_on(sv);
1352 SvUVX(sv) = U_V(SvNVX(sv));
1353 }
1354 else {
1355 SvIVX(sv) = I_V(SvNVX(sv));
1356 ret_zero:
1357 DEBUG_c(PerlIO_printf(Perl_debug_log,
1358 "0x%lx 2uv(%ld => %lu) (as signed)\n",
1359 (unsigned long)sv,(long)SvIVX(sv),
1360 (long)(UV)SvIVX(sv)));
1361 return (UV)SvIVX(sv);
1362 }
ff68c719 1363 }
1364 else if (SvPOKp(sv) && SvLEN(sv)) {
25da4f38
IZ
1365 I32 numtype = looks_like_number(sv);
1366
1367 /* We want to avoid a possible problem when we cache a UV which
1368 may be later translated to an NV, and the resulting NV is not
1369 the translation of the initial data.
1370
1371 This means that if we cache such a UV, we need to cache the
1372 NV as well. Moreover, we trade speed for space, and do not
1373 cache the NV if not needed.
1374 */
1375 if (numtype & IS_NUMBER_NOT_IV) {
1376 /* May be not an integer. Need to cache NV if we cache IV
1377 * - otherwise future conversion to NV will be wrong. */
1378 double d;
1379
1380 SET_NUMERIC_STANDARD();
1381 d = atof(SvPVX(sv)); /* XXXX 64-bit? */
1382
1383 if (SvTYPE(sv) < SVt_PVNV)
1384 sv_upgrade(sv, SVt_PVNV);
1385 SvNVX(sv) = d;
1386 (void)SvNOK_on(sv);
1387 (void)SvIOK_on(sv);
1388 DEBUG_c(PerlIO_printf(Perl_debug_log,
1389 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1390 SvNVX(sv)));
1391 if (SvNVX(sv) < -0.5) {
1392 SvIVX(sv) = I_V(SvNVX(sv));
1393 goto ret_zero;
1394 } else {
1395 SvUVX(sv) = U_V(SvNVX(sv));
1396 SvIsUV_on(sv);
1397 }
1398 }
1399 else if (numtype & IS_NUMBER_NEG) {
1400 /* The NV may be reconstructed from IV - safe to cache IV,
1401 which may be calculated by atol(). */
1402 if (SvTYPE(sv) == SVt_PV)
1403 sv_upgrade(sv, SVt_PVIV);
1404 (void)SvIOK_on(sv);
1405 SvIVX(sv) = (IV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1406 }
1407 else if (numtype) { /* Non-negative */
1408 /* The NV may be reconstructed from UV - safe to cache UV,
1409 which may be calculated by strtoul()/atol. */
1410 if (SvTYPE(sv) == SVt_PV)
1411 sv_upgrade(sv, SVt_PVIV);
1412 (void)SvIOK_on(sv);
1413 (void)SvIsUV_on(sv);
1414#ifdef HAS_STRTOUL
1415 SvUVX(sv) = strtoul(SvPVX(sv), Null(char**), 10); /* XXXX 64-bit? */
1416#else /* no atou(), but we know the number fits into IV... */
1417 /* The only problem may be if it is negative... */
1418 SvUVX(sv) = (UV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1419#endif
1420 }
1421 else { /* Not a number. Cache 0. */
1422 dTHR;
1423
1424 if (SvTYPE(sv) < SVt_PVIV)
1425 sv_upgrade(sv, SVt_PVIV);
1426 SvUVX(sv) = 0; /* We assume that 0s have the
1427 same bitmap in IV and UV. */
1428 (void)SvIOK_on(sv);
1429 (void)SvIsUV_on(sv);
1430 if (ckWARN(WARN_NUMERIC))
1431 not_a_number(sv);
1432 }
ff68c719 1433 }
1434 else {
d008e5eb 1435 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1436 dTHR;
d008e5eb 1437 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1438 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1439 }
25da4f38
IZ
1440 if (SvTYPE(sv) < SVt_IV)
1441 /* Typically the caller expects that sv_any is not NULL now. */
1442 sv_upgrade(sv, SVt_IV);
ff68c719 1443 return 0;
1444 }
25da4f38 1445
ff68c719 1446 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1447 (unsigned long)sv,SvUVX(sv)));
25da4f38 1448 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 1449}
1450
79072805 1451double
8ac85365 1452sv_2nv(register SV *sv)
79072805
LW
1453{
1454 if (!sv)
1455 return 0.0;
8990e307 1456 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1457 mg_get(sv);
1458 if (SvNOKp(sv))
1459 return SvNVX(sv);
a0d0e21e 1460 if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1461 dTHR;
599cee73 1462 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1463 not_a_number(sv);
36477c24 1464 SET_NUMERIC_STANDARD();
463ee0b2 1465 return atof(SvPVX(sv));
a0d0e21e 1466 }
25da4f38
IZ
1467 if (SvIOKp(sv)) {
1468 if (SvIsUV(sv))
1469 return (double)SvUVX(sv);
1470 else
1471 return (double)SvIVX(sv);
1472 }
16d20bd9 1473 if (!SvROK(sv)) {
d008e5eb 1474 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1475 dTHR;
d008e5eb 1476 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1477 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1478 }
16d20bd9
AD
1479 return 0;
1480 }
463ee0b2 1481 }
ed6116ce 1482 if (SvTHINKFIRST(sv)) {
a0d0e21e 1483 if (SvROK(sv)) {
a0d0e21e
LW
1484 SV* tmpstr;
1485 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
9e7bc3e8 1486 return SvNV(tmpstr);
a0d0e21e
LW
1487 return (double)(unsigned long)SvRV(sv);
1488 }
ed6116ce 1489 if (SvREADONLY(sv)) {
d008e5eb 1490 dTHR;
748a9306 1491 if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 1492 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1493 not_a_number(sv);
36477c24 1494 SET_NUMERIC_STANDARD();
ed6116ce 1495 return atof(SvPVX(sv));
a0d0e21e 1496 }
25da4f38
IZ
1497 if (SvIOKp(sv)) {
1498 if (SvIsUV(sv))
1499 return (double)SvUVX(sv);
1500 else
1501 return (double)SvIVX(sv);
1502 }
599cee73 1503 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1504 warner(WARN_UNINITIALIZED, PL_warn_uninit);
ed6116ce
LW
1505 return 0.0;
1506 }
79072805
LW
1507 }
1508 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
1509 if (SvTYPE(sv) == SVt_IV)
1510 sv_upgrade(sv, SVt_PVNV);
1511 else
1512 sv_upgrade(sv, SVt_NV);
36477c24 1513 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1514 DEBUG_c(PerlIO_printf(Perl_debug_log,
1515 "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
79072805
LW
1516 }
1517 else if (SvTYPE(sv) < SVt_PVNV)
1518 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
1519 if (SvIOKp(sv) &&
1520 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 1521 {
25da4f38 1522 SvNVX(sv) = SvIsUV(sv) ? (double)SvUVX(sv) : (double)SvIVX(sv);
93a17b20 1523 }
748a9306 1524 else if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1525 dTHR;
599cee73 1526 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1527 not_a_number(sv);
36477c24 1528 SET_NUMERIC_STANDARD();
463ee0b2 1529 SvNVX(sv) = atof(SvPVX(sv));
93a17b20 1530 }
79072805 1531 else {
11343788 1532 dTHR;
599cee73 1533 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1534 warner(WARN_UNINITIALIZED, PL_warn_uninit);
25da4f38
IZ
1535 if (SvTYPE(sv) < SVt_NV)
1536 /* Typically the caller expects that sv_any is not NULL now. */
1537 sv_upgrade(sv, SVt_NV);
a0d0e21e 1538 return 0.0;
79072805
LW
1539 }
1540 SvNOK_on(sv);
36477c24 1541 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1542 DEBUG_c(PerlIO_printf(Perl_debug_log,
1543 "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
463ee0b2 1544 return SvNVX(sv);
79072805
LW
1545}
1546
76e3520e 1547STATIC IV
8ac85365 1548asIV(SV *sv)
36477c24 1549{
1550 I32 numtype = looks_like_number(sv);
1551 double d;
1552
25da4f38
IZ
1553 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1554 return atol(SvPVX(sv)); /* XXXX 64-bit? */
d008e5eb
GS
1555 if (!numtype) {
1556 dTHR;
1557 if (ckWARN(WARN_NUMERIC))
1558 not_a_number(sv);
1559 }
36477c24 1560 SET_NUMERIC_STANDARD();
1561 d = atof(SvPVX(sv));
25da4f38 1562 return I_V(d);
36477c24 1563}
1564
76e3520e 1565STATIC UV
8ac85365 1566asUV(SV *sv)
36477c24 1567{
1568 I32 numtype = looks_like_number(sv);
1569
84902520 1570#ifdef HAS_STRTOUL
25da4f38 1571 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
84902520
TB
1572 return strtoul(SvPVX(sv), Null(char**), 10);
1573#endif
d008e5eb
GS
1574 if (!numtype) {
1575 dTHR;
1576 if (ckWARN(WARN_NUMERIC))
1577 not_a_number(sv);
1578 }
36477c24 1579 SET_NUMERIC_STANDARD();
1580 return U_V(atof(SvPVX(sv)));
1581}
1582
25da4f38
IZ
1583/*
1584 * Returns a combination of (advisory only - can get false negatives)
1585 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1586 * IS_NUMBER_NEG
1587 * 0 if does not look like number.
1588 *
1589 * In fact possible values are 0 and
1590 * IS_NUMBER_TO_INT_BY_ATOL 123
1591 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1592 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1593 * with a possible addition of IS_NUMBER_NEG.
1594 */
1595
36477c24 1596I32
8ac85365 1597looks_like_number(SV *sv)
36477c24 1598{
25da4f38
IZ
1599 /* XXXX 64-bit? It may be not IS_NUMBER_TO_INT_BY_ATOL, but
1600 * using atof() may lose precision. */
36477c24 1601 register char *s;
1602 register char *send;
1603 register char *sbegin;
25da4f38
IZ
1604 register char *nbegin;
1605 I32 numtype = 0;
36477c24 1606 STRLEN len;
1607
1608 if (SvPOK(sv)) {
1609 sbegin = SvPVX(sv);
1610 len = SvCUR(sv);
1611 }
1612 else if (SvPOKp(sv))
1613 sbegin = SvPV(sv, len);
1614 else
1615 return 1;
1616 send = sbegin + len;
1617
1618 s = sbegin;
1619 while (isSPACE(*s))
1620 s++;
25da4f38
IZ
1621 if (*s == '-') {
1622 s++;
1623 numtype = IS_NUMBER_NEG;
1624 }
1625 else if (*s == '+')
36477c24 1626 s++;
ff0cee69 1627
25da4f38
IZ
1628 nbegin = s;
1629 /*
1630 * we return 1 if the number can be converted to _integer_ with atol()
1631 * and 2 if you need (int)atof().
1632 */
1633
ff0cee69 1634 /* next must be digit or '.' */
1635 if (isDIGIT(*s)) {
1636 do {
1637 s++;
1638 } while (isDIGIT(*s));
25da4f38
IZ
1639
1640 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1641 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1642 else
1643 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1644
ff0cee69 1645 if (*s == '.') {
1646 s++;
25da4f38 1647 numtype |= IS_NUMBER_NOT_IV;
ff0cee69 1648 while (isDIGIT(*s)) /* optional digits after "." */
1649 s++;
1650 }
36477c24 1651 }
ff0cee69 1652 else if (*s == '.') {
1653 s++;
25da4f38 1654 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
ff0cee69 1655 /* no digits before '.' means we need digits after it */
1656 if (isDIGIT(*s)) {
1657 do {
1658 s++;
1659 } while (isDIGIT(*s));
1660 }
1661 else
1662 return 0;
1663 }
1664 else
1665 return 0;
1666
ff0cee69 1667 /* we can have an optional exponent part */
36477c24 1668 if (*s == 'e' || *s == 'E') {
25da4f38
IZ
1669 numtype &= ~IS_NUMBER_NEG;
1670 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
36477c24 1671 s++;
1672 if (*s == '+' || *s == '-')
1673 s++;
ff0cee69 1674 if (isDIGIT(*s)) {
1675 do {
1676 s++;
1677 } while (isDIGIT(*s));
1678 }
1679 else
1680 return 0;
36477c24 1681 }
1682 while (isSPACE(*s))
1683 s++;
1684 if (s >= send)
1685 return numtype;
1686 if (len == 10 && memEQ(sbegin, "0 but true", 10))
25da4f38 1687 return IS_NUMBER_TO_INT_BY_ATOL;
36477c24 1688 return 0;
1689}
1690
79072805 1691char *
1fa8b10d
JD
1692sv_2pv_nolen(register SV *sv)
1693{
1694 STRLEN n_a;
1695 return sv_2pv(sv, &n_a);
1696}
1697
25da4f38
IZ
1698/* We assume that buf is at least TYPE_CHARS(UV) long. */
1699STATIC char *
1700uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1701{
1702 STRLEN len;
1703 char *ptr = buf + TYPE_CHARS(UV);
1704 char *ebuf = ptr;
1705 int sign;
1706 char *p;
1707
1708 if (is_uv)
1709 sign = 0;
1710 else if (iv >= 0) {
1711 uv = iv;
1712 sign = 0;
1713 } else {
1714 uv = -iv;
1715 sign = 1;
1716 }
1717 do {
1718 *--ptr = '0' + (uv % 10);
1719 } while (uv /= 10);
1720 if (sign)
1721 *--ptr = '-';
1722 *peob = ebuf;
1723 return ptr;
1724}
1725
1fa8b10d 1726char *
8ac85365 1727sv_2pv(register SV *sv, STRLEN *lp)
79072805
LW
1728{
1729 register char *s;
1730 int olderrno;
46fc3d4c 1731 SV *tsv;
25da4f38
IZ
1732 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
1733 char *tmpbuf = tbuf;
79072805 1734
463ee0b2
LW
1735 if (!sv) {
1736 *lp = 0;
1737 return "";
1738 }
8990e307 1739 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1740 mg_get(sv);
1741 if (SvPOKp(sv)) {
1742 *lp = SvCUR(sv);
1743 return SvPVX(sv);
1744 }
25da4f38
IZ
1745 if (SvIOKp(sv)) { /* XXXX 64-bit? */
1746 if (SvIsUV(sv))
1747 (void)sprintf(tmpbuf,"%lu",(unsigned long)SvUVX(sv));
1748 else
1749 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
46fc3d4c 1750 tsv = Nullsv;
a0d0e21e 1751 goto tokensave;
463ee0b2
LW
1752 }
1753 if (SvNOKp(sv)) {
36477c24 1754 SET_NUMERIC_STANDARD();
96827780 1755 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1756 tsv = Nullsv;
a0d0e21e 1757 goto tokensave;
463ee0b2 1758 }
16d20bd9 1759 if (!SvROK(sv)) {
d008e5eb 1760 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1761 dTHR;
d008e5eb 1762 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1763 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1764 }
16d20bd9
AD
1765 *lp = 0;
1766 return "";
1767 }
463ee0b2 1768 }
ed6116ce
LW
1769 if (SvTHINKFIRST(sv)) {
1770 if (SvROK(sv)) {
a0d0e21e
LW
1771 SV* tmpstr;
1772 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
9e7bc3e8 1773 return SvPV(tmpstr,*lp);
ed6116ce
LW
1774 sv = (SV*)SvRV(sv);
1775 if (!sv)
1776 s = "NULLREF";
1777 else {
f9277f47
IZ
1778 MAGIC *mg;
1779
ed6116ce 1780 switch (SvTYPE(sv)) {
f9277f47
IZ
1781 case SVt_PVMG:
1782 if ( ((SvFLAGS(sv) &
1783 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 1784 == (SVs_OBJECT|SVs_RMG))
57668c4d 1785 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
f9277f47 1786 && (mg = mg_find(sv, 'r'))) {
5c0ca799 1787 dTHR;
2cd61cdb 1788 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 1789
2cd61cdb 1790 if (!mg->mg_ptr) {
8782bef2
GB
1791 char *fptr = "msix";
1792 char reflags[6];
1793 char ch;
1794 int left = 0;
1795 int right = 4;
1796 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1797
1798 while(ch = *fptr++) {
1799 if(reganch & 1) {
1800 reflags[left++] = ch;
1801 }
1802 else {
1803 reflags[right--] = ch;
1804 }
1805 reganch >>= 1;
1806 }
1807 if(left != 4) {
1808 reflags[left] = '-';
1809 left = 5;
1810 }
1811
1812 mg->mg_len = re->prelen + 4 + left;
1813 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1814 Copy("(?", mg->mg_ptr, 2, char);
1815 Copy(reflags, mg->mg_ptr+2, left, char);
1816 Copy(":", mg->mg_ptr+left+2, 1, char);
1817 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
1818 mg->mg_ptr[mg->mg_len - 1] = ')';
1819 mg->mg_ptr[mg->mg_len] = 0;
1820 }
3280af22 1821 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
1822 *lp = mg->mg_len;
1823 return mg->mg_ptr;
f9277f47
IZ
1824 }
1825 /* Fall through */
ed6116ce
LW
1826 case SVt_NULL:
1827 case SVt_IV:
1828 case SVt_NV:
1829 case SVt_RV:
1830 case SVt_PV:
1831 case SVt_PVIV:
1832 case SVt_PVNV:
f9277f47 1833 case SVt_PVBM: s = "SCALAR"; break;
ed6116ce
LW
1834 case SVt_PVLV: s = "LVALUE"; break;
1835 case SVt_PVAV: s = "ARRAY"; break;
1836 case SVt_PVHV: s = "HASH"; break;
1837 case SVt_PVCV: s = "CODE"; break;
1838 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 1839 case SVt_PVFM: s = "FORMAT"; break;
36477c24 1840 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
1841 default: s = "UNKNOWN"; break;
1842 }
46fc3d4c 1843 tsv = NEWSV(0,0);
ed6116ce 1844 if (SvOBJECT(sv))
46fc3d4c 1845 sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 1846 else
46fc3d4c 1847 sv_setpv(tsv, s);
25da4f38 1848 /* XXXX 64-bit? */
46fc3d4c 1849 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
a0d0e21e 1850 goto tokensaveref;
463ee0b2 1851 }
ed6116ce
LW
1852 *lp = strlen(s);
1853 return s;
79072805 1854 }
ed6116ce 1855 if (SvREADONLY(sv)) {
25da4f38
IZ
1856 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1857 /* XXXX 64-bit? IV may have better precision... */
36477c24 1858 SET_NUMERIC_STANDARD();
96827780 1859 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1860 tsv = Nullsv;
a0d0e21e 1861 goto tokensave;
ed6116ce 1862 }
8bb9dbe4 1863 if (SvIOKp(sv)) {
25da4f38
IZ
1864 char *ebuf;
1865
1866 if (SvIsUV(sv))
1867 tmpbuf = uiv_2buf(tbuf, 0, SvUVX(sv), 1, &ebuf);
1868 else
1869 tmpbuf = uiv_2buf(tbuf, SvIVX(sv), 0, 0, &ebuf);
1870 *ebuf = 0;
46fc3d4c 1871 tsv = Nullsv;
8bb9dbe4
LW
1872 goto tokensave;
1873 }
d008e5eb
GS
1874 {
1875 dTHR;
1876 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1877 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1878 }
ed6116ce
LW
1879 *lp = 0;
1880 return "";
79072805 1881 }
79072805 1882 }
25da4f38
IZ
1883 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1884 /* XXXX 64-bit? IV may have better precision... */
79072805
LW
1885 if (SvTYPE(sv) < SVt_PVNV)
1886 sv_upgrade(sv, SVt_PVNV);
1887 SvGROW(sv, 28);
463ee0b2 1888 s = SvPVX(sv);
79072805 1889 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 1890#ifdef apollo
463ee0b2 1891 if (SvNVX(sv) == 0.0)
79072805
LW
1892 (void)strcpy(s,"0");
1893 else
1894#endif /*apollo*/
bbce6d69 1895 {
36477c24 1896 SET_NUMERIC_STANDARD();
a0d0e21e 1897 Gconvert(SvNVX(sv), DBL_DIG, 0, s);
bbce6d69 1898 }
79072805 1899 errno = olderrno;
a0d0e21e
LW
1900#ifdef FIXNEGATIVEZERO
1901 if (*s == '-' && s[1] == '0' && !s[2])
1902 strcpy(s,"0");
1903#endif
79072805
LW
1904 while (*s) s++;
1905#ifdef hcx
1906 if (s[-1] == '.')
46fc3d4c 1907 *--s = '\0';
79072805
LW
1908#endif
1909 }
748a9306 1910 else if (SvIOKp(sv)) {
25da4f38
IZ
1911 U32 isIOK = SvIOK(sv);
1912 char buf[TYPE_CHARS(UV)];
1913 char *ebuf, *ptr;
1914
79072805
LW
1915 if (SvTYPE(sv) < SVt_PVIV)
1916 sv_upgrade(sv, SVt_PVIV);
25da4f38
IZ
1917 if (SvIsUV(sv)) {
1918 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
1919 sv_setpvn(sv, ptr, ebuf - ptr);
1920 SvIsUV_on(sv);
1921 }
1922 else {
1923 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
1924 sv_setpvn(sv, ptr, ebuf - ptr);
1925 }
46fc3d4c 1926 s = SvEND(sv);
25da4f38 1927 if (isIOK)
64f14228
GA
1928 SvIOK_on(sv);
1929 else
1930 SvIOKp_on(sv);
79072805
LW
1931 }
1932 else {
11343788 1933 dTHR;
599cee73 1934 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1935 warner(WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e 1936 *lp = 0;
25da4f38
IZ
1937 if (SvTYPE(sv) < SVt_PV)
1938 /* Typically the caller expects that sv_any is not NULL now. */
1939 sv_upgrade(sv, SVt_PV);
a0d0e21e 1940 return "";
79072805 1941 }
463ee0b2
LW
1942 *lp = s - SvPVX(sv);
1943 SvCUR_set(sv, *lp);
79072805 1944 SvPOK_on(sv);
760ac839 1945 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
463ee0b2 1946 return SvPVX(sv);
a0d0e21e
LW
1947
1948 tokensave:
1949 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
1950 /* Sneaky stuff here */
1951
1952 tokensaveref:
46fc3d4c 1953 if (!tsv)
96827780 1954 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 1955 sv_2mortal(tsv);
1956 *lp = SvCUR(tsv);
1957 return SvPVX(tsv);
a0d0e21e
LW
1958 }
1959 else {
1960 STRLEN len;
46fc3d4c 1961 char *t;
1962
1963 if (tsv) {
1964 sv_2mortal(tsv);
1965 t = SvPVX(tsv);
1966 len = SvCUR(tsv);
1967 }
1968 else {
96827780
MB
1969 t = tmpbuf;
1970 len = strlen(tmpbuf);
46fc3d4c 1971 }
a0d0e21e 1972#ifdef FIXNEGATIVEZERO
46fc3d4c 1973 if (len == 2 && t[0] == '-' && t[1] == '0') {
1974 t = "0";
1975 len = 1;
1976 }
a0d0e21e
LW
1977#endif
1978 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 1979 *lp = len;
a0d0e21e
LW
1980 s = SvGROW(sv, len + 1);
1981 SvCUR_set(sv, len);
46fc3d4c 1982 (void)strcpy(s, t);
6bf554b4 1983 SvPOKp_on(sv);
a0d0e21e
LW
1984 return s;
1985 }
463ee0b2
LW
1986}
1987
1988/* This function is only called on magical items */
1989bool
8ac85365 1990sv_2bool(register SV *sv)
463ee0b2 1991{
8990e307 1992 if (SvGMAGICAL(sv))
463ee0b2
LW
1993 mg_get(sv);
1994
a0d0e21e
LW
1995 if (!SvOK(sv))
1996 return 0;
1997 if (SvROK(sv)) {
11343788 1998 dTHR;
a0d0e21e
LW
1999 SV* tmpsv;
2000 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
9e7bc3e8 2001 return SvTRUE(tmpsv);
a0d0e21e
LW
2002 return SvRV(sv) != 0;
2003 }
463ee0b2 2004 if (SvPOKp(sv)) {
11343788
MB
2005 register XPV* Xpvtmp;
2006 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2007 (*Xpvtmp->xpv_pv > '0' ||
2008 Xpvtmp->xpv_cur > 1 ||
2009 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
2010 return 1;
2011 else
2012 return 0;
2013 }
2014 else {
2015 if (SvIOKp(sv))
2016 return SvIVX(sv) != 0;
2017 else {
2018 if (SvNOKp(sv))
2019 return SvNVX(sv) != 0.0;
2020 else
2021 return FALSE;
2022 }
2023 }
79072805
LW
2024}
2025
2026/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 2027 * to be reused, since it may destroy the source string if it is marked
79072805
LW
2028 * as temporary.
2029 */
2030
2031void
8ac85365 2032sv_setsv(SV *dstr, register SV *sstr)
79072805 2033{
11343788 2034 dTHR;
8990e307
LW
2035 register U32 sflags;
2036 register int dtype;
2037 register int stype;
463ee0b2 2038
79072805
LW
2039 if (sstr == dstr)
2040 return;
2213622d 2041 SV_CHECK_THINKFIRST(dstr);
79072805 2042 if (!sstr)
3280af22 2043 sstr = &PL_sv_undef;
8990e307
LW
2044 stype = SvTYPE(sstr);
2045 dtype = SvTYPE(dstr);
79072805 2046
a0d0e21e 2047 SvAMAGIC_off(dstr);
9e7bc3e8 2048
463ee0b2 2049 /* There's a lot of redundancy below but we're going for speed here */
79072805 2050
8990e307 2051 switch (stype) {
79072805 2052 case SVt_NULL:
aece5585 2053 undef_sstr:
20408e3c
GS
2054 if (dtype != SVt_PVGV) {
2055 (void)SvOK_off(dstr);
2056 return;
2057 }
2058 break;
463ee0b2 2059 case SVt_IV:
aece5585
GA
2060 if (SvIOK(sstr)) {
2061 switch (dtype) {
2062 case SVt_NULL:
8990e307 2063 sv_upgrade(dstr, SVt_IV);
aece5585
GA
2064 break;
2065 case SVt_NV:
8990e307 2066 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2067 break;
2068 case SVt_RV:
2069 case SVt_PV:
a0d0e21e 2070 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2071 break;
2072 }
2073 (void)SvIOK_only(dstr);
2074 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2075 if (SvIsUV(sstr))
2076 SvIsUV_on(dstr);
aece5585
GA
2077 SvTAINT(dstr);
2078 return;
8990e307 2079 }
aece5585
GA
2080 goto undef_sstr;
2081
463ee0b2 2082 case SVt_NV:
aece5585
GA
2083 if (SvNOK(sstr)) {
2084 switch (dtype) {
2085 case SVt_NULL:
2086 case SVt_IV:
8990e307 2087 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2088 break;
2089 case SVt_RV:
2090 case SVt_PV:
2091 case SVt_PVIV:
a0d0e21e 2092 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2093 break;
2094 }
2095 SvNVX(dstr) = SvNVX(sstr);
2096 (void)SvNOK_only(dstr);
2097 SvTAINT(dstr);
2098 return;
8990e307 2099 }
aece5585
GA
2100 goto undef_sstr;
2101
ed6116ce 2102 case SVt_RV:
8990e307 2103 if (dtype < SVt_RV)
ed6116ce 2104 sv_upgrade(dstr, SVt_RV);
c07a80fd 2105 else if (dtype == SVt_PVGV &&
2106 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2107 sstr = SvRV(sstr);
a5f75d66 2108 if (sstr == dstr) {
3280af22 2109 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2110 GvIMPORTED_on(dstr);
2111 GvMULTI_on(dstr);
2112 return;
2113 }
c07a80fd 2114 goto glob_assign;
2115 }
ed6116ce 2116 break;
463ee0b2 2117 case SVt_PV:
fc36a67e 2118 case SVt_PVFM:
8990e307 2119 if (dtype < SVt_PV)
463ee0b2 2120 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
2121 break;
2122 case SVt_PVIV:
8990e307 2123 if (dtype < SVt_PVIV)
463ee0b2 2124 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
2125 break;
2126 case SVt_PVNV:
8990e307 2127 if (dtype < SVt_PVNV)
463ee0b2 2128 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 2129 break;
4633a7c4
LW
2130 case SVt_PVAV:
2131 case SVt_PVHV:
2132 case SVt_PVCV:
4633a7c4 2133 case SVt_PVIO:
533c011a 2134 if (PL_op)
4633a7c4 2135 croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 2136 PL_op_name[PL_op->op_type]);
4633a7c4
LW
2137 else
2138 croak("Bizarre copy of %s", sv_reftype(sstr, 0));
2139 break;
2140
79072805 2141 case SVt_PVGV:
8990e307 2142 if (dtype <= SVt_PVGV) {
c07a80fd 2143 glob_assign:
a5f75d66 2144 if (dtype != SVt_PVGV) {
a0d0e21e
LW
2145 char *name = GvNAME(sstr);
2146 STRLEN len = GvNAMELEN(sstr);
463ee0b2 2147 sv_upgrade(dstr, SVt_PVGV);
a0d0e21e 2148 sv_magic(dstr, dstr, '*', name, len);
85aff577 2149 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
2150 GvNAME(dstr) = savepvn(name, len);
2151 GvNAMELEN(dstr) = len;
2152 SvFAKE_on(dstr); /* can coerce to non-glob */
2153 }
7bac28a0 2154 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
2155 else if (PL_curstackinfo->si_type == PERLSI_SORT
2156 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
7bac28a0 2157 croak("Can't redefine active sort subroutine %s",
2158 GvNAME(dstr));
a0d0e21e 2159 (void)SvOK_off(dstr);
a5f75d66 2160 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 2161 gp_free((GV*)dstr);
79072805 2162 GvGP(dstr) = gp_ref(GvGP(sstr));
8990e307 2163 SvTAINT(dstr);
3280af22 2164 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2165 GvIMPORTED_on(dstr);
2166 GvMULTI_on(dstr);
79072805
LW
2167 return;
2168 }
2169 /* FALL THROUGH */
2170
2171 default:
973f89ab
CS
2172 if (SvGMAGICAL(sstr)) {
2173 mg_get(sstr);
2174 if (SvTYPE(sstr) != stype) {
2175 stype = SvTYPE(sstr);
2176 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2177 goto glob_assign;
2178 }
2179 }
ded42b9f 2180 if (stype == SVt_PVLV)
6fc92669 2181 (void)SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 2182 else
6fc92669 2183 (void)SvUPGRADE(dstr, stype);
79072805
LW
2184 }
2185
8990e307
LW
2186 sflags = SvFLAGS(sstr);
2187
2188 if (sflags & SVf_ROK) {
2189 if (dtype >= SVt_PV) {
2190 if (dtype == SVt_PVGV) {
2191 SV *sref = SvREFCNT_inc(SvRV(sstr));
2192 SV *dref = 0;
a5f75d66 2193 int intro = GvINTRO(dstr);
a0d0e21e
LW
2194
2195 if (intro) {
2196 GP *gp;
2197 GvGP(dstr)->gp_refcnt--;
a5f75d66 2198 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 2199 Newz(602,gp, 1, GP);
44a8e56a 2200 GvGP(dstr) = gp_ref(gp);
a0d0e21e 2201 GvSV(dstr) = NEWSV(72,0);
3280af22 2202 GvLINE(dstr) = PL_curcop->cop_line;
1edc1566 2203 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 2204 }
a5f75d66 2205 GvMULTI_on(dstr);
8990e307
LW
2206 switch (SvTYPE(sref)) {
2207 case SVt_PVAV:
a0d0e21e
LW
2208 if (intro)
2209 SAVESPTR(GvAV(dstr));
2210 else
2211 dref = (SV*)GvAV(dstr);
8990e307 2212 GvAV(dstr) = (AV*)sref;
3280af22 2213 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2214 GvIMPORTED_AV_on(dstr);
8990e307
LW
2215 break;
2216 case SVt_PVHV:
a0d0e21e
LW
2217 if (intro)
2218 SAVESPTR(GvHV(dstr));
2219 else
2220 dref = (SV*)GvHV(dstr);
8990e307 2221 GvHV(dstr) = (HV*)sref;
3280af22 2222 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2223 GvIMPORTED_HV_on(dstr);
8990e307
LW
2224 break;
2225 case SVt_PVCV:
8ebc5c01 2226 if (intro) {
2227 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2228 SvREFCNT_dec(GvCV(dstr));
2229 GvCV(dstr) = Nullcv;
68dc0745 2230 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 2231 PL_sub_generation++;
8ebc5c01 2232 }
a0d0e21e 2233 SAVESPTR(GvCV(dstr));
8ebc5c01 2234 }
68dc0745 2235 else
2236 dref = (SV*)GvCV(dstr);
2237 if (GvCV(dstr) != (CV*)sref) {
748a9306 2238 CV* cv = GvCV(dstr);
4633a7c4 2239 if (cv) {
68dc0745 2240 if (!GvCVGEN((GV*)dstr) &&
2241 (CvROOT(cv) || CvXSUB(cv)))
2242 {
fe5e78ed
GS
2243 SV *const_sv = cv_const_sv(cv);
2244 bool const_changed = TRUE;
2245 if(const_sv)
2246 const_changed = sv_cmp(const_sv,
2247 op_const_sv(CvSTART((CV*)sref),
2248 Nullcv));
7bac28a0 2249 /* ahem, death to those who redefine
2250 * active sort subs */
3280af22
NIS
2251 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2252 PL_sortcop == CvSTART(cv))
7bac28a0 2253 croak(
2254 "Can't redefine active sort subroutine %s",
2255 GvENAME((GV*)dstr));
599cee73 2256 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2f34f9d4
IZ
2257 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2258 && HvNAME(GvSTASH(CvGV(cv)))
2259 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2260 "autouse")))
599cee73 2261 warner(WARN_REDEFINE, const_sv ?
fe5e78ed
GS
2262 "Constant subroutine %s redefined"
2263 : "Subroutine %s redefined",
2f34f9d4
IZ
2264 GvENAME((GV*)dstr));
2265 }
9607fc9c 2266 }
3fe9a6f1 2267 cv_ckproto(cv, (GV*)dstr,
2268 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 2269 }
a5f75d66 2270 GvCV(dstr) = (CV*)sref;
7a4c00b4 2271 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 2272 GvASSUMECV_on(dstr);
3280af22 2273 PL_sub_generation++;
a5f75d66 2274 }
3280af22 2275 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2276 GvIMPORTED_CV_on(dstr);
8990e307 2277 break;
91bba347
LW
2278 case SVt_PVIO:
2279 if (intro)
2280 SAVESPTR(GvIOp(dstr));
2281 else
2282 dref = (SV*)GvIOp(dstr);
2283 GvIOp(dstr) = (IO*)sref;
2284 break;
8990e307 2285 default:
a0d0e21e
LW
2286 if (intro)
2287 SAVESPTR(GvSV(dstr));
2288 else
2289 dref = (SV*)GvSV(dstr);
8990e307 2290 GvSV(dstr) = sref;
3280af22 2291 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2292 GvIMPORTED_SV_on(dstr);
8990e307
LW
2293 break;
2294 }
2295 if (dref)
2296 SvREFCNT_dec(dref);
a0d0e21e
LW
2297 if (intro)
2298 SAVEFREESV(sref);
8990e307
LW
2299 SvTAINT(dstr);
2300 return;
2301 }
a0d0e21e 2302 if (SvPVX(dstr)) {
760ac839 2303 (void)SvOOK_off(dstr); /* backoff */
50483b2c
JD
2304 if (SvLEN(dstr))
2305 Safefree(SvPVX(dstr));
a0d0e21e
LW
2306 SvLEN(dstr)=SvCUR(dstr)=0;
2307 }
8990e307 2308 }
a0d0e21e 2309 (void)SvOK_off(dstr);
8990e307 2310 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 2311 SvROK_on(dstr);
8990e307 2312 if (sflags & SVp_NOK) {
ed6116ce
LW
2313 SvNOK_on(dstr);
2314 SvNVX(dstr) = SvNVX(sstr);
2315 }
8990e307 2316 if (sflags & SVp_IOK) {
a0d0e21e 2317 (void)SvIOK_on(dstr);
ed6116ce 2318 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2319 if (SvIsUV(sstr))
2320 SvIsUV_on(dstr);
ed6116ce 2321 }
a0d0e21e
LW
2322 if (SvAMAGIC(sstr)) {
2323 SvAMAGIC_on(dstr);
2324 }
ed6116ce 2325 }
8990e307 2326 else if (sflags & SVp_POK) {
79072805
LW
2327
2328 /*
2329 * Check to see if we can just swipe the string. If so, it's a
2330 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
2331 * It might even be a win on short strings if SvPVX(dstr)
2332 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
2333 */
2334
ff68c719 2335 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 2336 SvREFCNT(sstr) == 1 && /* and no other references to it? */
a5f75d66
AD
2337 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2338 {
adbc6bb1 2339 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
2340 if (SvOOK(dstr)) {
2341 SvFLAGS(dstr) &= ~SVf_OOK;
2342 Safefree(SvPVX(dstr) - SvIVX(dstr));
2343 }
50483b2c 2344 else if (SvLEN(dstr))
a5f75d66 2345 Safefree(SvPVX(dstr));
79072805 2346 }
a5f75d66 2347 (void)SvPOK_only(dstr);
463ee0b2 2348 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
2349 SvLEN_set(dstr, SvLEN(sstr));
2350 SvCUR_set(dstr, SvCUR(sstr));
79072805 2351 SvTEMP_off(dstr);
a5f75d66 2352 (void)SvOK_off(sstr);
79072805
LW
2353 SvPV_set(sstr, Nullch);
2354 SvLEN_set(sstr, 0);
a5f75d66
AD
2355 SvCUR_set(sstr, 0);
2356 SvTEMP_off(sstr);
79072805
LW
2357 }
2358 else { /* have to copy actual string */
8990e307
LW
2359 STRLEN len = SvCUR(sstr);
2360
2361 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2362 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2363 SvCUR_set(dstr, len);
2364 *SvEND(dstr) = '\0';
a0d0e21e 2365 (void)SvPOK_only(dstr);
79072805
LW
2366 }
2367 /*SUPPRESS 560*/
8990e307 2368 if (sflags & SVp_NOK) {
79072805 2369 SvNOK_on(dstr);
463ee0b2 2370 SvNVX(dstr) = SvNVX(sstr);
79072805 2371 }
8990e307 2372 if (sflags & SVp_IOK) {
a0d0e21e 2373 (void)SvIOK_on(dstr);
463ee0b2 2374 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2375 if (SvIsUV(sstr))
2376 SvIsUV_on(dstr);
79072805
LW
2377 }
2378 }
8990e307 2379 else if (sflags & SVp_NOK) {
463ee0b2 2380 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 2381 (void)SvNOK_only(dstr);
79072805 2382 if (SvIOK(sstr)) {
a0d0e21e 2383 (void)SvIOK_on(dstr);
463ee0b2 2384 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2385 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2386 if (SvIsUV(sstr))
2387 SvIsUV_on(dstr);
79072805
LW
2388 }
2389 }
8990e307 2390 else if (sflags & SVp_IOK) {
a0d0e21e 2391 (void)SvIOK_only(dstr);
463ee0b2 2392 SvIVX(dstr) = SvIVX(sstr);
25da4f38
IZ
2393 if (SvIsUV(sstr))
2394 SvIsUV_on(dstr);
79072805
LW
2395 }
2396 else {
20408e3c 2397 if (dtype == SVt_PVGV) {
599cee73
PM
2398 if (ckWARN(WARN_UNSAFE))
2399 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
20408e3c
GS
2400 }
2401 else
2402 (void)SvOK_off(dstr);
a0d0e21e 2403 }
463ee0b2 2404 SvTAINT(dstr);
79072805
LW
2405}
2406
2407void
ef50df4b
GS
2408sv_setsv_mg(SV *dstr, register SV *sstr)
2409{
2410 sv_setsv(dstr,sstr);
2411 SvSETMAGIC(dstr);
2412}
2413
2414void
8ac85365 2415sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
79072805 2416{
c6f8c383 2417 register char *dptr;
4561caa4
CS
2418 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2419 elicit a warning, but it won't hurt. */
2213622d 2420 SV_CHECK_THINKFIRST(sv);
463ee0b2 2421 if (!ptr) {
a0d0e21e 2422 (void)SvOK_off(sv);
463ee0b2
LW
2423 return;
2424 }
6fc92669 2425 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2426
79072805 2427 SvGROW(sv, len + 1);
c6f8c383
GA
2428 dptr = SvPVX(sv);
2429 Move(ptr,dptr,len,char);
2430 dptr[len] = '\0';
79072805 2431 SvCUR_set(sv, len);
a0d0e21e 2432 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2433 SvTAINT(sv);
79072805
LW
2434}
2435
2436void
ef50df4b
GS
2437sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2438{
2439 sv_setpvn(sv,ptr,len);
2440 SvSETMAGIC(sv);
2441}
2442
2443void
8ac85365 2444sv_setpv(register SV *sv, register const char *ptr)
79072805
LW
2445{
2446 register STRLEN len;
2447
2213622d 2448 SV_CHECK_THINKFIRST(sv);
463ee0b2 2449 if (!ptr) {
a0d0e21e 2450 (void)SvOK_off(sv);
463ee0b2
LW
2451 return;
2452 }
79072805 2453 len = strlen(ptr);
6fc92669 2454 (void)SvUPGRADE(sv, SVt_PV);
c6f8c383 2455
79072805 2456 SvGROW(sv, len + 1);
463ee0b2 2457 Move(ptr,SvPVX(sv),len+1,char);
79072805 2458 SvCUR_set(sv, len);
a0d0e21e 2459 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
2460 SvTAINT(sv);
2461}
2462
2463void
ef50df4b
GS
2464sv_setpv_mg(register SV *sv, register const char *ptr)
2465{
2466 sv_setpv(sv,ptr);
2467 SvSETMAGIC(sv);
2468}
2469
2470void
8ac85365 2471sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 2472{
2213622d 2473 SV_CHECK_THINKFIRST(sv);
c6f8c383 2474 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 2475 if (!ptr) {
a0d0e21e 2476 (void)SvOK_off(sv);
463ee0b2
LW
2477 return;
2478 }
a0ed51b3 2479 (void)SvOOK_off(sv);
50483b2c 2480 if (SvPVX(sv) && SvLEN(sv))
463ee0b2
LW
2481 Safefree(SvPVX(sv));
2482 Renew(ptr, len+1, char);
2483 SvPVX(sv) = ptr;
2484 SvCUR_set(sv, len);
2485 SvLEN_set(sv, len+1);
2486 *SvEND(sv) = '\0';
a0d0e21e 2487 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2488 SvTAINT(sv);
79072805
LW
2489}
2490
ef50df4b
GS
2491void
2492sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2493{
51c1089b 2494 sv_usepvn(sv,ptr,len);
ef50df4b
GS
2495 SvSETMAGIC(sv);
2496}
2497
6fc92669
GS
2498void
2499sv_force_normal(register SV *sv)
0f15f207 2500{
2213622d
GA
2501 if (SvREADONLY(sv)) {
2502 dTHR;
3280af22 2503 if (PL_curcop != &PL_compiling)
22c35a8c 2504 croak(PL_no_modify);
0f15f207 2505 }
2213622d
GA
2506 if (SvROK(sv))
2507 sv_unref(sv);
6fc92669
GS
2508 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2509 sv_unglob(sv);
0f15f207
MB
2510}
2511
79072805 2512void
8ac85365
NIS
2513sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
2514
2515
79072805
LW
2516{
2517 register STRLEN delta;
2518
a0d0e21e 2519 if (!ptr || !SvPOKp(sv))
79072805 2520 return;
2213622d 2521 SV_CHECK_THINKFIRST(sv);
79072805
LW
2522 if (SvTYPE(sv) < SVt_PVIV)
2523 sv_upgrade(sv,SVt_PVIV);
2524
2525 if (!SvOOK(sv)) {
50483b2c
JD
2526 if (!SvLEN(sv)) { /* make copy of shared string */
2527 char *pvx = SvPVX(sv);
2528 STRLEN len = SvCUR(sv);
2529 SvGROW(sv, len + 1);
2530 Move(pvx,SvPVX(sv),len,char);
2531 *SvEND(sv) = '\0';
2532 }
463ee0b2 2533 SvIVX(sv) = 0;
79072805
LW
2534 SvFLAGS(sv) |= SVf_OOK;
2535 }
25da4f38 2536 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
463ee0b2 2537 delta = ptr - SvPVX(sv);
79072805
LW
2538 SvLEN(sv) -= delta;
2539 SvCUR(sv) -= delta;
463ee0b2
LW
2540 SvPVX(sv) += delta;
2541 SvIVX(sv) += delta;
79072805
LW
2542}
2543
2544void
08105a92 2545sv_catpvn(register SV *sv, register const char *ptr, register STRLEN len)
79072805 2546{
463ee0b2 2547 STRLEN tlen;
748a9306 2548 char *junk;
a0d0e21e 2549
748a9306 2550 junk = SvPV_force(sv, tlen);
463ee0b2 2551 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2552 if (ptr == junk)
2553 ptr = SvPVX(sv);
463ee0b2 2554 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
2555 SvCUR(sv) += len;
2556 *SvEND(sv) = '\0';
a0d0e21e 2557 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2558 SvTAINT(sv);
79072805
LW
2559}
2560
2561void
08105a92 2562sv_catpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
2563{
2564 sv_catpvn(sv,ptr,len);
2565 SvSETMAGIC(sv);
2566}
2567
2568void
8ac85365 2569sv_catsv(SV *dstr, register SV *sstr)
79072805
LW
2570{
2571 char *s;
463ee0b2 2572 STRLEN len;
79072805
LW
2573 if (!sstr)
2574 return;
463ee0b2
LW
2575 if (s = SvPV(sstr, len))
2576 sv_catpvn(dstr,s,len);
79072805
LW
2577}
2578
2579void
ef50df4b
GS
2580sv_catsv_mg(SV *dstr, register SV *sstr)
2581{
2582 sv_catsv(dstr,sstr);
2583 SvSETMAGIC(dstr);
2584}
2585
2586void
08105a92 2587sv_catpv(register SV *sv, register const char *ptr)
79072805
LW
2588{
2589 register STRLEN len;
463ee0b2 2590 STRLEN tlen;
748a9306 2591 char *junk;
79072805 2592
79072805
LW
2593 if (!ptr)
2594 return;
748a9306 2595 junk = SvPV_force(sv, tlen);
79072805 2596 len = strlen(ptr);
463ee0b2 2597 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2598 if (ptr == junk)
2599 ptr = SvPVX(sv);
463ee0b2 2600 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 2601 SvCUR(sv) += len;
a0d0e21e 2602 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2603 SvTAINT(sv);
79072805
LW
2604}
2605
ef50df4b 2606void
08105a92 2607sv_catpv_mg(register SV *sv, register const char *ptr)
ef50df4b 2608{
51c1089b 2609 sv_catpv(sv,ptr);
ef50df4b
GS
2610 SvSETMAGIC(sv);
2611}
2612
79072805 2613SV *
8ac85365 2614newSV(STRLEN len)
79072805
LW
2615{
2616 register SV *sv;
2617
4561caa4 2618 new_SV(sv);
79072805
LW
2619 if (len) {
2620 sv_upgrade(sv, SVt_PV);
2621 SvGROW(sv, len + 1);
2622 }
2623 return sv;
2624}
2625
1edc1566 2626/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2627
79072805 2628void
08105a92 2629sv_magic(register SV *sv, SV *obj, int how, const char *name, I32 namlen)
79072805
LW
2630{
2631 MAGIC* mg;
2632
0f15f207
MB
2633 if (SvREADONLY(sv)) {
2634 dTHR;
3280af22 2635 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
22c35a8c 2636 croak(PL_no_modify);
0f15f207 2637 }
4633a7c4 2638 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
2639 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2640 if (how == 't')
565764a8 2641 mg->mg_len |= 1;
463ee0b2 2642 return;
748a9306 2643 }
463ee0b2
LW
2644 }
2645 else {
c6f8c383 2646 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 2647 }
79072805
LW
2648 Newz(702,mg, 1, MAGIC);
2649 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 2650
79072805 2651 SvMAGIC(sv) = mg;
c277df42 2652 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 2653 mg->mg_obj = obj;
85e6fe83 2654 else {
11343788 2655 dTHR;
8990e307 2656 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
2657 mg->mg_flags |= MGf_REFCOUNTED;
2658 }
79072805 2659 mg->mg_type = how;
565764a8 2660 mg->mg_len = namlen;
1edc1566 2661 if (name)
2662 if (namlen >= 0)
2663 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 2664 else if (namlen == HEf_SVKEY)
1edc1566 2665 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2666
79072805
LW
2667 switch (how) {
2668 case 0:
22c35a8c 2669 mg->mg_virtual = &PL_vtbl_sv;
79072805 2670 break;
a0d0e21e 2671 case 'A':
22c35a8c 2672 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
2673 break;
2674 case 'a':
22c35a8c 2675 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
2676 break;
2677 case 'c':
2678 mg->mg_virtual = 0;
2679 break;
79072805 2680 case 'B':
22c35a8c 2681 mg->mg_virtual = &PL_vtbl_bm;
79072805 2682 break;
6cef1e77 2683 case 'D':
22c35a8c 2684 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
2685 break;
2686 case 'd':
22c35a8c 2687 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 2688 break;
79072805 2689 case 'E':
22c35a8c 2690 mg->mg_virtual = &PL_vtbl_env;
79072805 2691 break;
55497cff 2692 case 'f':
22c35a8c 2693 mg->mg_virtual = &PL_vtbl_fm;
55497cff 2694 break;
79072805 2695 case 'e':
22c35a8c 2696 mg->mg_virtual = &PL_vtbl_envelem;
79072805 2697 break;
93a17b20 2698 case 'g':
22c35a8c 2699 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 2700 break;
463ee0b2 2701 case 'I':
22c35a8c 2702 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
2703 break;
2704 case 'i':
22c35a8c 2705 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 2706 break;
16660edb 2707 case 'k':
22c35a8c 2708 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 2709 break;
79072805 2710 case 'L':
a0d0e21e 2711 SvRMAGICAL_on(sv);
93a17b20
LW
2712 mg->mg_virtual = 0;
2713 break;
2714 case 'l':
22c35a8c 2715 mg->mg_virtual = &PL_vtbl_dbline;
79072805 2716 break;
f93b4edd
MB
2717#ifdef USE_THREADS
2718 case 'm':
22c35a8c 2719 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
2720 break;
2721#endif /* USE_THREADS */
36477c24 2722#ifdef USE_LOCALE_COLLATE
bbce6d69 2723 case 'o':
22c35a8c 2724 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 2725 break;
36477c24 2726#endif /* USE_LOCALE_COLLATE */
463ee0b2 2727 case 'P':
22c35a8c 2728 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
2729 break;
2730 case 'p':
a0d0e21e 2731 case 'q':
22c35a8c 2732 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 2733 break;
c277df42 2734 case 'r':
22c35a8c 2735 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 2736 break;
79072805 2737 case 'S':
22c35a8c 2738 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
2739 break;
2740 case 's':
22c35a8c 2741 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 2742 break;
463ee0b2 2743 case 't':
22c35a8c 2744 mg->mg_virtual = &PL_vtbl_taint;
565764a8 2745 mg->mg_len = 1;
463ee0b2 2746 break;
79072805 2747 case 'U':
22c35a8c 2748 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
2749 break;
2750 case 'v':
22c35a8c 2751 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
2752 break;
2753 case 'x':
22c35a8c 2754 mg->mg_virtual = &PL_vtbl_substr;
79072805 2755 break;
5f05dabc 2756 case 'y':
22c35a8c 2757 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 2758 break;
79072805 2759 case '*':
22c35a8c 2760 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
2761 break;
2762 case '#':
22c35a8c 2763 mg->mg_virtual = &PL_vtbl_arylen;
79072805 2764 break;
a0d0e21e 2765 case '.':
22c35a8c 2766 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 2767 break;
810b8aa5
GS
2768 case '<':
2769 mg->mg_virtual = &PL_vtbl_backref;
2770 break;
4633a7c4
LW
2771 case '~': /* Reserved for use by extensions not perl internals. */
2772 /* Useful for attaching extension internal data to perl vars. */
2773 /* Note that multiple extensions may clash if magical scalars */
2774 /* etc holding private data from one are passed to another. */
2775 SvRMAGICAL_on(sv);
a0d0e21e 2776 break;
79072805 2777 default:
463ee0b2
LW
2778 croak("Don't know how to handle magic of type '%c'", how);
2779 }
8990e307
LW
2780 mg_magical(sv);
2781 if (SvGMAGICAL(sv))
2782 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
2783}
2784
2785int
8ac85365 2786sv_unmagic(SV *sv, int type)
463ee0b2
LW
2787{
2788 MAGIC* mg;
2789 MAGIC** mgp;
91bba347 2790 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
2791 return 0;
2792 mgp = &SvMAGIC(sv);
2793 for (mg = *mgp; mg; mg = *mgp) {
2794 if (mg->mg_type == type) {
2795 MGVTBL* vtbl = mg->mg_virtual;
2796 *mgp = mg->mg_moremagic;
76e3520e
GS
2797 if (vtbl && (vtbl->svt_free != NULL))
2798 (VTBL->svt_free)(sv, mg);
463ee0b2 2799 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 2800 if (mg->mg_len >= 0)
1edc1566 2801 Safefree(mg->mg_ptr);
565764a8 2802 else if (mg->mg_len == HEf_SVKEY)
1edc1566 2803 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
2804 if (mg->mg_flags & MGf_REFCOUNTED)
2805 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
2806 Safefree(mg);
2807 }
2808 else
2809 mgp = &mg->mg_moremagic;
79072805 2810 }
91bba347 2811 if (!SvMAGIC(sv)) {
463ee0b2 2812 SvMAGICAL_off(sv);
8990e307 2813 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
2814 }
2815
2816 return 0;
79072805
LW
2817}
2818
810b8aa5
GS
2819SV *
2820sv_rvweaken(SV *sv)
2821{
2822 SV *tsv;
2823 if (!SvOK(sv)) /* let undefs pass */
2824 return sv;
2825 if (!SvROK(sv))
2826 croak("Can't weaken a nonreference");
2827 else if (SvWEAKREF(sv)) {
2828 dTHR;
2829 if (ckWARN(WARN_MISC))
2830 warner(WARN_MISC, "Reference is already weak");
2831 return sv;
2832 }
2833 tsv = SvRV(sv);
2834 sv_add_backref(tsv, sv);
2835 SvWEAKREF_on(sv);
2836 SvREFCNT_dec(tsv);
2837 return sv;
2838}
2839
2840STATIC void
2841sv_add_backref(SV *tsv, SV *sv)
2842{
2843 AV *av;
2844 MAGIC *mg;
2845 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
2846 av = (AV*)mg->mg_obj;
2847 else {
2848 av = newAV();
2849 sv_magic(tsv, (SV*)av, '<', NULL, 0);
2850 SvREFCNT_dec(av); /* for sv_magic */
2851 }
2852 av_push(av,sv);
2853}
2854
2855STATIC void
2856sv_del_backref(SV *sv)
2857{
2858 AV *av;
2859 SV **svp;
2860 I32 i;
2861 SV *tsv = SvRV(sv);
2862 MAGIC *mg;
2863 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
2864 croak("panic: del_backref");
2865 av = (AV *)mg->mg_obj;
2866 svp = AvARRAY(av);
2867 i = AvFILLp(av);
2868 while (i >= 0) {
2869 if (svp[i] == sv) {
2870 svp[i] = &PL_sv_undef; /* XXX */
2871 }
2872 i--;
2873 }
2874}
2875
79072805 2876void
8ac85365 2877sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
2878{
2879 register char *big;
2880 register char *mid;
2881 register char *midend;
2882 register char *bigend;
2883 register I32 i;
6ff81951
GS
2884 STRLEN curlen;
2885
79072805 2886
8990e307
LW
2887 if (!bigstr)
2888 croak("Can't modify non-existent substring");
6ff81951
GS
2889 SvPV_force(bigstr, curlen);
2890 if (offset + len > curlen) {
2891 SvGROW(bigstr, offset+len+1);
2892 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2893 SvCUR_set(bigstr, offset+len);
2894 }
79072805
LW
2895
2896 i = littlelen - len;
2897 if (i > 0) { /* string might grow */
a0d0e21e 2898 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
2899 mid = big + offset + len;
2900 midend = bigend = big + SvCUR(bigstr);
2901 bigend += i;
2902 *bigend = '\0';
2903 while (midend > mid) /* shove everything down */
2904 *--bigend = *--midend;
2905 Move(little,big+offset,littlelen,char);
2906 SvCUR(bigstr) += i;
2907 SvSETMAGIC(bigstr);
2908 return;
2909 }
2910 else if (i == 0) {
463ee0b2 2911 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
2912 SvSETMAGIC(bigstr);
2913 return;
2914 }
2915
463ee0b2 2916 big = SvPVX(bigstr);
79072805
LW
2917 mid = big + offset;
2918 midend = mid + len;
2919 bigend = big + SvCUR(bigstr);
2920
2921 if (midend > bigend)
463ee0b2 2922 croak("panic: sv_insert");
79072805
LW
2923
2924 if (mid - big > bigend - midend) { /* faster to shorten from end */
2925 if (littlelen) {
2926 Move(little, mid, littlelen,char);
2927 mid += littlelen;
2928 }
2929 i = bigend - midend;
2930 if (i > 0) {
2931 Move(midend, mid, i,char);
2932 mid += i;
2933 }
2934 *mid = '\0';
2935 SvCUR_set(bigstr, mid - big);
2936 }
2937 /*SUPPRESS 560*/
2938 else if (i = mid - big) { /* faster from front */
2939 midend -= littlelen;
2940 mid = midend;
2941 sv_chop(bigstr,midend-i);
2942 big += i;
2943 while (i--)
2944 *--midend = *--big;
2945 if (littlelen)
2946 Move(little, mid, littlelen,char);
2947 }
2948 else if (littlelen) {
2949 midend -= littlelen;
2950 sv_chop(bigstr,midend);
2951 Move(little,midend,littlelen,char);
2952 }
2953 else {
2954 sv_chop(bigstr,midend);
2955 }
2956 SvSETMAGIC(bigstr);
2957}
2958
2959/* make sv point to what nstr did */
2960
2961void
8ac85365 2962sv_replace(register SV *sv, register SV *nsv)
79072805
LW
2963{
2964 U32 refcnt = SvREFCNT(sv);
2213622d 2965 SV_CHECK_THINKFIRST(sv);
79072805
LW
2966 if (SvREFCNT(nsv) != 1)
2967 warn("Reference miscount in sv_replace()");
93a17b20 2968 if (SvMAGICAL(sv)) {
a0d0e21e
LW
2969 if (SvMAGICAL(nsv))
2970 mg_free(nsv);
2971 else
2972 sv_upgrade(nsv, SVt_PVMG);
93a17b20 2973 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 2974 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
2975 SvMAGICAL_off(sv);
2976 SvMAGIC(sv) = 0;
2977 }
79072805
LW
2978 SvREFCNT(sv) = 0;
2979 sv_clear(sv);
477f5d66 2980 assert(!SvREFCNT(sv));
79072805
LW
2981 StructCopy(nsv,sv,SV);
2982 SvREFCNT(sv) = refcnt;
1edc1566 2983 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 2984 del_SV(nsv);
79072805
LW
2985}
2986
2987void
8ac85365 2988sv_clear(register SV *sv)
79072805 2989{
ec12f114 2990 HV* stash;
79072805
LW
2991 assert(sv);
2992 assert(SvREFCNT(sv) == 0);
2993
ed6116ce 2994 if (SvOBJECT(sv)) {
e858de61 2995 dTHR;
3280af22 2996 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 2997 djSP;
8ebc5c01 2998 GV* destructor;
837485b6 2999 SV tmpref;
a0d0e21e 3000
837485b6
GS
3001 Zero(&tmpref, 1, SV);
3002 sv_upgrade(&tmpref, SVt_RV);
3003 SvROK_on(&tmpref);
3004 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
3005 SvREFCNT(&tmpref) = 1;
8ebc5c01 3006
4e8e7886
GS
3007 do {
3008 stash = SvSTASH(sv);
3009 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3010 if (destructor) {
3011 ENTER;
e788e7d3 3012 PUSHSTACKi(PERLSI_DESTROY);
837485b6 3013 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
3014 EXTEND(SP, 2);
3015 PUSHMARK(SP);
837485b6 3016 PUSHs(&tmpref);
4e8e7886
GS
3017 PUTBACK;
3018 perl_call_sv((SV*)GvCV(destructor),
3019 G_DISCARD|G_EVAL|G_KEEPERR);
3020 SvREFCNT(sv)--;
d3acc0f7 3021 POPSTACK;
3095d977 3022 SPAGAIN;
4e8e7886
GS
3023 LEAVE;
3024 }
3025 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 3026
837485b6 3027 del_XRV(SvANY(&tmpref));
6f44e0a4
JP
3028
3029 if (SvREFCNT(sv)) {
3030 if (PL_in_clean_objs)
3031 croak("DESTROY created new reference to dead object '%s'",
3032 HvNAME(stash));
3033 /* DESTROY gave object new lease on life */
3034 return;
3035 }
a0d0e21e 3036 }
4e8e7886 3037
a0d0e21e 3038 if (SvOBJECT(sv)) {
4e8e7886 3039 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
3040 SvOBJECT_off(sv); /* Curse the object. */
3041 if (SvTYPE(sv) != SVt_PVIO)
3280af22 3042 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 3043 }
463ee0b2 3044 }
c07a80fd 3045 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 3046 mg_free(sv);
ec12f114 3047 stash = NULL;
79072805 3048 switch (SvTYPE(sv)) {
8990e307 3049 case SVt_PVIO:
df0bd2f4
GS
3050 if (IoIFP(sv) &&
3051 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 3052 IoIFP(sv) != PerlIO_stdout() &&
3053 IoIFP(sv) != PerlIO_stderr())
93578b34 3054 {
5f05dabc 3055 io_close((IO*)sv);
93578b34 3056 }
1236053a
GS
3057 if (IoDIRP(sv)) {
3058 PerlDir_close(IoDIRP(sv));
3059 IoDIRP(sv) = 0;
93578b34 3060 }
8990e307
LW
3061 Safefree(IoTOP_NAME(sv));
3062 Safefree(IoFMT_NAME(sv));
3063 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 3064 /* FALL THROUGH */
79072805 3065 case SVt_PVBM:
a0d0e21e 3066 goto freescalar;
79072805 3067 case SVt_PVCV:
748a9306 3068 case SVt_PVFM:
85e6fe83 3069 cv_undef((CV*)sv);
a0d0e21e 3070 goto freescalar;
79072805 3071 case SVt_PVHV:
85e6fe83 3072 hv_undef((HV*)sv);
a0d0e21e 3073 break;
79072805 3074 case SVt_PVAV:
85e6fe83 3075 av_undef((AV*)sv);
a0d0e21e 3076 break;
02270b4e
GS
3077 case SVt_PVLV:
3078 SvREFCNT_dec(LvTARG(sv));
3079 goto freescalar;
a0d0e21e 3080 case SVt_PVGV:
1edc1566 3081 gp_free((GV*)sv);
a0d0e21e 3082 Safefree(GvNAME(sv));
ec12f114
JPC
3083 /* cannot decrease stash refcount yet, as we might recursively delete
3084 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3085 of stash until current sv is completely gone.
3086 -- JohnPC, 27 Mar 1998 */
3087 stash = GvSTASH(sv);
a0d0e21e 3088 /* FALL THROUGH */
79072805 3089 case SVt_PVMG:
79072805
LW
3090 case SVt_PVNV:
3091 case SVt_PVIV:
a0d0e21e
LW
3092 freescalar:
3093 (void)SvOOK_off(sv);
79072805
LW
3094 /* FALL THROUGH */
3095 case SVt_PV:
a0d0e21e 3096 case SVt_RV:
810b8aa5
GS
3097 if (SvROK(sv)) {
3098 if (SvWEAKREF(sv))
3099 sv_del_backref(sv);
3100 else
3101 SvREFCNT_dec(SvRV(sv));
3102 }
1edc1566 3103 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 3104 Safefree(SvPVX(sv));
79072805 3105 break;
a0d0e21e 3106/*
79072805 3107 case SVt_NV:
79072805 3108 case SVt_IV:
79072805
LW
3109 case SVt_NULL:
3110 break;
a0d0e21e 3111*/
79072805
LW
3112 }
3113
3114 switch (SvTYPE(sv)) {
3115 case SVt_NULL:
3116 break;
79072805
LW
3117 case SVt_IV:
3118 del_XIV(SvANY(sv));
3119 break;
3120 case SVt_NV:
3121 del_XNV(SvANY(sv));
3122 break;
ed6116ce
LW
3123 case SVt_RV:
3124 del_XRV(SvANY(sv));
3125 break;
79072805
LW
3126 case SVt_PV:
3127 del_XPV(SvANY(sv));
3128 break;
3129 case SVt_PVIV:
3130 del_XPVIV(SvANY(sv));
3131 break;
3132 case SVt_PVNV:
3133 del_XPVNV(SvANY(sv));
3134 break;
3135 case SVt_PVMG:
3136 del_XPVMG(SvANY(sv));
3137 break;
3138 case SVt_PVLV:
3139 del_XPVLV(SvANY(sv));
3140 break;
3141 case SVt_PVAV:
3142 del_XPVAV(SvANY(sv));
3143 break;
3144 case SVt_PVHV:
3145 del_XPVHV(SvANY(sv));
3146 break;
3147 case SVt_PVCV:
3148 del_XPVCV(SvANY(sv));
3149 break;
3150 case SVt_PVGV:
3151 del_XPVGV(SvANY(sv));
ec12f114
JPC
3152 /* code duplication for increased performance. */
3153 SvFLAGS(sv) &= SVf_BREAK;
3154 SvFLAGS(sv) |= SVTYPEMASK;
3155 /* decrease refcount of the stash that owns this GV, if any */
3156 if (stash)
3157 SvREFCNT_dec(stash);
3158 return; /* not break, SvFLAGS reset already happened */
79072805
LW
3159 case SVt_PVBM:
3160 del_XPVBM(SvANY(sv));
3161 break;
3162 case SVt_PVFM:
3163 del_XPVFM(SvANY(sv));
3164 break;
8990e307
LW
3165 case SVt_PVIO:
3166 del_XPVIO(SvANY(sv));
3167 break;
79072805 3168 }
a0d0e21e 3169 SvFLAGS(sv) &= SVf_BREAK;
8990e307 3170 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
3171}
3172
3173SV *
8ac85365 3174sv_newref(SV *sv)
79072805 3175{
463ee0b2 3176 if (sv)
dce16143 3177 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
3178 return sv;
3179}
3180
3181void
8ac85365 3182sv_free(SV *sv)
79072805 3183{
dce16143
MB
3184 int refcount_is_zero;
3185
79072805
LW
3186 if (!sv)
3187 return;
a0d0e21e
LW
3188 if (SvREFCNT(sv) == 0) {
3189 if (SvFLAGS(sv) & SVf_BREAK)
3190 return;
3280af22 3191 if (PL_in_clean_all) /* All is fair */
1edc1566 3192 return;
d689ffdd
JP
3193 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3194 /* make sure SvREFCNT(sv)==0 happens very seldom */
3195 SvREFCNT(sv) = (~(U32)0)/2;
3196 return;
3197 }
79072805
LW
3198 warn("Attempt to free unreferenced scalar");
3199 return;
3200 }
dce16143
MB
3201 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3202 if (!refcount_is_zero)
8990e307 3203 return;
463ee0b2
LW
3204#ifdef DEBUGGING
3205 if (SvTEMP(sv)) {
7f20e9dd 3206 warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
79072805 3207 return;
79072805 3208 }
463ee0b2 3209#endif
d689ffdd
JP
3210 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3211 /* make sure SvREFCNT(sv)==0 happens very seldom */
3212 SvREFCNT(sv) = (~(U32)0)/2;
3213 return;
3214 }
79072805 3215 sv_clear(sv);
477f5d66
CS
3216 if (! SvREFCNT(sv))
3217 del_SV(sv);
79072805
LW
3218}
3219
3220STRLEN
8ac85365 3221sv_len(register SV *sv)
79072805 3222{
748a9306 3223 char *junk;
463ee0b2 3224 STRLEN len;
79072805
LW
3225
3226 if (!sv)
3227 return 0;
3228
8990e307 3229 if (SvGMAGICAL(sv))
565764a8 3230 len = mg_length(sv);
8990e307 3231 else
748a9306 3232 junk = SvPV(sv, len);
463ee0b2 3233 return len;
79072805
LW
3234}
3235
a0ed51b3
LW
3236STRLEN
3237sv_len_utf8(register SV *sv)
3238{
dfe13c55
GS
3239 U8 *s;
3240 U8 *send;
a0ed51b3
LW
3241 STRLEN len;
3242
3243 if (!sv)
3244 return 0;
3245
3246#ifdef NOTYET
3247 if (SvGMAGICAL(sv))
3248 len = mg_length(sv);
3249 else
3250#endif
dfe13c55 3251 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3252 send = s + len;
3253 len = 0;
3254 while (s < send) {
3255 s += UTF8SKIP(s);
3256 len++;
3257 }
3258 return len;
3259}
3260
3261void
3262sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
3263{
dfe13c55
GS
3264 U8 *start;
3265 U8 *s;
3266 U8 *send;
a0ed51b3
LW
3267 I32 uoffset = *offsetp;
3268 STRLEN len;
3269
3270 if (!sv)
3271 return;
3272
dfe13c55 3273 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3274 send = s + len;
3275 while (s < send && uoffset--)
3276 s += UTF8SKIP(s);
bb40f870
GA
3277 if (s >= send)
3278 s = send;
a0ed51b3
LW
3279 *offsetp = s - start;
3280 if (lenp) {
3281 I32 ulen = *lenp;
3282 start = s;
3283 while (s < send && ulen--)
3284 s += UTF8SKIP(s);
bb40f870
GA
3285 if (s >= send)
3286 s = send;
a0ed51b3
LW
3287 *lenp = s - start;
3288 }
3289 return;
3290}
3291
3292void
3293sv_pos_b2u(register SV *sv, I32* offsetp)
3294{
dfe13c55
GS
3295 U8 *s;
3296 U8 *send;
a0ed51b3
LW
3297 STRLEN len;
3298
3299 if (!sv)
3300 return;
3301
dfe13c55 3302 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3303 if (len < *offsetp)
3304 croak("panic: bad byte offset");
3305 send = s + *offsetp;
3306 len = 0;
3307 while (s < send) {
3308 s += UTF8SKIP(s);
3309 ++len;
3310 }
3311 if (s != send) {
3312 warn("Malformed UTF-8 character");
3313 --len;
3314 }
3315 *offsetp = len;
3316 return;
3317}
3318
79072805 3319I32
8ac85365 3320sv_eq(register SV *str1, register SV *str2)
79072805
LW
3321{
3322 char *pv1;
463ee0b2 3323 STRLEN cur1;
79072805 3324 char *pv2;
463ee0b2 3325 STRLEN cur2;
79072805
LW
3326
3327 if (!str1) {
3328 pv1 = "";
3329 cur1 = 0;
3330 }
463ee0b2
LW
3331 else
3332 pv1 = SvPV(str1, cur1);
79072805
LW
3333
3334 if (!str2)
3335 return !cur1;
463ee0b2
LW
3336 else
3337 pv2 = SvPV(str2, cur2);
79072805
LW
3338
3339 if (cur1 != cur2)
3340 return 0;
3341
36477c24 3342 return memEQ(pv1, pv2, cur1);
79072805
LW
3343}
3344
3345I32
8ac85365 3346sv_cmp(register SV *str1, register SV *str2)
79072805 3347{
bbce6d69 3348 STRLEN cur1 = 0;
8ac85365 3349 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
bbce6d69 3350 STRLEN cur2 = 0;
8ac85365 3351 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
79072805 3352 I32 retval;
79072805 3353
bbce6d69 3354 if (!cur1)
3355 return cur2 ? -1 : 0;
16660edb 3356
bbce6d69 3357 if (!cur2)
3358 return 1;
79072805 3359
bbce6d69 3360 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
16660edb 3361
bbce6d69 3362 if (retval)
3363 return retval < 0 ? -1 : 1;
16660edb 3364
bbce6d69 3365 if (cur1 == cur2)
3366 return 0;
3367 else
3368 return cur1 < cur2 ? -1 : 1;
3369}
16660edb 3370
bbce6d69 3371I32
8ac85365 3372sv_cmp_locale(register SV *sv1, register SV *sv2)
bbce6d69 3373{
36477c24 3374#ifdef USE_LOCALE_COLLATE
16660edb 3375
bbce6d69 3376 char *pv1, *pv2;
3377 STRLEN len1, len2;
3378 I32 retval;
16660edb 3379
3280af22 3380 if (PL_collation_standard)
bbce6d69 3381 goto raw_compare;
16660edb 3382
bbce6d69 3383 len1 = 0;
8ac85365 3384 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 3385 len2 = 0;
8ac85365 3386 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 3387
bbce6d69 3388 if (!pv1 || !len1) {
3389 if (pv2 && len2)
3390 return -1;
3391 else
3392 goto raw_compare;
3393 }
3394 else {
3395 if (!pv2 || !len2)
3396 return 1;
3397 }
16660edb 3398
bbce6d69 3399 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 3400
bbce6d69 3401 if (retval)
16660edb 3402 return retval < 0 ? -1 : 1;
3403
bbce6d69 3404 /*
3405 * When the result of collation is equality, that doesn't mean
3406 * that there are no differences -- some locales exclude some
3407 * characters from consideration. So to avoid false equalities,
3408 * we use the raw string as a tiebreaker.
3409 */
16660edb 3410
bbce6d69 3411 raw_compare:
3412 /* FALL THROUGH */
16660edb 3413
36477c24 3414#endif /* USE_LOCALE_COLLATE */
16660edb 3415
bbce6d69 3416 return sv_cmp(sv1, sv2);
3417}
79072805 3418
36477c24 3419#ifdef USE_LOCALE_COLLATE
7a4c00b4 3420/*
3421 * Any scalar variable may carry an 'o' magic that contains the
3422 * scalar data of the variable transformed to such a format that
3423 * a normal memory comparison can be used to compare the data
3424 * according to the locale settings.
3425 */
bbce6d69 3426char *
8ac85365 3427sv_collxfrm(SV *sv, STRLEN *nxp)
bbce6d69 3428{
7a4c00b4 3429 MAGIC *mg;
16660edb 3430
8ac85365 3431 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 3432 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 3433 char *s, *xf;
3434 STRLEN len, xlen;
3435
7a4c00b4 3436 if (mg)
3437 Safefree(mg->mg_ptr);
bbce6d69 3438 s = SvPV(sv, len);
3439 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 3440 if (SvREADONLY(sv)) {
3441 SAVEFREEPV(xf);
3442 *nxp = xlen;
3280af22 3443 return xf + sizeof(PL_collation_ix);
ff0cee69 3444 }
7a4c00b4 3445 if (! mg) {
3446 sv_magic(sv, 0, 'o', 0, 0);
3447 mg = mg_find(sv, 'o');
3448 assert(mg);
bbce6d69 3449 }
7a4c00b4 3450 mg->mg_ptr = xf;
565764a8 3451 mg->mg_len = xlen;
7a4c00b4 3452 }
3453 else {
ff0cee69 3454 if (mg) {
3455 mg->mg_ptr = NULL;
565764a8 3456 mg->mg_len = -1;
ff0cee69 3457 }
bbce6d69 3458 }
3459 }
7a4c00b4 3460 if (mg && mg->mg_ptr) {
565764a8 3461 *nxp = mg->mg_len;
3280af22 3462 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 3463 }
3464 else {
3465 *nxp = 0;
3466 return NULL;
16660edb 3467 }
79072805
LW
3468}
3469
36477c24 3470#endif /* USE_LOCALE_COLLATE */
bbce6d69 3471
79072805 3472char *
76e3520e 3473sv_gets(register SV *sv, register PerlIO *fp, I32 append)
79072805 3474{
aeea060c 3475 dTHR;
c07a80fd 3476 char *rsptr;
3477 STRLEN rslen;
3478 register STDCHAR rslast;
3479 register STDCHAR *bp;
3480 register I32 cnt;
3481 I32 i;
3482
2213622d 3483 SV_CHECK_THINKFIRST(sv);
6fc92669 3484 (void)SvUPGRADE(sv, SVt_PV);
99491443 3485
ff68c719 3486 SvSCREAM_off(sv);
c07a80fd 3487
3280af22 3488 if (RsSNARF(PL_rs)) {
c07a80fd 3489 rsptr = NULL;
3490 rslen = 0;
3491 }
3280af22 3492 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
3493 I32 recsize, bytesread;
3494 char *buffer;
3495
3496 /* Grab the size of the record we're getting */
3280af22 3497 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 3498 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 3499 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
3500 /* Go yank in */
3501#ifdef VMS
3502 /* VMS wants read instead of fread, because fread doesn't respect */
3503 /* RMS record boundaries. This is not necessarily a good thing to be */
3504 /* doing, but we've got no other real choice */
3505 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3506#else
3507 bytesread = PerlIO_read(fp, buffer, recsize);
3508#endif
3509 SvCUR_set(sv, bytesread);
e670df4e 3510 buffer[bytesread] = '\0';
5b2b9c68
HM
3511 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3512 }
3280af22 3513 else if (RsPARA(PL_rs)) {
c07a80fd 3514 rsptr = "\n\n";
3515 rslen = 2;
3516 }
3517 else
3280af22 3518 rsptr = SvPV(PL_rs, rslen);
c07a80fd 3519 rslast = rslen ? rsptr[rslen - 1] : '\0';
3520
3280af22 3521 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 3522 do { /* to make sure file boundaries work right */
760ac839 3523 if (PerlIO_eof(fp))
a0d0e21e 3524 return 0;
760ac839 3525 i = PerlIO_getc(fp);
79072805 3526 if (i != '\n') {
a0d0e21e
LW
3527 if (i == -1)
3528 return 0;
760ac839 3529 PerlIO_ungetc(fp,i);
79072805
LW
3530 break;
3531 }
3532 } while (i != EOF);
3533 }
c07a80fd 3534
760ac839
LW
3535 /* See if we know enough about I/O mechanism to cheat it ! */
3536
3537 /* This used to be #ifdef test - it is made run-time test for ease
3538 of abstracting out stdio interface. One call should be cheap
3539 enough here - and may even be a macro allowing compile
3540 time optimization.
3541 */
3542
3543 if (PerlIO_fast_gets(fp)) {
3544
3545 /*
3546 * We're going to steal some values from the stdio struct
3547 * and put EVERYTHING in the innermost loop into registers.
3548 */
3549 register STDCHAR *ptr;
3550 STRLEN bpx;
3551 I32 shortbuffered;
3552
16660edb 3553#if defined(VMS) && defined(PERLIO_IS_STDIO)
3554 /* An ungetc()d char is handled separately from the regular
3555 * buffer, so we getc() it back out and stuff it in the buffer.
3556 */
3557 i = PerlIO_getc(fp);
3558 if (i == EOF) return 0;
3559 *(--((*fp)->_ptr)) = (unsigned char) i;
3560 (*fp)->_cnt++;
3561#endif
c07a80fd 3562
c2960299 3563 /* Here is some breathtakingly efficient cheating */
c07a80fd 3564
760ac839 3565 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 3566 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
3567 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3568 if (cnt > 80 && SvLEN(sv) > append) {
3569 shortbuffered = cnt - SvLEN(sv) + append + 1;
3570 cnt -= shortbuffered;
3571 }
3572 else {
3573 shortbuffered = 0;
bbce6d69 3574 /* remember that cnt can be negative */
3575 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
3576 }
3577 }
3578 else
3579 shortbuffered = 0;
c07a80fd 3580 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
760ac839 3581 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 3582 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3583 "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
16660edb 3584 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3585 "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3586 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3587 (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
3588 for (;;) {
3589 screamer:
93a17b20 3590 if (cnt > 0) {
c07a80fd 3591 if (rslen) {
760ac839
LW
3592 while (cnt > 0) { /* this | eat */
3593 cnt--;
c07a80fd 3594 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3595 goto thats_all_folks; /* screams | sed :-) */
3596 }
3597 }
3598 else {
36477c24 3599 Copy(ptr, bp, cnt, char); /* this | eat */
c07a80fd 3600 bp += cnt; /* screams | dust */
3601 ptr += cnt; /* louder | sed :-) */
a5f75d66 3602 cnt = 0;
93a17b20 3603 }
79072805
LW
3604 }
3605
748a9306 3606 if (shortbuffered) { /* oh well, must extend */
79072805
LW
3607 cnt = shortbuffered;
3608 shortbuffered = 0;
c07a80fd 3609 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3610 SvCUR_set(sv, bpx);
3611 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 3612 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
3613 continue;
3614 }
3615
16660edb 3616 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3617 "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3618 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 3619 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3620 "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3621 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3622 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
16660edb 3623 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 3624 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3625 another abstraction. */
760ac839 3626 i = PerlIO_getc(fp); /* get more characters */
16660edb 3627 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3628 "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3629 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3630 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
760ac839
LW
3631 cnt = PerlIO_get_cnt(fp);
3632 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 3633 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3634 "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
79072805 3635
748a9306
LW
3636 if (i == EOF) /* all done for ever? */
3637 goto thats_really_all_folks;
3638
c07a80fd 3639 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3640 SvCUR_set(sv, bpx);
3641 SvGROW(sv, bpx + cnt + 2);
c07a80fd 3642 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3643
760ac839 3644 *bp++ = i; /* store character from PerlIO_getc */
79072805 3645
c07a80fd 3646 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 3647 goto thats_all_folks;
79072805
LW
3648 }
3649
3650thats_all_folks:
c07a80fd 3651 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 3652 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 3653 goto screamer; /* go back to the fray */
79072805
LW
3654thats_really_all_folks:
3655 if (shortbuffered)
3656 cnt += shortbuffered;
16660edb 3657 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3658 "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3659 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 3660 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3661 "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3662 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3663 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 3664 *bp = '\0';
760ac839 3665 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 3666 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 3667 "Screamer: done, len=%ld, string=|%.*s|\n",
3668 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
3669 }
3670 else
79072805 3671 {
760ac839 3672 /*The big, slow, and stupid way */
c07a80fd 3673 STDCHAR buf[8192];
79072805