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