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