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