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