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