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