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