This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
doc tweak suggested by M.J.T. Guy <mjtg@cus.cam.ac.uk>
[perl5.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (c) 1991-1999, 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 #ifdef PERL_OBJECT
40 #define FCALL this->*f
41 #define VTBL this->*vtbl
42
43 #else /* !PERL_OBJECT */
44
45 static IV asIV _((SV* sv));
46 static UV asUV _((SV* sv));
47 static SV *more_sv _((void));
48 static void more_xiv _((void));
49 static void more_xnv _((void));
50 static void more_xpv _((void));
51 static void more_xrv _((void));
52 static XPVIV *new_xiv _((void));
53 static XPVNV *new_xnv _((void));
54 static XPV *new_xpv _((void));
55 static XRV *new_xrv _((void));
56 static void del_xiv _((XPVIV* p));
57 static void del_xnv _((XPVNV* p));
58 static void del_xpv _((XPV* p));
59 static void del_xrv _((XRV* p));
60 static void sv_mortalgrow _((void));
61 static void sv_unglob _((SV* sv));
62 static void sv_check_thinkfirst _((SV *sv));
63
64 #ifndef PURIFY
65 static void *my_safemalloc(MEM_SIZE size);
66 #endif
67
68 typedef void (*SVFUNC) _((SV*));
69 #define VTBL *vtbl
70 #define FCALL *f
71
72 #endif /* PERL_OBJECT */
73
74 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_check_thinkfirst(sv)
75
76 #ifdef PURIFY
77
78 #define new_SV(p)                       \
79     do {                                \
80         LOCK_SV_MUTEX;                  \
81         (p) = (SV*)safemalloc(sizeof(SV)); \
82         reg_add(p);                     \
83         UNLOCK_SV_MUTEX;                \
84     } while (0)
85
86 #define del_SV(p)                       \
87     do {                                \
88         LOCK_SV_MUTEX;                  \
89         reg_remove(p);                  \
90         Safefree((char*)(p));           \
91         UNLOCK_SV_MUTEX;                \
92     } while (0)
93
94 static SV **registry;
95 static I32 registry_size;
96
97 #define REGHASH(sv,size)  ((((U32)(sv)) >> 2) % (size))
98
99 #define REG_REPLACE(sv,a,b) \
100     do {                                \
101         void* p = sv->sv_any;           \
102         I32 h = REGHASH(sv, registry_size);     \
103         I32 i = h;                      \
104         while (registry[i] != (a)) {    \
105             if (++i >= registry_size)   \
106                 i = 0;                  \
107             if (i == h)                 \
108                 die("SV registry bug"); \
109         }                               \
110         registry[i] = (b);              \
111     } while (0)
112
113 #define REG_ADD(sv)     REG_REPLACE(sv,Nullsv,sv)
114 #define REG_REMOVE(sv)  REG_REPLACE(sv,sv,Nullsv)
115
116 static void
117 reg_add(sv)
118 SV* sv;
119 {
120     if (PL_sv_count >= (registry_size >> 1))
121     {
122         SV **oldreg = registry;
123         I32 oldsize = registry_size;
124
125         registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
126         Newz(707, registry, registry_size, SV*);
127
128         if (oldreg) {
129             I32 i;
130
131             for (i = 0; i < oldsize; ++i) {
132                 SV* oldsv = oldreg[i];
133                 if (oldsv)
134                     REG_ADD(oldsv);
135             }
136             Safefree(oldreg);
137         }
138     }
139
140     REG_ADD(sv);
141     ++PL_sv_count;
142 }
143
144 static void
145 reg_remove(sv)
146 SV* sv;
147 {
148     REG_REMOVE(sv);
149     --PL_sv_count;
150 }
151
152 static void
153 visit(f)
154 SVFUNC f;
155 {
156     I32 i;
157
158     for (i = 0; i < registry_size; ++i) {
159         SV* sv = registry[i];
160         if (sv && SvTYPE(sv) != SVTYPEMASK)
161             (*f)(sv);
162     }
163 }
164
165 void
166 sv_add_arena(ptr, size, flags)
167 char* ptr;
168 U32 size;
169 U32 flags;
170 {
171     if (!(flags & SVf_FAKE))
172         Safefree(ptr);
173 }
174
175 #else /* ! PURIFY */
176
177 /*
178  * "A time to plant, and a time to uproot what was planted..."
179  */
180
181 #define plant_SV(p)                     \
182     do {                                \
183         SvANY(p) = (void *)PL_sv_root;  \
184         SvFLAGS(p) = SVTYPEMASK;        \
185         PL_sv_root = (p);                       \
186         --PL_sv_count;                  \
187     } while (0)
188
189 /* sv_mutex must be held while calling uproot_SV() */
190 #define uproot_SV(p)                    \
191     do {                                \
192         (p) = PL_sv_root;                       \
193         PL_sv_root = (SV*)SvANY(p);     \
194         ++PL_sv_count;                  \
195     } while (0)
196
197 #define new_SV(p)       do {    \
198         LOCK_SV_MUTEX;          \
199         if (PL_sv_root)         \
200             uproot_SV(p);       \
201         else                    \
202             (p) = more_sv();    \
203         UNLOCK_SV_MUTEX;        \
204     } while (0)
205
206 #ifdef DEBUGGING
207
208 #define del_SV(p)       do {    \
209         LOCK_SV_MUTEX;          \
210         if (PL_debug & 32768)   \
211             del_sv(p);          \
212         else                    \
213             plant_SV(p);        \
214         UNLOCK_SV_MUTEX;        \
215     } while (0)
216
217 STATIC void
218 del_sv(SV *p)
219 {
220     if (PL_debug & 32768) {
221         SV* sva;
222         SV* sv;
223         SV* svend;
224         int ok = 0;
225         for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
226             sv = sva + 1;
227             svend = &sva[SvREFCNT(sva)];
228             if (p >= sv && p < svend)
229                 ok = 1;
230         }
231         if (!ok) {
232             warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
233             return;
234         }
235     }
236     plant_SV(p);
237 }
238
239 #else /* ! DEBUGGING */
240
241 #define del_SV(p)   plant_SV(p)
242
243 #endif /* DEBUGGING */
244
245 void
246 sv_add_arena(char *ptr, U32 size, U32 flags)
247 {
248     SV* sva = (SV*)ptr;
249     register SV* sv;
250     register SV* svend;
251     Zero(sva, size, char);
252
253     /* The first SV in an arena isn't an SV. */
254     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
255     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
256     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
257
258     PL_sv_arenaroot = sva;
259     PL_sv_root = sva + 1;
260
261     svend = &sva[SvREFCNT(sva) - 1];
262     sv = sva + 1;
263     while (sv < svend) {
264         SvANY(sv) = (void *)(SV*)(sv + 1);
265         SvFLAGS(sv) = SVTYPEMASK;
266         sv++;
267     }
268     SvANY(sv) = 0;
269     SvFLAGS(sv) = SVTYPEMASK;
270 }
271
272 /* sv_mutex must be held while calling more_sv() */
273 STATIC SV*
274 more_sv(void)
275 {
276     register SV* sv;
277
278     if (PL_nice_chunk) {
279         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
280         PL_nice_chunk = Nullch;
281     }
282     else {
283         char *chunk;                /* must use New here to match call to */
284         New(704,chunk,1008,char);   /* Safefree() in sv_free_arenas()     */
285         sv_add_arena(chunk, 1008, 0);
286     }
287     uproot_SV(sv);
288     return sv;
289 }
290
291 STATIC void
292 visit(SVFUNC f)
293 {
294     SV* sva;
295     SV* sv;
296     register SV* svend;
297
298     for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
299         svend = &sva[SvREFCNT(sva)];
300         for (sv = sva + 1; sv < svend; ++sv) {
301             if (SvTYPE(sv) != SVTYPEMASK)
302                 (FCALL)(sv);
303         }
304     }
305 }
306
307 #endif /* PURIFY */
308
309 STATIC void
310 do_report_used(SV *sv)
311 {
312     if (SvTYPE(sv) != SVTYPEMASK) {
313         /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
314         PerlIO_printf(PerlIO_stderr(), "****\n");
315         sv_dump(sv);
316     }
317 }
318
319 void
320 sv_report_used(void)
321 {
322     visit(FUNC_NAME_TO_PTR(do_report_used));
323 }
324
325 STATIC void
326 do_clean_objs(SV *sv)
327 {
328     SV* rv;
329
330     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
331         DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
332         SvROK_off(sv);
333         SvRV(sv) = 0;
334         SvREFCNT_dec(rv);
335     }
336
337     /* XXX Might want to check arrays, etc. */
338 }
339
340 #ifndef DISABLE_DESTRUCTOR_KLUDGE
341 STATIC void
342 do_clean_named_objs(SV *sv)
343 {
344     if (SvTYPE(sv) == SVt_PVGV) {
345         if ( SvOBJECT(GvSV(sv)) ||
346              GvAV(sv) && SvOBJECT(GvAV(sv)) ||
347              GvHV(sv) && SvOBJECT(GvHV(sv)) ||
348              GvIO(sv) && SvOBJECT(GvIO(sv)) ||
349              GvCV(sv) && SvOBJECT(GvCV(sv)) )
350         {
351             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
352             SvREFCNT_dec(sv);
353         }
354     }
355 }
356 #endif
357
358 void
359 sv_clean_objs(void)
360 {
361     PL_in_clean_objs = TRUE;
362     visit(FUNC_NAME_TO_PTR(do_clean_objs));
363 #ifndef DISABLE_DESTRUCTOR_KLUDGE
364     /* some barnacles may yet remain, clinging to typeglobs */
365     visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
366 #endif
367     PL_in_clean_objs = FALSE;
368 }
369
370 STATIC void
371 do_clean_all(SV *sv)
372 {
373     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
374     SvFLAGS(sv) |= SVf_BREAK;
375     SvREFCNT_dec(sv);
376 }
377
378 void
379 sv_clean_all(void)
380 {
381     PL_in_clean_all = TRUE;
382     visit(FUNC_NAME_TO_PTR(do_clean_all));
383     PL_in_clean_all = FALSE;
384 }
385
386 void
387 sv_free_arenas(void)
388 {
389     SV* sva;
390     SV* svanext;
391
392     /* Free arenas here, but be careful about fake ones.  (We assume
393        contiguity of the fake ones with the corresponding real ones.) */
394
395     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
396         svanext = (SV*) SvANY(sva);
397         while (svanext && SvFAKE(svanext))
398             svanext = (SV*) SvANY(svanext);
399
400         if (!SvFAKE(sva))
401             Safefree((void *)sva);
402     }
403
404     if (PL_nice_chunk)
405         Safefree(PL_nice_chunk);
406     PL_nice_chunk = Nullch;
407     PL_nice_chunk_size = 0;
408     PL_sv_arenaroot = 0;
409     PL_sv_root = 0;
410 }
411
412 STATIC XPVIV*
413 new_xiv(void)
414 {
415     IV* xiv;
416     LOCK_SV_MUTEX;
417     if (!PL_xiv_root)
418         more_xiv();
419     xiv = PL_xiv_root;
420     /*
421      * See comment in more_xiv() -- RAM.
422      */
423     PL_xiv_root = *(IV**)xiv;
424     UNLOCK_SV_MUTEX;
425     return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
426 }
427
428 STATIC void
429 del_xiv(XPVIV *p)
430 {
431     IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
432     LOCK_SV_MUTEX;
433     *(IV**)xiv = PL_xiv_root;
434     PL_xiv_root = xiv;
435     UNLOCK_SV_MUTEX;
436 }
437
438 STATIC void
439 more_xiv(void)
440 {
441     register IV* xiv;
442     register IV* xivend;
443     XPV* ptr;
444     New(705, ptr, 1008/sizeof(XPV), XPV);
445     ptr->xpv_pv = (char*)PL_xiv_arenaroot;              /* linked list of xiv arenas */
446     PL_xiv_arenaroot = ptr;                     /* to keep Purify happy */
447
448     xiv = (IV*) ptr;
449     xivend = &xiv[1008 / sizeof(IV) - 1];
450     xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1;   /* fudge by size of XPV */
451     PL_xiv_root = xiv;
452     while (xiv < xivend) {
453         *(IV**)xiv = (IV *)(xiv + 1);
454         xiv++;
455     }
456     *(IV**)xiv = 0;
457 }
458
459 STATIC XPVNV*
460 new_xnv(void)
461 {
462     double* xnv;
463     LOCK_SV_MUTEX;
464     if (!PL_xnv_root)
465         more_xnv();
466     xnv = PL_xnv_root;
467     PL_xnv_root = *(double**)xnv;
468     UNLOCK_SV_MUTEX;
469     return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
470 }
471
472 STATIC void
473 del_xnv(XPVNV *p)
474 {
475     double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
476     LOCK_SV_MUTEX;
477     *(double**)xnv = PL_xnv_root;
478     PL_xnv_root = xnv;
479     UNLOCK_SV_MUTEX;
480 }
481
482 STATIC void
483 more_xnv(void)
484 {
485     register double* xnv;
486     register double* xnvend;
487     New(711, xnv, 1008/sizeof(double), double);
488     xnvend = &xnv[1008 / sizeof(double) - 1];
489     xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
490     PL_xnv_root = xnv;
491     while (xnv < xnvend) {
492         *(double**)xnv = (double*)(xnv + 1);
493         xnv++;
494     }
495     *(double**)xnv = 0;
496 }
497
498 STATIC XRV*
499 new_xrv(void)
500 {
501     XRV* xrv;
502     LOCK_SV_MUTEX;
503     if (!PL_xrv_root)
504         more_xrv();
505     xrv = PL_xrv_root;
506     PL_xrv_root = (XRV*)xrv->xrv_rv;
507     UNLOCK_SV_MUTEX;
508     return xrv;
509 }
510
511 STATIC void
512 del_xrv(XRV *p)
513 {
514     LOCK_SV_MUTEX;
515     p->xrv_rv = (SV*)PL_xrv_root;
516     PL_xrv_root = p;
517     UNLOCK_SV_MUTEX;
518 }
519
520 STATIC void
521 more_xrv(void)
522 {
523     register XRV* xrv;
524     register XRV* xrvend;
525     New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
526     xrv = PL_xrv_root;
527     xrvend = &xrv[1008 / sizeof(XRV) - 1];
528     while (xrv < xrvend) {
529         xrv->xrv_rv = (SV*)(xrv + 1);
530         xrv++;
531     }
532     xrv->xrv_rv = 0;
533 }
534
535 STATIC XPV*
536 new_xpv(void)
537 {
538     XPV* xpv;
539     LOCK_SV_MUTEX;
540     if (!PL_xpv_root)
541         more_xpv();
542     xpv = PL_xpv_root;
543     PL_xpv_root = (XPV*)xpv->xpv_pv;
544     UNLOCK_SV_MUTEX;
545     return xpv;
546 }
547
548 STATIC void
549 del_xpv(XPV *p)
550 {
551     LOCK_SV_MUTEX;
552     p->xpv_pv = (char*)PL_xpv_root;
553     PL_xpv_root = p;
554     UNLOCK_SV_MUTEX;
555 }
556
557 STATIC void
558 more_xpv(void)
559 {
560     register XPV* xpv;
561     register XPV* xpvend;
562     New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
563     xpv = PL_xpv_root;
564     xpvend = &xpv[1008 / sizeof(XPV) - 1];
565     while (xpv < xpvend) {
566         xpv->xpv_pv = (char*)(xpv + 1);
567         xpv++;
568     }
569     xpv->xpv_pv = 0;
570 }
571
572 #ifdef PURIFY
573 #define new_XIV() (void*)safemalloc(sizeof(XPVIV))
574 #define del_XIV(p) Safefree((char*)p)
575 #else
576 #define new_XIV() (void*)new_xiv()
577 #define del_XIV(p) del_xiv((XPVIV*) p)
578 #endif
579
580 #ifdef PURIFY
581 #define new_XNV() (void*)safemalloc(sizeof(XPVNV))
582 #define del_XNV(p) Safefree((char*)p)
583 #else
584 #define new_XNV() (void*)new_xnv()
585 #define del_XNV(p) del_xnv((XPVNV*) p)
586 #endif
587
588 #ifdef PURIFY
589 #define new_XRV() (void*)safemalloc(sizeof(XRV))
590 #define del_XRV(p) Safefree((char*)p)
591 #else
592 #define new_XRV() (void*)new_xrv()
593 #define del_XRV(p) del_xrv((XRV*) p)
594 #endif
595
596 #ifdef PURIFY
597 #define new_XPV() (void*)safemalloc(sizeof(XPV))
598 #define del_XPV(p) Safefree((char*)p)
599 #else
600 #define new_XPV() (void*)new_xpv()
601 #define del_XPV(p) del_xpv((XPV *)p)
602 #endif
603
604 #ifdef PURIFY
605 #  define my_safemalloc(s) safemalloc(s)
606 #  define my_safefree(s) safefree(s)
607 #else
608 STATIC void* 
609 my_safemalloc(MEM_SIZE size)
610 {
611     char *p;
612     New(717, p, size, char);
613     return (void*)p;
614 }
615 #  define my_safefree(s) Safefree(s)
616 #endif 
617
618 #define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
619 #define del_XPVIV(p) my_safefree((char*)p)
620   
621 #define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
622 #define del_XPVNV(p) my_safefree((char*)p)
623   
624 #define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
625 #define del_XPVMG(p) my_safefree((char*)p)
626   
627 #define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
628 #define del_XPVLV(p) my_safefree((char*)p)
629   
630 #define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
631 #define del_XPVAV(p) my_safefree((char*)p)
632   
633 #define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
634 #define del_XPVHV(p) my_safefree((char*)p)
635   
636 #define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
637 #define del_XPVCV(p) my_safefree((char*)p)
638   
639 #define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
640 #define del_XPVGV(p) my_safefree((char*)p)
641   
642 #define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
643 #define del_XPVBM(p) my_safefree((char*)p)
644   
645 #define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
646 #define del_XPVFM(p) my_safefree((char*)p)
647   
648 #define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
649 #define del_XPVIO(p) my_safefree((char*)p)
650
651 bool
652 sv_upgrade(register SV *sv, U32 mt)
653 {
654     char*       pv;
655     U32         cur;
656     U32         len;
657     IV          iv;
658     double      nv;
659     MAGIC*      magic;
660     HV*         stash;
661
662     if (SvTYPE(sv) == mt)
663         return TRUE;
664
665     if (mt < SVt_PVIV)
666         (void)SvOOK_off(sv);
667
668     switch (SvTYPE(sv)) {
669     case SVt_NULL:
670         pv      = 0;
671         cur     = 0;
672         len     = 0;
673         iv      = 0;
674         nv      = 0.0;
675         magic   = 0;
676         stash   = 0;
677         break;
678     case SVt_IV:
679         pv      = 0;
680         cur     = 0;
681         len     = 0;
682         iv      = SvIVX(sv);
683         nv      = (double)SvIVX(sv);
684         del_XIV(SvANY(sv));
685         magic   = 0;
686         stash   = 0;
687         if (mt == SVt_NV)
688             mt = SVt_PVNV;
689         else if (mt < SVt_PVIV)
690             mt = SVt_PVIV;
691         break;
692     case SVt_NV:
693         pv      = 0;
694         cur     = 0;
695         len     = 0;
696         nv      = SvNVX(sv);
697         iv      = I_V(nv);
698         magic   = 0;
699         stash   = 0;
700         del_XNV(SvANY(sv));
701         SvANY(sv) = 0;
702         if (mt < SVt_PVNV)
703             mt = SVt_PVNV;
704         break;
705     case SVt_RV:
706         pv      = (char*)SvRV(sv);
707         cur     = 0;
708         len     = 0;
709         iv      = (IV)pv;
710         nv      = (double)(unsigned long)pv;
711         del_XRV(SvANY(sv));
712         magic   = 0;
713         stash   = 0;
714         break;
715     case SVt_PV:
716         pv      = SvPVX(sv);
717         cur     = SvCUR(sv);
718         len     = SvLEN(sv);
719         iv      = 0;
720         nv      = 0.0;
721         magic   = 0;
722         stash   = 0;
723         del_XPV(SvANY(sv));
724         if (mt <= SVt_IV)
725             mt = SVt_PVIV;
726         else if (mt == SVt_NV)
727             mt = SVt_PVNV;
728         break;
729     case SVt_PVIV:
730         pv      = SvPVX(sv);
731         cur     = SvCUR(sv);
732         len     = SvLEN(sv);
733         iv      = SvIVX(sv);
734         nv      = 0.0;
735         magic   = 0;
736         stash   = 0;
737         del_XPVIV(SvANY(sv));
738         break;
739     case SVt_PVNV:
740         pv      = SvPVX(sv);
741         cur     = SvCUR(sv);
742         len     = SvLEN(sv);
743         iv      = SvIVX(sv);
744         nv      = SvNVX(sv);
745         magic   = 0;
746         stash   = 0;
747         del_XPVNV(SvANY(sv));
748         break;
749     case SVt_PVMG:
750         pv      = SvPVX(sv);
751         cur     = SvCUR(sv);
752         len     = SvLEN(sv);
753         iv      = SvIVX(sv);
754         nv      = SvNVX(sv);
755         magic   = SvMAGIC(sv);
756         stash   = SvSTASH(sv);
757         del_XPVMG(SvANY(sv));
758         break;
759     default:
760         croak("Can't upgrade that kind of scalar");
761     }
762
763     switch (mt) {
764     case SVt_NULL:
765         croak("Can't upgrade to undef");
766     case SVt_IV:
767         SvANY(sv) = new_XIV();
768         SvIVX(sv)       = iv;
769         break;
770     case SVt_NV:
771         SvANY(sv) = new_XNV();
772         SvNVX(sv)       = nv;
773         break;
774     case SVt_RV:
775         SvANY(sv) = new_XRV();
776         SvRV(sv) = (SV*)pv;
777         break;
778     case SVt_PV:
779         SvANY(sv) = new_XPV();
780         SvPVX(sv)       = pv;
781         SvCUR(sv)       = cur;
782         SvLEN(sv)       = len;
783         break;
784     case SVt_PVIV:
785         SvANY(sv) = new_XPVIV();
786         SvPVX(sv)       = pv;
787         SvCUR(sv)       = cur;
788         SvLEN(sv)       = len;
789         SvIVX(sv)       = iv;
790         if (SvNIOK(sv))
791             (void)SvIOK_on(sv);
792         SvNOK_off(sv);
793         break;
794     case SVt_PVNV:
795         SvANY(sv) = new_XPVNV();
796         SvPVX(sv)       = pv;
797         SvCUR(sv)       = cur;
798         SvLEN(sv)       = len;
799         SvIVX(sv)       = iv;
800         SvNVX(sv)       = nv;
801         break;
802     case SVt_PVMG:
803         SvANY(sv) = new_XPVMG();
804         SvPVX(sv)       = pv;
805         SvCUR(sv)       = cur;
806         SvLEN(sv)       = len;
807         SvIVX(sv)       = iv;
808         SvNVX(sv)       = nv;
809         SvMAGIC(sv)     = magic;
810         SvSTASH(sv)     = stash;
811         break;
812     case SVt_PVLV:
813         SvANY(sv) = new_XPVLV();
814         SvPVX(sv)       = pv;
815         SvCUR(sv)       = cur;
816         SvLEN(sv)       = len;
817         SvIVX(sv)       = iv;
818         SvNVX(sv)       = nv;
819         SvMAGIC(sv)     = magic;
820         SvSTASH(sv)     = stash;
821         LvTARGOFF(sv)   = 0;
822         LvTARGLEN(sv)   = 0;
823         LvTARG(sv)      = 0;
824         LvTYPE(sv)      = 0;
825         break;
826     case SVt_PVAV:
827         SvANY(sv) = new_XPVAV();
828         if (pv)
829             Safefree(pv);
830         SvPVX(sv)       = 0;
831         AvMAX(sv)       = -1;
832         AvFILLp(sv)     = -1;
833         SvIVX(sv)       = 0;
834         SvNVX(sv)       = 0.0;
835         SvMAGIC(sv)     = magic;
836         SvSTASH(sv)     = stash;
837         AvALLOC(sv)     = 0;
838         AvARYLEN(sv)    = 0;
839         AvFLAGS(sv)     = 0;
840         break;
841     case SVt_PVHV:
842         SvANY(sv) = new_XPVHV();
843         if (pv)
844             Safefree(pv);
845         SvPVX(sv)       = 0;
846         HvFILL(sv)      = 0;
847         HvMAX(sv)       = 0;
848         HvKEYS(sv)      = 0;
849         SvNVX(sv)       = 0.0;
850         SvMAGIC(sv)     = magic;
851         SvSTASH(sv)     = stash;
852         HvRITER(sv)     = 0;
853         HvEITER(sv)     = 0;
854         HvPMROOT(sv)    = 0;
855         HvNAME(sv)      = 0;
856         break;
857     case SVt_PVCV:
858         SvANY(sv) = new_XPVCV();
859         Zero(SvANY(sv), 1, XPVCV);
860         SvPVX(sv)       = pv;
861         SvCUR(sv)       = cur;
862         SvLEN(sv)       = len;
863         SvIVX(sv)       = iv;
864         SvNVX(sv)       = nv;
865         SvMAGIC(sv)     = magic;
866         SvSTASH(sv)     = stash;
867         break;
868     case SVt_PVGV:
869         SvANY(sv) = new_XPVGV();
870         SvPVX(sv)       = pv;
871         SvCUR(sv)       = cur;
872         SvLEN(sv)       = len;
873         SvIVX(sv)       = iv;
874         SvNVX(sv)       = nv;
875         SvMAGIC(sv)     = magic;
876         SvSTASH(sv)     = stash;
877         GvGP(sv)        = 0;
878         GvNAME(sv)      = 0;
879         GvNAMELEN(sv)   = 0;
880         GvSTASH(sv)     = 0;
881         GvFLAGS(sv)     = 0;
882         break;
883     case SVt_PVBM:
884         SvANY(sv) = new_XPVBM();
885         SvPVX(sv)       = pv;
886         SvCUR(sv)       = cur;
887         SvLEN(sv)       = len;
888         SvIVX(sv)       = iv;
889         SvNVX(sv)       = nv;
890         SvMAGIC(sv)     = magic;
891         SvSTASH(sv)     = stash;
892         BmRARE(sv)      = 0;
893         BmUSEFUL(sv)    = 0;
894         BmPREVIOUS(sv)  = 0;
895         break;
896     case SVt_PVFM:
897         SvANY(sv) = new_XPVFM();
898         Zero(SvANY(sv), 1, XPVFM);
899         SvPVX(sv)       = pv;
900         SvCUR(sv)       = cur;
901         SvLEN(sv)       = len;
902         SvIVX(sv)       = iv;
903         SvNVX(sv)       = nv;
904         SvMAGIC(sv)     = magic;
905         SvSTASH(sv)     = stash;
906         break;
907     case SVt_PVIO:
908         SvANY(sv) = new_XPVIO();
909         Zero(SvANY(sv), 1, XPVIO);
910         SvPVX(sv)       = pv;
911         SvCUR(sv)       = cur;
912         SvLEN(sv)       = len;
913         SvIVX(sv)       = iv;
914         SvNVX(sv)       = nv;
915         SvMAGIC(sv)     = magic;
916         SvSTASH(sv)     = stash;
917         IoPAGE_LEN(sv)  = 60;
918         break;
919     }
920     SvFLAGS(sv) &= ~SVTYPEMASK;
921     SvFLAGS(sv) |= mt;
922     return TRUE;
923 }
924
925 int
926 sv_backoff(register SV *sv)
927 {
928     assert(SvOOK(sv));
929     if (SvIVX(sv)) {
930         char *s = SvPVX(sv);
931         SvLEN(sv) += SvIVX(sv);
932         SvPVX(sv) -= SvIVX(sv);
933         SvIV_set(sv, 0);
934         Move(s, SvPVX(sv), SvCUR(sv)+1, char);
935     }
936     SvFLAGS(sv) &= ~SVf_OOK;
937     return 0;
938 }
939
940 char *
941 sv_grow(register SV *sv, register STRLEN newlen)
942 {
943     register char *s;
944
945 #ifdef HAS_64K_LIMIT
946     if (newlen >= 0x10000) {
947         PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
948         my_exit(1);
949     }
950 #endif /* HAS_64K_LIMIT */
951     if (SvROK(sv))
952         sv_unref(sv);
953     if (SvTYPE(sv) < SVt_PV) {
954         sv_upgrade(sv, SVt_PV);
955         s = SvPVX(sv);
956     }
957     else if (SvOOK(sv)) {       /* pv is offset? */
958         sv_backoff(sv);
959         s = SvPVX(sv);
960         if (newlen > SvLEN(sv))
961             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
962 #ifdef HAS_64K_LIMIT
963         if (newlen >= 0x10000)
964             newlen = 0xFFFF;
965 #endif
966     }
967     else
968         s = SvPVX(sv);
969     if (newlen > SvLEN(sv)) {           /* need more room? */
970         if (SvLEN(sv) && s) {
971 #if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
972             STRLEN l = malloced_size((void*)SvPVX(sv));
973             if (newlen <= l) {
974                 SvLEN_set(sv, l);
975                 return s;
976             } else
977 #endif
978             Renew(s,newlen,char);
979         }
980         else
981             New(703,s,newlen,char);
982         SvPV_set(sv, s);
983         SvLEN_set(sv, newlen);
984     }
985     return s;
986 }
987
988 void
989 sv_setiv(register SV *sv, IV i)
990 {
991     SV_CHECK_THINKFIRST(sv);
992     switch (SvTYPE(sv)) {
993     case SVt_NULL:
994         sv_upgrade(sv, SVt_IV);
995         break;
996     case SVt_NV:
997         sv_upgrade(sv, SVt_PVNV);
998         break;
999     case SVt_RV:
1000     case SVt_PV:
1001         sv_upgrade(sv, SVt_PVIV);
1002         break;
1003
1004     case SVt_PVGV:
1005         if (SvFAKE(sv)) {
1006             sv_unglob(sv);
1007             break;
1008         }
1009         /* FALL THROUGH */
1010     case SVt_PVAV:
1011     case SVt_PVHV:
1012     case SVt_PVCV:
1013     case SVt_PVFM:
1014     case SVt_PVIO:
1015         {
1016             dTHR;
1017             croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
1018                   PL_op_desc[PL_op->op_type]);
1019         }
1020     }
1021     (void)SvIOK_only(sv);                       /* validate number */
1022     SvIVX(sv) = i;
1023     SvTAINT(sv);
1024 }
1025
1026 void
1027 sv_setiv_mg(register SV *sv, IV i)
1028 {
1029     sv_setiv(sv,i);
1030     SvSETMAGIC(sv);
1031 }
1032
1033 void
1034 sv_setuv(register SV *sv, UV u)
1035 {
1036     if (u <= IV_MAX)
1037         sv_setiv(sv, u);
1038     else
1039         sv_setnv(sv, (double)u);
1040 }
1041
1042 void
1043 sv_setuv_mg(register SV *sv, UV u)
1044 {
1045     sv_setuv(sv,u);
1046     SvSETMAGIC(sv);
1047 }
1048
1049 void
1050 sv_setnv(register SV *sv, double num)
1051 {
1052     SV_CHECK_THINKFIRST(sv);
1053     switch (SvTYPE(sv)) {
1054     case SVt_NULL:
1055     case SVt_IV:
1056         sv_upgrade(sv, SVt_NV);
1057         break;
1058     case SVt_RV:
1059     case SVt_PV:
1060     case SVt_PVIV:
1061         sv_upgrade(sv, SVt_PVNV);
1062         break;
1063
1064     case SVt_PVGV:
1065         if (SvFAKE(sv)) {
1066             sv_unglob(sv);
1067             break;
1068         }
1069         /* FALL THROUGH */
1070     case SVt_PVAV:
1071     case SVt_PVHV:
1072     case SVt_PVCV:
1073     case SVt_PVFM:
1074     case SVt_PVIO:
1075         {
1076             dTHR;
1077             croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
1078                   PL_op_name[PL_op->op_type]);
1079         }
1080     }
1081     SvNVX(sv) = num;
1082     (void)SvNOK_only(sv);                       /* validate number */
1083     SvTAINT(sv);
1084 }
1085
1086 void
1087 sv_setnv_mg(register SV *sv, double num)
1088 {
1089     sv_setnv(sv,num);
1090     SvSETMAGIC(sv);
1091 }
1092
1093 STATIC void
1094 not_a_number(SV *sv)
1095 {
1096     dTHR;
1097     char tmpbuf[64];
1098     char *d = tmpbuf;
1099     char *s;
1100     char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1101                   /* each *s can expand to 4 chars + "...\0",
1102                      i.e. need room for 8 chars */
1103
1104     for (s = SvPVX(sv); *s && d < limit; s++) {
1105         int ch = *s & 0xFF;
1106         if (ch & 128 && !isPRINT_LC(ch)) {
1107             *d++ = 'M';
1108             *d++ = '-';
1109             ch &= 127;
1110         }
1111         if (ch == '\n') {
1112             *d++ = '\\';
1113             *d++ = 'n';
1114         }
1115         else if (ch == '\r') {
1116             *d++ = '\\';
1117             *d++ = 'r';
1118         }
1119         else if (ch == '\f') {
1120             *d++ = '\\';
1121             *d++ = 'f';
1122         }
1123         else if (ch == '\\') {
1124             *d++ = '\\';
1125             *d++ = '\\';
1126         }
1127         else if (isPRINT_LC(ch))
1128             *d++ = ch;
1129         else {
1130             *d++ = '^';
1131             *d++ = toCTRL(ch);
1132         }
1133     }
1134     if (*s) {
1135         *d++ = '.';
1136         *d++ = '.';
1137         *d++ = '.';
1138     }
1139     *d = '\0';
1140
1141     if (PL_op)
1142         warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
1143                 PL_op_name[PL_op->op_type]);
1144     else
1145         warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
1146 }
1147
1148 IV
1149 sv_2iv(register SV *sv)
1150 {
1151     if (!sv)
1152         return 0;
1153     if (SvGMAGICAL(sv)) {
1154         mg_get(sv);
1155         if (SvIOKp(sv))
1156             return SvIVX(sv);
1157         if (SvNOKp(sv)) {
1158             if (SvNVX(sv) < 0.0)
1159                 return I_V(SvNVX(sv));
1160             else
1161                 return (IV) U_V(SvNVX(sv));
1162         }
1163         if (SvPOKp(sv) && SvLEN(sv))
1164             return asIV(sv);
1165         if (!SvROK(sv)) {
1166             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1167                 dTHR;
1168                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1169                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1170             }
1171             return 0;
1172         }
1173     }
1174     if (SvTHINKFIRST(sv)) {
1175         if (SvROK(sv)) {
1176           SV* tmpstr;
1177           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1178               return SvIV(tmpstr);
1179           return (IV)SvRV(sv);
1180         }
1181         if (SvREADONLY(sv)) {
1182             if (SvNOKp(sv)) {
1183                 if (SvNVX(sv) < 0.0)
1184                     return I_V(SvNVX(sv));
1185                 else
1186                     return (IV) U_V(SvNVX(sv));
1187             }
1188             if (SvPOKp(sv) && SvLEN(sv))
1189                 return asIV(sv);
1190             {
1191                 dTHR;
1192                 if (ckWARN(WARN_UNINITIALIZED))
1193                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1194             }
1195             return 0;
1196         }
1197     }
1198     switch (SvTYPE(sv)) {
1199     case SVt_NULL:
1200         sv_upgrade(sv, SVt_IV);
1201         break;
1202     case SVt_PV:
1203         sv_upgrade(sv, SVt_PVIV);
1204         break;
1205     case SVt_NV:
1206         sv_upgrade(sv, SVt_PVNV);
1207         break;
1208     }
1209     if (SvNOKp(sv)) {
1210         (void)SvIOK_on(sv);
1211         if (SvNVX(sv) < 0.0)
1212             SvIVX(sv) = I_V(SvNVX(sv));
1213         else
1214             SvUVX(sv) = U_V(SvNVX(sv));
1215     }
1216     else if (SvPOKp(sv) && SvLEN(sv)) {
1217         (void)SvIOK_on(sv);
1218         SvIVX(sv) = asIV(sv);
1219     }
1220     else  {
1221         dTHR;
1222         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1223             warner(WARN_UNINITIALIZED, PL_warn_uninit);
1224         return 0;
1225     }
1226     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
1227         (unsigned long)sv,(long)SvIVX(sv)));
1228     return SvIVX(sv);
1229 }
1230
1231 UV
1232 sv_2uv(register SV *sv)
1233 {
1234     if (!sv)
1235         return 0;
1236     if (SvGMAGICAL(sv)) {
1237         mg_get(sv);
1238         if (SvIOKp(sv))
1239             return SvUVX(sv);
1240         if (SvNOKp(sv))
1241             return U_V(SvNVX(sv));
1242         if (SvPOKp(sv) && SvLEN(sv))
1243             return asUV(sv);
1244         if (!SvROK(sv)) {
1245             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1246                 dTHR;
1247                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1248                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1249             }
1250             return 0;
1251         }
1252     }
1253     if (SvTHINKFIRST(sv)) {
1254         if (SvROK(sv)) {
1255           SV* tmpstr;
1256           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1257               return SvUV(tmpstr);
1258           return (UV)SvRV(sv);
1259         }
1260         if (SvREADONLY(sv)) {
1261             if (SvNOKp(sv)) {
1262                 return U_V(SvNVX(sv));
1263             }
1264             if (SvPOKp(sv) && SvLEN(sv))
1265                 return asUV(sv);
1266             {
1267                 dTHR;
1268                 if (ckWARN(WARN_UNINITIALIZED))
1269                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1270             }
1271             return 0;
1272         }
1273     }
1274     switch (SvTYPE(sv)) {
1275     case SVt_NULL:
1276         sv_upgrade(sv, SVt_IV);
1277         break;
1278     case SVt_PV:
1279         sv_upgrade(sv, SVt_PVIV);
1280         break;
1281     case SVt_NV:
1282         sv_upgrade(sv, SVt_PVNV);
1283         break;
1284     }
1285     if (SvNOKp(sv)) {
1286         (void)SvIOK_on(sv);
1287         SvUVX(sv) = U_V(SvNVX(sv));
1288     }
1289     else if (SvPOKp(sv) && SvLEN(sv)) {
1290         (void)SvIOK_on(sv);
1291         SvUVX(sv) = asUV(sv);
1292     }
1293     else  {
1294         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1295             dTHR;
1296             if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1297                 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1298         }
1299         return 0;
1300     }
1301     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1302         (unsigned long)sv,SvUVX(sv)));
1303     return SvUVX(sv);
1304 }
1305
1306 double
1307 sv_2nv(register SV *sv)
1308 {
1309     if (!sv)
1310         return 0.0;
1311     if (SvGMAGICAL(sv)) {
1312         mg_get(sv);
1313         if (SvNOKp(sv))
1314             return SvNVX(sv);
1315         if (SvPOKp(sv) && SvLEN(sv)) {
1316             dTHR;
1317             if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1318                 not_a_number(sv);
1319             SET_NUMERIC_STANDARD();
1320             return atof(SvPVX(sv));
1321         }
1322         if (SvIOKp(sv))
1323             return (double)SvIVX(sv);
1324         if (!SvROK(sv)) {
1325             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1326                 dTHR;
1327                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1328                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1329             }
1330             return 0;
1331         }
1332     }
1333     if (SvTHINKFIRST(sv)) {
1334         if (SvROK(sv)) {
1335           SV* tmpstr;
1336           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
1337               return SvNV(tmpstr);
1338           return (double)(unsigned long)SvRV(sv);
1339         }
1340         if (SvREADONLY(sv)) {
1341             dTHR;
1342             if (SvPOKp(sv) && SvLEN(sv)) {
1343                 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1344                     not_a_number(sv);
1345                 SET_NUMERIC_STANDARD();
1346                 return atof(SvPVX(sv));
1347             }
1348             if (SvIOKp(sv))
1349                 return (double)SvIVX(sv);
1350             if (ckWARN(WARN_UNINITIALIZED))
1351                 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1352             return 0.0;
1353         }
1354     }
1355     if (SvTYPE(sv) < SVt_NV) {
1356         if (SvTYPE(sv) == SVt_IV)
1357             sv_upgrade(sv, SVt_PVNV);
1358         else
1359             sv_upgrade(sv, SVt_NV);
1360         DEBUG_c(SET_NUMERIC_STANDARD());
1361         DEBUG_c(PerlIO_printf(Perl_debug_log,
1362                               "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
1363     }
1364     else if (SvTYPE(sv) < SVt_PVNV)
1365         sv_upgrade(sv, SVt_PVNV);
1366     if (SvIOKp(sv) &&
1367             (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
1368     {
1369         SvNVX(sv) = (double)SvIVX(sv);
1370     }
1371     else if (SvPOKp(sv) && SvLEN(sv)) {
1372         dTHR;
1373         if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1374             not_a_number(sv);
1375         SET_NUMERIC_STANDARD();
1376         SvNVX(sv) = atof(SvPVX(sv));
1377     }
1378     else  {
1379         dTHR;
1380         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1381             warner(WARN_UNINITIALIZED, PL_warn_uninit);
1382         return 0.0;
1383     }
1384     SvNOK_on(sv);
1385     DEBUG_c(SET_NUMERIC_STANDARD());
1386     DEBUG_c(PerlIO_printf(Perl_debug_log,
1387                           "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
1388     return SvNVX(sv);
1389 }
1390
1391 STATIC IV
1392 asIV(SV *sv)
1393 {
1394     I32 numtype = looks_like_number(sv);
1395     double d;
1396
1397     if (numtype == 1)
1398         return atol(SvPVX(sv));
1399     if (!numtype) {
1400         dTHR;
1401         if (ckWARN(WARN_NUMERIC))
1402             not_a_number(sv);
1403     }
1404     SET_NUMERIC_STANDARD();
1405     d = atof(SvPVX(sv));
1406     if (d < 0.0)
1407         return I_V(d);
1408     else
1409         return (IV) U_V(d);
1410 }
1411
1412 STATIC UV
1413 asUV(SV *sv)
1414 {
1415     I32 numtype = looks_like_number(sv);
1416
1417 #ifdef HAS_STRTOUL
1418     if (numtype == 1)
1419         return strtoul(SvPVX(sv), Null(char**), 10);
1420 #endif
1421     if (!numtype) {
1422         dTHR;
1423         if (ckWARN(WARN_NUMERIC))
1424             not_a_number(sv);
1425     }
1426     SET_NUMERIC_STANDARD();
1427     return U_V(atof(SvPVX(sv)));
1428 }
1429
1430 I32
1431 looks_like_number(SV *sv)
1432 {
1433     register char *s;
1434     register char *send;
1435     register char *sbegin;
1436     I32 numtype;
1437     STRLEN len;
1438
1439     if (SvPOK(sv)) {
1440         sbegin = SvPVX(sv); 
1441         len = SvCUR(sv);
1442     }
1443     else if (SvPOKp(sv))
1444         sbegin = SvPV(sv, len);
1445     else
1446         return 1;
1447     send = sbegin + len;
1448
1449     s = sbegin;
1450     while (isSPACE(*s))
1451         s++;
1452     if (*s == '+' || *s == '-')
1453         s++;
1454
1455     /* next must be digit or '.' */
1456     if (isDIGIT(*s)) {
1457         do {
1458             s++;
1459         } while (isDIGIT(*s));
1460         if (*s == '.') {
1461             s++;
1462             while (isDIGIT(*s))  /* optional digits after "." */
1463                 s++;
1464         }
1465     }
1466     else if (*s == '.') {
1467         s++;
1468         /* no digits before '.' means we need digits after it */
1469         if (isDIGIT(*s)) {
1470             do {
1471                 s++;
1472             } while (isDIGIT(*s));
1473         }
1474         else
1475             return 0;
1476     }
1477     else
1478         return 0;
1479
1480     /*
1481      * we return 1 if the number can be converted to _integer_ with atol()
1482      * and 2 if you need (int)atof().
1483      */
1484     numtype = 1;
1485
1486     /* we can have an optional exponent part */
1487     if (*s == 'e' || *s == 'E') {
1488         numtype = 2;
1489         s++;
1490         if (*s == '+' || *s == '-')
1491             s++;
1492         if (isDIGIT(*s)) {
1493             do {
1494                 s++;
1495             } while (isDIGIT(*s));
1496         }
1497         else
1498             return 0;
1499     }
1500     while (isSPACE(*s))
1501         s++;
1502     if (s >= send)
1503         return numtype;
1504     if (len == 10 && memEQ(sbegin, "0 but true", 10))
1505         return 1;
1506     return 0;
1507 }
1508
1509 char *
1510 sv_2pv_nolen(register SV *sv)
1511 {
1512     STRLEN n_a;
1513     return sv_2pv(sv, &n_a);
1514 }
1515
1516 char *
1517 sv_2pv(register SV *sv, STRLEN *lp)
1518 {
1519     register char *s;
1520     int olderrno;
1521     SV *tsv;
1522     char tmpbuf[64];    /* Must fit sprintf/Gconvert of longest IV/NV */
1523
1524     if (!sv) {
1525         *lp = 0;
1526         return "";
1527     }
1528     if (SvGMAGICAL(sv)) {
1529         mg_get(sv);
1530         if (SvPOKp(sv)) {
1531             *lp = SvCUR(sv);
1532             return SvPVX(sv);
1533         }
1534         if (SvIOKp(sv)) {
1535             (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
1536             tsv = Nullsv;
1537             goto tokensave;
1538         }
1539         if (SvNOKp(sv)) {
1540             SET_NUMERIC_STANDARD();
1541             Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1542             tsv = Nullsv;
1543             goto tokensave;
1544         }
1545         if (!SvROK(sv)) {
1546             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1547                 dTHR;
1548                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1549                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1550             }
1551             *lp = 0;
1552             return "";
1553         }
1554     }
1555     if (SvTHINKFIRST(sv)) {
1556         if (SvROK(sv)) {
1557             SV* tmpstr;
1558             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
1559                 return SvPV(tmpstr,*lp);
1560             sv = (SV*)SvRV(sv);
1561             if (!sv)
1562                 s = "NULLREF";
1563             else {
1564                 MAGIC *mg;
1565                 
1566                 switch (SvTYPE(sv)) {
1567                 case SVt_PVMG:
1568                     if ( ((SvFLAGS(sv) &
1569                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG)) 
1570                           == (SVs_OBJECT|SVs_RMG))
1571                          && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
1572                          && (mg = mg_find(sv, 'r'))) {
1573                         dTHR;
1574                         regexp *re = (regexp *)mg->mg_obj;
1575
1576                         if (!mg->mg_ptr) {
1577                             char *fptr = "msix";
1578                             char reflags[6];
1579                             char ch;
1580                             int left = 0;
1581                             int right = 4;
1582                             U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1583
1584                             while(ch = *fptr++) {
1585                                 if(reganch & 1) {
1586                                     reflags[left++] = ch;
1587                                 }
1588                                 else {
1589                                     reflags[right--] = ch;
1590                                 }
1591                                 reganch >>= 1;
1592                             }
1593                             if(left != 4) {
1594                                 reflags[left] = '-';
1595                                 left = 5;
1596                             }
1597
1598                             mg->mg_len = re->prelen + 4 + left;
1599                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1600                             Copy("(?", mg->mg_ptr, 2, char);
1601                             Copy(reflags, mg->mg_ptr+2, left, char);
1602                             Copy(":", mg->mg_ptr+left+2, 1, char);
1603                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1604                             mg->mg_ptr[mg->mg_len - 1] = ')';
1605                             mg->mg_ptr[mg->mg_len] = 0;
1606                         }
1607                         PL_reginterp_cnt += re->program[0].next_off;
1608                         *lp = mg->mg_len;
1609                         return mg->mg_ptr;
1610                     }
1611                                         /* Fall through */
1612                 case SVt_NULL:
1613                 case SVt_IV:
1614                 case SVt_NV:
1615                 case SVt_RV:
1616                 case SVt_PV:
1617                 case SVt_PVIV:
1618                 case SVt_PVNV:
1619                 case SVt_PVBM:  s = "SCALAR";                   break;
1620                 case SVt_PVLV:  s = "LVALUE";                   break;
1621                 case SVt_PVAV:  s = "ARRAY";                    break;
1622                 case SVt_PVHV:  s = "HASH";                     break;
1623                 case SVt_PVCV:  s = "CODE";                     break;
1624                 case SVt_PVGV:  s = "GLOB";                     break;
1625                 case SVt_PVFM:  s = "FORMAT";                   break;
1626                 case SVt_PVIO:  s = "IO";                       break;
1627                 default:        s = "UNKNOWN";                  break;
1628                 }
1629                 tsv = NEWSV(0,0);
1630                 if (SvOBJECT(sv))
1631                     sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
1632                 else
1633                     sv_setpv(tsv, s);
1634                 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
1635                 goto tokensaveref;
1636             }
1637             *lp = strlen(s);
1638             return s;
1639         }
1640         if (SvREADONLY(sv)) {
1641             if (SvNOKp(sv)) {
1642                 SET_NUMERIC_STANDARD();
1643                 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1644                 tsv = Nullsv;
1645                 goto tokensave;
1646             }
1647             if (SvIOKp(sv)) {
1648                 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
1649                 tsv = Nullsv;
1650                 goto tokensave;
1651             }
1652             {
1653                 dTHR;
1654                 if (ckWARN(WARN_UNINITIALIZED))
1655                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1656             }
1657             *lp = 0;
1658             return "";
1659         }
1660     }
1661     (void)SvUPGRADE(sv, SVt_PV);
1662     if (SvNOKp(sv)) {
1663         if (SvTYPE(sv) < SVt_PVNV)
1664             sv_upgrade(sv, SVt_PVNV);
1665         SvGROW(sv, 28);
1666         s = SvPVX(sv);
1667         olderrno = errno;       /* some Xenix systems wipe out errno here */
1668 #ifdef apollo
1669         if (SvNVX(sv) == 0.0)
1670             (void)strcpy(s,"0");
1671         else
1672 #endif /*apollo*/
1673         {
1674             SET_NUMERIC_STANDARD();
1675             Gconvert(SvNVX(sv), DBL_DIG, 0, s);
1676         }
1677         errno = olderrno;
1678 #ifdef FIXNEGATIVEZERO
1679         if (*s == '-' && s[1] == '0' && !s[2])
1680             strcpy(s,"0");
1681 #endif
1682         while (*s) s++;
1683 #ifdef hcx
1684         if (s[-1] == '.')
1685             *--s = '\0';
1686 #endif
1687     }
1688     else if (SvIOKp(sv)) {
1689         U32 oldIOK = SvIOK(sv);
1690         if (SvTYPE(sv) < SVt_PVIV)
1691             sv_upgrade(sv, SVt_PVIV);
1692         olderrno = errno;       /* some Xenix systems wipe out errno here */
1693         sv_setpviv(sv, SvIVX(sv));
1694         errno = olderrno;
1695         s = SvEND(sv);
1696         if (oldIOK)
1697             SvIOK_on(sv);
1698         else
1699             SvIOKp_on(sv);
1700     }
1701     else {
1702         dTHR;
1703         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1704             warner(WARN_UNINITIALIZED, PL_warn_uninit);
1705         *lp = 0;
1706         return "";
1707     }
1708     *lp = s - SvPVX(sv);
1709     SvCUR_set(sv, *lp);
1710     SvPOK_on(sv);
1711     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
1712     return SvPVX(sv);
1713
1714   tokensave:
1715     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
1716         /* Sneaky stuff here */
1717
1718       tokensaveref:
1719         if (!tsv)
1720             tsv = newSVpv(tmpbuf, 0);
1721         sv_2mortal(tsv);
1722         *lp = SvCUR(tsv);
1723         return SvPVX(tsv);
1724     }
1725     else {
1726         STRLEN len;
1727         char *t;
1728
1729         if (tsv) {
1730             sv_2mortal(tsv);
1731             t = SvPVX(tsv);
1732             len = SvCUR(tsv);
1733         }
1734         else {
1735             t = tmpbuf;
1736             len = strlen(tmpbuf);
1737         }
1738 #ifdef FIXNEGATIVEZERO
1739         if (len == 2 && t[0] == '-' && t[1] == '0') {
1740             t = "0";
1741             len = 1;
1742         }
1743 #endif
1744         (void)SvUPGRADE(sv, SVt_PV);
1745         *lp = len;
1746         s = SvGROW(sv, len + 1);
1747         SvCUR_set(sv, len);
1748         (void)strcpy(s, t);
1749         SvPOKp_on(sv);
1750         return s;
1751     }
1752 }
1753
1754 /* This function is only called on magical items */
1755 bool
1756 sv_2bool(register SV *sv)
1757 {
1758     if (SvGMAGICAL(sv))
1759         mg_get(sv);
1760
1761     if (!SvOK(sv))
1762         return 0;
1763     if (SvROK(sv)) {
1764         dTHR;
1765         SV* tmpsv;
1766         if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
1767             return SvTRUE(tmpsv);
1768       return SvRV(sv) != 0;
1769     }
1770     if (SvPOKp(sv)) {
1771         register XPV* Xpvtmp;
1772         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
1773                 (*Xpvtmp->xpv_pv > '0' ||
1774                 Xpvtmp->xpv_cur > 1 ||
1775                 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
1776             return 1;
1777         else
1778             return 0;
1779     }
1780     else {
1781         if (SvIOKp(sv))
1782             return SvIVX(sv) != 0;
1783         else {
1784             if (SvNOKp(sv))
1785                 return SvNVX(sv) != 0.0;
1786             else
1787                 return FALSE;
1788         }
1789     }
1790 }
1791
1792 /* Note: sv_setsv() should not be called with a source string that needs
1793  * to be reused, since it may destroy the source string if it is marked
1794  * as temporary.
1795  */
1796
1797 void
1798 sv_setsv(SV *dstr, register SV *sstr)
1799 {
1800     dTHR;
1801     register U32 sflags;
1802     register int dtype;
1803     register int stype;
1804
1805     if (sstr == dstr)
1806         return;
1807     SV_CHECK_THINKFIRST(dstr);
1808     if (!sstr)
1809         sstr = &PL_sv_undef;
1810     stype = SvTYPE(sstr);
1811     dtype = SvTYPE(dstr);
1812
1813     if (dtype == SVt_PVGV && (SvFLAGS(dstr) & SVf_FAKE)) {
1814         sv_unglob(dstr);     /* so fake GLOB won't perpetuate */
1815         sv_setpvn(dstr, "", 0);
1816         (void)SvPOK_only(dstr);
1817         dtype = SvTYPE(dstr);
1818     }
1819
1820     SvAMAGIC_off(dstr);
1821
1822     /* There's a lot of redundancy below but we're going for speed here */
1823
1824     switch (stype) {
1825     case SVt_NULL:
1826       undef_sstr:
1827         if (dtype != SVt_PVGV) {
1828             (void)SvOK_off(dstr);
1829             return;
1830         }
1831         break;
1832     case SVt_IV:
1833         if (SvIOK(sstr)) {
1834             switch (dtype) {
1835             case SVt_NULL:
1836                 sv_upgrade(dstr, SVt_IV);
1837                 break;
1838             case SVt_NV:
1839                 sv_upgrade(dstr, SVt_PVNV);
1840                 break;
1841             case SVt_RV:
1842             case SVt_PV:
1843                 sv_upgrade(dstr, SVt_PVIV);
1844                 break;
1845             }
1846             (void)SvIOK_only(dstr);
1847             SvIVX(dstr) = SvIVX(sstr);
1848             SvTAINT(dstr);
1849             return;
1850         }
1851         goto undef_sstr;
1852
1853     case SVt_NV:
1854         if (SvNOK(sstr)) {
1855             switch (dtype) {
1856             case SVt_NULL:
1857             case SVt_IV:
1858                 sv_upgrade(dstr, SVt_NV);
1859                 break;
1860             case SVt_RV:
1861             case SVt_PV:
1862             case SVt_PVIV:
1863                 sv_upgrade(dstr, SVt_PVNV);
1864                 break;
1865             }
1866             SvNVX(dstr) = SvNVX(sstr);
1867             (void)SvNOK_only(dstr);
1868             SvTAINT(dstr);
1869             return;
1870         }
1871         goto undef_sstr;
1872
1873     case SVt_RV:
1874         if (dtype < SVt_RV)
1875             sv_upgrade(dstr, SVt_RV);
1876         else if (dtype == SVt_PVGV &&
1877                  SvTYPE(SvRV(sstr)) == SVt_PVGV) {
1878             sstr = SvRV(sstr);
1879             if (sstr == dstr) {
1880                 if (PL_curcop->cop_stash != GvSTASH(dstr))
1881                     GvIMPORTED_on(dstr);
1882                 GvMULTI_on(dstr);
1883                 return;
1884             }
1885             goto glob_assign;
1886         }
1887         break;
1888     case SVt_PV:
1889     case SVt_PVFM:
1890         if (dtype < SVt_PV)
1891             sv_upgrade(dstr, SVt_PV);
1892         break;
1893     case SVt_PVIV:
1894         if (dtype < SVt_PVIV)
1895             sv_upgrade(dstr, SVt_PVIV);
1896         break;
1897     case SVt_PVNV:
1898         if (dtype < SVt_PVNV)
1899             sv_upgrade(dstr, SVt_PVNV);
1900         break;
1901     case SVt_PVAV:
1902     case SVt_PVHV:
1903     case SVt_PVCV:
1904     case SVt_PVIO:
1905         if (PL_op)
1906             croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
1907                 PL_op_name[PL_op->op_type]);
1908         else
1909             croak("Bizarre copy of %s", sv_reftype(sstr, 0));
1910         break;
1911
1912     case SVt_PVGV:
1913         if (dtype <= SVt_PVGV) {
1914   glob_assign:
1915             if (dtype != SVt_PVGV) {
1916                 char *name = GvNAME(sstr);
1917                 STRLEN len = GvNAMELEN(sstr);
1918                 sv_upgrade(dstr, SVt_PVGV);
1919                 sv_magic(dstr, dstr, '*', name, len);
1920                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
1921                 GvNAME(dstr) = savepvn(name, len);
1922                 GvNAMELEN(dstr) = len;
1923                 SvFAKE_on(dstr);        /* can coerce to non-glob */
1924             }
1925             /* ahem, death to those who redefine active sort subs */
1926             else if (PL_curstackinfo->si_type == PERLSI_SORT
1927                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
1928                 croak("Can't redefine active sort subroutine %s",
1929                       GvNAME(dstr));
1930             (void)SvOK_off(dstr);
1931             GvINTRO_off(dstr);          /* one-shot flag */
1932             gp_free((GV*)dstr);
1933             GvGP(dstr) = gp_ref(GvGP(sstr));
1934             SvTAINT(dstr);
1935             if (PL_curcop->cop_stash != GvSTASH(dstr))
1936                 GvIMPORTED_on(dstr);
1937             GvMULTI_on(dstr);
1938             return;
1939         }
1940         /* FALL THROUGH */
1941
1942     default:
1943         if (SvGMAGICAL(sstr)) {
1944             mg_get(sstr);
1945             if (SvTYPE(sstr) != stype) {
1946                 stype = SvTYPE(sstr);
1947                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
1948                     goto glob_assign;
1949             }
1950         }
1951         if (stype == SVt_PVLV)
1952             SvUPGRADE(dstr, SVt_PVNV);
1953         else
1954             SvUPGRADE(dstr, stype);
1955     }
1956
1957     sflags = SvFLAGS(sstr);
1958
1959     if (sflags & SVf_ROK) {
1960         if (dtype >= SVt_PV) {
1961             if (dtype == SVt_PVGV) {
1962                 SV *sref = SvREFCNT_inc(SvRV(sstr));
1963                 SV *dref = 0;
1964                 int intro = GvINTRO(dstr);
1965
1966                 if (intro) {
1967                     GP *gp;
1968                     GvGP(dstr)->gp_refcnt--;
1969                     GvINTRO_off(dstr);  /* one-shot flag */
1970                     Newz(602,gp, 1, GP);
1971                     GvGP(dstr) = gp_ref(gp);
1972                     GvSV(dstr) = NEWSV(72,0);
1973                     GvLINE(dstr) = PL_curcop->cop_line;
1974                     GvEGV(dstr) = (GV*)dstr;
1975                 }
1976                 GvMULTI_on(dstr);
1977                 switch (SvTYPE(sref)) {
1978                 case SVt_PVAV:
1979                     if (intro)
1980                         SAVESPTR(GvAV(dstr));
1981                     else
1982                         dref = (SV*)GvAV(dstr);
1983                     GvAV(dstr) = (AV*)sref;
1984                     if (PL_curcop->cop_stash != GvSTASH(dstr))
1985                         GvIMPORTED_AV_on(dstr);
1986                     break;
1987                 case SVt_PVHV:
1988                     if (intro)
1989                         SAVESPTR(GvHV(dstr));
1990                     else
1991                         dref = (SV*)GvHV(dstr);
1992                     GvHV(dstr) = (HV*)sref;
1993                     if (PL_curcop->cop_stash != GvSTASH(dstr))
1994                         GvIMPORTED_HV_on(dstr);
1995                     break;
1996                 case SVt_PVCV:
1997                     if (intro) {
1998                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
1999                             SvREFCNT_dec(GvCV(dstr));
2000                             GvCV(dstr) = Nullcv;
2001                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2002                             PL_sub_generation++;
2003                         }
2004                         SAVESPTR(GvCV(dstr));
2005                     }
2006                     else
2007                         dref = (SV*)GvCV(dstr);
2008                     if (GvCV(dstr) != (CV*)sref) {
2009                         CV* cv = GvCV(dstr);
2010                         if (cv) {
2011                             if (!GvCVGEN((GV*)dstr) &&
2012                                 (CvROOT(cv) || CvXSUB(cv)))
2013                             {
2014                                 SV *const_sv = cv_const_sv(cv);
2015                                 bool const_changed = TRUE; 
2016                                 if(const_sv)
2017                                     const_changed = sv_cmp(const_sv, 
2018                                            op_const_sv(CvSTART((CV*)sref), 
2019                                                        Nullcv));
2020                                 /* ahem, death to those who redefine
2021                                  * active sort subs */
2022                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2023                                       PL_sortcop == CvSTART(cv))
2024                                     croak(
2025                                     "Can't redefine active sort subroutine %s",
2026                                           GvENAME((GV*)dstr));
2027                                 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2028                                     if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2029                                           && HvNAME(GvSTASH(CvGV(cv)))
2030                                           && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2031                                                    "autouse")))
2032                                         warner(WARN_REDEFINE, const_sv ? 
2033                                              "Constant subroutine %s redefined"
2034                                              : "Subroutine %s redefined", 
2035                                              GvENAME((GV*)dstr));
2036                                 }
2037                             }
2038                             cv_ckproto(cv, (GV*)dstr,
2039                                        SvPOK(sref) ? SvPVX(sref) : Nullch);
2040                         }
2041                         GvCV(dstr) = (CV*)sref;
2042                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2043                         GvASSUMECV_on(dstr);
2044                         PL_sub_generation++;
2045                     }
2046                     if (PL_curcop->cop_stash != GvSTASH(dstr))
2047                         GvIMPORTED_CV_on(dstr);
2048                     break;
2049                 case SVt_PVIO:
2050                     if (intro)
2051                         SAVESPTR(GvIOp(dstr));
2052                     else
2053                         dref = (SV*)GvIOp(dstr);
2054                     GvIOp(dstr) = (IO*)sref;
2055                     break;
2056                 default:
2057                     if (intro)
2058                         SAVESPTR(GvSV(dstr));
2059                     else
2060                         dref = (SV*)GvSV(dstr);
2061                     GvSV(dstr) = sref;
2062                     if (PL_curcop->cop_stash != GvSTASH(dstr))
2063                         GvIMPORTED_SV_on(dstr);
2064                     break;
2065                 }
2066                 if (dref)
2067                     SvREFCNT_dec(dref);
2068                 if (intro)
2069                     SAVEFREESV(sref);
2070                 SvTAINT(dstr);
2071                 return;
2072             }
2073             if (SvPVX(dstr)) {
2074                 (void)SvOOK_off(dstr);          /* backoff */
2075                 Safefree(SvPVX(dstr));
2076                 SvLEN(dstr)=SvCUR(dstr)=0;
2077             }
2078         }
2079         (void)SvOK_off(dstr);
2080         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
2081         SvROK_on(dstr);
2082         if (sflags & SVp_NOK) {
2083             SvNOK_on(dstr);
2084             SvNVX(dstr) = SvNVX(sstr);
2085         }
2086         if (sflags & SVp_IOK) {
2087             (void)SvIOK_on(dstr);
2088             SvIVX(dstr) = SvIVX(sstr);
2089         }
2090         if (SvAMAGIC(sstr)) {
2091             SvAMAGIC_on(dstr);
2092         }
2093     }
2094     else if (sflags & SVp_POK) {
2095
2096         /*
2097          * Check to see if we can just swipe the string.  If so, it's a
2098          * possible small lose on short strings, but a big win on long ones.
2099          * It might even be a win on short strings if SvPVX(dstr)
2100          * has to be allocated and SvPVX(sstr) has to be freed.
2101          */
2102
2103         if (SvTEMP(sstr) &&             /* slated for free anyway? */
2104             SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
2105             !(sflags & SVf_OOK))        /* and not involved in OOK hack? */
2106         {
2107             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
2108                 if (SvOOK(dstr)) {
2109                     SvFLAGS(dstr) &= ~SVf_OOK;
2110                     Safefree(SvPVX(dstr) - SvIVX(dstr));
2111                 }
2112                 else
2113                     Safefree(SvPVX(dstr));
2114             }
2115             (void)SvPOK_only(dstr);
2116             SvPV_set(dstr, SvPVX(sstr));
2117             SvLEN_set(dstr, SvLEN(sstr));
2118             SvCUR_set(dstr, SvCUR(sstr));
2119             SvTEMP_off(dstr);
2120             (void)SvOK_off(sstr);
2121             SvPV_set(sstr, Nullch);
2122             SvLEN_set(sstr, 0);
2123             SvCUR_set(sstr, 0);
2124             SvTEMP_off(sstr);
2125         }
2126         else {                                  /* have to copy actual string */
2127             STRLEN len = SvCUR(sstr);
2128
2129             SvGROW(dstr, len + 1);              /* inlined from sv_setpvn */
2130             Move(SvPVX(sstr),SvPVX(dstr),len,char);
2131             SvCUR_set(dstr, len);
2132             *SvEND(dstr) = '\0';
2133             (void)SvPOK_only(dstr);
2134         }
2135         /*SUPPRESS 560*/
2136         if (sflags & SVp_NOK) {
2137             SvNOK_on(dstr);
2138             SvNVX(dstr) = SvNVX(sstr);
2139         }
2140         if (sflags & SVp_IOK) {
2141             (void)SvIOK_on(dstr);
2142             SvIVX(dstr) = SvIVX(sstr);
2143         }
2144     }
2145     else if (sflags & SVp_NOK) {
2146         SvNVX(dstr) = SvNVX(sstr);
2147         (void)SvNOK_only(dstr);
2148         if (SvIOK(sstr)) {
2149             (void)SvIOK_on(dstr);
2150             SvIVX(dstr) = SvIVX(sstr);
2151         }
2152     }
2153     else if (sflags & SVp_IOK) {
2154         (void)SvIOK_only(dstr);
2155         SvIVX(dstr) = SvIVX(sstr);
2156     }
2157     else {
2158         if (dtype == SVt_PVGV) {
2159             if (ckWARN(WARN_UNSAFE))
2160                 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
2161         }
2162         else
2163             (void)SvOK_off(dstr);
2164     }
2165     SvTAINT(dstr);
2166 }
2167
2168 void
2169 sv_setsv_mg(SV *dstr, register SV *sstr)
2170 {
2171     sv_setsv(dstr,sstr);
2172     SvSETMAGIC(dstr);
2173 }
2174
2175 void
2176 sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
2177 {
2178     register char *dptr;
2179     assert(len >= 0);  /* STRLEN is probably unsigned, so this may
2180                           elicit a warning, but it won't hurt. */
2181     SV_CHECK_THINKFIRST(sv);
2182     if (!ptr) {
2183         (void)SvOK_off(sv);
2184         return;
2185     }
2186     if (SvTYPE(sv) >= SVt_PV) {
2187         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2188             sv_unglob(sv);
2189     }
2190     else
2191         sv_upgrade(sv, SVt_PV);
2192
2193     SvGROW(sv, len + 1);
2194     dptr = SvPVX(sv);
2195     Move(ptr,dptr,len,char);
2196     dptr[len] = '\0';
2197     SvCUR_set(sv, len);
2198     (void)SvPOK_only(sv);               /* validate pointer */
2199     SvTAINT(sv);
2200 }
2201
2202 void
2203 sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2204 {
2205     sv_setpvn(sv,ptr,len);
2206     SvSETMAGIC(sv);
2207 }
2208
2209 void
2210 sv_setpv(register SV *sv, register const char *ptr)
2211 {
2212     register STRLEN len;
2213
2214     SV_CHECK_THINKFIRST(sv);
2215     if (!ptr) {
2216         (void)SvOK_off(sv);
2217         return;
2218     }
2219     len = strlen(ptr);
2220     if (SvTYPE(sv) >= SVt_PV) {
2221         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2222             sv_unglob(sv);
2223     }
2224     else 
2225         sv_upgrade(sv, SVt_PV);
2226
2227     SvGROW(sv, len + 1);
2228     Move(ptr,SvPVX(sv),len+1,char);
2229     SvCUR_set(sv, len);
2230     (void)SvPOK_only(sv);               /* validate pointer */
2231     SvTAINT(sv);
2232 }
2233
2234 void
2235 sv_setpv_mg(register SV *sv, register const char *ptr)
2236 {
2237     sv_setpv(sv,ptr);
2238     SvSETMAGIC(sv);
2239 }
2240
2241 void
2242 sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
2243 {
2244     SV_CHECK_THINKFIRST(sv);
2245     (void)SvUPGRADE(sv, SVt_PV);
2246     if (!ptr) {
2247         (void)SvOK_off(sv);
2248         return;
2249     }
2250     (void)SvOOK_off(sv);
2251     if (SvPVX(sv))
2252         Safefree(SvPVX(sv));
2253     Renew(ptr, len+1, char);
2254     SvPVX(sv) = ptr;
2255     SvCUR_set(sv, len);
2256     SvLEN_set(sv, len+1);
2257     *SvEND(sv) = '\0';
2258     (void)SvPOK_only(sv);               /* validate pointer */
2259     SvTAINT(sv);
2260 }
2261
2262 void
2263 sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2264 {
2265     sv_usepvn(sv,ptr,len);
2266     SvSETMAGIC(sv);
2267 }
2268
2269 STATIC void
2270 sv_check_thinkfirst(register SV *sv)
2271 {
2272     if (SvREADONLY(sv)) {
2273         dTHR;
2274         if (PL_curcop != &PL_compiling)
2275             croak(PL_no_modify);
2276     }
2277     if (SvROK(sv))
2278         sv_unref(sv);
2279 }
2280     
2281 void
2282 sv_chop(register SV *sv, register char *ptr)    /* like set but assuming ptr is in sv */
2283                 
2284                    
2285 {
2286     register STRLEN delta;
2287
2288     if (!ptr || !SvPOKp(sv))
2289         return;
2290     SV_CHECK_THINKFIRST(sv);
2291     if (SvTYPE(sv) < SVt_PVIV)
2292         sv_upgrade(sv,SVt_PVIV);
2293
2294     if (!SvOOK(sv)) {
2295         SvIVX(sv) = 0;
2296         SvFLAGS(sv) |= SVf_OOK;
2297     }
2298     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
2299     delta = ptr - SvPVX(sv);
2300     SvLEN(sv) -= delta;
2301     SvCUR(sv) -= delta;
2302     SvPVX(sv) += delta;
2303     SvIVX(sv) += delta;
2304 }
2305
2306 void
2307 sv_catpvn(register SV *sv, register const char *ptr, register STRLEN len)
2308 {
2309     STRLEN tlen;
2310     char *junk;
2311
2312     junk = SvPV_force(sv, tlen);
2313     SvGROW(sv, tlen + len + 1);
2314     if (ptr == junk)
2315         ptr = SvPVX(sv);
2316     Move(ptr,SvPVX(sv)+tlen,len,char);
2317     SvCUR(sv) += len;
2318     *SvEND(sv) = '\0';
2319     (void)SvPOK_only(sv);               /* validate pointer */
2320     SvTAINT(sv);
2321 }
2322
2323 void
2324 sv_catpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2325 {
2326     sv_catpvn(sv,ptr,len);
2327     SvSETMAGIC(sv);
2328 }
2329
2330 void
2331 sv_catsv(SV *dstr, register SV *sstr)
2332 {
2333     char *s;
2334     STRLEN len;
2335     if (!sstr)
2336         return;
2337     if (s = SvPV(sstr, len))
2338         sv_catpvn(dstr,s,len);
2339 }
2340
2341 void
2342 sv_catsv_mg(SV *dstr, register SV *sstr)
2343 {
2344     sv_catsv(dstr,sstr);
2345     SvSETMAGIC(dstr);
2346 }
2347
2348 void
2349 sv_catpv(register SV *sv, register const char *ptr)
2350 {
2351     register STRLEN len;
2352     STRLEN tlen;
2353     char *junk;
2354
2355     if (!ptr)
2356         return;
2357     junk = SvPV_force(sv, tlen);
2358     len = strlen(ptr);
2359     SvGROW(sv, tlen + len + 1);
2360     if (ptr == junk)
2361         ptr = SvPVX(sv);
2362     Move(ptr,SvPVX(sv)+tlen,len+1,char);
2363     SvCUR(sv) += len;
2364     (void)SvPOK_only(sv);               /* validate pointer */
2365     SvTAINT(sv);
2366 }
2367
2368 void
2369 sv_catpv_mg(register SV *sv, register const char *ptr)
2370 {
2371     sv_catpv(sv,ptr);
2372     SvSETMAGIC(sv);
2373 }
2374
2375 SV *
2376 newSV(STRLEN len)
2377 {
2378     register SV *sv;
2379     
2380     new_SV(sv);
2381     SvANY(sv) = 0;
2382     SvREFCNT(sv) = 1;
2383     SvFLAGS(sv) = 0;
2384     if (len) {
2385         sv_upgrade(sv, SVt_PV);
2386         SvGROW(sv, len + 1);
2387     }
2388     return sv;
2389 }
2390
2391 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2392
2393 void
2394 sv_magic(register SV *sv, SV *obj, int how, const char *name, I32 namlen)
2395 {
2396     MAGIC* mg;
2397     
2398     if (SvREADONLY(sv)) {
2399         dTHR;
2400         if (PL_curcop != &PL_compiling && !strchr("gBf", how))
2401             croak(PL_no_modify);
2402     }
2403     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
2404         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2405             if (how == 't')
2406                 mg->mg_len |= 1;
2407             return;
2408         }
2409     }
2410     else {
2411         (void)SvUPGRADE(sv, SVt_PVMG);
2412     }
2413     Newz(702,mg, 1, MAGIC);
2414     mg->mg_moremagic = SvMAGIC(sv);
2415
2416     SvMAGIC(sv) = mg;
2417     if (!obj || obj == sv || how == '#' || how == 'r')
2418         mg->mg_obj = obj;
2419     else {
2420         dTHR;
2421         mg->mg_obj = SvREFCNT_inc(obj);
2422         mg->mg_flags |= MGf_REFCOUNTED;
2423     }
2424     mg->mg_type = how;
2425     mg->mg_len = namlen;
2426     if (name)
2427         if (namlen >= 0)
2428             mg->mg_ptr = savepvn(name, namlen);
2429         else if (namlen == HEf_SVKEY)
2430             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2431     
2432     switch (how) {
2433     case 0:
2434         mg->mg_virtual = &PL_vtbl_sv;
2435         break;
2436     case 'A':
2437         mg->mg_virtual = &PL_vtbl_amagic;
2438         break;
2439     case 'a':
2440         mg->mg_virtual = &PL_vtbl_amagicelem;
2441         break;
2442     case 'c':
2443         mg->mg_virtual = 0;
2444         break;
2445     case 'B':
2446         mg->mg_virtual = &PL_vtbl_bm;
2447         break;
2448     case 'D':
2449         mg->mg_virtual = &PL_vtbl_regdata;
2450         break;
2451     case 'd':
2452         mg->mg_virtual = &PL_vtbl_regdatum;
2453         break;
2454     case 'E':
2455         mg->mg_virtual = &PL_vtbl_env;
2456         break;
2457     case 'f':
2458         mg->mg_virtual = &PL_vtbl_fm;
2459         break;
2460     case 'e':
2461         mg->mg_virtual = &PL_vtbl_envelem;
2462         break;
2463     case 'g':
2464         mg->mg_virtual = &PL_vtbl_mglob;
2465         break;
2466     case 'I':
2467         mg->mg_virtual = &PL_vtbl_isa;
2468         break;
2469     case 'i':
2470         mg->mg_virtual = &PL_vtbl_isaelem;
2471         break;
2472     case 'k':
2473         mg->mg_virtual = &PL_vtbl_nkeys;
2474         break;
2475     case 'L':
2476         SvRMAGICAL_on(sv);
2477         mg->mg_virtual = 0;
2478         break;
2479     case 'l':
2480         mg->mg_virtual = &PL_vtbl_dbline;
2481         break;
2482 #ifdef USE_THREADS
2483     case 'm':
2484         mg->mg_virtual = &PL_vtbl_mutex;
2485         break;
2486 #endif /* USE_THREADS */
2487 #ifdef USE_LOCALE_COLLATE
2488     case 'o':
2489         mg->mg_virtual = &PL_vtbl_collxfrm;
2490         break;
2491 #endif /* USE_LOCALE_COLLATE */
2492     case 'P':
2493         mg->mg_virtual = &PL_vtbl_pack;
2494         break;
2495     case 'p':
2496     case 'q':
2497         mg->mg_virtual = &PL_vtbl_packelem;
2498         break;
2499     case 'r':
2500         mg->mg_virtual = &PL_vtbl_regexp;
2501         break;
2502     case 'S':
2503         mg->mg_virtual = &PL_vtbl_sig;
2504         break;
2505     case 's':
2506         mg->mg_virtual = &PL_vtbl_sigelem;
2507         break;
2508     case 't':
2509         mg->mg_virtual = &PL_vtbl_taint;
2510         mg->mg_len = 1;
2511         break;
2512     case 'U':
2513         mg->mg_virtual = &PL_vtbl_uvar;
2514         break;
2515     case 'v':
2516         mg->mg_virtual = &PL_vtbl_vec;
2517         break;
2518     case 'x':
2519         mg->mg_virtual = &PL_vtbl_substr;
2520         break;
2521     case 'y':
2522         mg->mg_virtual = &PL_vtbl_defelem;
2523         break;
2524     case '*':
2525         mg->mg_virtual = &PL_vtbl_glob;
2526         break;
2527     case '#':
2528         mg->mg_virtual = &PL_vtbl_arylen;
2529         break;
2530     case '.':
2531         mg->mg_virtual = &PL_vtbl_pos;
2532         break;
2533     case '~':   /* Reserved for use by extensions not perl internals.   */
2534         /* Useful for attaching extension internal data to perl vars.   */
2535         /* Note that multiple extensions may clash if magical scalars   */
2536         /* etc holding private data from one are passed to another.     */
2537         SvRMAGICAL_on(sv);
2538         break;
2539     default:
2540         croak("Don't know how to handle magic of type '%c'", how);
2541     }
2542     mg_magical(sv);
2543     if (SvGMAGICAL(sv))
2544         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2545 }
2546
2547 int
2548 sv_unmagic(SV *sv, int type)
2549 {
2550     MAGIC* mg;
2551     MAGIC** mgp;
2552     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
2553         return 0;
2554     mgp = &SvMAGIC(sv);
2555     for (mg = *mgp; mg; mg = *mgp) {
2556         if (mg->mg_type == type) {
2557             MGVTBL* vtbl = mg->mg_virtual;
2558             *mgp = mg->mg_moremagic;
2559             if (vtbl && (vtbl->svt_free != NULL))
2560                 (VTBL->svt_free)(sv, mg);
2561             if (mg->mg_ptr && mg->mg_type != 'g')
2562                 if (mg->mg_len >= 0)
2563                     Safefree(mg->mg_ptr);
2564                 else if (mg->mg_len == HEf_SVKEY)
2565                     SvREFCNT_dec((SV*)mg->mg_ptr);
2566             if (mg->mg_flags & MGf_REFCOUNTED)
2567                 SvREFCNT_dec(mg->mg_obj);
2568             Safefree(mg);
2569         }
2570         else
2571             mgp = &mg->mg_moremagic;
2572     }
2573     if (!SvMAGIC(sv)) {
2574         SvMAGICAL_off(sv);
2575         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
2576     }
2577
2578     return 0;
2579 }
2580
2581 void
2582 sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
2583 {
2584     register char *big;
2585     register char *mid;
2586     register char *midend;
2587     register char *bigend;
2588     register I32 i;
2589     STRLEN curlen;
2590     
2591
2592     if (!bigstr)
2593         croak("Can't modify non-existent substring");
2594     SvPV_force(bigstr, curlen);
2595     if (offset + len > curlen) {
2596         SvGROW(bigstr, offset+len+1);
2597         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2598         SvCUR_set(bigstr, offset+len);
2599     }
2600
2601     i = littlelen - len;
2602     if (i > 0) {                        /* string might grow */
2603         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
2604         mid = big + offset + len;
2605         midend = bigend = big + SvCUR(bigstr);
2606         bigend += i;
2607         *bigend = '\0';
2608         while (midend > mid)            /* shove everything down */
2609             *--bigend = *--midend;
2610         Move(little,big+offset,littlelen,char);
2611         SvCUR(bigstr) += i;
2612         SvSETMAGIC(bigstr);
2613         return;
2614     }
2615     else if (i == 0) {
2616         Move(little,SvPVX(bigstr)+offset,len,char);
2617         SvSETMAGIC(bigstr);
2618         return;
2619     }
2620
2621     big = SvPVX(bigstr);
2622     mid = big + offset;
2623     midend = mid + len;
2624     bigend = big + SvCUR(bigstr);
2625
2626     if (midend > bigend)
2627         croak("panic: sv_insert");
2628
2629     if (mid - big > bigend - midend) {  /* faster to shorten from end */
2630         if (littlelen) {
2631             Move(little, mid, littlelen,char);
2632             mid += littlelen;
2633         }
2634         i = bigend - midend;
2635         if (i > 0) {
2636             Move(midend, mid, i,char);
2637             mid += i;
2638         }
2639         *mid = '\0';
2640         SvCUR_set(bigstr, mid - big);
2641     }
2642     /*SUPPRESS 560*/
2643     else if (i = mid - big) {   /* faster from front */
2644         midend -= littlelen;
2645         mid = midend;
2646         sv_chop(bigstr,midend-i);
2647         big += i;
2648         while (i--)
2649             *--midend = *--big;
2650         if (littlelen)
2651             Move(little, mid, littlelen,char);
2652     }
2653     else if (littlelen) {
2654         midend -= littlelen;
2655         sv_chop(bigstr,midend);
2656         Move(little,midend,littlelen,char);
2657     }
2658     else {
2659         sv_chop(bigstr,midend);
2660     }
2661     SvSETMAGIC(bigstr);
2662 }
2663
2664 /* make sv point to what nstr did */
2665
2666 void
2667 sv_replace(register SV *sv, register SV *nsv)
2668 {
2669     U32 refcnt = SvREFCNT(sv);
2670     SV_CHECK_THINKFIRST(sv);
2671     if (SvREFCNT(nsv) != 1)
2672         warn("Reference miscount in sv_replace()");
2673     if (SvMAGICAL(sv)) {
2674         if (SvMAGICAL(nsv))
2675             mg_free(nsv);
2676         else
2677             sv_upgrade(nsv, SVt_PVMG);
2678         SvMAGIC(nsv) = SvMAGIC(sv);
2679         SvFLAGS(nsv) |= SvMAGICAL(sv);
2680         SvMAGICAL_off(sv);
2681         SvMAGIC(sv) = 0;
2682     }
2683     SvREFCNT(sv) = 0;
2684     sv_clear(sv);
2685     assert(!SvREFCNT(sv));
2686     StructCopy(nsv,sv,SV);
2687     SvREFCNT(sv) = refcnt;
2688     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
2689     del_SV(nsv);
2690 }
2691
2692 void
2693 sv_clear(register SV *sv)
2694 {
2695     HV* stash;
2696     assert(sv);
2697     assert(SvREFCNT(sv) == 0);
2698
2699     if (SvOBJECT(sv)) {
2700         dTHR;
2701         if (PL_defstash) {              /* Still have a symbol table? */
2702             djSP;
2703             GV* destructor;
2704             SV tmpref;
2705
2706             Zero(&tmpref, 1, SV);
2707             sv_upgrade(&tmpref, SVt_RV);
2708             SvROK_on(&tmpref);
2709             SvREADONLY_on(&tmpref);     /* DESTROY() could be naughty */
2710             SvREFCNT(&tmpref) = 1;
2711
2712             do {
2713                 stash = SvSTASH(sv);
2714                 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
2715                 if (destructor) {
2716                     ENTER;
2717                     PUSHSTACKi(PERLSI_DESTROY);
2718                     SvRV(&tmpref) = SvREFCNT_inc(sv);
2719                     EXTEND(SP, 2);
2720                     PUSHMARK(SP);
2721                     PUSHs(&tmpref);
2722                     PUTBACK;
2723                     perl_call_sv((SV*)GvCV(destructor),
2724                                  G_DISCARD|G_EVAL|G_KEEPERR);
2725                     SvREFCNT(sv)--;
2726                     POPSTACK;
2727                     SPAGAIN;
2728                     LEAVE;
2729                 }
2730             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
2731
2732             del_XRV(SvANY(&tmpref));
2733
2734             if (SvREFCNT(sv)) {
2735                 if (PL_in_clean_objs)
2736                     croak("DESTROY created new reference to dead object '%s'",
2737                           HvNAME(stash));
2738                 /* DESTROY gave object new lease on life */
2739                 return;
2740             }
2741         }
2742
2743         if (SvOBJECT(sv)) {
2744             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
2745             SvOBJECT_off(sv);   /* Curse the object. */
2746             if (SvTYPE(sv) != SVt_PVIO)
2747                 --PL_sv_objcount;       /* XXX Might want something more general */
2748         }
2749     }
2750     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2751         mg_free(sv);
2752     stash = NULL;
2753     switch (SvTYPE(sv)) {
2754     case SVt_PVIO:
2755         if (IoIFP(sv) &&
2756             IoIFP(sv) != PerlIO_stdin() &&
2757             IoIFP(sv) != PerlIO_stdout() &&
2758             IoIFP(sv) != PerlIO_stderr())
2759           io_close((IO*)sv);
2760         Safefree(IoTOP_NAME(sv));
2761         Safefree(IoFMT_NAME(sv));
2762         Safefree(IoBOTTOM_NAME(sv));
2763         /* FALL THROUGH */
2764     case SVt_PVBM:
2765         goto freescalar;
2766     case SVt_PVCV:
2767     case SVt_PVFM:
2768         cv_undef((CV*)sv);
2769         goto freescalar;
2770     case SVt_PVHV:
2771         hv_undef((HV*)sv);
2772         break;
2773     case SVt_PVAV:
2774         av_undef((AV*)sv);
2775         break;
2776     case SVt_PVLV:
2777         SvREFCNT_dec(LvTARG(sv));
2778         goto freescalar;
2779     case SVt_PVGV:
2780         gp_free((GV*)sv);
2781         Safefree(GvNAME(sv));
2782         /* cannot decrease stash refcount yet, as we might recursively delete
2783            ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
2784            of stash until current sv is completely gone.
2785            -- JohnPC, 27 Mar 1998 */
2786         stash = GvSTASH(sv);
2787         /* FALL THROUGH */
2788     case SVt_PVMG:
2789     case SVt_PVNV:
2790     case SVt_PVIV:
2791       freescalar:
2792         (void)SvOOK_off(sv);
2793         /* FALL THROUGH */
2794     case SVt_PV:
2795     case SVt_RV:
2796         if (SvROK(sv))
2797             SvREFCNT_dec(SvRV(sv));
2798         else if (SvPVX(sv) && SvLEN(sv))
2799             Safefree(SvPVX(sv));
2800         break;
2801 /*
2802     case SVt_NV:
2803     case SVt_IV:
2804     case SVt_NULL:
2805         break;
2806 */
2807     }
2808
2809     switch (SvTYPE(sv)) {
2810     case SVt_NULL:
2811         break;
2812     case SVt_IV:
2813         del_XIV(SvANY(sv));
2814         break;
2815     case SVt_NV:
2816         del_XNV(SvANY(sv));
2817         break;
2818     case SVt_RV:
2819         del_XRV(SvANY(sv));
2820         break;
2821     case SVt_PV:
2822         del_XPV(SvANY(sv));
2823         break;
2824     case SVt_PVIV:
2825         del_XPVIV(SvANY(sv));
2826         break;
2827     case SVt_PVNV:
2828         del_XPVNV(SvANY(sv));
2829         break;
2830     case SVt_PVMG:
2831         del_XPVMG(SvANY(sv));
2832         break;
2833     case SVt_PVLV:
2834         del_XPVLV(SvANY(sv));
2835         break;
2836     case SVt_PVAV:
2837         del_XPVAV(SvANY(sv));
2838         break;
2839     case SVt_PVHV:
2840         del_XPVHV(SvANY(sv));
2841         break;
2842     case SVt_PVCV:
2843         del_XPVCV(SvANY(sv));
2844         break;
2845     case SVt_PVGV:
2846         del_XPVGV(SvANY(sv));
2847         /* code duplication for increased performance. */
2848         SvFLAGS(sv) &= SVf_BREAK;
2849         SvFLAGS(sv) |= SVTYPEMASK;
2850         /* decrease refcount of the stash that owns this GV, if any */
2851         if (stash)
2852             SvREFCNT_dec(stash);
2853         return; /* not break, SvFLAGS reset already happened */
2854     case SVt_PVBM:
2855         del_XPVBM(SvANY(sv));
2856         break;
2857     case SVt_PVFM:
2858         del_XPVFM(SvANY(sv));
2859         break;
2860     case SVt_PVIO:
2861         del_XPVIO(SvANY(sv));
2862         break;
2863     }
2864     SvFLAGS(sv) &= SVf_BREAK;
2865     SvFLAGS(sv) |= SVTYPEMASK;
2866 }
2867
2868 SV *
2869 sv_newref(SV *sv)
2870 {
2871     if (sv)
2872         ATOMIC_INC(SvREFCNT(sv));
2873     return sv;
2874 }
2875
2876 void
2877 sv_free(SV *sv)
2878 {
2879     int refcount_is_zero;
2880
2881     if (!sv)
2882         return;
2883     if (SvREFCNT(sv) == 0) {
2884         if (SvFLAGS(sv) & SVf_BREAK)
2885             return;
2886         if (PL_in_clean_all) /* All is fair */
2887             return;
2888         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
2889             /* make sure SvREFCNT(sv)==0 happens very seldom */
2890             SvREFCNT(sv) = (~(U32)0)/2;
2891             return;
2892         }
2893         warn("Attempt to free unreferenced scalar");
2894         return;
2895     }
2896     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
2897     if (!refcount_is_zero)
2898         return;
2899 #ifdef DEBUGGING
2900     if (SvTEMP(sv)) {
2901         warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
2902         return;
2903     }
2904 #endif
2905     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
2906         /* make sure SvREFCNT(sv)==0 happens very seldom */
2907         SvREFCNT(sv) = (~(U32)0)/2;
2908         return;
2909     }
2910     sv_clear(sv);
2911     if (! SvREFCNT(sv))
2912         del_SV(sv);
2913 }
2914
2915 STRLEN
2916 sv_len(register SV *sv)
2917 {
2918     char *junk;
2919     STRLEN len;
2920
2921     if (!sv)
2922         return 0;
2923
2924     if (SvGMAGICAL(sv))
2925         len = mg_length(sv);
2926     else
2927         junk = SvPV(sv, len);
2928     return len;
2929 }
2930
2931 STRLEN
2932 sv_len_utf8(register SV *sv)
2933 {
2934     U8 *s;
2935     U8 *send;
2936     STRLEN len;
2937
2938     if (!sv)
2939         return 0;
2940
2941 #ifdef NOTYET
2942     if (SvGMAGICAL(sv))
2943         len = mg_length(sv);
2944     else
2945 #endif
2946         s = (U8*)SvPV(sv, len);
2947     send = s + len;
2948     len = 0;
2949     while (s < send) {
2950         s += UTF8SKIP(s);
2951         len++;
2952     }
2953     return len;
2954 }
2955
2956 void
2957 sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
2958 {
2959     U8 *start;
2960     U8 *s;
2961     U8 *send;
2962     I32 uoffset = *offsetp;
2963     STRLEN len;
2964
2965     if (!sv)
2966         return;
2967
2968     start = s = (U8*)SvPV(sv, len);
2969     send = s + len;
2970     while (s < send && uoffset--)
2971         s += UTF8SKIP(s);
2972     if (s >= send)
2973         s = send;
2974     *offsetp = s - start;
2975     if (lenp) {
2976         I32 ulen = *lenp;
2977         start = s;
2978         while (s < send && ulen--)
2979             s += UTF8SKIP(s);
2980         if (s >= send)
2981             s = send;
2982         *lenp = s - start;
2983     }
2984     return;
2985 }
2986
2987 void
2988 sv_pos_b2u(register SV *sv, I32* offsetp)
2989 {
2990     U8 *s;
2991     U8 *send;
2992     STRLEN len;
2993
2994     if (!sv)
2995         return;
2996
2997     s = (U8*)SvPV(sv, len);
2998     if (len < *offsetp)
2999         croak("panic: bad byte offset");
3000     send = s + *offsetp;
3001     len = 0;
3002     while (s < send) {
3003         s += UTF8SKIP(s);
3004         ++len;
3005     }
3006     if (s != send) {
3007         warn("Malformed UTF-8 character");
3008         --len;
3009     }
3010     *offsetp = len;
3011     return;
3012 }
3013
3014 I32
3015 sv_eq(register SV *str1, register SV *str2)
3016 {
3017     char *pv1;
3018     STRLEN cur1;
3019     char *pv2;
3020     STRLEN cur2;
3021
3022     if (!str1) {
3023         pv1 = "";
3024         cur1 = 0;
3025     }
3026     else
3027         pv1 = SvPV(str1, cur1);
3028
3029     if (!str2)
3030         return !cur1;
3031     else
3032         pv2 = SvPV(str2, cur2);
3033
3034     if (cur1 != cur2)
3035         return 0;
3036
3037     return memEQ(pv1, pv2, cur1);
3038 }
3039
3040 I32
3041 sv_cmp(register SV *str1, register SV *str2)
3042 {
3043     STRLEN cur1 = 0;
3044     char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
3045     STRLEN cur2 = 0;
3046     char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
3047     I32 retval;
3048
3049     if (!cur1)
3050         return cur2 ? -1 : 0;
3051
3052     if (!cur2)
3053         return 1;
3054
3055     retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
3056
3057     if (retval)
3058         return retval < 0 ? -1 : 1;
3059
3060     if (cur1 == cur2)
3061         return 0;
3062     else
3063         return cur1 < cur2 ? -1 : 1;
3064 }
3065
3066 I32
3067 sv_cmp_locale(register SV *sv1, register SV *sv2)
3068 {
3069 #ifdef USE_LOCALE_COLLATE
3070
3071     char *pv1, *pv2;
3072     STRLEN len1, len2;
3073     I32 retval;
3074
3075     if (PL_collation_standard)
3076         goto raw_compare;
3077
3078     len1 = 0;
3079     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
3080     len2 = 0;
3081     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
3082
3083     if (!pv1 || !len1) {
3084         if (pv2 && len2)
3085             return -1;
3086         else
3087             goto raw_compare;
3088     }
3089     else {
3090         if (!pv2 || !len2)
3091             return 1;
3092     }
3093
3094     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
3095
3096     if (retval)
3097         return retval < 0 ? -1 : 1;
3098
3099     /*
3100      * When the result of collation is equality, that doesn't mean
3101      * that there are no differences -- some locales exclude some
3102      * characters from consideration.  So to avoid false equalities,
3103      * we use the raw string as a tiebreaker.
3104      */
3105
3106   raw_compare:
3107     /* FALL THROUGH */
3108
3109 #endif /* USE_LOCALE_COLLATE */
3110
3111     return sv_cmp(sv1, sv2);
3112 }
3113
3114 #ifdef USE_LOCALE_COLLATE
3115 /*
3116  * Any scalar variable may carry an 'o' magic that contains the
3117  * scalar data of the variable transformed to such a format that
3118  * a normal memory comparison can be used to compare the data
3119  * according to the locale settings.
3120  */
3121 char *
3122 sv_collxfrm(SV *sv, STRLEN *nxp)
3123 {
3124     MAGIC *mg;
3125
3126     mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3127     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
3128         char *s, *xf;
3129         STRLEN len, xlen;
3130
3131         if (mg)
3132             Safefree(mg->mg_ptr);
3133         s = SvPV(sv, len);
3134         if ((xf = mem_collxfrm(s, len, &xlen))) {
3135             if (SvREADONLY(sv)) {
3136                 SAVEFREEPV(xf);
3137                 *nxp = xlen;
3138                 return xf + sizeof(PL_collation_ix);
3139             }
3140             if (! mg) {
3141                 sv_magic(sv, 0, 'o', 0, 0);
3142                 mg = mg_find(sv, 'o');
3143                 assert(mg);
3144             }
3145             mg->mg_ptr = xf;
3146             mg->mg_len = xlen;
3147         }
3148         else {
3149             if (mg) {
3150                 mg->mg_ptr = NULL;
3151                 mg->mg_len = -1;
3152             }
3153         }
3154     }
3155     if (mg && mg->mg_ptr) {
3156         *nxp = mg->mg_len;
3157         return mg->mg_ptr + sizeof(PL_collation_ix);
3158     }
3159     else {
3160         *nxp = 0;
3161         return NULL;
3162     }
3163 }
3164
3165 #endif /* USE_LOCALE_COLLATE */
3166
3167 char *
3168 sv_gets(register SV *sv, register PerlIO *fp, I32 append)
3169 {
3170     dTHR;
3171     char *rsptr;
3172     STRLEN rslen;
3173     register STDCHAR rslast;
3174     register STDCHAR *bp;
3175     register I32 cnt;
3176     I32 i;
3177
3178     SV_CHECK_THINKFIRST(sv);
3179     if (SvTYPE(sv) >= SVt_PV) {
3180         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
3181             sv_unglob(sv);
3182     }
3183     else
3184         sv_upgrade(sv, SVt_PV);
3185
3186     SvSCREAM_off(sv);
3187
3188     if (RsSNARF(PL_rs)) {
3189         rsptr = NULL;
3190         rslen = 0;
3191     }
3192     else if (RsRECORD(PL_rs)) {
3193       I32 recsize, bytesread;
3194       char *buffer;
3195
3196       /* Grab the size of the record we're getting */
3197       recsize = SvIV(SvRV(PL_rs));
3198       (void)SvPOK_only(sv);    /* Validate pointer */
3199       buffer = SvGROW(sv, recsize + 1);
3200       /* Go yank in */
3201 #ifdef VMS
3202       /* VMS wants read instead of fread, because fread doesn't respect */
3203       /* RMS record boundaries. This is not necessarily a good thing to be */
3204       /* doing, but we've got no other real choice */
3205       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3206 #else
3207       bytesread = PerlIO_read(fp, buffer, recsize);
3208 #endif
3209       SvCUR_set(sv, bytesread);
3210       buffer[bytesread] = '\0';
3211       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3212     }
3213     else if (RsPARA(PL_rs)) {
3214         rsptr = "\n\n";
3215         rslen = 2;
3216     }
3217     else
3218         rsptr = SvPV(PL_rs, rslen);
3219     rslast = rslen ? rsptr[rslen - 1] : '\0';
3220
3221     if (RsPARA(PL_rs)) {                /* have to do this both before and after */
3222         do {                    /* to make sure file boundaries work right */
3223             if (PerlIO_eof(fp))
3224                 return 0;
3225             i = PerlIO_getc(fp);
3226             if (i != '\n') {
3227                 if (i == -1)
3228                     return 0;
3229                 PerlIO_ungetc(fp,i);
3230                 break;
3231             }
3232         } while (i != EOF);
3233     }
3234
3235     /* See if we know enough about I/O mechanism to cheat it ! */
3236
3237     /* This used to be #ifdef test - it is made run-time test for ease
3238        of abstracting out stdio interface. One call should be cheap 
3239        enough here - and may even be a macro allowing compile
3240        time optimization.
3241      */
3242
3243     if (PerlIO_fast_gets(fp)) {
3244
3245     /*
3246      * We're going to steal some values from the stdio struct
3247      * and put EVERYTHING in the innermost loop into registers.
3248      */
3249     register STDCHAR *ptr;
3250     STRLEN bpx;
3251     I32 shortbuffered;
3252
3253 #if defined(VMS) && defined(PERLIO_IS_STDIO)
3254     /* An ungetc()d char is handled separately from the regular
3255      * buffer, so we getc() it back out and stuff it in the buffer.
3256      */
3257     i = PerlIO_getc(fp);
3258     if (i == EOF) return 0;
3259     *(--((*fp)->_ptr)) = (unsigned char) i;
3260     (*fp)->_cnt++;
3261 #endif
3262
3263     /* Here is some breathtakingly efficient cheating */
3264
3265     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
3266     (void)SvPOK_only(sv);               /* validate pointer */
3267     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3268         if (cnt > 80 && SvLEN(sv) > append) {
3269             shortbuffered = cnt - SvLEN(sv) + append + 1;
3270             cnt -= shortbuffered;
3271         }
3272         else {
3273             shortbuffered = 0;
3274             /* remember that cnt can be negative */
3275             SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
3276         }
3277     }
3278     else
3279         shortbuffered = 0;
3280     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
3281     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
3282     DEBUG_P(PerlIO_printf(Perl_debug_log,
3283         "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3284     DEBUG_P(PerlIO_printf(Perl_debug_log,
3285         "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3286                (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3287                (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
3288     for (;;) {
3289       screamer:
3290         if (cnt > 0) {
3291             if (rslen) {
3292                 while (cnt > 0) {                    /* this     |  eat */
3293                     cnt--;
3294                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
3295                         goto thats_all_folks;        /* screams  |  sed :-) */
3296                 }
3297             }
3298             else {
3299                 Copy(ptr, bp, cnt, char);            /* this     |  eat */    
3300                 bp += cnt;                           /* screams  |  dust */   
3301                 ptr += cnt;                          /* louder   |  sed :-) */
3302                 cnt = 0;
3303             }
3304         }
3305         
3306         if (shortbuffered) {            /* oh well, must extend */
3307             cnt = shortbuffered;
3308             shortbuffered = 0;
3309             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3310             SvCUR_set(sv, bpx);
3311             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3312             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3313             continue;
3314         }
3315
3316         DEBUG_P(PerlIO_printf(Perl_debug_log,
3317             "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3318         PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
3319         DEBUG_P(PerlIO_printf(Perl_debug_log,
3320             "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3321             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3322             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3323         /* This used to call 'filbuf' in stdio form, but as that behaves like 
3324            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3325            another abstraction.  */
3326         i   = PerlIO_getc(fp);          /* get more characters */
3327         DEBUG_P(PerlIO_printf(Perl_debug_log,
3328             "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3329             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3330             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3331         cnt = PerlIO_get_cnt(fp);
3332         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
3333         DEBUG_P(PerlIO_printf(Perl_debug_log,
3334             "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3335
3336         if (i == EOF)                   /* all done for ever? */
3337             goto thats_really_all_folks;
3338
3339         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3340         SvCUR_set(sv, bpx);
3341         SvGROW(sv, bpx + cnt + 2);
3342         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3343
3344         *bp++ = i;                      /* store character from PerlIO_getc */
3345
3346         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
3347             goto thats_all_folks;
3348     }
3349
3350 thats_all_folks:
3351     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
3352           memNE((char*)bp - rslen, rsptr, rslen))
3353         goto screamer;                          /* go back to the fray */
3354 thats_really_all_folks:
3355     if (shortbuffered)
3356         cnt += shortbuffered;
3357         DEBUG_P(PerlIO_printf(Perl_debug_log,
3358             "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3359     PerlIO_set_ptrcnt(fp, ptr, cnt);    /* put these back or we're in trouble */
3360     DEBUG_P(PerlIO_printf(Perl_debug_log,
3361         "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3362         (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3363         (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3364     *bp = '\0';
3365     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
3366     DEBUG_P(PerlIO_printf(Perl_debug_log,
3367         "Screamer: done, len=%ld, string=|%.*s|\n",
3368         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
3369     }
3370    else
3371     {
3372        /*The big, slow, and stupid way */
3373         STDCHAR buf[8192];
3374
3375 screamer2:
3376         if (rslen) {
3377             register STDCHAR *bpe = buf + sizeof(buf);
3378             bp = buf;
3379             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3380                 ; /* keep reading */
3381             cnt = bp - buf;
3382         }
3383         else {
3384             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
3385             /* Accomodate broken VAXC compiler, which applies U8 cast to
3386              * both args of ?: operator, causing EOF to change into 255
3387              */
3388             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
3389         }
3390
3391         if (append)
3392             sv_catpvn(sv, (char *) buf, cnt);
3393         else
3394             sv_setpvn(sv, (char *) buf, cnt);
3395
3396         if (i != EOF &&                 /* joy */
3397             (!rslen ||
3398              SvCUR(sv) < rslen ||
3399              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
3400         {
3401             append = -1;
3402             /*
3403              * If we're reading from a TTY and we get a short read,
3404              * indicating that the user hit his EOF character, we need
3405              * to notice it now, because if we try to read from the TTY
3406              * again, the EOF condition will disappear.
3407              *
3408              * The comparison of cnt to sizeof(buf) is an optimization
3409              * that prevents unnecessary calls to feof().
3410              *
3411              * - jik 9/25/96
3412              */
3413             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3414                 goto screamer2;
3415         }
3416     }
3417
3418     if (RsPARA(PL_rs)) {                /* have to do this both before and after */  
3419         while (i != EOF) {      /* to make sure file boundaries work right */
3420             i = PerlIO_getc(fp);
3421             if (i != '\n') {
3422                 PerlIO_ungetc(fp,i);
3423                 break;
3424             }
3425         }
3426     }
3427
3428 #ifdef WIN32
3429     win32_strip_return(sv);
3430 #endif
3431
3432     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
3433 }
3434
3435
3436 void
3437 sv_inc(register SV *sv)
3438 {
3439     register char *d;
3440     int flags;
3441
3442     if (!sv)
3443         return;
3444     if (SvGMAGICAL(sv))
3445         mg_get(sv);
3446     if (SvTHINKFIRST(sv)) {
3447         if (SvREADONLY(sv)) {
3448             dTHR;
3449             if (PL_curcop != &PL_compiling)
3450                 croak(PL_no_modify);
3451         }
3452         if (SvROK(sv)) {
3453             IV i;
3454             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
3455                 return;
3456             i = (IV)SvRV(sv);
3457             sv_unref(sv);
3458             sv_setiv(sv, i);
3459         }
3460     }
3461     flags = SvFLAGS(sv);
3462     if (flags & SVp_NOK) {
3463         (void)SvNOK_only(sv);
3464         SvNVX(sv) += 1.0;
3465         return;
3466     }
3467     if (flags & SVp_IOK) {
3468         if (SvIVX(sv) == IV_MAX)
3469             sv_setnv(sv, (double)IV_MAX + 1.0);
3470         else {
3471             (void)SvIOK_only(sv);
3472             ++SvIVX(sv);
3473         }
3474         return;
3475     }
3476     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
3477         if ((flags & SVTYPEMASK) < SVt_PVNV)
3478             sv_upgrade(sv, SVt_NV);
3479         SvNVX(sv) = 1.0;
3480         (void)SvNOK_only(sv);
3481         return;
3482     }
3483     d = SvPVX(sv);
3484     while (isALPHA(*d)) d++;
3485     while (isDIGIT(*d)) d++;
3486     if (*d) {
3487         SET_NUMERIC_STANDARD();
3488         sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
3489         return;
3490     }
3491     d--;
3492     while (d >= SvPVX(sv)) {
3493         if (isDIGIT(*d)) {
3494             if (++*d <= '9')
3495                 return;
3496             *(d--) = '0';
3497         }
3498         else {
3499 #ifdef EBCDIC
3500             /* MKS: The original code here died if letters weren't consecutive.
3501              * at least it didn't have to worry about non-C locales.  The
3502              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3503              * arranged in order (although not consecutively) and that only 
3504              * [A-Za-z] are accepted by isALPHA in the C locale.
3505              */
3506             if (*d != 'z' && *d != 'Z') {
3507                 do { ++*d; } while (!isALPHA(*d));
3508                 return;
3509             }
3510             *(d--) -= 'z' - 'a';
3511 #else
3512             ++*d;
3513             if (isALPHA(*d))
3514                 return;
3515             *(d--) -= 'z' - 'a' + 1;
3516 #endif
3517         }
3518     }
3519     /* oh,oh, the number grew */
3520     SvGROW(sv, SvCUR(sv) + 2);
3521     SvCUR(sv)++;
3522     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
3523         *d = d[-1];
3524     if (isDIGIT(d[1]))
3525         *d = '1';
3526     else
3527         *d = d[1];
3528 }
3529
3530 void
3531 sv_dec(register SV *sv)
3532 {
3533     int flags;
3534
3535     if (!sv)
3536         return;
3537     if (SvGMAGICAL(sv))
3538         mg_get(sv);
3539     if (SvTHINKFIRST(sv)) {
3540         if (SvREADONLY(sv)) {
3541             dTHR;
3542             if (PL_curcop != &PL_compiling)
3543                 croak(PL_no_modify);
3544         }
3545         if (SvROK(sv)) {
3546             IV i;
3547             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
3548                 return;
3549             i = (IV)SvRV(sv);
3550             sv_unref(sv);
3551             sv_setiv(sv, i);
3552         }
3553     }
3554     flags = SvFLAGS(sv);
3555     if (flags & SVp_NOK) {
3556         SvNVX(sv) -= 1.0;
3557         (void)SvNOK_only(sv);
3558         return;
3559     }
3560     if (flags & SVp_IOK) {
3561         if (SvIVX(sv) == IV_MIN)
3562             sv_setnv(sv, (double)IV_MIN - 1.0);
3563         else {
3564             (void)SvIOK_only(sv);
3565             --SvIVX(sv);
3566         }
3567         return;
3568     }
3569     if (!(flags & SVp_POK)) {
3570         if ((flags & SVTYPEMASK) < SVt_PVNV)
3571             sv_upgrade(sv, SVt_NV);
3572         SvNVX(sv) = -1.0;
3573         (void)SvNOK_only(sv);
3574         return;
3575     }
3576     SET_NUMERIC_STANDARD();
3577     sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
3578 }
3579
3580 /* Make a string that will exist for the duration of the expression
3581  * evaluation.  Actually, it may have to last longer than that, but
3582  * hopefully we won't free it until it has been assigned to a
3583  * permanent location. */
3584
3585 STATIC void
3586 sv_mortalgrow(void)
3587 {
3588     dTHR;
3589     PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
3590     Renew(PL_tmps_stack, PL_tmps_max, SV*);
3591 }
3592
3593 SV *
3594 sv_mortalcopy(SV *oldstr)
3595 {
3596     dTHR;
3597     register SV *sv;
3598
3599     new_SV(sv);
3600     SvANY(sv) = 0;
3601     SvREFCNT(sv) = 1;
3602     SvFLAGS(sv) = 0;
3603     sv_setsv(sv,oldstr);
3604     if (++PL_tmps_ix >= PL_tmps_max)
3605         sv_mortalgrow();
3606     PL_tmps_stack[PL_tmps_ix] = sv;
3607     SvTEMP_on(sv);
3608     return sv;
3609 }
3610
3611 SV *
3612 sv_newmortal(void)
3613 {
3614     dTHR;
3615     register SV *sv;
3616
3617     new_SV(sv);
3618     SvANY(sv) = 0;
3619     SvREFCNT(sv) = 1;
3620     SvFLAGS(sv) = SVs_TEMP;
3621     if (++PL_tmps_ix >= PL_tmps_max)
3622         sv_mortalgrow();
3623     PL_tmps_stack[PL_tmps_ix] = sv;
3624     return sv;
3625 }
3626
3627 /* same thing without the copying */
3628
3629 SV *
3630 sv_2mortal(register SV *sv)
3631 {
3632     dTHR;
3633     if (!sv)
3634         return sv;
3635     if (SvREADONLY(sv) && SvIMMORTAL(sv))
3636         return sv;
3637     if (++PL_tmps_ix >= PL_tmps_max)
3638         sv_mortalgrow();
3639     PL_tmps_stack[PL_tmps_ix] = sv;
3640     SvTEMP_on(sv);
3641     return sv;
3642 }
3643
3644 SV *
3645 newSVpv(const char *s, STRLEN len)
3646 {
3647     register SV *sv;
3648
3649     new_SV(sv);
3650     SvANY(sv) = 0;
3651     SvREFCNT(sv) = 1;
3652     SvFLAGS(sv) = 0;
3653     if (!len)
3654         len = strlen(s);
3655     sv_setpvn(sv,s,len);
3656     return sv;
3657 }
3658
3659 SV *
3660 newSVpvn(const char *s, STRLEN len)
3661 {
3662     register SV *sv;
3663
3664     new_SV(sv);
3665     SvANY(sv) = 0;
3666     SvREFCNT(sv) = 1;
3667     SvFLAGS(sv) = 0;
3668     sv_setpvn(sv,s,len);
3669     return sv;
3670 }
3671
3672 SV *
3673 newSVpvf(const char* pat, ...)
3674 {
3675     register SV *sv;
3676     va_list args;
3677
3678     new_SV(sv);
3679     SvANY(sv) = 0;
3680     SvREFCNT(sv) = 1;
3681     SvFLAGS(sv) = 0;
3682     va_start(args, pat);
3683     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3684     va_end(args);
3685     return sv;
3686 }
3687
3688
3689 SV *
3690 newSVnv(double n)
3691 {
3692     register SV *sv;
3693
3694     new_SV(sv);
3695     SvANY(sv) = 0;
3696     SvREFCNT(sv) = 1;
3697     SvFLAGS(sv) = 0;
3698     sv_setnv(sv,n);
3699     return sv;
3700 }
3701
3702 SV *
3703 newSViv(IV i)
3704 {
3705     register SV *sv;
3706
3707     new_SV(sv);
3708     SvANY(sv) = 0;
3709     SvREFCNT(sv) = 1;
3710     SvFLAGS(sv) = 0;
3711     sv_setiv(sv,i);
3712     return sv;
3713 }
3714
3715 SV *
3716 newRV_noinc(SV *tmpRef)
3717 {
3718     dTHR;
3719     register SV *sv;
3720
3721     new_SV(sv);
3722     SvANY(sv) = 0;
3723     SvREFCNT(sv) = 1;
3724     SvFLAGS(sv) = 0;
3725     sv_upgrade(sv, SVt_RV);
3726     SvTEMP_off(tmpRef);
3727     SvRV(sv) = tmpRef;
3728     SvROK_on(sv);
3729     return sv;
3730 }
3731
3732 SV *
3733 newRV(SV *tmpRef)
3734 {
3735     return newRV_noinc(SvREFCNT_inc(tmpRef));
3736 }
3737
3738 /* make an exact duplicate of old */
3739
3740 SV *
3741 newSVsv(register SV *old)
3742 {
3743     register SV *sv;
3744
3745     if (!old)
3746         return Nullsv;
3747     if (SvTYPE(old) == SVTYPEMASK) {
3748         warn("semi-panic: attempt to dup freed string");
3749         return Nullsv;
3750     }
3751     new_SV(sv);
3752     SvANY(sv) = 0;
3753     SvREFCNT(sv) = 1;
3754     SvFLAGS(sv) = 0;
3755     if (SvTEMP(old)) {
3756         SvTEMP_off(old);
3757         sv_setsv(sv,old);
3758         SvTEMP_on(old);
3759     }
3760     else
3761         sv_setsv(sv,old);
3762     return sv;
3763 }
3764
3765 void
3766 sv_reset(register char *s, HV *stash)
3767 {
3768     register HE *entry;
3769     register GV *gv;
3770     register SV *sv;
3771     register I32 i;
3772     register PMOP *pm;
3773     register I32 max;
3774     char todo[256];
3775
3776     if (!stash)
3777         return;
3778
3779     if (!*s) {          /* reset ?? searches */
3780         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
3781             pm->op_pmdynflags &= ~PMdf_USED;
3782         }
3783         return;
3784     }
3785
3786     /* reset variables */
3787
3788     if (!HvARRAY(stash))
3789         return;
3790
3791     Zero(todo, 256, char);
3792     while (*s) {
3793         i = *s;
3794         if (s[1] == '-') {
3795             s += 2;
3796         }
3797         max = *s++;
3798         for ( ; i <= max; i++) {
3799             todo[i] = 1;
3800         }
3801         for (i = 0; i <= (I32) HvMAX(stash); i++) {
3802             for (entry = HvARRAY(stash)[i];
3803                  entry;
3804                  entry = HeNEXT(entry))
3805             {
3806                 if (!todo[(U8)*HeKEY(entry)])
3807                     continue;
3808                 gv = (GV*)HeVAL(entry);
3809                 sv = GvSV(gv);
3810                 if (SvTHINKFIRST(sv)) {
3811                     if (!SvREADONLY(sv) && SvROK(sv))
3812                         sv_unref(sv);
3813                     continue;
3814                 }
3815                 (void)SvOK_off(sv);
3816                 if (SvTYPE(sv) >= SVt_PV) {
3817                     SvCUR_set(sv, 0);
3818                     if (SvPVX(sv) != Nullch)
3819                         *SvPVX(sv) = '\0';
3820                     SvTAINT(sv);
3821                 }
3822                 if (GvAV(gv)) {
3823                     av_clear(GvAV(gv));
3824                 }
3825                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
3826                     hv_clear(GvHV(gv));
3827 #ifndef VMS  /* VMS has no environ array */
3828                     if (gv == PL_envgv)
3829                         environ[0] = Nullch;
3830 #endif
3831                 }
3832             }
3833         }
3834     }
3835 }
3836
3837 IO*
3838 sv_2io(SV *sv)
3839 {
3840     IO* io;
3841     GV* gv;
3842     STRLEN n_a;
3843
3844     switch (SvTYPE(sv)) {
3845     case SVt_PVIO:
3846         io = (IO*)sv;
3847         break;
3848     case SVt_PVGV:
3849         gv = (GV*)sv;
3850         io = GvIO(gv);
3851         if (!io)
3852             croak("Bad filehandle: %s", GvNAME(gv));
3853         break;
3854     default:
3855         if (!SvOK(sv))
3856             croak(PL_no_usym, "filehandle");
3857         if (SvROK(sv))
3858             return sv_2io(SvRV(sv));
3859         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
3860         if (gv)
3861             io = GvIO(gv);
3862         else
3863             io = 0;
3864         if (!io)
3865             croak("Bad filehandle: %s", SvPV(sv,n_a));
3866         break;
3867     }
3868     return io;
3869 }
3870
3871 CV *
3872 sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
3873 {
3874     GV *gv;
3875     CV *cv;
3876     STRLEN n_a;
3877
3878     if (!sv)
3879         return *gvp = Nullgv, Nullcv;
3880     switch (SvTYPE(sv)) {
3881     case SVt_PVCV:
3882         *st = CvSTASH(sv);
3883         *gvp = Nullgv;
3884         return (CV*)sv;
3885     case SVt_PVHV:
3886     case SVt_PVAV:
3887         *gvp = Nullgv;
3888         return Nullcv;
3889     case SVt_PVGV:
3890         gv = (GV*)sv;
3891         *gvp = gv;
3892         *st = GvESTASH(gv);
3893         goto fix_gv;
3894
3895     default:
3896         if (SvGMAGICAL(sv))
3897             mg_get(sv);
3898         if (SvROK(sv)) {
3899             dTHR;
3900             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
3901             tryAMAGICunDEREF(to_cv);
3902
3903             sv = SvRV(sv);
3904             if (SvTYPE(sv) == SVt_PVCV) {
3905                 cv = (CV*)sv;
3906                 *gvp = Nullgv;
3907                 *st = CvSTASH(cv);
3908                 return cv;
3909             }
3910             else if(isGV(sv))
3911                 gv = (GV*)sv;
3912             else
3913                 croak("Not a subroutine reference");
3914         }
3915         else if (isGV(sv))
3916             gv = (GV*)sv;
3917         else
3918             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
3919         *gvp = gv;
3920         if (!gv)
3921             return Nullcv;
3922         *st = GvESTASH(gv);
3923     fix_gv:
3924         if (lref && !GvCVu(gv)) {
3925             SV *tmpsv;
3926             ENTER;
3927             tmpsv = NEWSV(704,0);
3928             gv_efullname3(tmpsv, gv, Nullch);
3929             newSUB(start_subparse(FALSE, 0),
3930                    newSVOP(OP_CONST, 0, tmpsv),
3931                    Nullop,
3932                    Nullop);
3933             LEAVE;
3934             if (!GvCVu(gv))
3935                 croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
3936         }
3937         return GvCVu(gv);
3938     }
3939 }
3940
3941 I32
3942 sv_true(register SV *sv)
3943 {
3944     dTHR;
3945     if (!sv)
3946         return 0;
3947     if (SvPOK(sv)) {
3948         register XPV* tXpv;
3949         if ((tXpv = (XPV*)SvANY(sv)) &&
3950                 (*tXpv->xpv_pv > '0' ||
3951                 tXpv->xpv_cur > 1 ||
3952                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
3953             return 1;
3954         else
3955             return 0;
3956     }
3957     else {
3958         if (SvIOK(sv))
3959             return SvIVX(sv) != 0;
3960         else {
3961             if (SvNOK(sv))
3962                 return SvNVX(sv) != 0.0;
3963             else
3964                 return sv_2bool(sv);
3965         }
3966     }
3967 }
3968
3969 IV
3970 sv_iv(register SV *sv)
3971 {
3972     if (SvIOK(sv))
3973         return SvIVX(sv);
3974     return sv_2iv(sv);
3975 }
3976
3977 UV
3978 sv_uv(register SV *sv)
3979 {
3980     if (SvIOK(sv))
3981         return SvUVX(sv);
3982     return sv_2uv(sv);
3983 }
3984
3985 double
3986 sv_nv(register SV *sv)
3987 {
3988     if (SvNOK(sv))
3989         return SvNVX(sv);
3990     return sv_2nv(sv);
3991 }
3992
3993 char *
3994 sv_pv(SV *sv)
3995 {
3996     STRLEN n_a;
3997
3998     if (SvPOK(sv))
3999         return SvPVX(sv);
4000
4001     return sv_2pv(sv, &n_a);
4002 }
4003
4004 char *
4005 sv_pvn(SV *sv, STRLEN *lp)
4006 {
4007     if (SvPOK(sv)) {
4008         *lp = SvCUR(sv);
4009         return SvPVX(sv);
4010     }
4011     return sv_2pv(sv, lp);
4012 }
4013
4014 char *
4015 sv_pvn_force(SV *sv, STRLEN *lp)
4016 {
4017     char *s;
4018
4019     if (SvREADONLY(sv)) {
4020         dTHR;
4021         if (PL_curcop != &PL_compiling)
4022             croak(PL_no_modify);
4023     }
4024     
4025     if (SvPOK(sv)) {
4026         *lp = SvCUR(sv);
4027     }
4028     else {
4029         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4030             if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
4031                 sv_unglob(sv);
4032                 s = SvPVX(sv);
4033                 *lp = SvCUR(sv);
4034             }
4035             else {
4036                 dTHR;
4037                 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
4038                     PL_op_name[PL_op->op_type]);
4039             }
4040         }
4041         else
4042             s = sv_2pv(sv, lp);
4043         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
4044             STRLEN len = *lp;
4045             
4046             if (SvROK(sv))
4047                 sv_unref(sv);
4048             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
4049             SvGROW(sv, len + 1);
4050             Move(s,SvPVX(sv),len,char);
4051             SvCUR_set(sv, len);
4052             *SvEND(sv) = '\0';
4053         }
4054         if (!SvPOK(sv)) {
4055             SvPOK_on(sv);               /* validate pointer */
4056             SvTAINT(sv);
4057             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
4058                 (unsigned long)sv,SvPVX(sv)));
4059         }
4060     }
4061     return SvPVX(sv);
4062 }
4063
4064 char *
4065 sv_reftype(SV *sv, int ob)
4066 {
4067     if (ob && SvOBJECT(sv))
4068         return HvNAME(SvSTASH(sv));
4069     else {
4070         switch (SvTYPE(sv)) {
4071         case SVt_NULL:
4072         case SVt_IV:
4073         case SVt_NV:
4074         case SVt_RV:
4075         case SVt_PV:
4076         case SVt_PVIV:
4077         case SVt_PVNV:
4078         case SVt_PVMG:
4079         case SVt_PVBM:
4080                                 if (SvROK(sv))
4081                                     return "REF";
4082                                 else
4083                                     return "SCALAR";
4084         case SVt_PVLV:          return "LVALUE";
4085         case SVt_PVAV:          return "ARRAY";
4086         case SVt_PVHV:          return "HASH";
4087         case SVt_PVCV:          return "CODE";
4088         case SVt_PVGV:          return "GLOB";
4089         case SVt_PVFM:          return "FORMAT";
4090         default:                return "UNKNOWN";
4091         }
4092     }
4093 }
4094
4095 int
4096 sv_isobject(SV *sv)
4097 {
4098     if (!sv)
4099         return 0;
4100     if (SvGMAGICAL(sv))
4101         mg_get(sv);
4102     if (!SvROK(sv))
4103         return 0;
4104     sv = (SV*)SvRV(sv);
4105     if (!SvOBJECT(sv))
4106         return 0;
4107     return 1;
4108 }
4109
4110 int
4111 sv_isa(SV *sv, const char *name)
4112 {
4113     if (!sv)
4114         return 0;
4115     if (SvGMAGICAL(sv))
4116         mg_get(sv);
4117     if (!SvROK(sv))
4118         return 0;
4119     sv = (SV*)SvRV(sv);
4120     if (!SvOBJECT(sv))
4121         return 0;
4122
4123     return strEQ(HvNAME(SvSTASH(sv)), name);
4124 }
4125
4126 SV*
4127 newSVrv(SV *rv, const char *classname)
4128 {
4129     dTHR;
4130     SV *sv;
4131
4132     new_SV(sv);
4133     SvANY(sv) = 0;
4134     SvREFCNT(sv) = 0;
4135     SvFLAGS(sv) = 0;
4136
4137     SV_CHECK_THINKFIRST(rv);
4138     SvAMAGIC_off(rv);
4139
4140     if (SvTYPE(rv) < SVt_RV)
4141       sv_upgrade(rv, SVt_RV);
4142
4143     (void)SvOK_off(rv);
4144     SvRV(rv) = SvREFCNT_inc(sv);
4145     SvROK_on(rv);
4146
4147     if (classname) {
4148         HV* stash = gv_stashpv(classname, TRUE);
4149         (void)sv_bless(rv, stash);
4150     }
4151     return sv;
4152 }
4153
4154 SV*
4155 sv_setref_pv(SV *rv, const char *classname, void *pv)
4156 {
4157     if (!pv) {
4158         sv_setsv(rv, &PL_sv_undef);
4159         SvSETMAGIC(rv);
4160     }
4161     else
4162         sv_setiv(newSVrv(rv,classname), (IV)pv);
4163     return rv;
4164 }
4165
4166 SV*
4167 sv_setref_iv(SV *rv, const char *classname, IV iv)
4168 {
4169     sv_setiv(newSVrv(rv,classname), iv);
4170     return rv;
4171 }
4172
4173 SV*
4174 sv_setref_nv(SV *rv, const char *classname, double nv)
4175 {
4176     sv_setnv(newSVrv(rv,classname), nv);
4177     return rv;
4178 }
4179
4180 SV*
4181 sv_setref_pvn(SV *rv, const char *classname, char *pv, I32 n)
4182 {
4183     sv_setpvn(newSVrv(rv,classname), pv, n);
4184     return rv;
4185 }
4186
4187 SV*
4188 sv_bless(SV *sv, HV *stash)
4189 {
4190     dTHR;
4191     SV *tmpRef;
4192     if (!SvROK(sv))
4193         croak("Can't bless non-reference value");
4194     tmpRef = SvRV(sv);
4195     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4196         if (SvREADONLY(tmpRef))
4197             croak(PL_no_modify);
4198         if (SvOBJECT(tmpRef)) {
4199             if (SvTYPE(tmpRef) != SVt_PVIO)
4200                 --PL_sv_objcount;
4201             SvREFCNT_dec(SvSTASH(tmpRef));
4202         }
4203     }
4204     SvOBJECT_on(tmpRef);
4205     if (SvTYPE(tmpRef) != SVt_PVIO)
4206         ++PL_sv_objcount;
4207     (void)SvUPGRADE(tmpRef, SVt_PVMG);
4208     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
4209
4210     if (Gv_AMG(stash))
4211         SvAMAGIC_on(sv);
4212     else
4213         SvAMAGIC_off(sv);
4214
4215     return sv;
4216 }
4217
4218 STATIC void
4219 sv_unglob(SV *sv)
4220 {
4221     assert(SvTYPE(sv) == SVt_PVGV);
4222     SvFAKE_off(sv);
4223     if (GvGP(sv))
4224         gp_free((GV*)sv);
4225     if (GvSTASH(sv)) {
4226         SvREFCNT_dec(GvSTASH(sv));
4227         GvSTASH(sv) = Nullhv;
4228     }
4229     sv_unmagic(sv, '*');
4230     Safefree(GvNAME(sv));
4231     GvMULTI_off(sv);
4232     SvFLAGS(sv) &= ~SVTYPEMASK;
4233     SvFLAGS(sv) |= SVt_PVMG;
4234 }
4235
4236 void
4237 sv_unref(SV *sv)
4238 {
4239     SV* rv = SvRV(sv);
4240     
4241     SvRV(sv) = 0;
4242     SvROK_off(sv);
4243     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4244         SvREFCNT_dec(rv);
4245     else
4246         sv_2mortal(rv);         /* Schedule for freeing later */
4247 }
4248
4249 void
4250 sv_taint(SV *sv)
4251 {
4252     sv_magic((sv), Nullsv, 't', Nullch, 0);
4253 }
4254
4255 void
4256 sv_untaint(SV *sv)
4257 {
4258     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4259         MAGIC *mg = mg_find(sv, 't');
4260         if (mg)
4261             mg->mg_len &= ~1;
4262     }
4263 }
4264
4265 bool
4266 sv_tainted(SV *sv)
4267 {
4268     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4269         MAGIC *mg = mg_find(sv, 't');
4270         if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
4271             return TRUE;
4272     }
4273     return FALSE;
4274 }
4275
4276 void
4277 sv_setpviv(SV *sv, IV iv)
4278 {
4279     STRLEN len;
4280     char buf[TYPE_DIGITS(UV)];
4281     char *ptr = buf + sizeof(buf);
4282     int sign;
4283     UV uv;
4284     char *p;
4285
4286     sv_setpvn(sv, "", 0);
4287     if (iv >= 0) {
4288         uv = iv;
4289         sign = 0;
4290     } else {
4291         uv = -iv;
4292         sign = 1;
4293     }
4294     do {
4295         *--ptr = '0' + (uv % 10);
4296     } while (uv /= 10);
4297     len = (buf + sizeof(buf)) - ptr;
4298     /* taking advantage of SvCUR(sv) == 0 */
4299     SvGROW(sv, sign + len + 1);
4300     p = SvPVX(sv);
4301     if (sign)
4302         *p++ = '-';
4303     memcpy(p, ptr, len);
4304     p += len;
4305     *p = '\0';
4306     SvCUR(sv) = p - SvPVX(sv);
4307 }
4308
4309
4310 void
4311 sv_setpviv_mg(SV *sv, IV iv)
4312 {
4313     sv_setpviv(sv,iv);
4314     SvSETMAGIC(sv);
4315 }
4316
4317 void
4318 sv_setpvf(SV *sv, const char* pat, ...)
4319 {
4320     va_list args;
4321     va_start(args, pat);
4322     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4323     va_end(args);
4324 }
4325
4326
4327 void
4328 sv_setpvf_mg(SV *sv, const char* pat, ...)
4329 {
4330     va_list args;
4331     va_start(args, pat);
4332     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4333     va_end(args);
4334     SvSETMAGIC(sv);
4335 }
4336
4337 void
4338 sv_catpvf(SV *sv, const char* pat, ...)
4339 {
4340     va_list args;
4341     va_start(args, pat);
4342     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4343     va_end(args);
4344 }
4345
4346 void
4347 sv_catpvf_mg(SV *sv, const char* pat, ...)
4348 {
4349     va_list args;
4350     va_start(args, pat);
4351     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4352     va_end(args);
4353     SvSETMAGIC(sv);
4354 }
4355
4356 void
4357 sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4358 {
4359     sv_setpvn(sv, "", 0);
4360     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4361 }
4362
4363 void
4364 sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4365 {
4366     dTHR;
4367     char *p;
4368     char *q;
4369     char *patend;
4370     STRLEN origlen;
4371     I32 svix = 0;
4372     static char nullstr[] = "(null)";
4373
4374     /* no matter what, this is a string now */
4375     (void)SvPV_force(sv, origlen);
4376
4377     /* special-case "", "%s", and "%_" */
4378     if (patlen == 0)
4379         return;
4380     if (patlen == 2 && pat[0] == '%') {
4381         switch (pat[1]) {
4382         case 's':
4383             if (args) {
4384                 char *s = va_arg(*args, char*);
4385                 sv_catpv(sv, s ? s : nullstr);
4386             }
4387             else if (svix < svmax)
4388                 sv_catsv(sv, *svargs);
4389             return;
4390         case '_':
4391             if (args) {
4392                 sv_catsv(sv, va_arg(*args, SV*));
4393                 return;
4394             }
4395             /* See comment on '_' below */
4396             break;
4397         }
4398     }
4399
4400     patend = (char*)pat + patlen;
4401     for (p = (char*)pat; p < patend; p = q) {
4402         bool alt = FALSE;
4403         bool left = FALSE;
4404         char fill = ' ';
4405         char plus = 0;
4406         char intsize = 0;
4407         STRLEN width = 0;
4408         STRLEN zeros = 0;
4409         bool has_precis = FALSE;
4410         STRLEN precis = 0;
4411
4412         char esignbuf[4];
4413         U8 utf8buf[10];
4414         STRLEN esignlen = 0;
4415
4416         char *eptr = Nullch;
4417         STRLEN elen = 0;
4418         char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
4419         char c;
4420         int i;
4421         unsigned base;
4422         IV iv;
4423         UV uv;
4424         double nv;
4425         STRLEN have;
4426         STRLEN need;
4427         STRLEN gap;
4428
4429         for (q = p; q < patend && *q != '%'; ++q) ;
4430         if (q > p) {
4431             sv_catpvn(sv, p, q - p);
4432             p = q;
4433         }
4434         if (q++ >= patend)
4435             break;
4436
4437         /* FLAGS */
4438
4439         while (*q) {
4440             switch (*q) {
4441             case ' ':
4442             case '+':
4443                 plus = *q++;
4444                 continue;
4445
4446             case '-':
4447                 left = TRUE;
4448                 q++;
4449                 continue;
4450
4451             case '0':
4452                 fill = *q++;
4453                 continue;
4454
4455             case '#':
4456                 alt = TRUE;
4457                 q++;
4458                 continue;
4459
4460             default:
4461                 break;
4462             }
4463             break;
4464         }
4465
4466         /* WIDTH */
4467
4468         switch (*q) {
4469         case '1': case '2': case '3':
4470         case '4': case '5': case '6':
4471         case '7': case '8': case '9':
4472             width = 0;
4473             while (isDIGIT(*q))
4474                 width = width * 10 + (*q++ - '0');
4475             break;
4476
4477         case '*':
4478             if (args)
4479                 i = va_arg(*args, int);
4480             else
4481                 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4482             left |= (i < 0);
4483             width = (i < 0) ? -i : i;
4484             q++;
4485             break;
4486         }
4487
4488         /* PRECISION */
4489
4490         if (*q == '.') {
4491             q++;
4492             if (*q == '*') {
4493                 if (args)
4494                     i = va_arg(*args, int);
4495                 else
4496                     i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4497                 precis = (i < 0) ? 0 : i;
4498                 q++;
4499             }
4500             else {
4501                 precis = 0;
4502                 while (isDIGIT(*q))
4503                     precis = precis * 10 + (*q++ - '0');
4504             }
4505             has_precis = TRUE;
4506         }
4507
4508         /* SIZE */
4509
4510         switch (*q) {
4511         case 'l':
4512 #if 0  /* when quads have better support within Perl */
4513             if (*(q + 1) == 'l') {
4514                 intsize = 'q';
4515                 q += 2;
4516                 break;
4517             }
4518 #endif
4519             /* FALL THROUGH */
4520         case 'h':
4521         case 'V':
4522             intsize = *q++;
4523             break;
4524         }
4525
4526         /* CONVERSION */
4527
4528         switch (c = *q++) {
4529
4530             /* STRINGS */
4531
4532         case '%':
4533             eptr = q - 1;
4534             elen = 1;
4535             goto string;
4536
4537         case 'c':
4538             if (IN_UTF8) {
4539                 if (args)
4540                     uv = va_arg(*args, int);
4541                 else
4542                     uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4543
4544                 eptr = (char*)utf8buf;
4545                 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
4546                 goto string;
4547             }
4548             if (args)
4549                 c = va_arg(*args, int);
4550             else
4551                 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4552             eptr = &c;
4553             elen = 1;
4554             goto string;
4555
4556         case 's':
4557             if (args) {
4558                 eptr = va_arg(*args, char*);
4559                 if (eptr)
4560                     elen = strlen(eptr);
4561                 else {
4562                     eptr = nullstr;
4563                     elen = sizeof nullstr - 1;
4564                 }
4565             }
4566             else if (svix < svmax) {
4567                 eptr = SvPVx(svargs[svix++], elen);
4568                 if (IN_UTF8) {
4569                     if (has_precis && precis < elen) {
4570                         I32 p = precis;
4571                         sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4572                         precis = p;
4573                     }
4574                     if (width) { /* fudge width (can't fudge elen) */
4575                         width += elen - sv_len_utf8(svargs[svix - 1]);
4576                     }
4577                 }
4578             }
4579             goto string;
4580
4581         case '_':
4582             /*
4583              * The "%_" hack might have to be changed someday,
4584              * if ISO or ANSI decide to use '_' for something.
4585              * So we keep it hidden from users' code.
4586              */
4587             if (!args)
4588                 goto unknown;
4589             eptr = SvPVx(va_arg(*args, SV*), elen);
4590
4591         string:
4592             if (has_precis && elen > precis)
4593                 elen = precis;
4594             break;
4595
4596             /* INTEGERS */
4597
4598         case 'p':
4599             if (args)
4600                 uv = (UV)va_arg(*args, void*);
4601             else
4602                 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4603             base = 16;
4604             goto integer;
4605
4606         case 'D':
4607             intsize = 'l';
4608             /* FALL THROUGH */
4609         case 'd':
4610         case 'i':
4611             if (args) {
4612                 switch (intsize) {
4613                 case 'h':       iv = (short)va_arg(*args, int); break;
4614                 default:        iv = va_arg(*args, int); break;
4615                 case 'l':       iv = va_arg(*args, long); break;
4616                 case 'V':       iv = va_arg(*args, IV); break;
4617                 }
4618             }
4619             else {
4620                 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4621                 switch (intsize) {
4622                 case 'h':       iv = (short)iv; break;
4623                 default:        iv = (int)iv; break;
4624                 case 'l':       iv = (long)iv; break;
4625                 case 'V':       break;
4626                 }
4627             }
4628             if (iv >= 0) {
4629                 uv = iv;
4630                 if (plus)
4631                     esignbuf[esignlen++] = plus;
4632             }
4633             else {
4634                 uv = -iv;
4635                 esignbuf[esignlen++] = '-';
4636             }
4637             base = 10;
4638             goto integer;
4639
4640         case 'U':
4641             intsize = 'l';
4642             /* FALL THROUGH */
4643         case 'u':
4644             base = 10;
4645             goto uns_integer;
4646
4647         case 'b':
4648             base = 2;
4649             goto uns_integer;
4650
4651         case 'O':
4652             intsize = 'l';
4653             /* FALL THROUGH */
4654         case 'o':
4655             base = 8;
4656             goto uns_integer;
4657
4658         case 'X':
4659         case 'x':
4660             base = 16;
4661
4662         uns_integer:
4663             if (args) {
4664                 switch (intsize) {
4665                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
4666                 default:   uv = va_arg(*args, unsigned); break;
4667                 case 'l':  uv = va_arg(*args, unsigned long); break;
4668                 case 'V':  uv = va_arg(*args, UV); break;
4669                 }
4670             }
4671             else {
4672                 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4673                 switch (intsize) {
4674                 case 'h':       uv = (unsigned short)uv; break;
4675                 default:        uv = (unsigned)uv; break;
4676                 case 'l':       uv = (unsigned long)uv; break;
4677                 case 'V':       break;
4678                 }
4679             }
4680
4681         integer:
4682             eptr = ebuf + sizeof ebuf;
4683             switch (base) {
4684                 unsigned dig;
4685             case 16:
4686                 if (!uv)
4687                     alt = FALSE;
4688                 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4689                 do {
4690                     dig = uv & 15;
4691                     *--eptr = p[dig];
4692                 } while (uv >>= 4);
4693                 if (alt) {
4694                     esignbuf[esignlen++] = '0';
4695                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
4696                 }
4697                 break;
4698             case 8:
4699                 do {
4700                     dig = uv & 7;
4701                     *--eptr = '0' + dig;
4702                 } while (uv >>= 3);
4703                 if (alt && *eptr != '0')
4704                     *--eptr = '0';
4705                 break;
4706             case 2:
4707                 do {
4708                     dig = uv & 1;
4709                     *--eptr = '0' + dig;
4710                 } while (uv >>= 1);
4711                 if (alt && *eptr != '0')
4712                     *--eptr = '0';
4713                 break;
4714             default:            /* it had better be ten or less */
4715                 do {
4716                     dig = uv % base;
4717                     *--eptr = '0' + dig;
4718                 } while (uv /= base);
4719                 break;
4720             }
4721             elen = (ebuf + sizeof ebuf) - eptr;
4722             if (has_precis) {
4723                 if (precis > elen)
4724                     zeros = precis - elen;
4725                 else if (precis == 0 && elen == 1 && *eptr == '0')
4726                     elen = 0;
4727             }
4728             break;
4729
4730             /* FLOATING POINT */
4731
4732         case 'F':
4733             c = 'f';            /* maybe %F isn't supported here */
4734             /* FALL THROUGH */
4735         case 'e': case 'E':
4736         case 'f':
4737         case 'g': case 'G':
4738
4739             /* This is evil, but floating point is even more evil */
4740
4741             if (args)
4742                 nv = va_arg(*args, double);
4743             else
4744                 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
4745
4746             need = 0;
4747             if (c != 'e' && c != 'E') {
4748                 i = PERL_INT_MIN;
4749                 (void)frexp(nv, &i);
4750                 if (i == PERL_INT_MIN)
4751                     die("panic: frexp");
4752                 if (i > 0)
4753                     need = BIT_DIGITS(i);
4754             }
4755             need += has_precis ? precis : 6; /* known default */
4756             if (need < width)
4757                 need = width;
4758
4759             need += 20; /* fudge factor */
4760             if (PL_efloatsize < need) {
4761                 Safefree(PL_efloatbuf);
4762                 PL_efloatsize = need + 20; /* more fudge */
4763                 New(906, PL_efloatbuf, PL_efloatsize, char);
4764             }
4765
4766             eptr = ebuf + sizeof ebuf;
4767             *--eptr = '\0';
4768             *--eptr = c;
4769             if (has_precis) {
4770                 base = precis;
4771                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4772                 *--eptr = '.';
4773             }
4774             if (width) {
4775                 base = width;
4776                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4777             }
4778             if (fill == '0')
4779                 *--eptr = fill;
4780             if (left)
4781                 *--eptr = '-';
4782             if (plus)
4783                 *--eptr = plus;
4784             if (alt)
4785                 *--eptr = '#';
4786             *--eptr = '%';
4787
4788             (void)sprintf(PL_efloatbuf, eptr, nv);
4789
4790             eptr = PL_efloatbuf;
4791             elen = strlen(PL_efloatbuf);
4792
4793 #ifdef LC_NUMERIC
4794             /*
4795              * User-defined locales may include arbitrary characters.
4796              * And, unfortunately, some system may alloc the "C" locale
4797              * to be overridden by a malicious user.
4798              */
4799             if (used_locale)
4800                 *used_locale = TRUE;
4801 #endif /* LC_NUMERIC */
4802
4803             break;
4804
4805             /* SPECIAL */
4806
4807         case 'n':
4808             i = SvCUR(sv) - origlen;
4809             if (args) {
4810                 switch (intsize) {
4811                 case 'h':       *(va_arg(*args, short*)) = i; break;
4812                 default:        *(va_arg(*args, int*)) = i; break;
4813                 case 'l':       *(va_arg(*args, long*)) = i; break;
4814                 case 'V':       *(va_arg(*args, IV*)) = i; break;
4815                 }
4816             }
4817             else if (svix < svmax)
4818                 sv_setuv(svargs[svix++], (UV)i);
4819             continue;   /* not "break" */
4820
4821             /* UNKNOWN */
4822
4823         default:
4824       unknown:
4825             if (!args && ckWARN(WARN_PRINTF) &&
4826                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
4827                 SV *msg = sv_newmortal();
4828                 sv_setpvf(msg, "Invalid conversion in %s: ",
4829                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
4830                 if (c)
4831                     sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
4832                               c & 0xFF);
4833                 else
4834                     sv_catpv(msg, "end of string");
4835                 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
4836             }
4837
4838             /* output mangled stuff ... */
4839             if (c == '\0')
4840                 --q;
4841             eptr = p;
4842             elen = q - p;
4843
4844             /* ... right here, because formatting flags should not apply */
4845             SvGROW(sv, SvCUR(sv) + elen + 1);
4846             p = SvEND(sv);
4847             memcpy(p, eptr, elen);
4848             p += elen;
4849             *p = '\0';
4850             SvCUR(sv) = p - SvPVX(sv);
4851             continue;   /* not "break" */
4852         }
4853
4854         have = esignlen + zeros + elen;
4855         need = (have > width ? have : width);
4856         gap = need - have;
4857
4858         SvGROW(sv, SvCUR(sv) + need + 1);
4859         p = SvEND(sv);
4860         if (esignlen && fill == '0') {
4861             for (i = 0; i < esignlen; i++)
4862                 *p++ = esignbuf[i];
4863         }
4864         if (gap && !left) {
4865             memset(p, fill, gap);
4866             p += gap;
4867         }
4868         if (esignlen && fill != '0') {
4869             for (i = 0; i < esignlen; i++)
4870                 *p++ = esignbuf[i];
4871         }
4872         if (zeros) {
4873             for (i = zeros; i; i--)
4874                 *p++ = '0';
4875         }
4876         if (elen) {
4877             memcpy(p, eptr, elen);
4878             p += elen;
4879         }
4880         if (gap && left) {
4881             memset(p, ' ', gap);
4882             p += gap;
4883         }
4884         *p = '\0';
4885         SvCUR(sv) = p - SvPVX(sv);
4886     }
4887 }