perl 5.003_03: hints/sunos_4_1.sh
[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                 PerlIO_printf(PerlIO_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((PerlIO_printf(PerlIO_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((PerlIO_printf(PerlIO_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((PerlIO_printf(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         PerlIO_printf(PerlIO_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(PerlIO_printf(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(PerlIO_printf(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(PerlIO_printf(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(PerlIO_printf(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                 (void)SvOOK_off(dstr);          /* backoff */
1717                 Safefree(SvPVX(dstr));
1718                 SvLEN(dstr)=SvCUR(dstr)=0;
1719             }
1720         }
1721         (void)SvOK_off(dstr);
1722         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
1723         SvROK_on(dstr);
1724         if (sflags & SVp_NOK) {
1725             SvNOK_on(dstr);
1726             SvNVX(dstr) = SvNVX(sstr);
1727         }
1728         if (sflags & SVp_IOK) {
1729             (void)SvIOK_on(dstr);
1730             SvIVX(dstr) = SvIVX(sstr);
1731         }
1732 #ifdef OVERLOAD
1733         if (SvAMAGIC(sstr)) {
1734             SvAMAGIC_on(dstr);
1735         }
1736 #endif /* OVERLOAD */
1737     }
1738     else if (sflags & SVp_POK) {
1739
1740         /*
1741          * Check to see if we can just swipe the string.  If so, it's a
1742          * possible small lose on short strings, but a big win on long ones.
1743          * It might even be a win on short strings if SvPVX(dstr)
1744          * has to be allocated and SvPVX(sstr) has to be freed.
1745          */
1746
1747         if (SvTEMP(sstr) &&             /* slated for free anyway? */
1748             !(sflags & SVf_OOK))        /* and not involved in OOK hack? */
1749         {
1750             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
1751                 if (SvOOK(dstr)) {
1752                     SvFLAGS(dstr) &= ~SVf_OOK;
1753                     Safefree(SvPVX(dstr) - SvIVX(dstr));
1754                 }
1755                 else
1756                     Safefree(SvPVX(dstr));
1757             }
1758             (void)SvPOK_only(dstr);
1759             SvPV_set(dstr, SvPVX(sstr));
1760             SvLEN_set(dstr, SvLEN(sstr));
1761             SvCUR_set(dstr, SvCUR(sstr));
1762             SvTEMP_off(dstr);
1763             (void)SvOK_off(sstr);
1764             SvPV_set(sstr, Nullch);
1765             SvLEN_set(sstr, 0);
1766             SvCUR_set(sstr, 0);
1767             SvTEMP_off(sstr);
1768         }
1769         else {                                  /* have to copy actual string */
1770             STRLEN len = SvCUR(sstr);
1771
1772             SvGROW(dstr, len + 1);              /* inlined from sv_setpvn */
1773             Move(SvPVX(sstr),SvPVX(dstr),len,char);
1774             SvCUR_set(dstr, len);
1775             *SvEND(dstr) = '\0';
1776             (void)SvPOK_only(dstr);
1777         }
1778         /*SUPPRESS 560*/
1779         if (sflags & SVp_NOK) {
1780             SvNOK_on(dstr);
1781             SvNVX(dstr) = SvNVX(sstr);
1782         }
1783         if (sflags & SVp_IOK) {
1784             (void)SvIOK_on(dstr);
1785             SvIVX(dstr) = SvIVX(sstr);
1786         }
1787     }
1788     else if (sflags & SVp_NOK) {
1789         SvNVX(dstr) = SvNVX(sstr);
1790         (void)SvNOK_only(dstr);
1791         if (SvIOK(sstr)) {
1792             (void)SvIOK_on(dstr);
1793             SvIVX(dstr) = SvIVX(sstr);
1794         }
1795     }
1796     else if (sflags & SVp_IOK) {
1797         (void)SvIOK_only(dstr);
1798         SvIVX(dstr) = SvIVX(sstr);
1799     }
1800     else {
1801         (void)SvOK_off(dstr);
1802     }
1803     SvTAINT(dstr);
1804 }
1805
1806 void
1807 sv_setpvn(sv,ptr,len)
1808 register SV *sv;
1809 register char *ptr;
1810 register STRLEN len;
1811 {
1812     assert(len >= 0);
1813     if (SvTHINKFIRST(sv)) {
1814         if (SvREADONLY(sv) && curcop != &compiling)
1815             croak(no_modify);
1816         if (SvROK(sv))
1817             sv_unref(sv);
1818     }
1819     if (!ptr) {
1820         (void)SvOK_off(sv);
1821         return;
1822     }
1823     if (SvTYPE(sv) >= SVt_PV) {
1824         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
1825             sv_unglob(sv);
1826     }
1827     else if (!sv_upgrade(sv, SVt_PV))
1828         return;
1829     SvGROW(sv, len + 1);
1830     Move(ptr,SvPVX(sv),len,char);
1831     SvCUR_set(sv, len);
1832     *SvEND(sv) = '\0';
1833     (void)SvPOK_only(sv);               /* validate pointer */
1834     SvTAINT(sv);
1835 }
1836
1837 void
1838 sv_setpv(sv,ptr)
1839 register SV *sv;
1840 register char *ptr;
1841 {
1842     register STRLEN len;
1843
1844     if (SvTHINKFIRST(sv)) {
1845         if (SvREADONLY(sv) && curcop != &compiling)
1846             croak(no_modify);
1847         if (SvROK(sv))
1848             sv_unref(sv);
1849     }
1850     if (!ptr) {
1851         (void)SvOK_off(sv);
1852         return;
1853     }
1854     len = strlen(ptr);
1855     if (SvTYPE(sv) >= SVt_PV) {
1856         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
1857             sv_unglob(sv);
1858     }
1859     else if (!sv_upgrade(sv, SVt_PV))
1860         return;
1861     SvGROW(sv, len + 1);
1862     Move(ptr,SvPVX(sv),len+1,char);
1863     SvCUR_set(sv, len);
1864     (void)SvPOK_only(sv);               /* validate pointer */
1865     SvTAINT(sv);
1866 }
1867
1868 void
1869 sv_usepvn(sv,ptr,len)
1870 register SV *sv;
1871 register char *ptr;
1872 register STRLEN len;
1873 {
1874     if (SvTHINKFIRST(sv)) {
1875         if (SvREADONLY(sv) && curcop != &compiling)
1876             croak(no_modify);
1877         if (SvROK(sv))
1878             sv_unref(sv);
1879     }
1880     if (!SvUPGRADE(sv, SVt_PV))
1881         return;
1882     if (!ptr) {
1883         (void)SvOK_off(sv);
1884         return;
1885     }
1886     if (SvPVX(sv))
1887         Safefree(SvPVX(sv));
1888     Renew(ptr, len+1, char);
1889     SvPVX(sv) = ptr;
1890     SvCUR_set(sv, len);
1891     SvLEN_set(sv, len+1);
1892     *SvEND(sv) = '\0';
1893     (void)SvPOK_only(sv);               /* validate pointer */
1894     SvTAINT(sv);
1895 }
1896
1897 void
1898 sv_chop(sv,ptr) /* like set but assuming ptr is in sv */
1899 register SV *sv;
1900 register char *ptr;
1901 {
1902     register STRLEN delta;
1903
1904     if (!ptr || !SvPOKp(sv))
1905         return;
1906     if (SvTHINKFIRST(sv)) {
1907         if (SvREADONLY(sv) && curcop != &compiling)
1908             croak(no_modify);
1909         if (SvROK(sv))
1910             sv_unref(sv);
1911     }
1912     if (SvTYPE(sv) < SVt_PVIV)
1913         sv_upgrade(sv,SVt_PVIV);
1914
1915     if (!SvOOK(sv)) {
1916         SvIVX(sv) = 0;
1917         SvFLAGS(sv) |= SVf_OOK;
1918     }
1919     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
1920     delta = ptr - SvPVX(sv);
1921     SvLEN(sv) -= delta;
1922     SvCUR(sv) -= delta;
1923     SvPVX(sv) += delta;
1924     SvIVX(sv) += delta;
1925 }
1926
1927 void
1928 sv_catpvn(sv,ptr,len)
1929 register SV *sv;
1930 register char *ptr;
1931 register STRLEN len;
1932 {
1933     STRLEN tlen;
1934     char *junk;
1935
1936     junk = SvPV_force(sv, tlen);
1937     SvGROW(sv, tlen + len + 1);
1938     if (ptr == junk)
1939         ptr = SvPVX(sv);
1940     Move(ptr,SvPVX(sv)+tlen,len,char);
1941     SvCUR(sv) += len;
1942     *SvEND(sv) = '\0';
1943     (void)SvPOK_only(sv);               /* validate pointer */
1944     SvTAINT(sv);
1945 }
1946
1947 void
1948 sv_catsv(dstr,sstr)
1949 SV *dstr;
1950 register SV *sstr;
1951 {
1952     char *s;
1953     STRLEN len;
1954     if (!sstr)
1955         return;
1956     if (s = SvPV(sstr, len))
1957         sv_catpvn(dstr,s,len);
1958 }
1959
1960 void
1961 sv_catpv(sv,ptr)
1962 register SV *sv;
1963 register char *ptr;
1964 {
1965     register STRLEN len;
1966     STRLEN tlen;
1967     char *junk;
1968
1969     if (!ptr)
1970         return;
1971     junk = SvPV_force(sv, tlen);
1972     len = strlen(ptr);
1973     SvGROW(sv, tlen + len + 1);
1974     if (ptr == junk)
1975         ptr = SvPVX(sv);
1976     Move(ptr,SvPVX(sv)+tlen,len+1,char);
1977     SvCUR(sv) += len;
1978     (void)SvPOK_only(sv);               /* validate pointer */
1979     SvTAINT(sv);
1980 }
1981
1982 SV *
1983 #ifdef LEAKTEST
1984 newSV(x,len)
1985 I32 x;
1986 #else
1987 newSV(len)
1988 #endif
1989 STRLEN len;
1990 {
1991     register SV *sv;
1992     
1993     new_SV();
1994     SvANY(sv) = 0;
1995     SvREFCNT(sv) = 1;
1996     SvFLAGS(sv) = 0;
1997     if (len) {
1998         sv_upgrade(sv, SVt_PV);
1999         SvGROW(sv, len + 1);
2000     }
2001     return sv;
2002 }
2003
2004 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2005
2006 void
2007 sv_magic(sv, obj, how, name, namlen)
2008 register SV *sv;
2009 SV *obj;
2010 int how;
2011 char *name;
2012 I32 namlen;
2013 {
2014     MAGIC* mg;
2015     
2016     if (SvREADONLY(sv) && curcop != &compiling && !strchr("gB", how))
2017         croak(no_modify);
2018     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
2019         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2020             if (how == 't')
2021                 mg->mg_len |= 1;
2022             return;
2023         }
2024     }
2025     else {
2026         if (!SvUPGRADE(sv, SVt_PVMG))
2027             return;
2028     }
2029     Newz(702,mg, 1, MAGIC);
2030     mg->mg_moremagic = SvMAGIC(sv);
2031
2032     SvMAGIC(sv) = mg;
2033     if (!obj || obj == sv || how == '#')
2034         mg->mg_obj = obj;
2035     else {
2036         mg->mg_obj = SvREFCNT_inc(obj);
2037         mg->mg_flags |= MGf_REFCOUNTED;
2038     }
2039     mg->mg_type = how;
2040     mg->mg_len = namlen;
2041     if (name)
2042         if (namlen >= 0)
2043             mg->mg_ptr = savepvn(name, namlen);
2044         else if (namlen == HEf_SVKEY)
2045             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2046     
2047     switch (how) {
2048     case 0:
2049         mg->mg_virtual = &vtbl_sv;
2050         break;
2051 #ifdef OVERLOAD
2052     case 'A':
2053         mg->mg_virtual = &vtbl_amagic;
2054         break;
2055     case 'a':
2056         mg->mg_virtual = &vtbl_amagicelem;
2057         break;
2058     case 'c':
2059         mg->mg_virtual = 0;
2060         break;
2061 #endif /* OVERLOAD */
2062     case 'B':
2063         mg->mg_virtual = &vtbl_bm;
2064         break;
2065     case 'E':
2066         mg->mg_virtual = &vtbl_env;
2067         break;
2068     case 'e':
2069         mg->mg_virtual = &vtbl_envelem;
2070         break;
2071     case 'g':
2072         mg->mg_virtual = &vtbl_mglob;
2073         break;
2074     case 'I':
2075         mg->mg_virtual = &vtbl_isa;
2076         break;
2077     case 'i':
2078         mg->mg_virtual = &vtbl_isaelem;
2079         break;
2080     case 'L':
2081         SvRMAGICAL_on(sv);
2082         mg->mg_virtual = 0;
2083         break;
2084     case 'l':
2085         mg->mg_virtual = &vtbl_dbline;
2086         break;
2087     case 'P':
2088         mg->mg_virtual = &vtbl_pack;
2089         break;
2090     case 'p':
2091     case 'q':
2092         mg->mg_virtual = &vtbl_packelem;
2093         break;
2094     case 'S':
2095         mg->mg_virtual = &vtbl_sig;
2096         break;
2097     case 's':
2098         mg->mg_virtual = &vtbl_sigelem;
2099         break;
2100     case 't':
2101         mg->mg_virtual = &vtbl_taint;
2102         mg->mg_len = 1;
2103         break;
2104     case 'U':
2105         mg->mg_virtual = &vtbl_uvar;
2106         break;
2107     case 'v':
2108         mg->mg_virtual = &vtbl_vec;
2109         break;
2110     case 'x':
2111         mg->mg_virtual = &vtbl_substr;
2112         break;
2113     case '*':
2114         mg->mg_virtual = &vtbl_glob;
2115         break;
2116     case '#':
2117         mg->mg_virtual = &vtbl_arylen;
2118         break;
2119     case '.':
2120         mg->mg_virtual = &vtbl_pos;
2121         break;
2122     case '~':   /* Reserved for use by extensions not perl internals.   */
2123         /* Useful for attaching extension internal data to perl vars.   */
2124         /* Note that multiple extensions may clash if magical scalars   */
2125         /* etc holding private data from one are passed to another.     */
2126         SvRMAGICAL_on(sv);
2127         break;
2128     default:
2129         croak("Don't know how to handle magic of type '%c'", how);
2130     }
2131     mg_magical(sv);
2132     if (SvGMAGICAL(sv))
2133         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2134 }
2135
2136 int
2137 sv_unmagic(sv, type)
2138 SV* sv;
2139 int type;
2140 {
2141     MAGIC* mg;
2142     MAGIC** mgp;
2143     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
2144         return 0;
2145     mgp = &SvMAGIC(sv);
2146     for (mg = *mgp; mg; mg = *mgp) {
2147         if (mg->mg_type == type) {
2148             MGVTBL* vtbl = mg->mg_virtual;
2149             *mgp = mg->mg_moremagic;
2150             if (vtbl && vtbl->svt_free)
2151                 (*vtbl->svt_free)(sv, mg);
2152             if (mg->mg_ptr && mg->mg_type != 'g')
2153                 if (mg->mg_len >= 0)
2154                     Safefree(mg->mg_ptr);
2155                 else if (mg->mg_len == HEf_SVKEY)
2156                     SvREFCNT_dec((SV*)mg->mg_ptr);
2157             if (mg->mg_flags & MGf_REFCOUNTED)
2158                 SvREFCNT_dec(mg->mg_obj);
2159             Safefree(mg);
2160         }
2161         else
2162             mgp = &mg->mg_moremagic;
2163     }
2164     if (!SvMAGIC(sv)) {
2165         SvMAGICAL_off(sv);
2166         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
2167     }
2168
2169     return 0;
2170 }
2171
2172 void
2173 sv_insert(bigstr,offset,len,little,littlelen)
2174 SV *bigstr;
2175 STRLEN offset;
2176 STRLEN len;
2177 char *little;
2178 STRLEN littlelen;
2179 {
2180     register char *big;
2181     register char *mid;
2182     register char *midend;
2183     register char *bigend;
2184     register I32 i;
2185
2186     if (!bigstr)
2187         croak("Can't modify non-existent substring");
2188     SvPV_force(bigstr, na);
2189
2190     i = littlelen - len;
2191     if (i > 0) {                        /* string might grow */
2192         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
2193         mid = big + offset + len;
2194         midend = bigend = big + SvCUR(bigstr);
2195         bigend += i;
2196         *bigend = '\0';
2197         while (midend > mid)            /* shove everything down */
2198             *--bigend = *--midend;
2199         Move(little,big+offset,littlelen,char);
2200         SvCUR(bigstr) += i;
2201         SvSETMAGIC(bigstr);
2202         return;
2203     }
2204     else if (i == 0) {
2205         Move(little,SvPVX(bigstr)+offset,len,char);
2206         SvSETMAGIC(bigstr);
2207         return;
2208     }
2209
2210     big = SvPVX(bigstr);
2211     mid = big + offset;
2212     midend = mid + len;
2213     bigend = big + SvCUR(bigstr);
2214
2215     if (midend > bigend)
2216         croak("panic: sv_insert");
2217
2218     if (mid - big > bigend - midend) {  /* faster to shorten from end */
2219         if (littlelen) {
2220             Move(little, mid, littlelen,char);
2221             mid += littlelen;
2222         }
2223         i = bigend - midend;
2224         if (i > 0) {
2225             Move(midend, mid, i,char);
2226             mid += i;
2227         }
2228         *mid = '\0';
2229         SvCUR_set(bigstr, mid - big);
2230     }
2231     /*SUPPRESS 560*/
2232     else if (i = mid - big) {   /* faster from front */
2233         midend -= littlelen;
2234         mid = midend;
2235         sv_chop(bigstr,midend-i);
2236         big += i;
2237         while (i--)
2238             *--midend = *--big;
2239         if (littlelen)
2240             Move(little, mid, littlelen,char);
2241     }
2242     else if (littlelen) {
2243         midend -= littlelen;
2244         sv_chop(bigstr,midend);
2245         Move(little,midend,littlelen,char);
2246     }
2247     else {
2248         sv_chop(bigstr,midend);
2249     }
2250     SvSETMAGIC(bigstr);
2251 }
2252
2253 /* make sv point to what nstr did */
2254
2255 void
2256 sv_replace(sv,nsv)
2257 register SV *sv;
2258 register SV *nsv;
2259 {
2260     U32 refcnt = SvREFCNT(sv);
2261     if (SvTHINKFIRST(sv)) {
2262         if (SvREADONLY(sv) && curcop != &compiling)
2263             croak(no_modify);
2264         if (SvROK(sv))
2265             sv_unref(sv);
2266     }
2267     if (SvREFCNT(nsv) != 1)
2268         warn("Reference miscount in sv_replace()");
2269     if (SvMAGICAL(sv)) {
2270         if (SvMAGICAL(nsv))
2271             mg_free(nsv);
2272         else
2273             sv_upgrade(nsv, SVt_PVMG);
2274         SvMAGIC(nsv) = SvMAGIC(sv);
2275         SvFLAGS(nsv) |= SvMAGICAL(sv);
2276         SvMAGICAL_off(sv);
2277         SvMAGIC(sv) = 0;
2278     }
2279     SvREFCNT(sv) = 0;
2280     sv_clear(sv);
2281     StructCopy(nsv,sv,SV);
2282     SvREFCNT(sv) = refcnt;
2283     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
2284     del_SV(nsv);
2285 }
2286
2287 void
2288 sv_clear(sv)
2289 register SV *sv;
2290 {
2291     assert(sv);
2292     assert(SvREFCNT(sv) == 0);
2293
2294     if (SvOBJECT(sv)) {
2295         dSP;
2296         GV* destructor;
2297
2298         if (defstash) {         /* Still have a symbol table? */
2299             destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
2300
2301             ENTER;
2302             SAVEFREESV(SvSTASH(sv));
2303             if (destructor && GvCV(destructor)) {
2304                 SV ref;
2305
2306                 Zero(&ref, 1, SV);
2307                 sv_upgrade(&ref, SVt_RV);
2308                 SvRV(&ref) = SvREFCNT_inc(sv);
2309                 SvROK_on(&ref);
2310
2311                 EXTEND(SP, 2);
2312                 PUSHMARK(SP);
2313                 PUSHs(&ref);
2314                 PUTBACK;
2315                 perl_call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
2316                 del_XRV(SvANY(&ref));
2317                 SvREFCNT(sv)--;
2318             }
2319             LEAVE;
2320         }
2321         else
2322             SvREFCNT_dec(SvSTASH(sv));
2323         if (SvOBJECT(sv)) {
2324             SvOBJECT_off(sv);   /* Curse the object. */
2325             if (SvTYPE(sv) != SVt_PVIO)
2326                 --sv_objcount;  /* XXX Might want something more general */
2327         }
2328         if (SvREFCNT(sv)) {
2329             SV *ret;  
2330             if ( perldb
2331                  && (ret = perl_get_sv("DB::ret", FALSE))
2332                  && SvROK(ret) && SvRV(ret) == sv && SvREFCNT(sv) == 1) {
2333                 /* Debugger is prone to dangling references. */
2334                 SvRV(ret) = 0;
2335                 SvROK_off(ret);
2336                 SvREFCNT(sv) = 0;
2337             } else {
2338                 croak("panic: dangling references in DESTROY");
2339             }
2340         }
2341     }
2342     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2343         mg_free(sv);
2344     switch (SvTYPE(sv)) {
2345     case SVt_PVIO:
2346         io_close((IO*)sv);
2347         Safefree(IoTOP_NAME(sv));
2348         Safefree(IoFMT_NAME(sv));
2349         Safefree(IoBOTTOM_NAME(sv));
2350         /* FALL THROUGH */
2351     case SVt_PVBM:
2352         goto freescalar;
2353     case SVt_PVCV:
2354     case SVt_PVFM:
2355         cv_undef((CV*)sv);
2356         goto freescalar;
2357     case SVt_PVHV:
2358         hv_undef((HV*)sv);
2359         break;
2360     case SVt_PVAV:
2361         av_undef((AV*)sv);
2362         break;
2363     case SVt_PVGV:
2364         gp_free((GV*)sv);
2365         Safefree(GvNAME(sv));
2366         /* FALL THROUGH */
2367     case SVt_PVLV:
2368     case SVt_PVMG:
2369     case SVt_PVNV:
2370     case SVt_PVIV:
2371       freescalar:
2372         (void)SvOOK_off(sv);
2373         /* FALL THROUGH */
2374     case SVt_PV:
2375     case SVt_RV:
2376         if (SvROK(sv))
2377             SvREFCNT_dec(SvRV(sv));
2378         else if (SvPVX(sv) && SvLEN(sv))
2379             Safefree(SvPVX(sv));
2380         break;
2381 /*
2382     case SVt_NV:
2383     case SVt_IV:
2384     case SVt_NULL:
2385         break;
2386 */
2387     }
2388
2389     switch (SvTYPE(sv)) {
2390     case SVt_NULL:
2391         break;
2392     case SVt_IV:
2393         del_XIV(SvANY(sv));
2394         break;
2395     case SVt_NV:
2396         del_XNV(SvANY(sv));
2397         break;
2398     case SVt_RV:
2399         del_XRV(SvANY(sv));
2400         break;
2401     case SVt_PV:
2402         del_XPV(SvANY(sv));
2403         break;
2404     case SVt_PVIV:
2405         del_XPVIV(SvANY(sv));
2406         break;
2407     case SVt_PVNV:
2408         del_XPVNV(SvANY(sv));
2409         break;
2410     case SVt_PVMG:
2411         del_XPVMG(SvANY(sv));
2412         break;
2413     case SVt_PVLV:
2414         del_XPVLV(SvANY(sv));
2415         break;
2416     case SVt_PVAV:
2417         del_XPVAV(SvANY(sv));
2418         break;
2419     case SVt_PVHV:
2420         del_XPVHV(SvANY(sv));
2421         break;
2422     case SVt_PVCV:
2423         del_XPVCV(SvANY(sv));
2424         break;
2425     case SVt_PVGV:
2426         del_XPVGV(SvANY(sv));
2427         break;
2428     case SVt_PVBM:
2429         del_XPVBM(SvANY(sv));
2430         break;
2431     case SVt_PVFM:
2432         del_XPVFM(SvANY(sv));
2433         break;
2434     case SVt_PVIO:
2435         del_XPVIO(SvANY(sv));
2436         break;
2437     }
2438     SvFLAGS(sv) &= SVf_BREAK;
2439     SvFLAGS(sv) |= SVTYPEMASK;
2440 }
2441
2442 SV *
2443 sv_newref(sv)
2444 SV* sv;
2445 {
2446     if (sv)
2447         SvREFCNT(sv)++;
2448     return sv;
2449 }
2450
2451 void
2452 sv_free(sv)
2453 SV *sv;
2454 {
2455     if (!sv)
2456         return;
2457     if (SvREADONLY(sv)) {
2458         if (sv == &sv_undef || sv == &sv_yes || sv == &sv_no)
2459             return;
2460     }
2461     if (SvREFCNT(sv) == 0) {
2462         if (SvFLAGS(sv) & SVf_BREAK)
2463             return;
2464         if (in_clean_all) /* All is fair */
2465             return;
2466         warn("Attempt to free unreferenced scalar");
2467         return;
2468     }
2469     if (--SvREFCNT(sv) > 0)
2470         return;
2471 #ifdef DEBUGGING
2472     if (SvTEMP(sv)) {
2473         warn("Attempt to free temp prematurely");
2474         return;
2475     }
2476 #endif
2477     sv_clear(sv);
2478     del_SV(sv);
2479 }
2480
2481 STRLEN
2482 sv_len(sv)
2483 register SV *sv;
2484 {
2485     char *junk;
2486     STRLEN len;
2487
2488     if (!sv)
2489         return 0;
2490
2491     if (SvGMAGICAL(sv))
2492         len = mg_len(sv);
2493     else
2494         junk = SvPV(sv, len);
2495     return len;
2496 }
2497
2498 I32
2499 sv_eq(str1,str2)
2500 register SV *str1;
2501 register SV *str2;
2502 {
2503     char *pv1;
2504     STRLEN cur1;
2505     char *pv2;
2506     STRLEN cur2;
2507
2508     if (!str1) {
2509         pv1 = "";
2510         cur1 = 0;
2511     }
2512     else
2513         pv1 = SvPV(str1, cur1);
2514
2515     if (!str2)
2516         return !cur1;
2517     else
2518         pv2 = SvPV(str2, cur2);
2519
2520     if (cur1 != cur2)
2521         return 0;
2522
2523     return !bcmp(pv1, pv2, cur1);
2524 }
2525
2526 I32
2527 sv_cmp(str1,str2)
2528 register SV *str1;
2529 register SV *str2;
2530 {
2531     I32 retval;
2532     char *pv1;
2533     STRLEN cur1;
2534     char *pv2;
2535     STRLEN cur2;
2536
2537     if (!str1) {
2538         pv1 = "";
2539         cur1 = 0;
2540     }
2541     else
2542         pv1 = SvPV(str1, cur1);
2543
2544     if (!str2) {
2545         pv2 = "";
2546         cur2 = 0;
2547     }
2548     else
2549         pv2 = SvPV(str2, cur2);
2550
2551     if (!cur1)
2552         return cur2 ? -1 : 0;
2553     if (!cur2)
2554         return 1;
2555
2556     if (cur1 < cur2) {
2557         /*SUPPRESS 560*/
2558         if (retval = memcmp((void*)pv1, (void*)pv2, cur1))
2559             return retval < 0 ? -1 : 1;
2560         else
2561             return -1;
2562     }
2563     /*SUPPRESS 560*/
2564     else if (retval = memcmp((void*)pv1, (void*)pv2, cur2))
2565         return retval < 0 ? -1 : 1;
2566     else if (cur1 == cur2)
2567         return 0;
2568     else
2569         return 1;
2570 }
2571
2572 char *
2573 sv_gets(sv,fp,append)
2574 register SV *sv;
2575 register PerlIO *fp;
2576 I32 append;
2577 {
2578     char *rsptr;
2579     STRLEN rslen;
2580     register STDCHAR rslast;
2581     register STDCHAR *bp;
2582     register I32 cnt;
2583     I32 i;
2584
2585     if (SvTHINKFIRST(sv)) {
2586         if (SvREADONLY(sv) && curcop != &compiling)
2587             croak(no_modify);
2588         if (SvROK(sv))
2589             sv_unref(sv);
2590     }
2591     if (!SvUPGRADE(sv, SVt_PV))
2592         return 0;
2593
2594     if (RsSNARF(rs)) {
2595         rsptr = NULL;
2596         rslen = 0;
2597     }
2598     else if (RsPARA(rs)) {
2599         rsptr = "\n\n";
2600         rslen = 2;
2601     }
2602     else
2603         rsptr = SvPV(rs, rslen);
2604     rslast = rslen ? rsptr[rslen - 1] : '\0';
2605
2606     if (RsPARA(rs)) {           /* have to do this both before and after */
2607         do {                    /* to make sure file boundaries work right */
2608             if (PerlIO_eof(fp))
2609                 return 0;
2610             i = PerlIO_getc(fp);
2611             if (i != '\n') {
2612                 if (i == -1)
2613                     return 0;
2614                 PerlIO_ungetc(fp,i);
2615                 break;
2616             }
2617         } while (i != EOF);
2618     }
2619
2620     /* See if we know enough about I/O mechanism to cheat it ! */
2621
2622     /* This used to be #ifdef test - it is made run-time test for ease
2623        of abstracting out stdio interface. One call should be cheap 
2624        enough here - and may even be a macro allowing compile
2625        time optimization.
2626      */
2627
2628     if (PerlIO_fast_gets(fp)) {
2629
2630     /*
2631      * We're going to steal some values from the stdio struct
2632      * and put EVERYTHING in the innermost loop into registers.
2633      */
2634     register STDCHAR *ptr;
2635     STRLEN bpx;
2636     I32 shortbuffered;
2637
2638
2639     /* Here is some breathtakingly efficient cheating */
2640
2641     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
2642     (void)SvPOK_only(sv);               /* validate pointer */
2643     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
2644         if (cnt > 80 && SvLEN(sv) > append) {
2645             shortbuffered = cnt - SvLEN(sv) + append + 1;
2646             cnt -= shortbuffered;
2647         }
2648         else {
2649             shortbuffered = 0;
2650             SvGROW(sv, append+cnt+2);/* (remembering cnt can be -1) */
2651         }
2652     }
2653     else
2654         shortbuffered = 0;
2655     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
2656     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
2657     for (;;) {
2658       screamer:
2659         if (cnt > 0) {
2660             if (rslen) {
2661                 while (cnt > 0) {                    /* this     |  eat */
2662                     cnt--;
2663                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
2664                         goto thats_all_folks;        /* screams  |  sed :-) */
2665                 }
2666             }
2667             else {
2668                 memcpy((char*)bp, (char*)ptr, cnt);  /* this     |  eat */    
2669                 bp += cnt;                           /* screams  |  dust */   
2670                 ptr += cnt;                          /* louder   |  sed :-) */
2671                 cnt = 0;
2672             }
2673         }
2674         
2675         if (shortbuffered) {            /* oh well, must extend */
2676             cnt = shortbuffered;
2677             shortbuffered = 0;
2678             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
2679             SvCUR_set(sv, bpx);
2680             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
2681             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
2682             continue;
2683         }
2684
2685         PerlIO_set_ptrcnt(fp,(char *) ptr, cnt); /* deregisterize cnt and ptr */
2686         /* This used to call 'filbuf' in stdio form, but as that behaves like getc
2687            when cnt <= 0 we use PerlIO_getc here to avoid another abstraction.
2688            This may also avoid issues with different named 'filbuf' equivalents
2689          */
2690         i   = PerlIO_getc(fp);          /* get more characters */
2691         cnt = PerlIO_get_cnt(fp);
2692         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
2693
2694         if (i == EOF)                   /* all done for ever? */
2695             goto thats_really_all_folks;
2696
2697         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
2698         SvCUR_set(sv, bpx);
2699         SvGROW(sv, bpx + cnt + 2);
2700         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
2701
2702         *bp++ = i;                      /* store character from PerlIO_getc */
2703
2704         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
2705             goto thats_all_folks;
2706     }
2707
2708 thats_all_folks:
2709     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
2710           bcmp((char*)bp - rslen, rsptr, rslen))
2711         goto screamer;                          /* go back to the fray */
2712 thats_really_all_folks:
2713     if (shortbuffered)
2714         cnt += shortbuffered;
2715     PerlIO_set_ptrcnt(fp,(char *) ptr, cnt);    /* put these back or we're in trouble */
2716     *bp = '\0';
2717     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
2718     }
2719    else
2720     {
2721        /*The big, slow, and stupid way */
2722         STDCHAR buf[8192];
2723
2724 screamer2:
2725         if (rslen) {
2726             register STDCHAR *bpe = buf + sizeof(buf);
2727             bp = buf;
2728             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
2729                 ; /* keep reading */
2730             cnt = bp - buf;
2731         }
2732         else {
2733             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
2734             i = cnt ? (U8)buf[cnt - 1] : EOF;
2735         }
2736
2737         if (append)
2738             sv_catpvn(sv, (char *) buf, cnt);
2739         else
2740             sv_setpvn(sv, (char *) buf, cnt);
2741
2742         if (i != EOF &&                 /* joy */
2743             (!rslen ||
2744              SvCUR(sv) < rslen ||
2745              bcmp(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
2746         {
2747             append = -1;
2748             goto screamer2;
2749         }
2750     }
2751
2752     if (RsPARA(rs)) {           /* have to do this both before and after */  
2753         while (i != EOF) {      /* to make sure file boundaries work right */
2754             i = PerlIO_getc(fp);
2755             if (i != '\n') {
2756                 PerlIO_ungetc(fp,i);
2757                 break;
2758             }
2759         }
2760     }
2761
2762     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
2763 }
2764
2765
2766 void
2767 sv_inc(sv)
2768 register SV *sv;
2769 {
2770     register char *d;
2771     int flags;
2772
2773     if (!sv)
2774         return;
2775     if (SvTHINKFIRST(sv)) {
2776         if (SvREADONLY(sv) && curcop != &compiling)
2777             croak(no_modify);
2778         if (SvROK(sv)) {
2779 #ifdef OVERLOAD
2780           if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
2781 #endif /* OVERLOAD */
2782           sv_unref(sv);
2783         }
2784     }
2785     if (SvGMAGICAL(sv))
2786         mg_get(sv);
2787     flags = SvFLAGS(sv);
2788     if (flags & SVp_IOK) {
2789         (void)SvIOK_only(sv);
2790         ++SvIVX(sv);
2791         return;
2792     }
2793     if (flags & SVp_NOK) {
2794         SvNVX(sv) += 1.0;
2795         (void)SvNOK_only(sv);
2796         return;
2797     }
2798     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
2799         if ((flags & SVTYPEMASK) < SVt_PVNV)
2800             sv_upgrade(sv, SVt_NV);
2801         SvNVX(sv) = 1.0;
2802         (void)SvNOK_only(sv);
2803         return;
2804     }
2805     d = SvPVX(sv);
2806     while (isALPHA(*d)) d++;
2807     while (isDIGIT(*d)) d++;
2808     if (*d) {
2809         sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
2810         return;
2811     }
2812     d--;
2813     while (d >= SvPVX(sv)) {
2814         if (isDIGIT(*d)) {
2815             if (++*d <= '9')
2816                 return;
2817             *(d--) = '0';
2818         }
2819         else {
2820             ++*d;
2821             if (isALPHA(*d))
2822                 return;
2823             *(d--) -= 'z' - 'a' + 1;
2824         }
2825     }
2826     /* oh,oh, the number grew */
2827     SvGROW(sv, SvCUR(sv) + 2);
2828     SvCUR(sv)++;
2829     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
2830         *d = d[-1];
2831     if (isDIGIT(d[1]))
2832         *d = '1';
2833     else
2834         *d = d[1];
2835 }
2836
2837 void
2838 sv_dec(sv)
2839 register SV *sv;
2840 {
2841     int flags;
2842
2843     if (!sv)
2844         return;
2845     if (SvTHINKFIRST(sv)) {
2846         if (SvREADONLY(sv) && curcop != &compiling)
2847             croak(no_modify);
2848         if (SvROK(sv)) {
2849 #ifdef OVERLOAD
2850           if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
2851 #endif /* OVERLOAD */
2852           sv_unref(sv);
2853         }
2854     }
2855     if (SvGMAGICAL(sv))
2856         mg_get(sv);
2857     flags = SvFLAGS(sv);
2858     if (flags & SVp_IOK) {
2859         (void)SvIOK_only(sv);
2860         --SvIVX(sv);
2861         return;
2862     }
2863     if (flags & SVp_NOK) {
2864         SvNVX(sv) -= 1.0;
2865         (void)SvNOK_only(sv);
2866         return;
2867     }
2868     if (!(flags & SVp_POK)) {
2869         if ((flags & SVTYPEMASK) < SVt_PVNV)
2870             sv_upgrade(sv, SVt_NV);
2871         SvNVX(sv) = -1.0;
2872         (void)SvNOK_only(sv);
2873         return;
2874     }
2875     sv_setnv(sv,atof(SvPVX(sv)) - 1.0);
2876 }
2877
2878 /* Make a string that will exist for the duration of the expression
2879  * evaluation.  Actually, it may have to last longer than that, but
2880  * hopefully we won't free it until it has been assigned to a
2881  * permanent location. */
2882
2883 static void
2884 sv_mortalgrow()
2885 {
2886     tmps_max += 128;
2887     Renew(tmps_stack, tmps_max, SV*);
2888 }
2889
2890 SV *
2891 sv_mortalcopy(oldstr)
2892 SV *oldstr;
2893 {
2894     register SV *sv;
2895
2896     new_SV();
2897     SvANY(sv) = 0;
2898     SvREFCNT(sv) = 1;
2899     SvFLAGS(sv) = 0;
2900     sv_setsv(sv,oldstr);
2901     if (++tmps_ix >= tmps_max)
2902         sv_mortalgrow();
2903     tmps_stack[tmps_ix] = sv;
2904     SvTEMP_on(sv);
2905     return sv;
2906 }
2907
2908 SV *
2909 sv_newmortal()
2910 {
2911     register SV *sv;
2912
2913     new_SV();
2914     SvANY(sv) = 0;
2915     SvREFCNT(sv) = 1;
2916     SvFLAGS(sv) = SVs_TEMP;
2917     if (++tmps_ix >= tmps_max)
2918         sv_mortalgrow();
2919     tmps_stack[tmps_ix] = sv;
2920     return sv;
2921 }
2922
2923 /* same thing without the copying */
2924
2925 SV *
2926 sv_2mortal(sv)
2927 register SV *sv;
2928 {
2929     if (!sv)
2930         return sv;
2931     if (SvREADONLY(sv) && curcop != &compiling)
2932         croak(no_modify);
2933     if (++tmps_ix >= tmps_max)
2934         sv_mortalgrow();
2935     tmps_stack[tmps_ix] = sv;
2936     SvTEMP_on(sv);
2937     return sv;
2938 }
2939
2940 SV *
2941 newSVpv(s,len)
2942 char *s;
2943 STRLEN len;
2944 {
2945     register SV *sv;
2946
2947     new_SV();
2948     SvANY(sv) = 0;
2949     SvREFCNT(sv) = 1;
2950     SvFLAGS(sv) = 0;
2951     if (!len)
2952         len = strlen(s);
2953     sv_setpvn(sv,s,len);
2954     return sv;
2955 }
2956
2957 SV *
2958 newSVnv(n)
2959 double n;
2960 {
2961     register SV *sv;
2962
2963     new_SV();
2964     SvANY(sv) = 0;
2965     SvREFCNT(sv) = 1;
2966     SvFLAGS(sv) = 0;
2967     sv_setnv(sv,n);
2968     return sv;
2969 }
2970
2971 SV *
2972 newSViv(i)
2973 IV i;
2974 {
2975     register SV *sv;
2976
2977     new_SV();
2978     SvANY(sv) = 0;
2979     SvREFCNT(sv) = 1;
2980     SvFLAGS(sv) = 0;
2981     sv_setiv(sv,i);
2982     return sv;
2983 }
2984
2985 SV *
2986 newRV(ref)
2987 SV *ref;
2988 {
2989     register SV *sv;
2990
2991     new_SV();
2992     SvANY(sv) = 0;
2993     SvREFCNT(sv) = 1;
2994     SvFLAGS(sv) = 0;
2995     sv_upgrade(sv, SVt_RV);
2996     SvTEMP_off(ref);
2997     SvRV(sv) = SvREFCNT_inc(ref);
2998     SvROK_on(sv);
2999     return sv;
3000 }
3001
3002 /* make an exact duplicate of old */
3003
3004 SV *
3005 newSVsv(old)
3006 register SV *old;
3007 {
3008     register SV *sv;
3009
3010     if (!old)
3011         return Nullsv;
3012     if (SvTYPE(old) == SVTYPEMASK) {
3013         warn("semi-panic: attempt to dup freed string");
3014         return Nullsv;
3015     }
3016     new_SV();
3017     SvANY(sv) = 0;
3018     SvREFCNT(sv) = 1;
3019     SvFLAGS(sv) = 0;
3020     if (SvTEMP(old)) {
3021         SvTEMP_off(old);
3022         sv_setsv(sv,old);
3023         SvTEMP_on(old);
3024     }
3025     else
3026         sv_setsv(sv,old);
3027     return sv;
3028 }
3029
3030 void
3031 sv_reset(s,stash)
3032 register char *s;
3033 HV *stash;
3034 {
3035     register HE *entry;
3036     register GV *gv;
3037     register SV *sv;
3038     register I32 i;
3039     register PMOP *pm;
3040     register I32 max;
3041     char todo[256];
3042
3043     if (!*s) {          /* reset ?? searches */
3044         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
3045             pm->op_pmflags &= ~PMf_USED;
3046         }
3047         return;
3048     }
3049
3050     /* reset variables */
3051
3052     if (!HvARRAY(stash))
3053         return;
3054
3055     Zero(todo, 256, char);
3056     while (*s) {
3057         i = *s;
3058         if (s[1] == '-') {
3059             s += 2;
3060         }
3061         max = *s++;
3062         for ( ; i <= max; i++) {
3063             todo[i] = 1;
3064         }
3065         for (i = 0; i <= (I32) HvMAX(stash); i++) {
3066             for (entry = HvARRAY(stash)[i];
3067               entry;
3068               entry = HeNEXT(entry)) {
3069                 if (!todo[(U8)*HeKEY(entry)])
3070                     continue;
3071                 gv = (GV*)HeVAL(entry);
3072                 sv = GvSV(gv);
3073                 (void)SvOK_off(sv);
3074                 if (SvTYPE(sv) >= SVt_PV) {
3075                     SvCUR_set(sv, 0);
3076                     SvTAINT(sv);
3077                     if (SvPVX(sv) != Nullch)
3078                         *SvPVX(sv) = '\0';
3079                 }
3080                 if (GvAV(gv)) {
3081                     av_clear(GvAV(gv));
3082                 }
3083                 if (GvHV(gv)) {
3084                     if (HvNAME(GvHV(gv)))
3085                         continue;
3086                     hv_clear(GvHV(gv));
3087 #ifndef VMS  /* VMS has no environ array */
3088                     if (gv == envgv)
3089                         environ[0] = Nullch;
3090 #endif
3091                 }
3092             }
3093         }
3094     }
3095 }
3096
3097 CV *
3098 sv_2cv(sv, st, gvp, lref)
3099 SV *sv;
3100 HV **st;
3101 GV **gvp;
3102 I32 lref;
3103 {
3104     GV *gv;
3105     CV *cv;
3106
3107     if (!sv)
3108         return *gvp = Nullgv, Nullcv;
3109     switch (SvTYPE(sv)) {
3110     case SVt_PVCV:
3111         *st = CvSTASH(sv);
3112         *gvp = Nullgv;
3113         return (CV*)sv;
3114     case SVt_PVHV:
3115     case SVt_PVAV:
3116         *gvp = Nullgv;
3117         return Nullcv;
3118     case SVt_PVGV:
3119         gv = (GV*)sv;
3120         *gvp = gv;
3121         *st = GvESTASH(gv);
3122         goto fix_gv;
3123
3124     default:
3125         if (SvGMAGICAL(sv))
3126             mg_get(sv);
3127         if (SvROK(sv)) {
3128             cv = (CV*)SvRV(sv);
3129             if (SvTYPE(cv) != SVt_PVCV)
3130                 croak("Not a subroutine reference");
3131             *gvp = Nullgv;
3132             *st = CvSTASH(cv);
3133             return cv;
3134         }
3135         if (isGV(sv))
3136             gv = (GV*)sv;
3137         else
3138             gv = gv_fetchpv(SvPV(sv, na), lref, SVt_PVCV);
3139         *gvp = gv;
3140         if (!gv)
3141             return Nullcv;
3142         *st = GvESTASH(gv);
3143     fix_gv:
3144         if (lref && !GvCV(gv)) {
3145             SV *tmpsv;
3146             ENTER;
3147             tmpsv = NEWSV(704,0);
3148             gv_efullname(tmpsv, gv);
3149             newSUB(start_subparse(),
3150                    newSVOP(OP_CONST, 0, tmpsv),
3151                    Nullop,
3152                    Nullop);
3153             LEAVE;
3154             if (!GvCV(gv))
3155                 croak("Unable to create sub named \"%s\"", SvPV(sv,na));
3156         }
3157         return GvCV(gv);
3158     }
3159 }
3160
3161 #ifndef SvTRUE
3162 I32
3163 SvTRUE(sv)
3164 register SV *sv;
3165 {
3166     if (!sv)
3167         return 0;
3168     if (SvGMAGICAL(sv))
3169         mg_get(sv);
3170     if (SvPOK(sv)) {
3171         register XPV* Xpv;
3172         if ((Xpv = (XPV*)SvANY(sv)) &&
3173                 (*Xpv->xpv_pv > '0' ||
3174                 Xpv->xpv_cur > 1 ||
3175                 (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
3176             return 1;
3177         else
3178             return 0;
3179     }
3180     else {
3181         if (SvIOK(sv))
3182             return SvIVX(sv) != 0;
3183         else {
3184             if (SvNOK(sv))
3185                 return SvNVX(sv) != 0.0;
3186             else
3187                 return sv_2bool(sv);
3188         }
3189     }
3190 }
3191 #endif /* SvTRUE */
3192
3193 #ifndef SvIV
3194 IV SvIV(Sv)
3195 register SV *Sv;
3196 {
3197     if (SvIOK(Sv))
3198         return SvIVX(Sv);
3199     return sv_2iv(Sv);
3200 }
3201 #endif /* SvIV */
3202
3203
3204 #ifndef SvNV
3205 double SvNV(Sv)
3206 register SV *Sv;
3207 {
3208     if (SvNOK(Sv))
3209         return SvNVX(Sv);
3210     if (SvIOK(Sv))
3211         return (double)SvIVX(Sv);
3212     return sv_2nv(Sv);
3213 }
3214 #endif /* SvNV */
3215
3216 #ifdef CRIPPLED_CC
3217 char *
3218 sv_pvn(sv, lp)
3219 SV *sv;
3220 STRLEN *lp;
3221 {
3222     if (SvPOK(sv)) {
3223         *lp = SvCUR(sv);
3224         return SvPVX(sv);
3225     }
3226     return sv_2pv(sv, lp);
3227 }
3228 #endif
3229
3230 char *
3231 sv_pvn_force(sv, lp)
3232 SV *sv;
3233 STRLEN *lp;
3234 {
3235     char *s;
3236
3237     if (SvREADONLY(sv) && curcop != &compiling)
3238         croak(no_modify);
3239     
3240     if (SvPOK(sv)) {
3241         *lp = SvCUR(sv);
3242     }
3243     else {
3244         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
3245             if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
3246                 sv_unglob(sv);
3247                 s = SvPVX(sv);
3248                 *lp = SvCUR(sv);
3249             }
3250             else
3251                 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
3252                     op_name[op->op_type]);
3253         }
3254         else
3255             s = sv_2pv(sv, lp);
3256         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
3257             STRLEN len = *lp;
3258             
3259             if (SvROK(sv))
3260                 sv_unref(sv);
3261             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
3262             SvGROW(sv, len + 1);
3263             Move(s,SvPVX(sv),len,char);
3264             SvCUR_set(sv, len);
3265             *SvEND(sv) = '\0';
3266         }
3267         if (!SvPOK(sv)) {
3268             SvPOK_on(sv);               /* validate pointer */
3269             SvTAINT(sv);
3270             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
3271                 (unsigned long)sv,SvPVX(sv)));
3272         }
3273     }
3274     return SvPVX(sv);
3275 }
3276
3277 char *
3278 sv_reftype(sv, ob)
3279 SV* sv;
3280 int ob;
3281 {
3282     if (ob && SvOBJECT(sv))
3283         return HvNAME(SvSTASH(sv));
3284     else {
3285         switch (SvTYPE(sv)) {
3286         case SVt_NULL:
3287         case SVt_IV:
3288         case SVt_NV:
3289         case SVt_RV:
3290         case SVt_PV:
3291         case SVt_PVIV:
3292         case SVt_PVNV:
3293         case SVt_PVMG:
3294         case SVt_PVBM:
3295                                 if (SvROK(sv))
3296                                     return "REF";
3297                                 else
3298                                     return "SCALAR";
3299         case SVt_PVLV:          return "LVALUE";
3300         case SVt_PVAV:          return "ARRAY";
3301         case SVt_PVHV:          return "HASH";
3302         case SVt_PVCV:          return "CODE";
3303         case SVt_PVGV:          return "GLOB";
3304         case SVt_PVFM:          return "FORMLINE";
3305         default:                return "UNKNOWN";
3306         }
3307     }
3308 }
3309
3310 int
3311 sv_isobject(sv)
3312 SV *sv;
3313 {
3314     if (!SvROK(sv))
3315         return 0;
3316     sv = (SV*)SvRV(sv);
3317     if (!SvOBJECT(sv))
3318         return 0;
3319     return 1;
3320 }
3321
3322 int
3323 sv_isa(sv, name)
3324 SV *sv;
3325 char *name;
3326 {
3327     if (!SvROK(sv))
3328         return 0;
3329     sv = (SV*)SvRV(sv);
3330     if (!SvOBJECT(sv))
3331         return 0;
3332
3333     return strEQ(HvNAME(SvSTASH(sv)), name);
3334 }
3335
3336 SV*
3337 newSVrv(rv, classname)
3338 SV *rv;
3339 char *classname;
3340 {
3341     SV *sv;
3342
3343     new_SV();
3344     SvANY(sv) = 0;
3345     SvREFCNT(sv) = 0;
3346     SvFLAGS(sv) = 0;
3347     sv_upgrade(rv, SVt_RV);
3348     SvRV(rv) = SvREFCNT_inc(sv);
3349     SvROK_on(rv);
3350
3351     if (classname) {
3352         HV* stash = gv_stashpv(classname, TRUE);
3353         (void)sv_bless(rv, stash);
3354     }
3355     return sv;
3356 }
3357
3358 SV*
3359 sv_setref_pv(rv, classname, pv)
3360 SV *rv;
3361 char *classname;
3362 void* pv;
3363 {
3364     if (!pv)
3365         sv_setsv(rv, &sv_undef);
3366     else
3367         sv_setiv(newSVrv(rv,classname), (IV)pv);
3368     return rv;
3369 }
3370
3371 SV*
3372 sv_setref_iv(rv, classname, iv)
3373 SV *rv;
3374 char *classname;
3375 IV iv;
3376 {
3377     sv_setiv(newSVrv(rv,classname), iv);
3378     return rv;
3379 }
3380
3381 SV*
3382 sv_setref_nv(rv, classname, nv)
3383 SV *rv;
3384 char *classname;
3385 double nv;
3386 {
3387     sv_setnv(newSVrv(rv,classname), nv);
3388     return rv;
3389 }
3390
3391 SV*
3392 sv_setref_pvn(rv, classname, pv, n)
3393 SV *rv;
3394 char *classname;
3395 char* pv;
3396 I32 n;
3397 {
3398     sv_setpvn(newSVrv(rv,classname), pv, n);
3399     return rv;
3400 }
3401
3402 SV*
3403 sv_bless(sv,stash)
3404 SV* sv;
3405 HV* stash;
3406 {
3407     SV *ref;
3408     if (!SvROK(sv))
3409         croak("Can't bless non-reference value");
3410     ref = SvRV(sv);
3411     if (SvFLAGS(ref) & (SVs_OBJECT|SVf_READONLY)) {
3412         if (SvREADONLY(ref))
3413             croak(no_modify);
3414         if (SvOBJECT(ref) && SvTYPE(ref) != SVt_PVIO)
3415             --sv_objcount;
3416     }
3417     SvOBJECT_on(ref);
3418     ++sv_objcount;
3419     (void)SvUPGRADE(ref, SVt_PVMG);
3420     SvSTASH(ref) = (HV*)SvREFCNT_inc(stash);
3421
3422 #ifdef OVERLOAD
3423     SvAMAGIC_off(sv);
3424     if (Gv_AMG(stash)) {
3425       SvAMAGIC_on(sv);
3426     }
3427 #endif /* OVERLOAD */
3428
3429     return sv;
3430 }
3431
3432 static void
3433 sv_unglob(sv)
3434 SV* sv;
3435 {
3436     assert(SvTYPE(sv) == SVt_PVGV);
3437     SvFAKE_off(sv);
3438     if (GvGP(sv))
3439         gp_free((GV*)sv);
3440     sv_unmagic(sv, '*');
3441     Safefree(GvNAME(sv));
3442     GvMULTI_off(sv);
3443     SvFLAGS(sv) &= ~SVTYPEMASK;
3444     SvFLAGS(sv) |= SVt_PVMG;
3445 }
3446
3447 void
3448 sv_unref(sv)
3449 SV* sv;
3450 {
3451     SV* rv = SvRV(sv);
3452     
3453     SvRV(sv) = 0;
3454     SvROK_off(sv);
3455     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
3456         SvREFCNT_dec(rv);
3457     else
3458         sv_2mortal(rv);         /* Schedule for freeing later */
3459 }
3460
3461 #ifdef DEBUGGING
3462 void
3463 sv_dump(sv)
3464 SV* sv;
3465 {
3466     char tmpbuf[1024];
3467     char *d = tmpbuf;
3468     U32 flags;
3469     U32 type;
3470
3471     if (!sv) {
3472         PerlIO_printf(Perl_debug_log, "SV = 0\n");
3473         return;
3474     }
3475     
3476     flags = SvFLAGS(sv);
3477     type = SvTYPE(sv);
3478
3479     sprintf(d, "(0x%lx)\n  REFCNT = %ld\n  FLAGS = (",
3480         (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
3481     d += strlen(d);
3482     if (flags & SVs_PADBUSY)    strcat(d, "PADBUSY,");
3483     if (flags & SVs_PADTMP)     strcat(d, "PADTMP,");
3484     if (flags & SVs_PADMY)      strcat(d, "PADMY,");
3485     if (flags & SVs_TEMP)       strcat(d, "TEMP,");
3486     if (flags & SVs_OBJECT)     strcat(d, "OBJECT,");
3487     if (flags & SVs_GMG)        strcat(d, "GMG,");
3488     if (flags & SVs_SMG)        strcat(d, "SMG,");
3489     if (flags & SVs_RMG)        strcat(d, "RMG,");
3490     d += strlen(d);
3491
3492     if (flags & SVf_IOK)        strcat(d, "IOK,");
3493     if (flags & SVf_NOK)        strcat(d, "NOK,");
3494     if (flags & SVf_POK)        strcat(d, "POK,");
3495     if (flags & SVf_ROK)        strcat(d, "ROK,");
3496     if (flags & SVf_OOK)        strcat(d, "OOK,");
3497     if (flags & SVf_FAKE)       strcat(d, "FAKE,");
3498     if (flags & SVf_READONLY)   strcat(d, "READONLY,");
3499     d += strlen(d);
3500
3501 #ifdef OVERLOAD
3502     if (flags & SVf_AMAGIC)     strcat(d, "OVERLOAD,");
3503 #endif /* OVERLOAD */
3504     if (flags & SVp_IOK)        strcat(d, "pIOK,");
3505     if (flags & SVp_NOK)        strcat(d, "pNOK,");
3506     if (flags & SVp_POK)        strcat(d, "pPOK,");
3507     if (flags & SVp_SCREAM)     strcat(d, "SCREAM,");
3508
3509     switch (type) {
3510     case SVt_PVCV:
3511       if (CvANON(sv))   strcat(d, "ANON,");
3512       if (CvCLONE(sv))  strcat(d, "CLONE,");
3513       if (CvCLONED(sv)) strcat(d, "CLONED,");
3514       break;
3515     case SVt_PVGV:
3516       if (GvMULTI(sv))  strcat(d, "MULTI,");
3517 #ifdef OVERLOAD
3518       if (flags & SVpgv_AM)     strcat(d, "withOVERLOAD,");
3519 #endif /* OVERLOAD */
3520     }
3521
3522     d += strlen(d);
3523     if (d[-1] == ',')
3524         d--;
3525     *d++ = ')';
3526     *d = '\0';
3527
3528     PerlIO_printf(Perl_debug_log, "SV = ");
3529     switch (type) {
3530     case SVt_NULL:
3531         PerlIO_printf(Perl_debug_log, "NULL%s\n", tmpbuf);
3532         return;
3533     case SVt_IV:
3534         PerlIO_printf(Perl_debug_log, "IV%s\n", tmpbuf);
3535         break;
3536     case SVt_NV:
3537         PerlIO_printf(Perl_debug_log, "NV%s\n", tmpbuf);
3538         break;
3539     case SVt_RV:
3540         PerlIO_printf(Perl_debug_log, "RV%s\n", tmpbuf);
3541         break;
3542     case SVt_PV:
3543         PerlIO_printf(Perl_debug_log, "PV%s\n", tmpbuf);
3544         break;
3545     case SVt_PVIV:
3546         PerlIO_printf(Perl_debug_log, "PVIV%s\n", tmpbuf);
3547         break;
3548     case SVt_PVNV:
3549         PerlIO_printf(Perl_debug_log, "PVNV%s\n", tmpbuf);
3550         break;
3551     case SVt_PVBM:
3552         PerlIO_printf(Perl_debug_log, "PVBM%s\n", tmpbuf);
3553         break;
3554     case SVt_PVMG:
3555         PerlIO_printf(Perl_debug_log, "PVMG%s\n", tmpbuf);
3556         break;
3557     case SVt_PVLV:
3558         PerlIO_printf(Perl_debug_log, "PVLV%s\n", tmpbuf);
3559         break;
3560     case SVt_PVAV:
3561         PerlIO_printf(Perl_debug_log, "PVAV%s\n", tmpbuf);
3562         break;
3563     case SVt_PVHV:
3564         PerlIO_printf(Perl_debug_log, "PVHV%s\n", tmpbuf);
3565         break;
3566     case SVt_PVCV:
3567         PerlIO_printf(Perl_debug_log, "PVCV%s\n", tmpbuf);
3568         break;
3569     case SVt_PVGV:
3570         PerlIO_printf(Perl_debug_log, "PVGV%s\n", tmpbuf);
3571         break;
3572     case SVt_PVFM:
3573         PerlIO_printf(Perl_debug_log, "PVFM%s\n", tmpbuf);
3574         break;
3575     case SVt_PVIO:
3576         PerlIO_printf(Perl_debug_log, "PVIO%s\n", tmpbuf);
3577         break;
3578     default:
3579         PerlIO_printf(Perl_debug_log, "UNKNOWN%s\n", tmpbuf);
3580         return;
3581     }
3582     if (type >= SVt_PVIV || type == SVt_IV)
3583         PerlIO_printf(Perl_debug_log, "  IV = %ld\n", (long)SvIVX(sv));
3584     if (type >= SVt_PVNV || type == SVt_NV)
3585         PerlIO_printf(Perl_debug_log, "  NV = %.*g\n", DBL_DIG, SvNVX(sv));
3586     if (SvROK(sv)) {
3587         PerlIO_printf(Perl_debug_log, "  RV = 0x%lx\n", (long)SvRV(sv));
3588         sv_dump(SvRV(sv));
3589         return;
3590     }
3591     if (type < SVt_PV)
3592         return;
3593     if (type <= SVt_PVLV) {
3594         if (SvPVX(sv))
3595             PerlIO_printf(Perl_debug_log, "  PV = 0x%lx \"%s\"\n  CUR = %ld\n  LEN = %ld\n",
3596                 (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
3597         else
3598             PerlIO_printf(Perl_debug_log, "  PV = 0\n");
3599     }
3600     if (type >= SVt_PVMG) {
3601         if (SvMAGIC(sv)) {
3602             PerlIO_printf(Perl_debug_log, "  MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
3603         }
3604         if (SvSTASH(sv))
3605             PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n", HvNAME(SvSTASH(sv)));
3606     }
3607     switch (type) {
3608     case SVt_PVLV:
3609         PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", LvTYPE(sv));
3610         PerlIO_printf(Perl_debug_log, "  TARGOFF = %ld\n", (long)LvTARGOFF(sv));
3611         PerlIO_printf(Perl_debug_log, "  TARGLEN = %ld\n", (long)LvTARGLEN(sv));
3612         PerlIO_printf(Perl_debug_log, "  TARG = 0x%lx\n", (long)LvTARG(sv));
3613         sv_dump(LvTARG(sv));
3614         break;
3615     case SVt_PVAV:
3616         PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n", (long)AvARRAY(sv));
3617         PerlIO_printf(Perl_debug_log, "  ALLOC = 0x%lx\n", (long)AvALLOC(sv));
3618         PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)AvFILL(sv));
3619         PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)AvMAX(sv));
3620         PerlIO_printf(Perl_debug_log, "  ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
3621         flags = AvFLAGS(sv);
3622         d = tmpbuf;
3623         *d = '\0';
3624         if (flags & AVf_REAL)   strcat(d, "REAL,");
3625         if (flags & AVf_REIFY)  strcat(d, "REIFY,");
3626         if (flags & AVf_REUSED) strcat(d, "REUSED,");
3627         if (*d)
3628             d[strlen(d)-1] = '\0';
3629         PerlIO_printf(Perl_debug_log, "  FLAGS = (%s)\n", d);
3630         break;
3631     case SVt_PVHV:
3632         PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n",(long)HvARRAY(sv));
3633         PerlIO_printf(Perl_debug_log, "  KEYS = %ld\n", (long)HvKEYS(sv));
3634         PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)HvFILL(sv));
3635         PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)HvMAX(sv));
3636         PerlIO_printf(Perl_debug_log, "  RITER = %ld\n", (long)HvRITER(sv));
3637         PerlIO_printf(Perl_debug_log, "  EITER = 0x%lx\n",(long) HvEITER(sv));
3638         if (HvPMROOT(sv))
3639             PerlIO_printf(Perl_debug_log, "  PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
3640         if (HvNAME(sv))
3641             PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", HvNAME(sv));
3642         break;
3643     case SVt_PVFM:
3644     case SVt_PVCV:
3645         if (SvPOK(sv))
3646             PerlIO_printf(Perl_debug_log, "  PROTOTYPE = \"%s\"\n", SvPV(sv,na));
3647         PerlIO_printf(Perl_debug_log, "  STASH = 0x%lx\n", (long)CvSTASH(sv));
3648         PerlIO_printf(Perl_debug_log, "  START = 0x%lx\n", (long)CvSTART(sv));
3649         PerlIO_printf(Perl_debug_log, "  ROOT = 0x%lx\n", (long)CvROOT(sv));
3650         PerlIO_printf(Perl_debug_log, "  XSUB = 0x%lx\n", (long)CvXSUB(sv));
3651         PerlIO_printf(Perl_debug_log, "  XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
3652         PerlIO_printf(PerlIO_stderr(), "  GV = 0x%lx", (long)CvGV(sv));
3653         if (CvGV(sv) && GvNAME(CvGV(sv))) {
3654             PerlIO_printf(PerlIO_stderr(), "  \"%s\"\n", GvNAME(CvGV(sv)));
3655         } else {
3656             PerlIO_printf(PerlIO_stderr(), "\n");
3657         }
3658         PerlIO_printf(Perl_debug_log, "  FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
3659         PerlIO_printf(Perl_debug_log, "  DEPTH = %ld\n", (long)CvDEPTH(sv));
3660         PerlIO_printf(Perl_debug_log, "  PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
3661         PerlIO_printf(Perl_debug_log, "  OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
3662         if (type == SVt_PVFM)
3663             PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)FmLINES(sv));
3664         break;
3665     case SVt_PVGV:
3666         PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", GvNAME(sv));
3667         PerlIO_printf(Perl_debug_log, "  NAMELEN = %ld\n", (long)GvNAMELEN(sv));
3668         PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n", HvNAME(GvSTASH(sv)));
3669         PerlIO_printf(Perl_debug_log, "  GP = 0x%lx\n", (long)GvGP(sv));
3670         PerlIO_printf(Perl_debug_log, "    SV = 0x%lx\n", (long)GvSV(sv));
3671         PerlIO_printf(Perl_debug_log, "    REFCNT = %ld\n", (long)GvREFCNT(sv));
3672         PerlIO_printf(Perl_debug_log, "    IO = 0x%lx\n", (long)GvIOp(sv));
3673         PerlIO_printf(Perl_debug_log, "    FORM = 0x%lx\n", (long)GvFORM(sv));
3674         PerlIO_printf(Perl_debug_log, "    AV = 0x%lx\n", (long)GvAV(sv));
3675         PerlIO_printf(Perl_debug_log, "    HV = 0x%lx\n", (long)GvHV(sv));
3676         PerlIO_printf(Perl_debug_log, "    CV = 0x%lx\n", (long)GvCV(sv));
3677         PerlIO_printf(Perl_debug_log, "    CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
3678         PerlIO_printf(Perl_debug_log, "    LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
3679         PerlIO_printf(Perl_debug_log, "    LINE = %ld\n", (long)GvLINE(sv));
3680         PerlIO_printf(Perl_debug_log, "    FLAGS = 0x%x\n", (int)GvFLAGS(sv));
3681         PerlIO_printf(Perl_debug_log, "    STASH = \"%s\"\n", HvNAME(GvSTASH(sv)));
3682         PerlIO_printf(Perl_debug_log, "    EGV = 0x%lx\n", (long)GvEGV(sv));
3683         break;
3684     case SVt_PVIO:
3685         PerlIO_printf(Perl_debug_log, "  IFP = 0x%lx\n", (long)IoIFP(sv));
3686         PerlIO_printf(Perl_debug_log, "  OFP = 0x%lx\n", (long)IoOFP(sv));
3687         PerlIO_printf(Perl_debug_log, "  DIRP = 0x%lx\n", (long)IoDIRP(sv));
3688         PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)IoLINES(sv));
3689         PerlIO_printf(Perl_debug_log, "  PAGE = %ld\n", (long)IoPAGE(sv));
3690         PerlIO_printf(Perl_debug_log, "  PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
3691         PerlIO_printf(Perl_debug_log, "  LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
3692         PerlIO_printf(Perl_debug_log, "  TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
3693         PerlIO_printf(Perl_debug_log, "  TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
3694         PerlIO_printf(Perl_debug_log, "  FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
3695         PerlIO_printf(Perl_debug_log, "  FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
3696         PerlIO_printf(Perl_debug_log, "  BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
3697         PerlIO_printf(Perl_debug_log, "  BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
3698         PerlIO_printf(Perl_debug_log, "  SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
3699         PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", IoTYPE(sv));
3700         PerlIO_printf(Perl_debug_log, "  FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
3701         break;
3702     }
3703 }
3704 #else
3705 void
3706 sv_dump(sv)
3707 SV* sv;
3708 {
3709 }
3710 #endif
3711
3712 IO*
3713 sv_2io(sv)
3714 SV *sv;
3715 {
3716     IO* io;
3717     GV* gv;
3718
3719     switch (SvTYPE(sv)) {
3720     case SVt_PVIO:
3721         io = (IO*)sv;
3722         break;
3723     case SVt_PVGV:
3724         gv = (GV*)sv;
3725         io = GvIO(gv);
3726         if (!io)
3727             croak("Bad filehandle: %s", GvNAME(gv));
3728         break;
3729     default:
3730         if (!SvOK(sv))
3731             croak(no_usym, "filehandle");
3732         if (SvROK(sv))
3733             return sv_2io(SvRV(sv));
3734         gv = gv_fetchpv(SvPV(sv,na), FALSE, SVt_PVIO);
3735         if (gv)
3736             io = GvIO(gv);
3737         else
3738             io = 0;
3739         if (!io)
3740             croak("Bad filehandle: %s", SvPV(sv,na));
3741         break;
3742     }
3743     return io;
3744 }
3745