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