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