fix parsing of here documents in C<eval 's/.../<<FOO/e'>
[p5sagit/p5-mst-13.2.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (c) 1991-1997, 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     (void)SvUPGRADE(sv, SVt_PV);
3180     SvSCREAM_off(sv);
3181
3182     if (RsSNARF(PL_rs)) {
3183         rsptr = NULL;
3184         rslen = 0;
3185     }
3186     else if (RsRECORD(PL_rs)) {
3187       I32 recsize, bytesread;
3188       char *buffer;
3189
3190       /* Grab the size of the record we're getting */
3191       recsize = SvIV(SvRV(PL_rs));
3192       (void)SvPOK_only(sv);    /* Validate pointer */
3193       buffer = SvGROW(sv, recsize + 1);
3194       /* Go yank in */
3195 #ifdef VMS
3196       /* VMS wants read instead of fread, because fread doesn't respect */
3197       /* RMS record boundaries. This is not necessarily a good thing to be */
3198       /* doing, but we've got no other real choice */
3199       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3200 #else
3201       bytesread = PerlIO_read(fp, buffer, recsize);
3202 #endif
3203       SvCUR_set(sv, bytesread);
3204       buffer[bytesread] = '\0';
3205       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3206     }
3207     else if (RsPARA(PL_rs)) {
3208         rsptr = "\n\n";
3209         rslen = 2;
3210     }
3211     else
3212         rsptr = SvPV(PL_rs, rslen);
3213     rslast = rslen ? rsptr[rslen - 1] : '\0';
3214
3215     if (RsPARA(PL_rs)) {                /* have to do this both before and after */
3216         do {                    /* to make sure file boundaries work right */
3217             if (PerlIO_eof(fp))
3218                 return 0;
3219             i = PerlIO_getc(fp);
3220             if (i != '\n') {
3221                 if (i == -1)
3222                     return 0;
3223                 PerlIO_ungetc(fp,i);
3224                 break;
3225             }
3226         } while (i != EOF);
3227     }
3228
3229     /* See if we know enough about I/O mechanism to cheat it ! */
3230
3231     /* This used to be #ifdef test - it is made run-time test for ease
3232        of abstracting out stdio interface. One call should be cheap 
3233        enough here - and may even be a macro allowing compile
3234        time optimization.
3235      */
3236
3237     if (PerlIO_fast_gets(fp)) {
3238
3239     /*
3240      * We're going to steal some values from the stdio struct
3241      * and put EVERYTHING in the innermost loop into registers.
3242      */
3243     register STDCHAR *ptr;
3244     STRLEN bpx;
3245     I32 shortbuffered;
3246
3247 #if defined(VMS) && defined(PERLIO_IS_STDIO)
3248     /* An ungetc()d char is handled separately from the regular
3249      * buffer, so we getc() it back out and stuff it in the buffer.
3250      */
3251     i = PerlIO_getc(fp);
3252     if (i == EOF) return 0;
3253     *(--((*fp)->_ptr)) = (unsigned char) i;
3254     (*fp)->_cnt++;
3255 #endif
3256
3257     /* Here is some breathtakingly efficient cheating */
3258
3259     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
3260     (void)SvPOK_only(sv);               /* validate pointer */
3261     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3262         if (cnt > 80 && SvLEN(sv) > append) {
3263             shortbuffered = cnt - SvLEN(sv) + append + 1;
3264             cnt -= shortbuffered;
3265         }
3266         else {
3267             shortbuffered = 0;
3268             /* remember that cnt can be negative */
3269             SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
3270         }
3271     }
3272     else
3273         shortbuffered = 0;
3274     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
3275     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
3276     DEBUG_P(PerlIO_printf(Perl_debug_log,
3277         "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3278     DEBUG_P(PerlIO_printf(Perl_debug_log,
3279         "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3280                (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3281                (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
3282     for (;;) {
3283       screamer:
3284         if (cnt > 0) {
3285             if (rslen) {
3286                 while (cnt > 0) {                    /* this     |  eat */
3287                     cnt--;
3288                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
3289                         goto thats_all_folks;        /* screams  |  sed :-) */
3290                 }
3291             }
3292             else {
3293                 Copy(ptr, bp, cnt, char);            /* this     |  eat */    
3294                 bp += cnt;                           /* screams  |  dust */   
3295                 ptr += cnt;                          /* louder   |  sed :-) */
3296                 cnt = 0;
3297             }
3298         }
3299         
3300         if (shortbuffered) {            /* oh well, must extend */
3301             cnt = shortbuffered;
3302             shortbuffered = 0;
3303             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3304             SvCUR_set(sv, bpx);
3305             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3306             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3307             continue;
3308         }
3309
3310         DEBUG_P(PerlIO_printf(Perl_debug_log,
3311             "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3312         PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
3313         DEBUG_P(PerlIO_printf(Perl_debug_log,
3314             "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3315             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3316             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3317         /* This used to call 'filbuf' in stdio form, but as that behaves like 
3318            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3319            another abstraction.  */
3320         i   = PerlIO_getc(fp);          /* get more characters */
3321         DEBUG_P(PerlIO_printf(Perl_debug_log,
3322             "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3323             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3324             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3325         cnt = PerlIO_get_cnt(fp);
3326         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
3327         DEBUG_P(PerlIO_printf(Perl_debug_log,
3328             "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3329
3330         if (i == EOF)                   /* all done for ever? */
3331             goto thats_really_all_folks;
3332
3333         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3334         SvCUR_set(sv, bpx);
3335         SvGROW(sv, bpx + cnt + 2);
3336         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3337
3338         *bp++ = i;                      /* store character from PerlIO_getc */
3339
3340         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
3341             goto thats_all_folks;
3342     }
3343
3344 thats_all_folks:
3345     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
3346           memNE((char*)bp - rslen, rsptr, rslen))
3347         goto screamer;                          /* go back to the fray */
3348 thats_really_all_folks:
3349     if (shortbuffered)
3350         cnt += shortbuffered;
3351         DEBUG_P(PerlIO_printf(Perl_debug_log,
3352             "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3353     PerlIO_set_ptrcnt(fp, ptr, cnt);    /* put these back or we're in trouble */
3354     DEBUG_P(PerlIO_printf(Perl_debug_log,
3355         "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3356         (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3357         (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3358     *bp = '\0';
3359     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
3360     DEBUG_P(PerlIO_printf(Perl_debug_log,
3361         "Screamer: done, len=%ld, string=|%.*s|\n",
3362         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
3363     }
3364    else
3365     {
3366        /*The big, slow, and stupid way */
3367         STDCHAR buf[8192];
3368
3369 screamer2:
3370         if (rslen) {
3371             register STDCHAR *bpe = buf + sizeof(buf);
3372             bp = buf;
3373             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3374                 ; /* keep reading */
3375             cnt = bp - buf;
3376         }
3377         else {
3378             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
3379             /* Accomodate broken VAXC compiler, which applies U8 cast to
3380              * both args of ?: operator, causing EOF to change into 255
3381              */
3382             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
3383         }
3384
3385         if (append)
3386             sv_catpvn(sv, (char *) buf, cnt);
3387         else
3388             sv_setpvn(sv, (char *) buf, cnt);
3389
3390         if (i != EOF &&                 /* joy */
3391             (!rslen ||
3392              SvCUR(sv) < rslen ||
3393              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
3394         {
3395             append = -1;
3396             /*
3397              * If we're reading from a TTY and we get a short read,
3398              * indicating that the user hit his EOF character, we need
3399              * to notice it now, because if we try to read from the TTY
3400              * again, the EOF condition will disappear.
3401              *
3402              * The comparison of cnt to sizeof(buf) is an optimization
3403              * that prevents unnecessary calls to feof().
3404              *
3405              * - jik 9/25/96
3406              */
3407             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3408                 goto screamer2;
3409         }
3410     }
3411
3412     if (RsPARA(PL_rs)) {                /* have to do this both before and after */  
3413         while (i != EOF) {      /* to make sure file boundaries work right */
3414             i = PerlIO_getc(fp);
3415             if (i != '\n') {
3416                 PerlIO_ungetc(fp,i);
3417                 break;
3418             }
3419         }
3420     }
3421
3422 #ifdef WIN32
3423     win32_strip_return(sv);
3424 #endif
3425
3426     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
3427 }
3428
3429
3430 void
3431 sv_inc(register SV *sv)
3432 {
3433     register char *d;
3434     int flags;
3435
3436     if (!sv)
3437         return;
3438     if (SvGMAGICAL(sv))
3439         mg_get(sv);
3440     if (SvTHINKFIRST(sv)) {
3441         if (SvREADONLY(sv)) {
3442             dTHR;
3443             if (PL_curcop != &PL_compiling)
3444                 croak(PL_no_modify);
3445         }
3446         if (SvROK(sv)) {
3447             IV i;
3448             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
3449                 return;
3450             i = (IV)SvRV(sv);
3451             sv_unref(sv);
3452             sv_setiv(sv, i);
3453         }
3454     }
3455     flags = SvFLAGS(sv);
3456     if (flags & SVp_NOK) {
3457         (void)SvNOK_only(sv);
3458         SvNVX(sv) += 1.0;
3459         return;
3460     }
3461     if (flags & SVp_IOK) {
3462         if (SvIVX(sv) == IV_MAX)
3463             sv_setnv(sv, (double)IV_MAX + 1.0);
3464         else {
3465             (void)SvIOK_only(sv);
3466             ++SvIVX(sv);
3467         }
3468         return;
3469     }
3470     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
3471         if ((flags & SVTYPEMASK) < SVt_PVNV)
3472             sv_upgrade(sv, SVt_NV);
3473         SvNVX(sv) = 1.0;
3474         (void)SvNOK_only(sv);
3475         return;
3476     }
3477     d = SvPVX(sv);
3478     while (isALPHA(*d)) d++;
3479     while (isDIGIT(*d)) d++;
3480     if (*d) {
3481         SET_NUMERIC_STANDARD();
3482         sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
3483         return;
3484     }
3485     d--;
3486     while (d >= SvPVX(sv)) {
3487         if (isDIGIT(*d)) {
3488             if (++*d <= '9')
3489                 return;
3490             *(d--) = '0';
3491         }
3492         else {
3493 #ifdef EBCDIC
3494             /* MKS: The original code here died if letters weren't consecutive.
3495              * at least it didn't have to worry about non-C locales.  The
3496              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3497              * arranged in order (although not consecutively) and that only 
3498              * [A-Za-z] are accepted by isALPHA in the C locale.
3499              */
3500             if (*d != 'z' && *d != 'Z') {
3501                 do { ++*d; } while (!isALPHA(*d));
3502                 return;
3503             }
3504             *(d--) -= 'z' - 'a';
3505 #else
3506             ++*d;
3507             if (isALPHA(*d))
3508                 return;
3509             *(d--) -= 'z' - 'a' + 1;
3510 #endif
3511         }
3512     }
3513     /* oh,oh, the number grew */
3514     SvGROW(sv, SvCUR(sv) + 2);
3515     SvCUR(sv)++;
3516     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
3517         *d = d[-1];
3518     if (isDIGIT(d[1]))
3519         *d = '1';
3520     else
3521         *d = d[1];
3522 }
3523
3524 void
3525 sv_dec(register SV *sv)
3526 {
3527     int flags;
3528
3529     if (!sv)
3530         return;
3531     if (SvGMAGICAL(sv))
3532         mg_get(sv);
3533     if (SvTHINKFIRST(sv)) {
3534         if (SvREADONLY(sv)) {
3535             dTHR;
3536             if (PL_curcop != &PL_compiling)
3537                 croak(PL_no_modify);
3538         }
3539         if (SvROK(sv)) {
3540             IV i;
3541             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
3542                 return;
3543             i = (IV)SvRV(sv);
3544             sv_unref(sv);
3545             sv_setiv(sv, i);
3546         }
3547     }
3548     flags = SvFLAGS(sv);
3549     if (flags & SVp_NOK) {
3550         SvNVX(sv) -= 1.0;
3551         (void)SvNOK_only(sv);
3552         return;
3553     }
3554     if (flags & SVp_IOK) {
3555         if (SvIVX(sv) == IV_MIN)
3556             sv_setnv(sv, (double)IV_MIN - 1.0);
3557         else {
3558             (void)SvIOK_only(sv);
3559             --SvIVX(sv);
3560         }
3561         return;
3562     }
3563     if (!(flags & SVp_POK)) {
3564         if ((flags & SVTYPEMASK) < SVt_PVNV)
3565             sv_upgrade(sv, SVt_NV);
3566         SvNVX(sv) = -1.0;
3567         (void)SvNOK_only(sv);
3568         return;
3569     }
3570     SET_NUMERIC_STANDARD();
3571     sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
3572 }
3573
3574 /* Make a string that will exist for the duration of the expression
3575  * evaluation.  Actually, it may have to last longer than that, but
3576  * hopefully we won't free it until it has been assigned to a
3577  * permanent location. */
3578
3579 STATIC void
3580 sv_mortalgrow(void)
3581 {
3582     dTHR;
3583     PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
3584     Renew(PL_tmps_stack, PL_tmps_max, SV*);
3585 }
3586
3587 SV *
3588 sv_mortalcopy(SV *oldstr)
3589 {
3590     dTHR;
3591     register SV *sv;
3592
3593     new_SV(sv);
3594     SvANY(sv) = 0;
3595     SvREFCNT(sv) = 1;
3596     SvFLAGS(sv) = 0;
3597     sv_setsv(sv,oldstr);
3598     if (++PL_tmps_ix >= PL_tmps_max)
3599         sv_mortalgrow();
3600     PL_tmps_stack[PL_tmps_ix] = sv;
3601     SvTEMP_on(sv);
3602     return sv;
3603 }
3604
3605 SV *
3606 sv_newmortal(void)
3607 {
3608     dTHR;
3609     register SV *sv;
3610
3611     new_SV(sv);
3612     SvANY(sv) = 0;
3613     SvREFCNT(sv) = 1;
3614     SvFLAGS(sv) = SVs_TEMP;
3615     if (++PL_tmps_ix >= PL_tmps_max)
3616         sv_mortalgrow();
3617     PL_tmps_stack[PL_tmps_ix] = sv;
3618     return sv;
3619 }
3620
3621 /* same thing without the copying */
3622
3623 SV *
3624 sv_2mortal(register SV *sv)
3625 {
3626     dTHR;
3627     if (!sv)
3628         return sv;
3629     if (SvREADONLY(sv) && SvIMMORTAL(sv))
3630         return sv;
3631     if (++PL_tmps_ix >= PL_tmps_max)
3632         sv_mortalgrow();
3633     PL_tmps_stack[PL_tmps_ix] = sv;
3634     SvTEMP_on(sv);
3635     return sv;
3636 }
3637
3638 SV *
3639 newSVpv(const char *s, STRLEN len)
3640 {
3641     register SV *sv;
3642
3643     new_SV(sv);
3644     SvANY(sv) = 0;
3645     SvREFCNT(sv) = 1;
3646     SvFLAGS(sv) = 0;
3647     if (!len)
3648         len = strlen(s);
3649     sv_setpvn(sv,s,len);
3650     return sv;
3651 }
3652
3653 SV *
3654 newSVpvn(const char *s, STRLEN len)
3655 {
3656     register SV *sv;
3657
3658     new_SV(sv);
3659     SvANY(sv) = 0;
3660     SvREFCNT(sv) = 1;
3661     SvFLAGS(sv) = 0;
3662     sv_setpvn(sv,s,len);
3663     return sv;
3664 }
3665
3666 SV *
3667 newSVpvf(const char* pat, ...)
3668 {
3669     register SV *sv;
3670     va_list args;
3671
3672     new_SV(sv);
3673     SvANY(sv) = 0;
3674     SvREFCNT(sv) = 1;
3675     SvFLAGS(sv) = 0;
3676     va_start(args, pat);
3677     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3678     va_end(args);
3679     return sv;
3680 }
3681
3682
3683 SV *
3684 newSVnv(double n)
3685 {
3686     register SV *sv;
3687
3688     new_SV(sv);
3689     SvANY(sv) = 0;
3690     SvREFCNT(sv) = 1;
3691     SvFLAGS(sv) = 0;
3692     sv_setnv(sv,n);
3693     return sv;
3694 }
3695
3696 SV *
3697 newSViv(IV i)
3698 {
3699     register SV *sv;
3700
3701     new_SV(sv);
3702     SvANY(sv) = 0;
3703     SvREFCNT(sv) = 1;
3704     SvFLAGS(sv) = 0;
3705     sv_setiv(sv,i);
3706     return sv;
3707 }
3708
3709 SV *
3710 newRV_noinc(SV *tmpRef)
3711 {
3712     dTHR;
3713     register SV *sv;
3714
3715     new_SV(sv);
3716     SvANY(sv) = 0;
3717     SvREFCNT(sv) = 1;
3718     SvFLAGS(sv) = 0;
3719     sv_upgrade(sv, SVt_RV);
3720     SvTEMP_off(tmpRef);
3721     SvRV(sv) = tmpRef;
3722     SvROK_on(sv);
3723     return sv;
3724 }
3725
3726 SV *
3727 newRV(SV *tmpRef)
3728 {
3729     return newRV_noinc(SvREFCNT_inc(tmpRef));
3730 }
3731
3732 /* make an exact duplicate of old */
3733
3734 SV *
3735 newSVsv(register SV *old)
3736 {
3737     register SV *sv;
3738
3739     if (!old)
3740         return Nullsv;
3741     if (SvTYPE(old) == SVTYPEMASK) {
3742         warn("semi-panic: attempt to dup freed string");
3743         return Nullsv;
3744     }
3745     new_SV(sv);
3746     SvANY(sv) = 0;
3747     SvREFCNT(sv) = 1;
3748     SvFLAGS(sv) = 0;
3749     if (SvTEMP(old)) {
3750         SvTEMP_off(old);
3751         sv_setsv(sv,old);
3752         SvTEMP_on(old);
3753     }
3754     else
3755         sv_setsv(sv,old);
3756     return sv;
3757 }
3758
3759 void
3760 sv_reset(register char *s, HV *stash)
3761 {
3762     register HE *entry;
3763     register GV *gv;
3764     register SV *sv;
3765     register I32 i;
3766     register PMOP *pm;
3767     register I32 max;
3768     char todo[256];
3769
3770     if (!stash)
3771         return;
3772
3773     if (!*s) {          /* reset ?? searches */
3774         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
3775             pm->op_pmdynflags &= ~PMdf_USED;
3776         }
3777         return;
3778     }
3779
3780     /* reset variables */
3781
3782     if (!HvARRAY(stash))
3783         return;
3784
3785     Zero(todo, 256, char);
3786     while (*s) {
3787         i = *s;
3788         if (s[1] == '-') {
3789             s += 2;
3790         }
3791         max = *s++;
3792         for ( ; i <= max; i++) {
3793             todo[i] = 1;
3794         }
3795         for (i = 0; i <= (I32) HvMAX(stash); i++) {
3796             for (entry = HvARRAY(stash)[i];
3797                  entry;
3798                  entry = HeNEXT(entry))
3799             {
3800                 if (!todo[(U8)*HeKEY(entry)])
3801                     continue;
3802                 gv = (GV*)HeVAL(entry);
3803                 sv = GvSV(gv);
3804                 if (SvTHINKFIRST(sv)) {
3805                     if (!SvREADONLY(sv) && SvROK(sv))
3806                         sv_unref(sv);
3807                     continue;
3808                 }
3809                 (void)SvOK_off(sv);
3810                 if (SvTYPE(sv) >= SVt_PV) {
3811                     SvCUR_set(sv, 0);
3812                     if (SvPVX(sv) != Nullch)
3813                         *SvPVX(sv) = '\0';
3814                     SvTAINT(sv);
3815                 }
3816                 if (GvAV(gv)) {
3817                     av_clear(GvAV(gv));
3818                 }
3819                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
3820                     hv_clear(GvHV(gv));
3821 #ifndef VMS  /* VMS has no environ array */
3822                     if (gv == PL_envgv)
3823                         environ[0] = Nullch;
3824 #endif
3825                 }
3826             }
3827         }
3828     }
3829 }
3830
3831 IO*
3832 sv_2io(SV *sv)
3833 {
3834     IO* io;
3835     GV* gv;
3836     STRLEN n_a;
3837
3838     switch (SvTYPE(sv)) {
3839     case SVt_PVIO:
3840         io = (IO*)sv;
3841         break;
3842     case SVt_PVGV:
3843         gv = (GV*)sv;
3844         io = GvIO(gv);
3845         if (!io)
3846             croak("Bad filehandle: %s", GvNAME(gv));
3847         break;
3848     default:
3849         if (!SvOK(sv))
3850             croak(PL_no_usym, "filehandle");
3851         if (SvROK(sv))
3852             return sv_2io(SvRV(sv));
3853         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
3854         if (gv)
3855             io = GvIO(gv);
3856         else
3857             io = 0;
3858         if (!io)
3859             croak("Bad filehandle: %s", SvPV(sv,n_a));
3860         break;
3861     }
3862     return io;
3863 }
3864
3865 CV *
3866 sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
3867 {
3868     GV *gv;
3869     CV *cv;
3870     STRLEN n_a;
3871
3872     if (!sv)
3873         return *gvp = Nullgv, Nullcv;
3874     switch (SvTYPE(sv)) {
3875     case SVt_PVCV:
3876         *st = CvSTASH(sv);
3877         *gvp = Nullgv;
3878         return (CV*)sv;
3879     case SVt_PVHV:
3880     case SVt_PVAV:
3881         *gvp = Nullgv;
3882         return Nullcv;
3883     case SVt_PVGV:
3884         gv = (GV*)sv;
3885         *gvp = gv;
3886         *st = GvESTASH(gv);
3887         goto fix_gv;
3888
3889     default:
3890         if (SvGMAGICAL(sv))
3891             mg_get(sv);
3892         if (SvROK(sv)) {
3893             dTHR;
3894             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
3895             tryAMAGICunDEREF(to_cv);
3896
3897             sv = SvRV(sv);
3898             if (SvTYPE(sv) == SVt_PVCV) {
3899                 cv = (CV*)sv;
3900                 *gvp = Nullgv;
3901                 *st = CvSTASH(cv);
3902                 return cv;
3903             }
3904             else if(isGV(sv))
3905                 gv = (GV*)sv;
3906             else
3907                 croak("Not a subroutine reference");
3908         }
3909         else if (isGV(sv))
3910             gv = (GV*)sv;
3911         else
3912             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
3913         *gvp = gv;
3914         if (!gv)
3915             return Nullcv;
3916         *st = GvESTASH(gv);
3917     fix_gv:
3918         if (lref && !GvCVu(gv)) {
3919             SV *tmpsv;
3920             ENTER;
3921             tmpsv = NEWSV(704,0);
3922             gv_efullname3(tmpsv, gv, Nullch);
3923             newSUB(start_subparse(FALSE, 0),
3924                    newSVOP(OP_CONST, 0, tmpsv),
3925                    Nullop,
3926                    Nullop);
3927             LEAVE;
3928             if (!GvCVu(gv))
3929                 croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
3930         }
3931         return GvCVu(gv);
3932     }
3933 }
3934
3935 I32
3936 sv_true(register SV *sv)
3937 {
3938     dTHR;
3939     if (!sv)
3940         return 0;
3941     if (SvPOK(sv)) {
3942         register XPV* tXpv;
3943         if ((tXpv = (XPV*)SvANY(sv)) &&
3944                 (*tXpv->xpv_pv > '0' ||
3945                 tXpv->xpv_cur > 1 ||
3946                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
3947             return 1;
3948         else
3949             return 0;
3950     }
3951     else {
3952         if (SvIOK(sv))
3953             return SvIVX(sv) != 0;
3954         else {
3955             if (SvNOK(sv))
3956                 return SvNVX(sv) != 0.0;
3957             else
3958                 return sv_2bool(sv);
3959         }
3960     }
3961 }
3962
3963 IV
3964 sv_iv(register SV *sv)
3965 {
3966     if (SvIOK(sv))
3967         return SvIVX(sv);
3968     return sv_2iv(sv);
3969 }
3970
3971 UV
3972 sv_uv(register SV *sv)
3973 {
3974     if (SvIOK(sv))
3975         return SvUVX(sv);
3976     return sv_2uv(sv);
3977 }
3978
3979 double
3980 sv_nv(register SV *sv)
3981 {
3982     if (SvNOK(sv))
3983         return SvNVX(sv);
3984     return sv_2nv(sv);
3985 }
3986
3987 char *
3988 sv_pv(SV *sv)
3989 {
3990     STRLEN n_a;
3991
3992     if (SvPOK(sv))
3993         return SvPVX(sv);
3994
3995     return sv_2pv(sv, &n_a);
3996 }
3997
3998 char *
3999 sv_pvn(SV *sv, STRLEN *lp)
4000 {
4001     if (SvPOK(sv)) {
4002         *lp = SvCUR(sv);
4003         return SvPVX(sv);
4004     }
4005     return sv_2pv(sv, lp);
4006 }
4007
4008 char *
4009 sv_pvn_force(SV *sv, STRLEN *lp)
4010 {
4011     char *s;
4012
4013     if (SvREADONLY(sv)) {
4014         dTHR;
4015         if (PL_curcop != &PL_compiling)
4016             croak(PL_no_modify);
4017     }
4018     
4019     if (SvPOK(sv)) {
4020         *lp = SvCUR(sv);
4021     }
4022     else {
4023         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4024             if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
4025                 sv_unglob(sv);
4026                 s = SvPVX(sv);
4027                 *lp = SvCUR(sv);
4028             }
4029             else {
4030                 dTHR;
4031                 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
4032                     PL_op_name[PL_op->op_type]);
4033             }
4034         }
4035         else
4036             s = sv_2pv(sv, lp);
4037         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
4038             STRLEN len = *lp;
4039             
4040             if (SvROK(sv))
4041                 sv_unref(sv);
4042             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
4043             SvGROW(sv, len + 1);
4044             Move(s,SvPVX(sv),len,char);
4045             SvCUR_set(sv, len);
4046             *SvEND(sv) = '\0';
4047         }
4048         if (!SvPOK(sv)) {
4049             SvPOK_on(sv);               /* validate pointer */
4050             SvTAINT(sv);
4051             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
4052                 (unsigned long)sv,SvPVX(sv)));
4053         }
4054     }
4055     return SvPVX(sv);
4056 }
4057
4058 char *
4059 sv_reftype(SV *sv, int ob)
4060 {
4061     if (ob && SvOBJECT(sv))
4062         return HvNAME(SvSTASH(sv));
4063     else {
4064         switch (SvTYPE(sv)) {
4065         case SVt_NULL:
4066         case SVt_IV:
4067         case SVt_NV:
4068         case SVt_RV:
4069         case SVt_PV:
4070         case SVt_PVIV:
4071         case SVt_PVNV:
4072         case SVt_PVMG:
4073         case SVt_PVBM:
4074                                 if (SvROK(sv))
4075                                     return "REF";
4076                                 else
4077                                     return "SCALAR";
4078         case SVt_PVLV:          return "LVALUE";
4079         case SVt_PVAV:          return "ARRAY";
4080         case SVt_PVHV:          return "HASH";
4081         case SVt_PVCV:          return "CODE";
4082         case SVt_PVGV:          return "GLOB";
4083         case SVt_PVFM:          return "FORMAT";
4084         default:                return "UNKNOWN";
4085         }
4086     }
4087 }
4088
4089 int
4090 sv_isobject(SV *sv)
4091 {
4092     if (!sv)
4093         return 0;
4094     if (SvGMAGICAL(sv))
4095         mg_get(sv);
4096     if (!SvROK(sv))
4097         return 0;
4098     sv = (SV*)SvRV(sv);
4099     if (!SvOBJECT(sv))
4100         return 0;
4101     return 1;
4102 }
4103
4104 int
4105 sv_isa(SV *sv, const char *name)
4106 {
4107     if (!sv)
4108         return 0;
4109     if (SvGMAGICAL(sv))
4110         mg_get(sv);
4111     if (!SvROK(sv))
4112         return 0;
4113     sv = (SV*)SvRV(sv);
4114     if (!SvOBJECT(sv))
4115         return 0;
4116
4117     return strEQ(HvNAME(SvSTASH(sv)), name);
4118 }
4119
4120 SV*
4121 newSVrv(SV *rv, const char *classname)
4122 {
4123     dTHR;
4124     SV *sv;
4125
4126     new_SV(sv);
4127     SvANY(sv) = 0;
4128     SvREFCNT(sv) = 0;
4129     SvFLAGS(sv) = 0;
4130
4131     SV_CHECK_THINKFIRST(rv);
4132     SvAMAGIC_off(rv);
4133
4134     if (SvTYPE(rv) < SVt_RV)
4135       sv_upgrade(rv, SVt_RV);
4136
4137     (void)SvOK_off(rv);
4138     SvRV(rv) = SvREFCNT_inc(sv);
4139     SvROK_on(rv);
4140
4141     if (classname) {
4142         HV* stash = gv_stashpv(classname, TRUE);
4143         (void)sv_bless(rv, stash);
4144     }
4145     return sv;
4146 }
4147
4148 SV*
4149 sv_setref_pv(SV *rv, const char *classname, void *pv)
4150 {
4151     if (!pv) {
4152         sv_setsv(rv, &PL_sv_undef);
4153         SvSETMAGIC(rv);
4154     }
4155     else
4156         sv_setiv(newSVrv(rv,classname), (IV)pv);
4157     return rv;
4158 }
4159
4160 SV*
4161 sv_setref_iv(SV *rv, const char *classname, IV iv)
4162 {
4163     sv_setiv(newSVrv(rv,classname), iv);
4164     return rv;
4165 }
4166
4167 SV*
4168 sv_setref_nv(SV *rv, const char *classname, double nv)
4169 {
4170     sv_setnv(newSVrv(rv,classname), nv);
4171     return rv;
4172 }
4173
4174 SV*
4175 sv_setref_pvn(SV *rv, const char *classname, char *pv, I32 n)
4176 {
4177     sv_setpvn(newSVrv(rv,classname), pv, n);
4178     return rv;
4179 }
4180
4181 SV*
4182 sv_bless(SV *sv, HV *stash)
4183 {
4184     dTHR;
4185     SV *tmpRef;
4186     if (!SvROK(sv))
4187         croak("Can't bless non-reference value");
4188     tmpRef = SvRV(sv);
4189     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4190         if (SvREADONLY(tmpRef))
4191             croak(PL_no_modify);
4192         if (SvOBJECT(tmpRef)) {
4193             if (SvTYPE(tmpRef) != SVt_PVIO)
4194                 --PL_sv_objcount;
4195             SvREFCNT_dec(SvSTASH(tmpRef));
4196         }
4197     }
4198     SvOBJECT_on(tmpRef);
4199     if (SvTYPE(tmpRef) != SVt_PVIO)
4200         ++PL_sv_objcount;
4201     (void)SvUPGRADE(tmpRef, SVt_PVMG);
4202     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
4203
4204     if (Gv_AMG(stash))
4205         SvAMAGIC_on(sv);
4206     else
4207         SvAMAGIC_off(sv);
4208
4209     return sv;
4210 }
4211
4212 STATIC void
4213 sv_unglob(SV *sv)
4214 {
4215     assert(SvTYPE(sv) == SVt_PVGV);
4216     SvFAKE_off(sv);
4217     if (GvGP(sv))
4218         gp_free((GV*)sv);
4219     if (GvSTASH(sv)) {
4220         SvREFCNT_dec(GvSTASH(sv));
4221         GvSTASH(sv) = Nullhv;
4222     }
4223     sv_unmagic(sv, '*');
4224     Safefree(GvNAME(sv));
4225     GvMULTI_off(sv);
4226     SvFLAGS(sv) &= ~SVTYPEMASK;
4227     SvFLAGS(sv) |= SVt_PVMG;
4228 }
4229
4230 void
4231 sv_unref(SV *sv)
4232 {
4233     SV* rv = SvRV(sv);
4234     
4235     SvRV(sv) = 0;
4236     SvROK_off(sv);
4237     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4238         SvREFCNT_dec(rv);
4239     else
4240         sv_2mortal(rv);         /* Schedule for freeing later */
4241 }
4242
4243 void
4244 sv_taint(SV *sv)
4245 {
4246     sv_magic((sv), Nullsv, 't', Nullch, 0);
4247 }
4248
4249 void
4250 sv_untaint(SV *sv)
4251 {
4252     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4253         MAGIC *mg = mg_find(sv, 't');
4254         if (mg)
4255             mg->mg_len &= ~1;
4256     }
4257 }
4258
4259 bool
4260 sv_tainted(SV *sv)
4261 {
4262     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4263         MAGIC *mg = mg_find(sv, 't');
4264         if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
4265             return TRUE;
4266     }
4267     return FALSE;
4268 }
4269
4270 void
4271 sv_setpviv(SV *sv, IV iv)
4272 {
4273     STRLEN len;
4274     char buf[TYPE_DIGITS(UV)];
4275     char *ptr = buf + sizeof(buf);
4276     int sign;
4277     UV uv;
4278     char *p;
4279
4280     sv_setpvn(sv, "", 0);
4281     if (iv >= 0) {
4282         uv = iv;
4283         sign = 0;
4284     } else {
4285         uv = -iv;
4286         sign = 1;
4287     }
4288     do {
4289         *--ptr = '0' + (uv % 10);
4290     } while (uv /= 10);
4291     len = (buf + sizeof(buf)) - ptr;
4292     /* taking advantage of SvCUR(sv) == 0 */
4293     SvGROW(sv, sign + len + 1);
4294     p = SvPVX(sv);
4295     if (sign)
4296         *p++ = '-';
4297     memcpy(p, ptr, len);
4298     p += len;
4299     *p = '\0';
4300     SvCUR(sv) = p - SvPVX(sv);
4301 }
4302
4303
4304 void
4305 sv_setpviv_mg(SV *sv, IV iv)
4306 {
4307     sv_setpviv(sv,iv);
4308     SvSETMAGIC(sv);
4309 }
4310
4311 void
4312 sv_setpvf(SV *sv, const char* pat, ...)
4313 {
4314     va_list args;
4315     va_start(args, pat);
4316     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4317     va_end(args);
4318 }
4319
4320
4321 void
4322 sv_setpvf_mg(SV *sv, const char* pat, ...)
4323 {
4324     va_list args;
4325     va_start(args, pat);
4326     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4327     va_end(args);
4328     SvSETMAGIC(sv);
4329 }
4330
4331 void
4332 sv_catpvf(SV *sv, const char* pat, ...)
4333 {
4334     va_list args;
4335     va_start(args, pat);
4336     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4337     va_end(args);
4338 }
4339
4340 void
4341 sv_catpvf_mg(SV *sv, const char* pat, ...)
4342 {
4343     va_list args;
4344     va_start(args, pat);
4345     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4346     va_end(args);
4347     SvSETMAGIC(sv);
4348 }
4349
4350 void
4351 sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4352 {
4353     sv_setpvn(sv, "", 0);
4354     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4355 }
4356
4357 void
4358 sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4359 {
4360     dTHR;
4361     char *p;
4362     char *q;
4363     char *patend;
4364     STRLEN origlen;
4365     I32 svix = 0;
4366     static char nullstr[] = "(null)";
4367
4368     /* no matter what, this is a string now */
4369     (void)SvPV_force(sv, origlen);
4370
4371     /* special-case "", "%s", and "%_" */
4372     if (patlen == 0)
4373         return;
4374     if (patlen == 2 && pat[0] == '%') {
4375         switch (pat[1]) {
4376         case 's':
4377             if (args) {
4378                 char *s = va_arg(*args, char*);
4379                 sv_catpv(sv, s ? s : nullstr);
4380             }
4381             else if (svix < svmax)
4382                 sv_catsv(sv, *svargs);
4383             return;
4384         case '_':
4385             if (args) {
4386                 sv_catsv(sv, va_arg(*args, SV*));
4387                 return;
4388             }
4389             /* See comment on '_' below */
4390             break;
4391         }
4392     }
4393
4394     patend = (char*)pat + patlen;
4395     for (p = (char*)pat; p < patend; p = q) {
4396         bool alt = FALSE;
4397         bool left = FALSE;
4398         char fill = ' ';
4399         char plus = 0;
4400         char intsize = 0;
4401         STRLEN width = 0;
4402         STRLEN zeros = 0;
4403         bool has_precis = FALSE;
4404         STRLEN precis = 0;
4405
4406         char esignbuf[4];
4407         U8 utf8buf[10];
4408         STRLEN esignlen = 0;
4409
4410         char *eptr = Nullch;
4411         STRLEN elen = 0;
4412         char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
4413         char c;
4414         int i;
4415         unsigned base;
4416         IV iv;
4417         UV uv;
4418         double nv;
4419         STRLEN have;
4420         STRLEN need;
4421         STRLEN gap;
4422
4423         for (q = p; q < patend && *q != '%'; ++q) ;
4424         if (q > p) {
4425             sv_catpvn(sv, p, q - p);
4426             p = q;
4427         }
4428         if (q++ >= patend)
4429             break;
4430
4431         /* FLAGS */
4432
4433         while (*q) {
4434             switch (*q) {
4435             case ' ':
4436             case '+':
4437                 plus = *q++;
4438                 continue;
4439
4440             case '-':
4441                 left = TRUE;
4442                 q++;
4443                 continue;
4444
4445             case '0':
4446                 fill = *q++;
4447                 continue;
4448
4449             case '#':
4450                 alt = TRUE;
4451                 q++;
4452                 continue;
4453
4454             default:
4455                 break;
4456             }
4457             break;
4458         }
4459
4460         /* WIDTH */
4461
4462         switch (*q) {
4463         case '1': case '2': case '3':
4464         case '4': case '5': case '6':
4465         case '7': case '8': case '9':
4466             width = 0;
4467             while (isDIGIT(*q))
4468                 width = width * 10 + (*q++ - '0');
4469             break;
4470
4471         case '*':
4472             if (args)
4473                 i = va_arg(*args, int);
4474             else
4475                 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4476             left |= (i < 0);
4477             width = (i < 0) ? -i : i;
4478             q++;
4479             break;
4480         }
4481
4482         /* PRECISION */
4483
4484         if (*q == '.') {
4485             q++;
4486             if (*q == '*') {
4487                 if (args)
4488                     i = va_arg(*args, int);
4489                 else
4490                     i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4491                 precis = (i < 0) ? 0 : i;
4492                 q++;
4493             }
4494             else {
4495                 precis = 0;
4496                 while (isDIGIT(*q))
4497                     precis = precis * 10 + (*q++ - '0');
4498             }
4499             has_precis = TRUE;
4500         }
4501
4502         /* SIZE */
4503
4504         switch (*q) {
4505         case 'l':
4506 #if 0  /* when quads have better support within Perl */
4507             if (*(q + 1) == 'l') {
4508                 intsize = 'q';
4509                 q += 2;
4510                 break;
4511             }
4512 #endif
4513             /* FALL THROUGH */
4514         case 'h':
4515         case 'V':
4516             intsize = *q++;
4517             break;
4518         }
4519
4520         /* CONVERSION */
4521
4522         switch (c = *q++) {
4523
4524             /* STRINGS */
4525
4526         case '%':
4527             eptr = q - 1;
4528             elen = 1;
4529             goto string;
4530
4531         case 'c':
4532             if (IN_UTF8) {
4533                 if (args)
4534                     uv = va_arg(*args, int);
4535                 else
4536                     uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4537
4538                 eptr = (char*)utf8buf;
4539                 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
4540                 goto string;
4541             }
4542             if (args)
4543                 c = va_arg(*args, int);
4544             else
4545                 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4546             eptr = &c;
4547             elen = 1;
4548             goto string;
4549
4550         case 's':
4551             if (args) {
4552                 eptr = va_arg(*args, char*);
4553                 if (eptr)
4554                     elen = strlen(eptr);
4555                 else {
4556                     eptr = nullstr;
4557                     elen = sizeof nullstr - 1;
4558                 }
4559             }
4560             else if (svix < svmax) {
4561                 eptr = SvPVx(svargs[svix++], elen);
4562                 if (IN_UTF8) {
4563                     if (has_precis && precis < elen) {
4564                         I32 p = precis;
4565                         sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4566                         precis = p;
4567                     }
4568                     if (width) { /* fudge width (can't fudge elen) */
4569                         width += elen - sv_len_utf8(svargs[svix - 1]);
4570                     }
4571                 }
4572             }
4573             goto string;
4574
4575         case '_':
4576             /*
4577              * The "%_" hack might have to be changed someday,
4578              * if ISO or ANSI decide to use '_' for something.
4579              * So we keep it hidden from users' code.
4580              */
4581             if (!args)
4582                 goto unknown;
4583             eptr = SvPVx(va_arg(*args, SV*), elen);
4584
4585         string:
4586             if (has_precis && elen > precis)
4587                 elen = precis;
4588             break;
4589
4590             /* INTEGERS */
4591
4592         case 'p':
4593             if (args)
4594                 uv = (UV)va_arg(*args, void*);
4595             else
4596                 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4597             base = 16;
4598             goto integer;
4599
4600         case 'D':
4601             intsize = 'l';
4602             /* FALL THROUGH */
4603         case 'd':
4604         case 'i':
4605             if (args) {
4606                 switch (intsize) {
4607                 case 'h':       iv = (short)va_arg(*args, int); break;
4608                 default:        iv = va_arg(*args, int); break;
4609                 case 'l':       iv = va_arg(*args, long); break;
4610                 case 'V':       iv = va_arg(*args, IV); break;
4611                 }
4612             }
4613             else {
4614                 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4615                 switch (intsize) {
4616                 case 'h':       iv = (short)iv; break;
4617                 default:        iv = (int)iv; break;
4618                 case 'l':       iv = (long)iv; break;
4619                 case 'V':       break;
4620                 }
4621             }
4622             if (iv >= 0) {
4623                 uv = iv;
4624                 if (plus)
4625                     esignbuf[esignlen++] = plus;
4626             }
4627             else {
4628                 uv = -iv;
4629                 esignbuf[esignlen++] = '-';
4630             }
4631             base = 10;
4632             goto integer;
4633
4634         case 'U':
4635             intsize = 'l';
4636             /* FALL THROUGH */
4637         case 'u':
4638             base = 10;
4639             goto uns_integer;
4640
4641         case 'b':
4642             base = 2;
4643             goto uns_integer;
4644
4645         case 'O':
4646             intsize = 'l';
4647             /* FALL THROUGH */
4648         case 'o':
4649             base = 8;
4650             goto uns_integer;
4651
4652         case 'X':
4653         case 'x':
4654             base = 16;
4655
4656         uns_integer:
4657             if (args) {
4658                 switch (intsize) {
4659                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
4660                 default:   uv = va_arg(*args, unsigned); break;
4661                 case 'l':  uv = va_arg(*args, unsigned long); break;
4662                 case 'V':  uv = va_arg(*args, UV); break;
4663                 }
4664             }
4665             else {
4666                 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4667                 switch (intsize) {
4668                 case 'h':       uv = (unsigned short)uv; break;
4669                 default:        uv = (unsigned)uv; break;
4670                 case 'l':       uv = (unsigned long)uv; break;
4671                 case 'V':       break;
4672                 }
4673             }
4674
4675         integer:
4676             eptr = ebuf + sizeof ebuf;
4677             switch (base) {
4678                 unsigned dig;
4679             case 16:
4680                 if (!uv)
4681                     alt = FALSE;
4682                 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4683                 do {
4684                     dig = uv & 15;
4685                     *--eptr = p[dig];
4686                 } while (uv >>= 4);
4687                 if (alt) {
4688                     esignbuf[esignlen++] = '0';
4689                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
4690                 }
4691                 break;
4692             case 8:
4693                 do {
4694                     dig = uv & 7;
4695                     *--eptr = '0' + dig;
4696                 } while (uv >>= 3);
4697                 if (alt && *eptr != '0')
4698                     *--eptr = '0';
4699                 break;
4700             case 2:
4701                 do {
4702                     dig = uv & 1;
4703                     *--eptr = '0' + dig;
4704                 } while (uv >>= 1);
4705                 if (alt && *eptr != '0')
4706                     *--eptr = '0';
4707                 break;
4708             default:            /* it had better be ten or less */
4709                 do {
4710                     dig = uv % base;
4711                     *--eptr = '0' + dig;
4712                 } while (uv /= base);
4713                 break;
4714             }
4715             elen = (ebuf + sizeof ebuf) - eptr;
4716             if (has_precis) {
4717                 if (precis > elen)
4718                     zeros = precis - elen;
4719                 else if (precis == 0 && elen == 1 && *eptr == '0')
4720                     elen = 0;
4721             }
4722             break;
4723
4724             /* FLOATING POINT */
4725
4726         case 'F':
4727             c = 'f';            /* maybe %F isn't supported here */
4728             /* FALL THROUGH */
4729         case 'e': case 'E':
4730         case 'f':
4731         case 'g': case 'G':
4732
4733             /* This is evil, but floating point is even more evil */
4734
4735             if (args)
4736                 nv = va_arg(*args, double);
4737             else
4738                 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
4739
4740             need = 0;
4741             if (c != 'e' && c != 'E') {
4742                 i = PERL_INT_MIN;
4743                 (void)frexp(nv, &i);
4744                 if (i == PERL_INT_MIN)
4745                     die("panic: frexp");
4746                 if (i > 0)
4747                     need = BIT_DIGITS(i);
4748             }
4749             need += has_precis ? precis : 6; /* known default */
4750             if (need < width)
4751                 need = width;
4752
4753             need += 20; /* fudge factor */
4754             if (PL_efloatsize < need) {
4755                 Safefree(PL_efloatbuf);
4756                 PL_efloatsize = need + 20; /* more fudge */
4757                 New(906, PL_efloatbuf, PL_efloatsize, char);
4758             }
4759
4760             eptr = ebuf + sizeof ebuf;
4761             *--eptr = '\0';
4762             *--eptr = c;
4763             if (has_precis) {
4764                 base = precis;
4765                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4766                 *--eptr = '.';
4767             }
4768             if (width) {
4769                 base = width;
4770                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4771             }
4772             if (fill == '0')
4773                 *--eptr = fill;
4774             if (left)
4775                 *--eptr = '-';
4776             if (plus)
4777                 *--eptr = plus;
4778             if (alt)
4779                 *--eptr = '#';
4780             *--eptr = '%';
4781
4782             (void)sprintf(PL_efloatbuf, eptr, nv);
4783
4784             eptr = PL_efloatbuf;
4785             elen = strlen(PL_efloatbuf);
4786
4787 #ifdef LC_NUMERIC
4788             /*
4789              * User-defined locales may include arbitrary characters.
4790              * And, unfortunately, some system may alloc the "C" locale
4791              * to be overridden by a malicious user.
4792              */
4793             if (used_locale)
4794                 *used_locale = TRUE;
4795 #endif /* LC_NUMERIC */
4796
4797             break;
4798
4799             /* SPECIAL */
4800
4801         case 'n':
4802             i = SvCUR(sv) - origlen;
4803             if (args) {
4804                 switch (intsize) {
4805                 case 'h':       *(va_arg(*args, short*)) = i; break;
4806                 default:        *(va_arg(*args, int*)) = i; break;
4807                 case 'l':       *(va_arg(*args, long*)) = i; break;
4808                 case 'V':       *(va_arg(*args, IV*)) = i; break;
4809                 }
4810             }
4811             else if (svix < svmax)
4812                 sv_setuv(svargs[svix++], (UV)i);
4813             continue;   /* not "break" */
4814
4815             /* UNKNOWN */
4816
4817         default:
4818       unknown:
4819             if (!args && ckWARN(WARN_PRINTF) &&
4820                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
4821                 SV *msg = sv_newmortal();
4822                 sv_setpvf(msg, "Invalid conversion in %s: ",
4823                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
4824                 if (c)
4825                     sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
4826                               c & 0xFF);
4827                 else
4828                     sv_catpv(msg, "end of string");
4829                 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
4830             }
4831
4832             /* output mangled stuff ... */
4833             if (c == '\0')
4834                 --q;
4835             eptr = p;
4836             elen = q - p;
4837
4838             /* ... right here, because formatting flags should not apply */
4839             SvGROW(sv, SvCUR(sv) + elen + 1);
4840             p = SvEND(sv);
4841             memcpy(p, eptr, elen);
4842             p += elen;
4843             *p = '\0';
4844             SvCUR(sv) = p - SvPVX(sv);
4845             continue;   /* not "break" */
4846         }
4847
4848         have = esignlen + zeros + elen;
4849         need = (have > width ? have : width);
4850         gap = need - have;
4851
4852         SvGROW(sv, SvCUR(sv) + need + 1);
4853         p = SvEND(sv);
4854         if (esignlen && fill == '0') {
4855             for (i = 0; i < esignlen; i++)
4856                 *p++ = esignbuf[i];
4857         }
4858         if (gap && !left) {
4859             memset(p, fill, gap);
4860             p += gap;
4861         }
4862         if (esignlen && fill != '0') {
4863             for (i = 0; i < esignlen; i++)
4864                 *p++ = esignbuf[i];
4865         }
4866         if (zeros) {
4867             for (i = zeros; i; i--)
4868                 *p++ = '0';
4869         }
4870         if (elen) {
4871             memcpy(p, eptr, elen);
4872             p += elen;
4873         }
4874         if (gap && left) {
4875             memset(p, ' ', gap);
4876             p += gap;
4877         }
4878         *p = '\0';
4879         SvCUR(sv) = p - SvPVX(sv);
4880     }
4881 }