This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
545a9d5fdc8106d89d60c39cb9f1f452cf7f946a
[perl5.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(register SV *sv, STRLEN *lp)
1511 {
1512     register char *s;
1513     int olderrno;
1514     SV *tsv;
1515     char tmpbuf[64];    /* Must fit sprintf/Gconvert of longest IV/NV */
1516
1517     if (!sv) {
1518         *lp = 0;
1519         return "";
1520     }
1521     if (SvGMAGICAL(sv)) {
1522         mg_get(sv);
1523         if (SvPOKp(sv)) {
1524             *lp = SvCUR(sv);
1525             return SvPVX(sv);
1526         }
1527         if (SvIOKp(sv)) {
1528             (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
1529             tsv = Nullsv;
1530             goto tokensave;
1531         }
1532         if (SvNOKp(sv)) {
1533             SET_NUMERIC_STANDARD();
1534             Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1535             tsv = Nullsv;
1536             goto tokensave;
1537         }
1538         if (!SvROK(sv)) {
1539             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1540                 dTHR;
1541                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1542                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1543             }
1544             *lp = 0;
1545             return "";
1546         }
1547     }
1548     if (SvTHINKFIRST(sv)) {
1549         if (SvROK(sv)) {
1550             SV* tmpstr;
1551             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
1552                 return SvPV(tmpstr,*lp);
1553             sv = (SV*)SvRV(sv);
1554             if (!sv)
1555                 s = "NULLREF";
1556             else {
1557                 MAGIC *mg;
1558                 
1559                 switch (SvTYPE(sv)) {
1560                 case SVt_PVMG:
1561                     if ( ((SvFLAGS(sv) &
1562                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG)) 
1563                           == (SVs_OBJECT|SVs_RMG))
1564                          && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
1565                          && (mg = mg_find(sv, 'r'))) {
1566                         dTHR;
1567                         regexp *re = (regexp *)mg->mg_obj;
1568
1569                         if (!mg->mg_ptr) {
1570                             char *fptr = "msix";
1571                             char reflags[6];
1572                             char ch;
1573                             int left = 0;
1574                             int right = 4;
1575                             U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1576
1577                             while(ch = *fptr++) {
1578                                 if(reganch & 1) {
1579                                     reflags[left++] = ch;
1580                                 }
1581                                 else {
1582                                     reflags[right--] = ch;
1583                                 }
1584                                 reganch >>= 1;
1585                             }
1586                             if(left != 4) {
1587                                 reflags[left] = '-';
1588                                 left = 5;
1589                             }
1590
1591                             mg->mg_len = re->prelen + 4 + left;
1592                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1593                             Copy("(?", mg->mg_ptr, 2, char);
1594                             Copy(reflags, mg->mg_ptr+2, left, char);
1595                             Copy(":", mg->mg_ptr+left+2, 1, char);
1596                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1597                             mg->mg_ptr[mg->mg_len - 1] = ')';
1598                             mg->mg_ptr[mg->mg_len] = 0;
1599                         }
1600                         PL_reginterp_cnt += re->program[0].next_off;
1601                         *lp = mg->mg_len;
1602                         return mg->mg_ptr;
1603                     }
1604                                         /* Fall through */
1605                 case SVt_NULL:
1606                 case SVt_IV:
1607                 case SVt_NV:
1608                 case SVt_RV:
1609                 case SVt_PV:
1610                 case SVt_PVIV:
1611                 case SVt_PVNV:
1612                 case SVt_PVBM:  s = "SCALAR";                   break;
1613                 case SVt_PVLV:  s = "LVALUE";                   break;
1614                 case SVt_PVAV:  s = "ARRAY";                    break;
1615                 case SVt_PVHV:  s = "HASH";                     break;
1616                 case SVt_PVCV:  s = "CODE";                     break;
1617                 case SVt_PVGV:  s = "GLOB";                     break;
1618                 case SVt_PVFM:  s = "FORMAT";                   break;
1619                 case SVt_PVIO:  s = "IO";                       break;
1620                 default:        s = "UNKNOWN";                  break;
1621                 }
1622                 tsv = NEWSV(0,0);
1623                 if (SvOBJECT(sv))
1624                     sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
1625                 else
1626                     sv_setpv(tsv, s);
1627                 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
1628                 goto tokensaveref;
1629             }
1630             *lp = strlen(s);
1631             return s;
1632         }
1633         if (SvREADONLY(sv)) {
1634             if (SvNOKp(sv)) {
1635                 SET_NUMERIC_STANDARD();
1636                 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1637                 tsv = Nullsv;
1638                 goto tokensave;
1639             }
1640             if (SvIOKp(sv)) {
1641                 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
1642                 tsv = Nullsv;
1643                 goto tokensave;
1644             }
1645             {
1646                 dTHR;
1647                 if (ckWARN(WARN_UNINITIALIZED))
1648                     warner(WARN_UNINITIALIZED, PL_warn_uninit);
1649             }
1650             *lp = 0;
1651             return "";
1652         }
1653     }
1654     (void)SvUPGRADE(sv, SVt_PV);
1655     if (SvNOKp(sv)) {
1656         if (SvTYPE(sv) < SVt_PVNV)
1657             sv_upgrade(sv, SVt_PVNV);
1658         SvGROW(sv, 28);
1659         s = SvPVX(sv);
1660         olderrno = errno;       /* some Xenix systems wipe out errno here */
1661 #ifdef apollo
1662         if (SvNVX(sv) == 0.0)
1663             (void)strcpy(s,"0");
1664         else
1665 #endif /*apollo*/
1666         {
1667             SET_NUMERIC_STANDARD();
1668             Gconvert(SvNVX(sv), DBL_DIG, 0, s);
1669         }
1670         errno = olderrno;
1671 #ifdef FIXNEGATIVEZERO
1672         if (*s == '-' && s[1] == '0' && !s[2])
1673             strcpy(s,"0");
1674 #endif
1675         while (*s) s++;
1676 #ifdef hcx
1677         if (s[-1] == '.')
1678             *--s = '\0';
1679 #endif
1680     }
1681     else if (SvIOKp(sv)) {
1682         U32 oldIOK = SvIOK(sv);
1683         if (SvTYPE(sv) < SVt_PVIV)
1684             sv_upgrade(sv, SVt_PVIV);
1685         olderrno = errno;       /* some Xenix systems wipe out errno here */
1686         sv_setpviv(sv, SvIVX(sv));
1687         errno = olderrno;
1688         s = SvEND(sv);
1689         if (oldIOK)
1690             SvIOK_on(sv);
1691         else
1692             SvIOKp_on(sv);
1693     }
1694     else {
1695         dTHR;
1696         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1697             warner(WARN_UNINITIALIZED, PL_warn_uninit);
1698         *lp = 0;
1699         return "";
1700     }
1701     *lp = s - SvPVX(sv);
1702     SvCUR_set(sv, *lp);
1703     SvPOK_on(sv);
1704     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
1705     return SvPVX(sv);
1706
1707   tokensave:
1708     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
1709         /* Sneaky stuff here */
1710
1711       tokensaveref:
1712         if (!tsv)
1713             tsv = newSVpv(tmpbuf, 0);
1714         sv_2mortal(tsv);
1715         *lp = SvCUR(tsv);
1716         return SvPVX(tsv);
1717     }
1718     else {
1719         STRLEN len;
1720         char *t;
1721
1722         if (tsv) {
1723             sv_2mortal(tsv);
1724             t = SvPVX(tsv);
1725             len = SvCUR(tsv);
1726         }
1727         else {
1728             t = tmpbuf;
1729             len = strlen(tmpbuf);
1730         }
1731 #ifdef FIXNEGATIVEZERO
1732         if (len == 2 && t[0] == '-' && t[1] == '0') {
1733             t = "0";
1734             len = 1;
1735         }
1736 #endif
1737         (void)SvUPGRADE(sv, SVt_PV);
1738         *lp = len;
1739         s = SvGROW(sv, len + 1);
1740         SvCUR_set(sv, len);
1741         (void)strcpy(s, t);
1742         SvPOKp_on(sv);
1743         return s;
1744     }
1745 }
1746
1747 /* This function is only called on magical items */
1748 bool
1749 sv_2bool(register SV *sv)
1750 {
1751     if (SvGMAGICAL(sv))
1752         mg_get(sv);
1753
1754     if (!SvOK(sv))
1755         return 0;
1756     if (SvROK(sv)) {
1757         dTHR;
1758         SV* tmpsv;
1759         if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
1760             return SvTRUE(tmpsv);
1761       return SvRV(sv) != 0;
1762     }
1763     if (SvPOKp(sv)) {
1764         register XPV* Xpvtmp;
1765         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
1766                 (*Xpvtmp->xpv_pv > '0' ||
1767                 Xpvtmp->xpv_cur > 1 ||
1768                 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
1769             return 1;
1770         else
1771             return 0;
1772     }
1773     else {
1774         if (SvIOKp(sv))
1775             return SvIVX(sv) != 0;
1776         else {
1777             if (SvNOKp(sv))
1778                 return SvNVX(sv) != 0.0;
1779             else
1780                 return FALSE;
1781         }
1782     }
1783 }
1784
1785 /* Note: sv_setsv() should not be called with a source string that needs
1786  * to be reused, since it may destroy the source string if it is marked
1787  * as temporary.
1788  */
1789
1790 void
1791 sv_setsv(SV *dstr, register SV *sstr)
1792 {
1793     dTHR;
1794     register U32 sflags;
1795     register int dtype;
1796     register int stype;
1797
1798     if (sstr == dstr)
1799         return;
1800     SV_CHECK_THINKFIRST(dstr);
1801     if (!sstr)
1802         sstr = &PL_sv_undef;
1803     stype = SvTYPE(sstr);
1804     dtype = SvTYPE(dstr);
1805
1806     if (dtype == SVt_PVGV && (SvFLAGS(dstr) & SVf_FAKE)) {
1807         sv_unglob(dstr);     /* so fake GLOB won't perpetuate */
1808         sv_setpvn(dstr, "", 0);
1809         (void)SvPOK_only(dstr);
1810         dtype = SvTYPE(dstr);
1811     }
1812
1813     SvAMAGIC_off(dstr);
1814
1815     /* There's a lot of redundancy below but we're going for speed here */
1816
1817     switch (stype) {
1818     case SVt_NULL:
1819       undef_sstr:
1820         if (dtype != SVt_PVGV) {
1821             (void)SvOK_off(dstr);
1822             return;
1823         }
1824         break;
1825     case SVt_IV:
1826         if (SvIOK(sstr)) {
1827             switch (dtype) {
1828             case SVt_NULL:
1829                 sv_upgrade(dstr, SVt_IV);
1830                 break;
1831             case SVt_NV:
1832                 sv_upgrade(dstr, SVt_PVNV);
1833                 break;
1834             case SVt_RV:
1835             case SVt_PV:
1836                 sv_upgrade(dstr, SVt_PVIV);
1837                 break;
1838             }
1839             (void)SvIOK_only(dstr);
1840             SvIVX(dstr) = SvIVX(sstr);
1841             SvTAINT(dstr);
1842             return;
1843         }
1844         goto undef_sstr;
1845
1846     case SVt_NV:
1847         if (SvNOK(sstr)) {
1848             switch (dtype) {
1849             case SVt_NULL:
1850             case SVt_IV:
1851                 sv_upgrade(dstr, SVt_NV);
1852                 break;
1853             case SVt_RV:
1854             case SVt_PV:
1855             case SVt_PVIV:
1856                 sv_upgrade(dstr, SVt_PVNV);
1857                 break;
1858             }
1859             SvNVX(dstr) = SvNVX(sstr);
1860             (void)SvNOK_only(dstr);
1861             SvTAINT(dstr);
1862             return;
1863         }
1864         goto undef_sstr;
1865
1866     case SVt_RV:
1867         if (dtype < SVt_RV)
1868             sv_upgrade(dstr, SVt_RV);
1869         else if (dtype == SVt_PVGV &&
1870                  SvTYPE(SvRV(sstr)) == SVt_PVGV) {
1871             sstr = SvRV(sstr);
1872             if (sstr == dstr) {
1873                 if (PL_curcop->cop_stash != GvSTASH(dstr))
1874                     GvIMPORTED_on(dstr);
1875                 GvMULTI_on(dstr);
1876                 return;
1877             }
1878             goto glob_assign;
1879         }
1880         break;
1881     case SVt_PV:
1882     case SVt_PVFM:
1883         if (dtype < SVt_PV)
1884             sv_upgrade(dstr, SVt_PV);
1885         break;
1886     case SVt_PVIV:
1887         if (dtype < SVt_PVIV)
1888             sv_upgrade(dstr, SVt_PVIV);
1889         break;
1890     case SVt_PVNV:
1891         if (dtype < SVt_PVNV)
1892             sv_upgrade(dstr, SVt_PVNV);
1893         break;
1894     case SVt_PVAV:
1895     case SVt_PVHV:
1896     case SVt_PVCV:
1897     case SVt_PVIO:
1898         if (PL_op)
1899             croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
1900                 PL_op_name[PL_op->op_type]);
1901         else
1902             croak("Bizarre copy of %s", sv_reftype(sstr, 0));
1903         break;
1904
1905     case SVt_PVGV:
1906         if (dtype <= SVt_PVGV) {
1907   glob_assign:
1908             if (dtype != SVt_PVGV) {
1909                 char *name = GvNAME(sstr);
1910                 STRLEN len = GvNAMELEN(sstr);
1911                 sv_upgrade(dstr, SVt_PVGV);
1912                 sv_magic(dstr, dstr, '*', name, len);
1913                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
1914                 GvNAME(dstr) = savepvn(name, len);
1915                 GvNAMELEN(dstr) = len;
1916                 SvFAKE_on(dstr);        /* can coerce to non-glob */
1917             }
1918             /* ahem, death to those who redefine active sort subs */
1919             else if (PL_curstackinfo->si_type == PERLSI_SORT
1920                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
1921                 croak("Can't redefine active sort subroutine %s",
1922                       GvNAME(dstr));
1923             (void)SvOK_off(dstr);
1924             GvINTRO_off(dstr);          /* one-shot flag */
1925             gp_free((GV*)dstr);
1926             GvGP(dstr) = gp_ref(GvGP(sstr));
1927             SvTAINT(dstr);
1928             if (PL_curcop->cop_stash != GvSTASH(dstr))
1929                 GvIMPORTED_on(dstr);
1930             GvMULTI_on(dstr);
1931             return;
1932         }
1933         /* FALL THROUGH */
1934
1935     default:
1936         if (SvGMAGICAL(sstr)) {
1937             mg_get(sstr);
1938             if (SvTYPE(sstr) != stype) {
1939                 stype = SvTYPE(sstr);
1940                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
1941                     goto glob_assign;
1942             }
1943         }
1944         if (stype == SVt_PVLV)
1945             SvUPGRADE(dstr, SVt_PVNV);
1946         else
1947             SvUPGRADE(dstr, stype);
1948     }
1949
1950     sflags = SvFLAGS(sstr);
1951
1952     if (sflags & SVf_ROK) {
1953         if (dtype >= SVt_PV) {
1954             if (dtype == SVt_PVGV) {
1955                 SV *sref = SvREFCNT_inc(SvRV(sstr));
1956                 SV *dref = 0;
1957                 int intro = GvINTRO(dstr);
1958
1959                 if (intro) {
1960                     GP *gp;
1961                     GvGP(dstr)->gp_refcnt--;
1962                     GvINTRO_off(dstr);  /* one-shot flag */
1963                     Newz(602,gp, 1, GP);
1964                     GvGP(dstr) = gp_ref(gp);
1965                     GvSV(dstr) = NEWSV(72,0);
1966                     GvLINE(dstr) = PL_curcop->cop_line;
1967                     GvEGV(dstr) = (GV*)dstr;
1968                 }
1969                 GvMULTI_on(dstr);
1970                 switch (SvTYPE(sref)) {
1971                 case SVt_PVAV:
1972                     if (intro)
1973                         SAVESPTR(GvAV(dstr));
1974                     else
1975                         dref = (SV*)GvAV(dstr);
1976                     GvAV(dstr) = (AV*)sref;
1977                     if (PL_curcop->cop_stash != GvSTASH(dstr))
1978                         GvIMPORTED_AV_on(dstr);
1979                     break;
1980                 case SVt_PVHV:
1981                     if (intro)
1982                         SAVESPTR(GvHV(dstr));
1983                     else
1984                         dref = (SV*)GvHV(dstr);
1985                     GvHV(dstr) = (HV*)sref;
1986                     if (PL_curcop->cop_stash != GvSTASH(dstr))
1987                         GvIMPORTED_HV_on(dstr);
1988                     break;
1989                 case SVt_PVCV:
1990                     if (intro) {
1991                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
1992                             SvREFCNT_dec(GvCV(dstr));
1993                             GvCV(dstr) = Nullcv;
1994                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
1995                             PL_sub_generation++;
1996                         }
1997                         SAVESPTR(GvCV(dstr));
1998                     }
1999                     else
2000                         dref = (SV*)GvCV(dstr);
2001                     if (GvCV(dstr) != (CV*)sref) {
2002                         CV* cv = GvCV(dstr);
2003                         if (cv) {
2004                             if (!GvCVGEN((GV*)dstr) &&
2005                                 (CvROOT(cv) || CvXSUB(cv)))
2006                             {
2007                                 SV *const_sv = cv_const_sv(cv);
2008                                 bool const_changed = TRUE; 
2009                                 if(const_sv)
2010                                     const_changed = sv_cmp(const_sv, 
2011                                            op_const_sv(CvSTART((CV*)sref), 
2012                                                        Nullcv));
2013                                 /* ahem, death to those who redefine
2014                                  * active sort subs */
2015                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2016                                       PL_sortcop == CvSTART(cv))
2017                                     croak(
2018                                     "Can't redefine active sort subroutine %s",
2019                                           GvENAME((GV*)dstr));
2020                                 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2021                                     if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2022                                           && HvNAME(GvSTASH(CvGV(cv)))
2023                                           && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2024                                                    "autouse")))
2025                                         warner(WARN_REDEFINE, const_sv ? 
2026                                              "Constant subroutine %s redefined"
2027                                              : "Subroutine %s redefined", 
2028                                              GvENAME((GV*)dstr));
2029                                 }
2030                             }
2031                             cv_ckproto(cv, (GV*)dstr,
2032                                        SvPOK(sref) ? SvPVX(sref) : Nullch);
2033                         }
2034                         GvCV(dstr) = (CV*)sref;
2035                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2036                         GvASSUMECV_on(dstr);
2037                         PL_sub_generation++;
2038                     }
2039                     if (PL_curcop->cop_stash != GvSTASH(dstr))
2040                         GvIMPORTED_CV_on(dstr);
2041                     break;
2042                 case SVt_PVIO:
2043                     if (intro)
2044                         SAVESPTR(GvIOp(dstr));
2045                     else
2046                         dref = (SV*)GvIOp(dstr);
2047                     GvIOp(dstr) = (IO*)sref;
2048                     break;
2049                 default:
2050                     if (intro)
2051                         SAVESPTR(GvSV(dstr));
2052                     else
2053                         dref = (SV*)GvSV(dstr);
2054                     GvSV(dstr) = sref;
2055                     if (PL_curcop->cop_stash != GvSTASH(dstr))
2056                         GvIMPORTED_SV_on(dstr);
2057                     break;
2058                 }
2059                 if (dref)
2060                     SvREFCNT_dec(dref);
2061                 if (intro)
2062                     SAVEFREESV(sref);
2063                 SvTAINT(dstr);
2064                 return;
2065             }
2066             if (SvPVX(dstr)) {
2067                 (void)SvOOK_off(dstr);          /* backoff */
2068                 Safefree(SvPVX(dstr));
2069                 SvLEN(dstr)=SvCUR(dstr)=0;
2070             }
2071         }
2072         (void)SvOK_off(dstr);
2073         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
2074         SvROK_on(dstr);
2075         if (sflags & SVp_NOK) {
2076             SvNOK_on(dstr);
2077             SvNVX(dstr) = SvNVX(sstr);
2078         }
2079         if (sflags & SVp_IOK) {
2080             (void)SvIOK_on(dstr);
2081             SvIVX(dstr) = SvIVX(sstr);
2082         }
2083         if (SvAMAGIC(sstr)) {
2084             SvAMAGIC_on(dstr);
2085         }
2086     }
2087     else if (sflags & SVp_POK) {
2088
2089         /*
2090          * Check to see if we can just swipe the string.  If so, it's a
2091          * possible small lose on short strings, but a big win on long ones.
2092          * It might even be a win on short strings if SvPVX(dstr)
2093          * has to be allocated and SvPVX(sstr) has to be freed.
2094          */
2095
2096         if (SvTEMP(sstr) &&             /* slated for free anyway? */
2097             SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
2098             !(sflags & SVf_OOK))        /* and not involved in OOK hack? */
2099         {
2100             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
2101                 if (SvOOK(dstr)) {
2102                     SvFLAGS(dstr) &= ~SVf_OOK;
2103                     Safefree(SvPVX(dstr) - SvIVX(dstr));
2104                 }
2105                 else
2106                     Safefree(SvPVX(dstr));
2107             }
2108             (void)SvPOK_only(dstr);
2109             SvPV_set(dstr, SvPVX(sstr));
2110             SvLEN_set(dstr, SvLEN(sstr));
2111             SvCUR_set(dstr, SvCUR(sstr));
2112             SvTEMP_off(dstr);
2113             (void)SvOK_off(sstr);
2114             SvPV_set(sstr, Nullch);
2115             SvLEN_set(sstr, 0);
2116             SvCUR_set(sstr, 0);
2117             SvTEMP_off(sstr);
2118         }
2119         else {                                  /* have to copy actual string */
2120             STRLEN len = SvCUR(sstr);
2121
2122             SvGROW(dstr, len + 1);              /* inlined from sv_setpvn */
2123             Move(SvPVX(sstr),SvPVX(dstr),len,char);
2124             SvCUR_set(dstr, len);
2125             *SvEND(dstr) = '\0';
2126             (void)SvPOK_only(dstr);
2127         }
2128         /*SUPPRESS 560*/
2129         if (sflags & SVp_NOK) {
2130             SvNOK_on(dstr);
2131             SvNVX(dstr) = SvNVX(sstr);
2132         }
2133         if (sflags & SVp_IOK) {
2134             (void)SvIOK_on(dstr);
2135             SvIVX(dstr) = SvIVX(sstr);
2136         }
2137     }
2138     else if (sflags & SVp_NOK) {
2139         SvNVX(dstr) = SvNVX(sstr);
2140         (void)SvNOK_only(dstr);
2141         if (SvIOK(sstr)) {
2142             (void)SvIOK_on(dstr);
2143             SvIVX(dstr) = SvIVX(sstr);
2144         }
2145     }
2146     else if (sflags & SVp_IOK) {
2147         (void)SvIOK_only(dstr);
2148         SvIVX(dstr) = SvIVX(sstr);
2149     }
2150     else {
2151         if (dtype == SVt_PVGV) {
2152             if (ckWARN(WARN_UNSAFE))
2153                 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
2154         }
2155         else
2156             (void)SvOK_off(dstr);
2157     }
2158     SvTAINT(dstr);
2159 }
2160
2161 void
2162 sv_setsv_mg(SV *dstr, register SV *sstr)
2163 {
2164     sv_setsv(dstr,sstr);
2165     SvSETMAGIC(dstr);
2166 }
2167
2168 void
2169 sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
2170 {
2171     register char *dptr;
2172     assert(len >= 0);  /* STRLEN is probably unsigned, so this may
2173                           elicit a warning, but it won't hurt. */
2174     SV_CHECK_THINKFIRST(sv);
2175     if (!ptr) {
2176         (void)SvOK_off(sv);
2177         return;
2178     }
2179     if (SvTYPE(sv) >= SVt_PV) {
2180         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2181             sv_unglob(sv);
2182     }
2183     else
2184         sv_upgrade(sv, SVt_PV);
2185
2186     SvGROW(sv, len + 1);
2187     dptr = SvPVX(sv);
2188     Move(ptr,dptr,len,char);
2189     dptr[len] = '\0';
2190     SvCUR_set(sv, len);
2191     (void)SvPOK_only(sv);               /* validate pointer */
2192     SvTAINT(sv);
2193 }
2194
2195 void
2196 sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2197 {
2198     sv_setpvn(sv,ptr,len);
2199     SvSETMAGIC(sv);
2200 }
2201
2202 void
2203 sv_setpv(register SV *sv, register const char *ptr)
2204 {
2205     register STRLEN len;
2206
2207     SV_CHECK_THINKFIRST(sv);
2208     if (!ptr) {
2209         (void)SvOK_off(sv);
2210         return;
2211     }
2212     len = strlen(ptr);
2213     if (SvTYPE(sv) >= SVt_PV) {
2214         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2215             sv_unglob(sv);
2216     }
2217     else 
2218         sv_upgrade(sv, SVt_PV);
2219
2220     SvGROW(sv, len + 1);
2221     Move(ptr,SvPVX(sv),len+1,char);
2222     SvCUR_set(sv, len);
2223     (void)SvPOK_only(sv);               /* validate pointer */
2224     SvTAINT(sv);
2225 }
2226
2227 void
2228 sv_setpv_mg(register SV *sv, register const char *ptr)
2229 {
2230     sv_setpv(sv,ptr);
2231     SvSETMAGIC(sv);
2232 }
2233
2234 void
2235 sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
2236 {
2237     SV_CHECK_THINKFIRST(sv);
2238     (void)SvUPGRADE(sv, SVt_PV);
2239     if (!ptr) {
2240         (void)SvOK_off(sv);
2241         return;
2242     }
2243     (void)SvOOK_off(sv);
2244     if (SvPVX(sv))
2245         Safefree(SvPVX(sv));
2246     Renew(ptr, len+1, char);
2247     SvPVX(sv) = ptr;
2248     SvCUR_set(sv, len);
2249     SvLEN_set(sv, len+1);
2250     *SvEND(sv) = '\0';
2251     (void)SvPOK_only(sv);               /* validate pointer */
2252     SvTAINT(sv);
2253 }
2254
2255 void
2256 sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2257 {
2258     sv_usepvn(sv,ptr,len);
2259     SvSETMAGIC(sv);
2260 }
2261
2262 STATIC void
2263 sv_check_thinkfirst(register SV *sv)
2264 {
2265     if (SvREADONLY(sv)) {
2266         dTHR;
2267         if (PL_curcop != &PL_compiling)
2268             croak(PL_no_modify);
2269     }
2270     if (SvROK(sv))
2271         sv_unref(sv);
2272 }
2273     
2274 void
2275 sv_chop(register SV *sv, register char *ptr)    /* like set but assuming ptr is in sv */
2276                 
2277                    
2278 {
2279     register STRLEN delta;
2280
2281     if (!ptr || !SvPOKp(sv))
2282         return;
2283     SV_CHECK_THINKFIRST(sv);
2284     if (SvTYPE(sv) < SVt_PVIV)
2285         sv_upgrade(sv,SVt_PVIV);
2286
2287     if (!SvOOK(sv)) {
2288         SvIVX(sv) = 0;
2289         SvFLAGS(sv) |= SVf_OOK;
2290     }
2291     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
2292     delta = ptr - SvPVX(sv);
2293     SvLEN(sv) -= delta;
2294     SvCUR(sv) -= delta;
2295     SvPVX(sv) += delta;
2296     SvIVX(sv) += delta;
2297 }
2298
2299 void
2300 sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
2301 {
2302     STRLEN tlen;
2303     char *junk;
2304
2305     junk = SvPV_force(sv, tlen);
2306     SvGROW(sv, tlen + len + 1);
2307     if (ptr == junk)
2308         ptr = SvPVX(sv);
2309     Move(ptr,SvPVX(sv)+tlen,len,char);
2310     SvCUR(sv) += len;
2311     *SvEND(sv) = '\0';
2312     (void)SvPOK_only(sv);               /* validate pointer */
2313     SvTAINT(sv);
2314 }
2315
2316 void
2317 sv_catpvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2318 {
2319     sv_catpvn(sv,ptr,len);
2320     SvSETMAGIC(sv);
2321 }
2322
2323 void
2324 sv_catsv(SV *dstr, register SV *sstr)
2325 {
2326     char *s;
2327     STRLEN len;
2328     if (!sstr)
2329         return;
2330     if (s = SvPV(sstr, len))
2331         sv_catpvn(dstr,s,len);
2332 }
2333
2334 void
2335 sv_catsv_mg(SV *dstr, register SV *sstr)
2336 {
2337     sv_catsv(dstr,sstr);
2338     SvSETMAGIC(dstr);
2339 }
2340
2341 void
2342 sv_catpv(register SV *sv, register char *ptr)
2343 {
2344     register STRLEN len;
2345     STRLEN tlen;
2346     char *junk;
2347
2348     if (!ptr)
2349         return;
2350     junk = SvPV_force(sv, tlen);
2351     len = strlen(ptr);
2352     SvGROW(sv, tlen + len + 1);
2353     if (ptr == junk)
2354         ptr = SvPVX(sv);
2355     Move(ptr,SvPVX(sv)+tlen,len+1,char);
2356     SvCUR(sv) += len;
2357     (void)SvPOK_only(sv);               /* validate pointer */
2358     SvTAINT(sv);
2359 }
2360
2361 void
2362 sv_catpv_mg(register SV *sv, register char *ptr)
2363 {
2364     sv_catpv(sv,ptr);
2365     SvSETMAGIC(sv);
2366 }
2367
2368 SV *
2369 newSV(STRLEN len)
2370 {
2371     register SV *sv;
2372     
2373     new_SV(sv);
2374     SvANY(sv) = 0;
2375     SvREFCNT(sv) = 1;
2376     SvFLAGS(sv) = 0;
2377     if (len) {
2378         sv_upgrade(sv, SVt_PV);
2379         SvGROW(sv, len + 1);
2380     }
2381     return sv;
2382 }
2383
2384 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2385
2386 void
2387 sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
2388 {
2389     MAGIC* mg;
2390     
2391     if (SvREADONLY(sv)) {
2392         dTHR;
2393         if (PL_curcop != &PL_compiling && !strchr("gBf", how))
2394             croak(PL_no_modify);
2395     }
2396     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
2397         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2398             if (how == 't')
2399                 mg->mg_len |= 1;
2400             return;
2401         }
2402     }
2403     else {
2404         (void)SvUPGRADE(sv, SVt_PVMG);
2405     }
2406     Newz(702,mg, 1, MAGIC);
2407     mg->mg_moremagic = SvMAGIC(sv);
2408
2409     SvMAGIC(sv) = mg;
2410     if (!obj || obj == sv || how == '#' || how == 'r')
2411         mg->mg_obj = obj;
2412     else {
2413         dTHR;
2414         mg->mg_obj = SvREFCNT_inc(obj);
2415         mg->mg_flags |= MGf_REFCOUNTED;
2416     }
2417     mg->mg_type = how;
2418     mg->mg_len = namlen;
2419     if (name)
2420         if (namlen >= 0)
2421             mg->mg_ptr = savepvn(name, namlen);
2422         else if (namlen == HEf_SVKEY)
2423             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2424     
2425     switch (how) {
2426     case 0:
2427         mg->mg_virtual = &PL_vtbl_sv;
2428         break;
2429     case 'A':
2430         mg->mg_virtual = &PL_vtbl_amagic;
2431         break;
2432     case 'a':
2433         mg->mg_virtual = &PL_vtbl_amagicelem;
2434         break;
2435     case 'c':
2436         mg->mg_virtual = 0;
2437         break;
2438     case 'B':
2439         mg->mg_virtual = &PL_vtbl_bm;
2440         break;
2441     case 'D':
2442         mg->mg_virtual = &PL_vtbl_regdata;
2443         break;
2444     case 'd':
2445         mg->mg_virtual = &PL_vtbl_regdatum;
2446         break;
2447     case 'E':
2448         mg->mg_virtual = &PL_vtbl_env;
2449         break;
2450     case 'f':
2451         mg->mg_virtual = &PL_vtbl_fm;
2452         break;
2453     case 'e':
2454         mg->mg_virtual = &PL_vtbl_envelem;
2455         break;
2456     case 'g':
2457         mg->mg_virtual = &PL_vtbl_mglob;
2458         break;
2459     case 'I':
2460         mg->mg_virtual = &PL_vtbl_isa;
2461         break;
2462     case 'i':
2463         mg->mg_virtual = &PL_vtbl_isaelem;
2464         break;
2465     case 'k':
2466         mg->mg_virtual = &PL_vtbl_nkeys;
2467         break;
2468     case 'L':
2469         SvRMAGICAL_on(sv);
2470         mg->mg_virtual = 0;
2471         break;
2472     case 'l':
2473         mg->mg_virtual = &PL_vtbl_dbline;
2474         break;
2475 #ifdef USE_THREADS
2476     case 'm':
2477         mg->mg_virtual = &PL_vtbl_mutex;
2478         break;
2479 #endif /* USE_THREADS */
2480 #ifdef USE_LOCALE_COLLATE
2481     case 'o':
2482         mg->mg_virtual = &PL_vtbl_collxfrm;
2483         break;
2484 #endif /* USE_LOCALE_COLLATE */
2485     case 'P':
2486         mg->mg_virtual = &PL_vtbl_pack;
2487         break;
2488     case 'p':
2489     case 'q':
2490         mg->mg_virtual = &PL_vtbl_packelem;
2491         break;
2492     case 'r':
2493         mg->mg_virtual = &PL_vtbl_regexp;
2494         break;
2495     case 'S':
2496         mg->mg_virtual = &PL_vtbl_sig;
2497         break;
2498     case 's':
2499         mg->mg_virtual = &PL_vtbl_sigelem;
2500         break;
2501     case 't':
2502         mg->mg_virtual = &PL_vtbl_taint;
2503         mg->mg_len = 1;
2504         break;
2505     case 'U':
2506         mg->mg_virtual = &PL_vtbl_uvar;
2507         break;
2508     case 'v':
2509         mg->mg_virtual = &PL_vtbl_vec;
2510         break;
2511     case 'x':
2512         mg->mg_virtual = &PL_vtbl_substr;
2513         break;
2514     case 'y':
2515         mg->mg_virtual = &PL_vtbl_defelem;
2516         break;
2517     case '*':
2518         mg->mg_virtual = &PL_vtbl_glob;
2519         break;
2520     case '#':
2521         mg->mg_virtual = &PL_vtbl_arylen;
2522         break;
2523     case '.':
2524         mg->mg_virtual = &PL_vtbl_pos;
2525         break;
2526     case '~':   /* Reserved for use by extensions not perl internals.   */
2527         /* Useful for attaching extension internal data to perl vars.   */
2528         /* Note that multiple extensions may clash if magical scalars   */
2529         /* etc holding private data from one are passed to another.     */
2530         SvRMAGICAL_on(sv);
2531         break;
2532     default:
2533         croak("Don't know how to handle magic of type '%c'", how);
2534     }
2535     mg_magical(sv);
2536     if (SvGMAGICAL(sv))
2537         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2538 }
2539
2540 int
2541 sv_unmagic(SV *sv, int type)
2542 {
2543     MAGIC* mg;
2544     MAGIC** mgp;
2545     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
2546         return 0;
2547     mgp = &SvMAGIC(sv);
2548     for (mg = *mgp; mg; mg = *mgp) {
2549         if (mg->mg_type == type) {
2550             MGVTBL* vtbl = mg->mg_virtual;
2551             *mgp = mg->mg_moremagic;
2552             if (vtbl && (vtbl->svt_free != NULL))
2553                 (VTBL->svt_free)(sv, mg);
2554             if (mg->mg_ptr && mg->mg_type != 'g')
2555                 if (mg->mg_len >= 0)
2556                     Safefree(mg->mg_ptr);
2557                 else if (mg->mg_len == HEf_SVKEY)
2558                     SvREFCNT_dec((SV*)mg->mg_ptr);
2559             if (mg->mg_flags & MGf_REFCOUNTED)
2560                 SvREFCNT_dec(mg->mg_obj);
2561             Safefree(mg);
2562         }
2563         else
2564             mgp = &mg->mg_moremagic;
2565     }
2566     if (!SvMAGIC(sv)) {
2567         SvMAGICAL_off(sv);
2568         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
2569     }
2570
2571     return 0;
2572 }
2573
2574 void
2575 sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
2576 {
2577     register char *big;
2578     register char *mid;
2579     register char *midend;
2580     register char *bigend;
2581     register I32 i;
2582     STRLEN curlen;
2583     
2584
2585     if (!bigstr)
2586         croak("Can't modify non-existent substring");
2587     SvPV_force(bigstr, curlen);
2588     if (offset + len > curlen) {
2589         SvGROW(bigstr, offset+len+1);
2590         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2591         SvCUR_set(bigstr, offset+len);
2592     }
2593
2594     i = littlelen - len;
2595     if (i > 0) {                        /* string might grow */
2596         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
2597         mid = big + offset + len;
2598         midend = bigend = big + SvCUR(bigstr);
2599         bigend += i;
2600         *bigend = '\0';
2601         while (midend > mid)            /* shove everything down */
2602             *--bigend = *--midend;
2603         Move(little,big+offset,littlelen,char);
2604         SvCUR(bigstr) += i;
2605         SvSETMAGIC(bigstr);
2606         return;
2607     }
2608     else if (i == 0) {
2609         Move(little,SvPVX(bigstr)+offset,len,char);
2610         SvSETMAGIC(bigstr);
2611         return;
2612     }
2613
2614     big = SvPVX(bigstr);
2615     mid = big + offset;
2616     midend = mid + len;
2617     bigend = big + SvCUR(bigstr);
2618
2619     if (midend > bigend)
2620         croak("panic: sv_insert");
2621
2622     if (mid - big > bigend - midend) {  /* faster to shorten from end */
2623         if (littlelen) {
2624             Move(little, mid, littlelen,char);
2625             mid += littlelen;
2626         }
2627         i = bigend - midend;
2628         if (i > 0) {
2629             Move(midend, mid, i,char);
2630             mid += i;
2631         }
2632         *mid = '\0';
2633         SvCUR_set(bigstr, mid - big);
2634     }
2635     /*SUPPRESS 560*/
2636     else if (i = mid - big) {   /* faster from front */
2637         midend -= littlelen;
2638         mid = midend;
2639         sv_chop(bigstr,midend-i);
2640         big += i;
2641         while (i--)
2642             *--midend = *--big;
2643         if (littlelen)
2644             Move(little, mid, littlelen,char);
2645     }
2646     else if (littlelen) {
2647         midend -= littlelen;
2648         sv_chop(bigstr,midend);
2649         Move(little,midend,littlelen,char);
2650     }
2651     else {
2652         sv_chop(bigstr,midend);
2653     }
2654     SvSETMAGIC(bigstr);
2655 }
2656
2657 /* make sv point to what nstr did */
2658
2659 void
2660 sv_replace(register SV *sv, register SV *nsv)
2661 {
2662     U32 refcnt = SvREFCNT(sv);
2663     SV_CHECK_THINKFIRST(sv);
2664     if (SvREFCNT(nsv) != 1)
2665         warn("Reference miscount in sv_replace()");
2666     if (SvMAGICAL(sv)) {
2667         if (SvMAGICAL(nsv))
2668             mg_free(nsv);
2669         else
2670             sv_upgrade(nsv, SVt_PVMG);
2671         SvMAGIC(nsv) = SvMAGIC(sv);
2672         SvFLAGS(nsv) |= SvMAGICAL(sv);
2673         SvMAGICAL_off(sv);
2674         SvMAGIC(sv) = 0;
2675     }
2676     SvREFCNT(sv) = 0;
2677     sv_clear(sv);
2678     assert(!SvREFCNT(sv));
2679     StructCopy(nsv,sv,SV);
2680     SvREFCNT(sv) = refcnt;
2681     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
2682     del_SV(nsv);
2683 }
2684
2685 void
2686 sv_clear(register SV *sv)
2687 {
2688     HV* stash;
2689     assert(sv);
2690     assert(SvREFCNT(sv) == 0);
2691
2692     if (SvOBJECT(sv)) {
2693         dTHR;
2694         if (PL_defstash) {              /* Still have a symbol table? */
2695             djSP;
2696             GV* destructor;
2697             SV tmpref;
2698
2699             Zero(&tmpref, 1, SV);
2700             sv_upgrade(&tmpref, SVt_RV);
2701             SvROK_on(&tmpref);
2702             SvREADONLY_on(&tmpref);     /* DESTROY() could be naughty */
2703             SvREFCNT(&tmpref) = 1;
2704
2705             do {
2706                 stash = SvSTASH(sv);
2707                 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
2708                 if (destructor) {
2709                     ENTER;
2710                     PUSHSTACKi(PERLSI_DESTROY);
2711                     SvRV(&tmpref) = SvREFCNT_inc(sv);
2712                     EXTEND(SP, 2);
2713                     PUSHMARK(SP);
2714                     PUSHs(&tmpref);
2715                     PUTBACK;
2716                     perl_call_sv((SV*)GvCV(destructor),
2717                                  G_DISCARD|G_EVAL|G_KEEPERR);
2718                     SvREFCNT(sv)--;
2719                     POPSTACK;
2720                     SPAGAIN;
2721                     LEAVE;
2722                 }
2723             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
2724
2725             del_XRV(SvANY(&tmpref));
2726         }
2727
2728         if (SvOBJECT(sv)) {
2729             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
2730             SvOBJECT_off(sv);   /* Curse the object. */
2731             if (SvTYPE(sv) != SVt_PVIO)
2732                 --PL_sv_objcount;       /* XXX Might want something more general */
2733         }
2734         if (SvREFCNT(sv)) {
2735                 if (PL_in_clean_objs)
2736                     croak("DESTROY created new reference to dead object");
2737                 /* DESTROY gave object new lease on life */
2738                 return;
2739         }
2740     }
2741     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2742         mg_free(sv);
2743     stash = NULL;
2744     switch (SvTYPE(sv)) {
2745     case SVt_PVIO:
2746         if (IoIFP(sv) &&
2747             IoIFP(sv) != PerlIO_stdin() &&
2748             IoIFP(sv) != PerlIO_stdout() &&
2749             IoIFP(sv) != PerlIO_stderr())
2750           io_close((IO*)sv);
2751         Safefree(IoTOP_NAME(sv));
2752         Safefree(IoFMT_NAME(sv));
2753         Safefree(IoBOTTOM_NAME(sv));
2754         /* FALL THROUGH */
2755     case SVt_PVBM:
2756         goto freescalar;
2757     case SVt_PVCV:
2758     case SVt_PVFM:
2759         cv_undef((CV*)sv);
2760         goto freescalar;
2761     case SVt_PVHV:
2762         hv_undef((HV*)sv);
2763         break;
2764     case SVt_PVAV:
2765         av_undef((AV*)sv);
2766         break;
2767     case SVt_PVLV:
2768         SvREFCNT_dec(LvTARG(sv));
2769         goto freescalar;
2770     case SVt_PVGV:
2771         gp_free((GV*)sv);
2772         Safefree(GvNAME(sv));
2773         /* cannot decrease stash refcount yet, as we might recursively delete
2774            ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
2775            of stash until current sv is completely gone.
2776            -- JohnPC, 27 Mar 1998 */
2777         stash = GvSTASH(sv);
2778         /* FALL THROUGH */
2779     case SVt_PVMG:
2780     case SVt_PVNV:
2781     case SVt_PVIV:
2782       freescalar:
2783         (void)SvOOK_off(sv);
2784         /* FALL THROUGH */
2785     case SVt_PV:
2786     case SVt_RV:
2787         if (SvROK(sv))
2788             SvREFCNT_dec(SvRV(sv));
2789         else if (SvPVX(sv) && SvLEN(sv))
2790             Safefree(SvPVX(sv));
2791         break;
2792 /*
2793     case SVt_NV:
2794     case SVt_IV:
2795     case SVt_NULL:
2796         break;
2797 */
2798     }
2799
2800     switch (SvTYPE(sv)) {
2801     case SVt_NULL:
2802         break;
2803     case SVt_IV:
2804         del_XIV(SvANY(sv));
2805         break;
2806     case SVt_NV:
2807         del_XNV(SvANY(sv));
2808         break;
2809     case SVt_RV:
2810         del_XRV(SvANY(sv));
2811         break;
2812     case SVt_PV:
2813         del_XPV(SvANY(sv));
2814         break;
2815     case SVt_PVIV:
2816         del_XPVIV(SvANY(sv));
2817         break;
2818     case SVt_PVNV:
2819         del_XPVNV(SvANY(sv));
2820         break;
2821     case SVt_PVMG:
2822         del_XPVMG(SvANY(sv));
2823         break;
2824     case SVt_PVLV:
2825         del_XPVLV(SvANY(sv));
2826         break;
2827     case SVt_PVAV:
2828         del_XPVAV(SvANY(sv));
2829         break;
2830     case SVt_PVHV:
2831         del_XPVHV(SvANY(sv));
2832         break;
2833     case SVt_PVCV:
2834         del_XPVCV(SvANY(sv));
2835         break;
2836     case SVt_PVGV:
2837         del_XPVGV(SvANY(sv));
2838         /* code duplication for increased performance. */
2839         SvFLAGS(sv) &= SVf_BREAK;
2840         SvFLAGS(sv) |= SVTYPEMASK;
2841         /* decrease refcount of the stash that owns this GV, if any */
2842         if (stash)
2843             SvREFCNT_dec(stash);
2844         return; /* not break, SvFLAGS reset already happened */
2845     case SVt_PVBM:
2846         del_XPVBM(SvANY(sv));
2847         break;
2848     case SVt_PVFM:
2849         del_XPVFM(SvANY(sv));
2850         break;
2851     case SVt_PVIO:
2852         del_XPVIO(SvANY(sv));
2853         break;
2854     }
2855     SvFLAGS(sv) &= SVf_BREAK;
2856     SvFLAGS(sv) |= SVTYPEMASK;
2857 }
2858
2859 SV *
2860 sv_newref(SV *sv)
2861 {
2862     if (sv)
2863         ATOMIC_INC(SvREFCNT(sv));
2864     return sv;
2865 }
2866
2867 void
2868 sv_free(SV *sv)
2869 {
2870     int refcount_is_zero;
2871
2872     if (!sv)
2873         return;
2874     if (SvREFCNT(sv) == 0) {
2875         if (SvFLAGS(sv) & SVf_BREAK)
2876             return;
2877         if (PL_in_clean_all) /* All is fair */
2878             return;
2879         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
2880             /* make sure SvREFCNT(sv)==0 happens very seldom */
2881             SvREFCNT(sv) = (~(U32)0)/2;
2882             return;
2883         }
2884         warn("Attempt to free unreferenced scalar");
2885         return;
2886     }
2887     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
2888     if (!refcount_is_zero)
2889         return;
2890 #ifdef DEBUGGING
2891     if (SvTEMP(sv)) {
2892         warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
2893         return;
2894     }
2895 #endif
2896     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
2897         /* make sure SvREFCNT(sv)==0 happens very seldom */
2898         SvREFCNT(sv) = (~(U32)0)/2;
2899         return;
2900     }
2901     sv_clear(sv);
2902     if (! SvREFCNT(sv))
2903         del_SV(sv);
2904 }
2905
2906 STRLEN
2907 sv_len(register SV *sv)
2908 {
2909     char *junk;
2910     STRLEN len;
2911
2912     if (!sv)
2913         return 0;
2914
2915     if (SvGMAGICAL(sv))
2916         len = mg_length(sv);
2917     else
2918         junk = SvPV(sv, len);
2919     return len;
2920 }
2921
2922 STRLEN
2923 sv_len_utf8(register SV *sv)
2924 {
2925     U8 *s;
2926     U8 *send;
2927     STRLEN len;
2928
2929     if (!sv)
2930         return 0;
2931
2932 #ifdef NOTYET
2933     if (SvGMAGICAL(sv))
2934         len = mg_length(sv);
2935     else
2936 #endif
2937         s = (U8*)SvPV(sv, len);
2938     send = s + len;
2939     len = 0;
2940     while (s < send) {
2941         s += UTF8SKIP(s);
2942         len++;
2943     }
2944     return len;
2945 }
2946
2947 void
2948 sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
2949 {
2950     U8 *start;
2951     U8 *s;
2952     U8 *send;
2953     I32 uoffset = *offsetp;
2954     STRLEN len;
2955
2956     if (!sv)
2957         return;
2958
2959     start = s = (U8*)SvPV(sv, len);
2960     send = s + len;
2961     while (s < send && uoffset--)
2962         s += UTF8SKIP(s);
2963     if (s >= send)
2964         s = send;
2965     *offsetp = s - start;
2966     if (lenp) {
2967         I32 ulen = *lenp;
2968         start = s;
2969         while (s < send && ulen--)
2970             s += UTF8SKIP(s);
2971         if (s >= send)
2972             s = send;
2973         *lenp = s - start;
2974     }
2975     return;
2976 }
2977
2978 void
2979 sv_pos_b2u(register SV *sv, I32* offsetp)
2980 {
2981     U8 *s;
2982     U8 *send;
2983     STRLEN len;
2984
2985     if (!sv)
2986         return;
2987
2988     s = (U8*)SvPV(sv, len);
2989     if (len < *offsetp)
2990         croak("panic: bad byte offset");
2991     send = s + *offsetp;
2992     len = 0;
2993     while (s < send) {
2994         s += UTF8SKIP(s);
2995         ++len;
2996     }
2997     if (s != send) {
2998         warn("Malformed UTF-8 character");
2999         --len;
3000     }
3001     *offsetp = len;
3002     return;
3003 }
3004
3005 I32
3006 sv_eq(register SV *str1, register SV *str2)
3007 {
3008     char *pv1;
3009     STRLEN cur1;
3010     char *pv2;
3011     STRLEN cur2;
3012
3013     if (!str1) {
3014         pv1 = "";
3015         cur1 = 0;
3016     }
3017     else
3018         pv1 = SvPV(str1, cur1);
3019
3020     if (!str2)
3021         return !cur1;
3022     else
3023         pv2 = SvPV(str2, cur2);
3024
3025     if (cur1 != cur2)
3026         return 0;
3027
3028     return memEQ(pv1, pv2, cur1);
3029 }
3030
3031 I32
3032 sv_cmp(register SV *str1, register SV *str2)
3033 {
3034     STRLEN cur1 = 0;
3035     char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
3036     STRLEN cur2 = 0;
3037     char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
3038     I32 retval;
3039
3040     if (!cur1)
3041         return cur2 ? -1 : 0;
3042
3043     if (!cur2)
3044         return 1;
3045
3046     retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
3047
3048     if (retval)
3049         return retval < 0 ? -1 : 1;
3050
3051     if (cur1 == cur2)
3052         return 0;
3053     else
3054         return cur1 < cur2 ? -1 : 1;
3055 }
3056
3057 I32
3058 sv_cmp_locale(register SV *sv1, register SV *sv2)
3059 {
3060 #ifdef USE_LOCALE_COLLATE
3061
3062     char *pv1, *pv2;
3063     STRLEN len1, len2;
3064     I32 retval;
3065
3066     if (PL_collation_standard)
3067         goto raw_compare;
3068
3069     len1 = 0;
3070     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
3071     len2 = 0;
3072     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
3073
3074     if (!pv1 || !len1) {
3075         if (pv2 && len2)
3076             return -1;
3077         else
3078             goto raw_compare;
3079     }
3080     else {
3081         if (!pv2 || !len2)
3082             return 1;
3083     }
3084
3085     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
3086
3087     if (retval)
3088         return retval < 0 ? -1 : 1;
3089
3090     /*
3091      * When the result of collation is equality, that doesn't mean
3092      * that there are no differences -- some locales exclude some
3093      * characters from consideration.  So to avoid false equalities,
3094      * we use the raw string as a tiebreaker.
3095      */
3096
3097   raw_compare:
3098     /* FALL THROUGH */
3099
3100 #endif /* USE_LOCALE_COLLATE */
3101
3102     return sv_cmp(sv1, sv2);
3103 }
3104
3105 #ifdef USE_LOCALE_COLLATE
3106 /*
3107  * Any scalar variable may carry an 'o' magic that contains the
3108  * scalar data of the variable transformed to such a format that
3109  * a normal memory comparison can be used to compare the data
3110  * according to the locale settings.
3111  */
3112 char *
3113 sv_collxfrm(SV *sv, STRLEN *nxp)
3114 {
3115     MAGIC *mg;
3116
3117     mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3118     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
3119         char *s, *xf;
3120         STRLEN len, xlen;
3121
3122         if (mg)
3123             Safefree(mg->mg_ptr);
3124         s = SvPV(sv, len);
3125         if ((xf = mem_collxfrm(s, len, &xlen))) {
3126             if (SvREADONLY(sv)) {
3127                 SAVEFREEPV(xf);
3128                 *nxp = xlen;
3129                 return xf + sizeof(PL_collation_ix);
3130             }
3131             if (! mg) {
3132                 sv_magic(sv, 0, 'o', 0, 0);
3133                 mg = mg_find(sv, 'o');
3134                 assert(mg);
3135             }
3136             mg->mg_ptr = xf;
3137             mg->mg_len = xlen;
3138         }
3139         else {
3140             if (mg) {
3141                 mg->mg_ptr = NULL;
3142                 mg->mg_len = -1;
3143             }
3144         }
3145     }
3146     if (mg && mg->mg_ptr) {
3147         *nxp = mg->mg_len;
3148         return mg->mg_ptr + sizeof(PL_collation_ix);
3149     }
3150     else {
3151         *nxp = 0;
3152         return NULL;
3153     }
3154 }
3155
3156 #endif /* USE_LOCALE_COLLATE */
3157
3158 char *
3159 sv_gets(register SV *sv, register PerlIO *fp, I32 append)
3160 {
3161     dTHR;
3162     char *rsptr;
3163     STRLEN rslen;
3164     register STDCHAR rslast;
3165     register STDCHAR *bp;
3166     register I32 cnt;
3167     I32 i;
3168
3169     SV_CHECK_THINKFIRST(sv);
3170     (void)SvUPGRADE(sv, SVt_PV);
3171     SvSCREAM_off(sv);
3172
3173     if (RsSNARF(PL_rs)) {
3174         rsptr = NULL;
3175         rslen = 0;
3176     }
3177     else if (RsRECORD(PL_rs)) {
3178       I32 recsize, bytesread;
3179       char *buffer;
3180
3181       /* Grab the size of the record we're getting */
3182       recsize = SvIV(SvRV(PL_rs));
3183       (void)SvPOK_only(sv);    /* Validate pointer */
3184       buffer = SvGROW(sv, recsize + 1);
3185       /* Go yank in */
3186 #ifdef VMS
3187       /* VMS wants read instead of fread, because fread doesn't respect */
3188       /* RMS record boundaries. This is not necessarily a good thing to be */
3189       /* doing, but we've got no other real choice */
3190       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3191 #else
3192       bytesread = PerlIO_read(fp, buffer, recsize);
3193 #endif
3194       SvCUR_set(sv, bytesread);
3195       buffer[bytesread] = '\0';
3196       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3197     }
3198     else if (RsPARA(PL_rs)) {
3199         rsptr = "\n\n";
3200         rslen = 2;
3201     }
3202     else
3203         rsptr = SvPV(PL_rs, rslen);
3204     rslast = rslen ? rsptr[rslen - 1] : '\0';
3205
3206     if (RsPARA(PL_rs)) {                /* have to do this both before and after */
3207         do {                    /* to make sure file boundaries work right */
3208             if (PerlIO_eof(fp))
3209                 return 0;
3210             i = PerlIO_getc(fp);
3211             if (i != '\n') {
3212                 if (i == -1)
3213                     return 0;
3214                 PerlIO_ungetc(fp,i);
3215                 break;
3216             }
3217         } while (i != EOF);
3218     }
3219
3220     /* See if we know enough about I/O mechanism to cheat it ! */
3221
3222     /* This used to be #ifdef test - it is made run-time test for ease
3223        of abstracting out stdio interface. One call should be cheap 
3224        enough here - and may even be a macro allowing compile
3225        time optimization.
3226      */
3227
3228     if (PerlIO_fast_gets(fp)) {
3229
3230     /*
3231      * We're going to steal some values from the stdio struct
3232      * and put EVERYTHING in the innermost loop into registers.
3233      */
3234     register STDCHAR *ptr;
3235     STRLEN bpx;
3236     I32 shortbuffered;
3237
3238 #if defined(VMS) && defined(PERLIO_IS_STDIO)
3239     /* An ungetc()d char is handled separately from the regular
3240      * buffer, so we getc() it back out and stuff it in the buffer.
3241      */
3242     i = PerlIO_getc(fp);
3243     if (i == EOF) return 0;
3244     *(--((*fp)->_ptr)) = (unsigned char) i;
3245     (*fp)->_cnt++;
3246 #endif
3247
3248     /* Here is some breathtakingly efficient cheating */
3249
3250     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
3251     (void)SvPOK_only(sv);               /* validate pointer */
3252     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3253         if (cnt > 80 && SvLEN(sv) > append) {
3254             shortbuffered = cnt - SvLEN(sv) + append + 1;
3255             cnt -= shortbuffered;
3256         }
3257         else {
3258             shortbuffered = 0;
3259             /* remember that cnt can be negative */
3260             SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
3261         }
3262     }
3263     else
3264         shortbuffered = 0;
3265     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
3266     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
3267     DEBUG_P(PerlIO_printf(Perl_debug_log,
3268         "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3269     DEBUG_P(PerlIO_printf(Perl_debug_log,
3270         "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3271                (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3272                (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
3273     for (;;) {
3274       screamer:
3275         if (cnt > 0) {
3276             if (rslen) {
3277                 while (cnt > 0) {                    /* this     |  eat */
3278                     cnt--;
3279                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
3280                         goto thats_all_folks;        /* screams  |  sed :-) */
3281                 }
3282             }
3283             else {
3284                 Copy(ptr, bp, cnt, char);            /* this     |  eat */    
3285                 bp += cnt;                           /* screams  |  dust */   
3286                 ptr += cnt;                          /* louder   |  sed :-) */
3287                 cnt = 0;
3288             }
3289         }
3290         
3291         if (shortbuffered) {            /* oh well, must extend */
3292             cnt = shortbuffered;
3293             shortbuffered = 0;
3294             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3295             SvCUR_set(sv, bpx);
3296             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3297             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3298             continue;
3299         }
3300
3301         DEBUG_P(PerlIO_printf(Perl_debug_log,
3302             "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3303         PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
3304         DEBUG_P(PerlIO_printf(Perl_debug_log,
3305             "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3306             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3307             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3308         /* This used to call 'filbuf' in stdio form, but as that behaves like 
3309            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3310            another abstraction.  */
3311         i   = PerlIO_getc(fp);          /* get more characters */
3312         DEBUG_P(PerlIO_printf(Perl_debug_log,
3313             "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3314             (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3315             (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3316         cnt = PerlIO_get_cnt(fp);
3317         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
3318         DEBUG_P(PerlIO_printf(Perl_debug_log,
3319             "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3320
3321         if (i == EOF)                   /* all done for ever? */
3322             goto thats_really_all_folks;
3323
3324         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3325         SvCUR_set(sv, bpx);
3326         SvGROW(sv, bpx + cnt + 2);
3327         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3328
3329         *bp++ = i;                      /* store character from PerlIO_getc */
3330
3331         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
3332             goto thats_all_folks;
3333     }
3334
3335 thats_all_folks:
3336     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
3337           memNE((char*)bp - rslen, rsptr, rslen))
3338         goto screamer;                          /* go back to the fray */
3339 thats_really_all_folks:
3340     if (shortbuffered)
3341         cnt += shortbuffered;
3342         DEBUG_P(PerlIO_printf(Perl_debug_log,
3343             "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3344     PerlIO_set_ptrcnt(fp, ptr, cnt);    /* put these back or we're in trouble */
3345     DEBUG_P(PerlIO_printf(Perl_debug_log,
3346         "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3347         (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
3348         (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3349     *bp = '\0';
3350     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
3351     DEBUG_P(PerlIO_printf(Perl_debug_log,
3352         "Screamer: done, len=%ld, string=|%.*s|\n",
3353         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
3354     }
3355    else
3356     {
3357        /*The big, slow, and stupid way */
3358         STDCHAR buf[8192];
3359
3360 screamer2:
3361         if (rslen) {
3362             register STDCHAR *bpe = buf + sizeof(buf);
3363             bp = buf;
3364             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3365                 ; /* keep reading */
3366             cnt = bp - buf;
3367         }
3368         else {
3369             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
3370             /* Accomodate broken VAXC compiler, which applies U8 cast to
3371              * both args of ?: operator, causing EOF to change into 255
3372              */
3373             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
3374         }
3375
3376         if (append)
3377             sv_catpvn(sv, (char *) buf, cnt);
3378         else
3379             sv_setpvn(sv, (char *) buf, cnt);
3380
3381         if (i != EOF &&                 /* joy */
3382             (!rslen ||
3383              SvCUR(sv) < rslen ||
3384              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
3385         {
3386             append = -1;
3387             /*
3388              * If we're reading from a TTY and we get a short read,
3389              * indicating that the user hit his EOF character, we need
3390              * to notice it now, because if we try to read from the TTY
3391              * again, the EOF condition will disappear.
3392              *
3393              * The comparison of cnt to sizeof(buf) is an optimization
3394              * that prevents unnecessary calls to feof().
3395              *
3396              * - jik 9/25/96
3397              */
3398             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3399                 goto screamer2;
3400         }
3401     }
3402
3403     if (RsPARA(PL_rs)) {                /* have to do this both before and after */  
3404         while (i != EOF) {      /* to make sure file boundaries work right */
3405             i = PerlIO_getc(fp);
3406             if (i != '\n') {
3407                 PerlIO_ungetc(fp,i);
3408                 break;
3409             }
3410         }
3411     }
3412
3413 #ifdef WIN32
3414     win32_strip_return(sv);
3415 #endif
3416
3417     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
3418 }
3419
3420
3421 void
3422 sv_inc(register SV *sv)
3423 {
3424     register char *d;
3425     int flags;
3426
3427     if (!sv)
3428         return;
3429     if (SvGMAGICAL(sv))
3430         mg_get(sv);
3431     if (SvTHINKFIRST(sv)) {
3432         if (SvREADONLY(sv)) {
3433             dTHR;
3434             if (PL_curcop != &PL_compiling)
3435                 croak(PL_no_modify);
3436         }
3437         if (SvROK(sv)) {
3438             IV i;
3439             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
3440                 return;
3441             i = (IV)SvRV(sv);
3442             sv_unref(sv);
3443             sv_setiv(sv, i);
3444         }
3445     }
3446     flags = SvFLAGS(sv);
3447     if (flags & SVp_NOK) {
3448         (void)SvNOK_only(sv);
3449         SvNVX(sv) += 1.0;
3450         return;
3451     }
3452     if (flags & SVp_IOK) {
3453         if (SvIVX(sv) == IV_MAX)
3454             sv_setnv(sv, (double)IV_MAX + 1.0);
3455         else {
3456             (void)SvIOK_only(sv);
3457             ++SvIVX(sv);
3458         }
3459         return;
3460     }
3461     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
3462         if ((flags & SVTYPEMASK) < SVt_PVNV)
3463             sv_upgrade(sv, SVt_NV);
3464         SvNVX(sv) = 1.0;
3465         (void)SvNOK_only(sv);
3466         return;
3467     }
3468     d = SvPVX(sv);
3469     while (isALPHA(*d)) d++;
3470     while (isDIGIT(*d)) d++;
3471     if (*d) {
3472         SET_NUMERIC_STANDARD();
3473         sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
3474         return;
3475     }
3476     d--;
3477     while (d >= SvPVX(sv)) {
3478         if (isDIGIT(*d)) {
3479             if (++*d <= '9')
3480                 return;
3481             *(d--) = '0';
3482         }
3483         else {
3484 #ifdef EBCDIC
3485             /* MKS: The original code here died if letters weren't consecutive.
3486              * at least it didn't have to worry about non-C locales.  The
3487              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3488              * arranged in order (although not consecutively) and that only 
3489              * [A-Za-z] are accepted by isALPHA in the C locale.
3490              */
3491             if (*d != 'z' && *d != 'Z') {
3492                 do { ++*d; } while (!isALPHA(*d));
3493                 return;
3494             }
3495             *(d--) -= 'z' - 'a';
3496 #else
3497             ++*d;
3498             if (isALPHA(*d))
3499                 return;
3500             *(d--) -= 'z' - 'a' + 1;
3501 #endif
3502         }
3503     }
3504     /* oh,oh, the number grew */
3505     SvGROW(sv, SvCUR(sv) + 2);
3506     SvCUR(sv)++;
3507     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
3508         *d = d[-1];
3509     if (isDIGIT(d[1]))
3510         *d = '1';
3511     else
3512         *d = d[1];
3513 }
3514
3515 void
3516 sv_dec(register SV *sv)
3517 {
3518     int flags;
3519
3520     if (!sv)
3521         return;
3522     if (SvGMAGICAL(sv))
3523         mg_get(sv);
3524     if (SvTHINKFIRST(sv)) {
3525         if (SvREADONLY(sv)) {
3526             dTHR;
3527             if (PL_curcop != &PL_compiling)
3528                 croak(PL_no_modify);
3529         }
3530         if (SvROK(sv)) {
3531             IV i;
3532             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
3533                 return;
3534             i = (IV)SvRV(sv);
3535             sv_unref(sv);
3536             sv_setiv(sv, i);
3537         }
3538     }
3539     flags = SvFLAGS(sv);
3540     if (flags & SVp_NOK) {
3541         SvNVX(sv) -= 1.0;
3542         (void)SvNOK_only(sv);
3543         return;
3544     }
3545     if (flags & SVp_IOK) {
3546         if (SvIVX(sv) == IV_MIN)
3547             sv_setnv(sv, (double)IV_MIN - 1.0);
3548         else {
3549             (void)SvIOK_only(sv);
3550             --SvIVX(sv);
3551         }
3552         return;
3553     }
3554     if (!(flags & SVp_POK)) {
3555         if ((flags & SVTYPEMASK) < SVt_PVNV)
3556             sv_upgrade(sv, SVt_NV);
3557         SvNVX(sv) = -1.0;
3558         (void)SvNOK_only(sv);
3559         return;
3560     }
3561     SET_NUMERIC_STANDARD();
3562     sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
3563 }
3564
3565 /* Make a string that will exist for the duration of the expression
3566  * evaluation.  Actually, it may have to last longer than that, but
3567  * hopefully we won't free it until it has been assigned to a
3568  * permanent location. */
3569
3570 STATIC void
3571 sv_mortalgrow(void)
3572 {
3573     dTHR;
3574     PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
3575     Renew(PL_tmps_stack, PL_tmps_max, SV*);
3576 }
3577
3578 SV *
3579 sv_mortalcopy(SV *oldstr)
3580 {
3581     dTHR;
3582     register SV *sv;
3583
3584     new_SV(sv);
3585     SvANY(sv) = 0;
3586     SvREFCNT(sv) = 1;
3587     SvFLAGS(sv) = 0;
3588     sv_setsv(sv,oldstr);
3589     if (++PL_tmps_ix >= PL_tmps_max)
3590         sv_mortalgrow();
3591     PL_tmps_stack[PL_tmps_ix] = sv;
3592     SvTEMP_on(sv);
3593     return sv;
3594 }
3595
3596 SV *
3597 sv_newmortal(void)
3598 {
3599     dTHR;
3600     register SV *sv;
3601
3602     new_SV(sv);
3603     SvANY(sv) = 0;
3604     SvREFCNT(sv) = 1;
3605     SvFLAGS(sv) = SVs_TEMP;
3606     if (++PL_tmps_ix >= PL_tmps_max)
3607         sv_mortalgrow();
3608     PL_tmps_stack[PL_tmps_ix] = sv;
3609     return sv;
3610 }
3611
3612 /* same thing without the copying */
3613
3614 SV *
3615 sv_2mortal(register SV *sv)
3616 {
3617     dTHR;
3618     if (!sv)
3619         return sv;
3620     if (SvREADONLY(sv) && SvIMMORTAL(sv))
3621         return sv;
3622     if (++PL_tmps_ix >= PL_tmps_max)
3623         sv_mortalgrow();
3624     PL_tmps_stack[PL_tmps_ix] = sv;
3625     SvTEMP_on(sv);
3626     return sv;
3627 }
3628
3629 SV *
3630 newSVpv(char *s, STRLEN len)
3631 {
3632     register SV *sv;
3633
3634     new_SV(sv);
3635     SvANY(sv) = 0;
3636     SvREFCNT(sv) = 1;
3637     SvFLAGS(sv) = 0;
3638     if (!len)
3639         len = strlen(s);
3640     sv_setpvn(sv,s,len);
3641     return sv;
3642 }
3643
3644 SV *
3645 newSVpvn(char *s, STRLEN len)
3646 {
3647     register SV *sv;
3648
3649     new_SV(sv);
3650     SvANY(sv) = 0;
3651     SvREFCNT(sv) = 1;
3652     SvFLAGS(sv) = 0;
3653     sv_setpvn(sv,s,len);
3654     return sv;
3655 }
3656
3657 SV *
3658 newSVpvf(const char* pat, ...)
3659 {
3660     register SV *sv;
3661     va_list args;
3662
3663     new_SV(sv);
3664     SvANY(sv) = 0;
3665     SvREFCNT(sv) = 1;
3666     SvFLAGS(sv) = 0;
3667     va_start(args, pat);
3668     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3669     va_end(args);
3670     return sv;
3671 }
3672
3673
3674 SV *
3675 newSVnv(double n)
3676 {
3677     register SV *sv;
3678
3679     new_SV(sv);
3680     SvANY(sv) = 0;
3681     SvREFCNT(sv) = 1;
3682     SvFLAGS(sv) = 0;
3683     sv_setnv(sv,n);
3684     return sv;
3685 }
3686
3687 SV *
3688 newSViv(IV i)
3689 {
3690     register SV *sv;
3691
3692     new_SV(sv);
3693     SvANY(sv) = 0;
3694     SvREFCNT(sv) = 1;
3695     SvFLAGS(sv) = 0;
3696     sv_setiv(sv,i);
3697     return sv;
3698 }
3699
3700 SV *
3701 newRV_noinc(SV *tmpRef)
3702 {
3703     dTHR;
3704     register SV *sv;
3705
3706     new_SV(sv);
3707     SvANY(sv) = 0;
3708     SvREFCNT(sv) = 1;
3709     SvFLAGS(sv) = 0;
3710     sv_upgrade(sv, SVt_RV);
3711     SvTEMP_off(tmpRef);
3712     SvRV(sv) = tmpRef;
3713     SvROK_on(sv);
3714     return sv;
3715 }
3716
3717 SV *
3718 newRV(SV *tmpRef)
3719 {
3720     return newRV_noinc(SvREFCNT_inc(tmpRef));
3721 }
3722
3723 /* make an exact duplicate of old */
3724
3725 SV *
3726 newSVsv(register SV *old)
3727 {
3728     register SV *sv;
3729
3730     if (!old)
3731         return Nullsv;
3732     if (SvTYPE(old) == SVTYPEMASK) {
3733         warn("semi-panic: attempt to dup freed string");
3734         return Nullsv;
3735     }
3736     new_SV(sv);
3737     SvANY(sv) = 0;
3738     SvREFCNT(sv) = 1;
3739     SvFLAGS(sv) = 0;
3740     if (SvTEMP(old)) {
3741         SvTEMP_off(old);
3742         sv_setsv(sv,old);
3743         SvTEMP_on(old);
3744     }
3745     else
3746         sv_setsv(sv,old);
3747     return sv;
3748 }
3749
3750 void
3751 sv_reset(register char *s, HV *stash)
3752 {
3753     register HE *entry;
3754     register GV *gv;
3755     register SV *sv;
3756     register I32 i;
3757     register PMOP *pm;
3758     register I32 max;
3759     char todo[256];
3760
3761     if (!stash)
3762         return;
3763
3764     if (!*s) {          /* reset ?? searches */
3765         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
3766             pm->op_pmdynflags &= ~PMdf_USED;
3767         }
3768         return;
3769     }
3770
3771     /* reset variables */
3772
3773     if (!HvARRAY(stash))
3774         return;
3775
3776     Zero(todo, 256, char);
3777     while (*s) {
3778         i = *s;
3779         if (s[1] == '-') {
3780             s += 2;
3781         }
3782         max = *s++;
3783         for ( ; i <= max; i++) {
3784             todo[i] = 1;
3785         }
3786         for (i = 0; i <= (I32) HvMAX(stash); i++) {
3787             for (entry = HvARRAY(stash)[i];
3788                  entry;
3789                  entry = HeNEXT(entry))
3790             {
3791                 if (!todo[(U8)*HeKEY(entry)])
3792                     continue;
3793                 gv = (GV*)HeVAL(entry);
3794                 sv = GvSV(gv);
3795                 if (SvTHINKFIRST(sv)) {
3796                     if (!SvREADONLY(sv) && SvROK(sv))
3797                         sv_unref(sv);
3798                     continue;
3799                 }
3800                 (void)SvOK_off(sv);
3801                 if (SvTYPE(sv) >= SVt_PV) {
3802                     SvCUR_set(sv, 0);
3803                     if (SvPVX(sv) != Nullch)
3804                         *SvPVX(sv) = '\0';
3805                     SvTAINT(sv);
3806                 }
3807                 if (GvAV(gv)) {
3808                     av_clear(GvAV(gv));
3809                 }
3810                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
3811                     hv_clear(GvHV(gv));
3812 #ifndef VMS  /* VMS has no environ array */
3813                     if (gv == PL_envgv)
3814                         environ[0] = Nullch;
3815 #endif
3816                 }
3817             }
3818         }
3819     }
3820 }
3821
3822 IO*
3823 sv_2io(SV *sv)
3824 {
3825     IO* io;
3826     GV* gv;
3827     STRLEN n_a;
3828
3829     switch (SvTYPE(sv)) {
3830     case SVt_PVIO:
3831         io = (IO*)sv;
3832         break;
3833     case SVt_PVGV:
3834         gv = (GV*)sv;
3835         io = GvIO(gv);
3836         if (!io)
3837             croak("Bad filehandle: %s", GvNAME(gv));
3838         break;
3839     default:
3840         if (!SvOK(sv))
3841             croak(PL_no_usym, "filehandle");
3842         if (SvROK(sv))
3843             return sv_2io(SvRV(sv));
3844         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
3845         if (gv)
3846             io = GvIO(gv);
3847         else
3848             io = 0;
3849         if (!io)
3850             croak("Bad filehandle: %s", SvPV(sv,n_a));
3851         break;
3852     }
3853     return io;
3854 }
3855
3856 CV *
3857 sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
3858 {
3859     GV *gv;
3860     CV *cv;
3861     STRLEN n_a;
3862
3863     if (!sv)
3864         return *gvp = Nullgv, Nullcv;
3865     switch (SvTYPE(sv)) {
3866     case SVt_PVCV:
3867         *st = CvSTASH(sv);
3868         *gvp = Nullgv;
3869         return (CV*)sv;
3870     case SVt_PVHV:
3871     case SVt_PVAV:
3872         *gvp = Nullgv;
3873         return Nullcv;
3874     case SVt_PVGV:
3875         gv = (GV*)sv;
3876         *gvp = gv;
3877         *st = GvESTASH(gv);
3878         goto fix_gv;
3879
3880     default:
3881         if (SvGMAGICAL(sv))
3882             mg_get(sv);
3883         if (SvROK(sv)) {
3884             dTHR;
3885             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
3886             tryAMAGICunDEREF(to_cv);
3887
3888             sv = SvRV(sv);
3889             if (SvTYPE(sv) == SVt_PVCV) {
3890                 cv = (CV*)sv;
3891                 *gvp = Nullgv;
3892                 *st = CvSTASH(cv);
3893                 return cv;
3894             }
3895             else if(isGV(sv))
3896                 gv = (GV*)sv;
3897             else
3898                 croak("Not a subroutine reference");
3899         }
3900         else if (isGV(sv))
3901             gv = (GV*)sv;
3902         else
3903             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
3904         *gvp = gv;
3905         if (!gv)
3906             return Nullcv;
3907         *st = GvESTASH(gv);
3908     fix_gv:
3909         if (lref && !GvCVu(gv)) {
3910             SV *tmpsv;
3911             ENTER;
3912             tmpsv = NEWSV(704,0);
3913             gv_efullname3(tmpsv, gv, Nullch);
3914             newSUB(start_subparse(FALSE, 0),
3915                    newSVOP(OP_CONST, 0, tmpsv),
3916                    Nullop,
3917                    Nullop);
3918             LEAVE;
3919             if (!GvCVu(gv))
3920                 croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
3921         }
3922         return GvCVu(gv);
3923     }
3924 }
3925
3926 I32
3927 sv_true(register SV *sv)
3928 {
3929     dTHR;
3930     if (!sv)
3931         return 0;
3932     if (SvPOK(sv)) {
3933         register XPV* tXpv;
3934         if ((tXpv = (XPV*)SvANY(sv)) &&
3935                 (*tXpv->xpv_pv > '0' ||
3936                 tXpv->xpv_cur > 1 ||
3937                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
3938             return 1;
3939         else
3940             return 0;
3941     }
3942     else {
3943         if (SvIOK(sv))
3944             return SvIVX(sv) != 0;
3945         else {
3946             if (SvNOK(sv))
3947                 return SvNVX(sv) != 0.0;
3948             else
3949                 return sv_2bool(sv);
3950         }
3951     }
3952 }
3953
3954 IV
3955 sv_iv(register SV *sv)
3956 {
3957     if (SvIOK(sv))
3958         return SvIVX(sv);
3959     return sv_2iv(sv);
3960 }
3961
3962 UV
3963 sv_uv(register SV *sv)
3964 {
3965     if (SvIOK(sv))
3966         return SvUVX(sv);
3967     return sv_2uv(sv);
3968 }
3969
3970 double
3971 sv_nv(register SV *sv)
3972 {
3973     if (SvNOK(sv))
3974         return SvNVX(sv);
3975     return sv_2nv(sv);
3976 }
3977
3978 char *
3979 sv_pvn(SV *sv, STRLEN *lp)
3980 {
3981     if (SvPOK(sv)) {
3982         *lp = SvCUR(sv);
3983         return SvPVX(sv);
3984     }
3985     return sv_2pv(sv, lp);
3986 }
3987
3988 char *
3989 sv_pvn_force(SV *sv, STRLEN *lp)
3990 {
3991     char *s;
3992
3993     if (SvREADONLY(sv)) {
3994         dTHR;
3995         if (PL_curcop != &PL_compiling)
3996             croak(PL_no_modify);
3997     }
3998     
3999     if (SvPOK(sv)) {
4000         *lp = SvCUR(sv);
4001     }
4002     else {
4003         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4004             if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
4005                 sv_unglob(sv);
4006                 s = SvPVX(sv);
4007                 *lp = SvCUR(sv);
4008             }
4009             else {
4010                 dTHR;
4011                 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
4012                     PL_op_name[PL_op->op_type]);
4013             }
4014         }
4015         else
4016             s = sv_2pv(sv, lp);
4017         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
4018             STRLEN len = *lp;
4019             
4020             if (SvROK(sv))
4021                 sv_unref(sv);
4022             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
4023             SvGROW(sv, len + 1);
4024             Move(s,SvPVX(sv),len,char);
4025             SvCUR_set(sv, len);
4026             *SvEND(sv) = '\0';
4027         }
4028         if (!SvPOK(sv)) {
4029             SvPOK_on(sv);               /* validate pointer */
4030             SvTAINT(sv);
4031             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
4032                 (unsigned long)sv,SvPVX(sv)));
4033         }
4034     }
4035     return SvPVX(sv);
4036 }
4037
4038 char *
4039 sv_reftype(SV *sv, int ob)
4040 {
4041     if (ob && SvOBJECT(sv))
4042         return HvNAME(SvSTASH(sv));
4043     else {
4044         switch (SvTYPE(sv)) {
4045         case SVt_NULL:
4046         case SVt_IV:
4047         case SVt_NV:
4048         case SVt_RV:
4049         case SVt_PV:
4050         case SVt_PVIV:
4051         case SVt_PVNV:
4052         case SVt_PVMG:
4053         case SVt_PVBM:
4054                                 if (SvROK(sv))
4055                                     return "REF";
4056                                 else
4057                                     return "SCALAR";
4058         case SVt_PVLV:          return "LVALUE";
4059         case SVt_PVAV:          return "ARRAY";
4060         case SVt_PVHV:          return "HASH";
4061         case SVt_PVCV:          return "CODE";
4062         case SVt_PVGV:          return "GLOB";
4063         case SVt_PVFM:          return "FORMAT";
4064         default:                return "UNKNOWN";
4065         }
4066     }
4067 }
4068
4069 int
4070 sv_isobject(SV *sv)
4071 {
4072     if (!sv)
4073         return 0;
4074     if (SvGMAGICAL(sv))
4075         mg_get(sv);
4076     if (!SvROK(sv))
4077         return 0;
4078     sv = (SV*)SvRV(sv);
4079     if (!SvOBJECT(sv))
4080         return 0;
4081     return 1;
4082 }
4083
4084 int
4085 sv_isa(SV *sv, char *name)
4086 {
4087     if (!sv)
4088         return 0;
4089     if (SvGMAGICAL(sv))
4090         mg_get(sv);
4091     if (!SvROK(sv))
4092         return 0;
4093     sv = (SV*)SvRV(sv);
4094     if (!SvOBJECT(sv))
4095         return 0;
4096
4097     return strEQ(HvNAME(SvSTASH(sv)), name);
4098 }
4099
4100 SV*
4101 newSVrv(SV *rv, char *classname)
4102 {
4103     dTHR;
4104     SV *sv;
4105
4106     new_SV(sv);
4107     SvANY(sv) = 0;
4108     SvREFCNT(sv) = 0;
4109     SvFLAGS(sv) = 0;
4110
4111     SV_CHECK_THINKFIRST(rv);
4112     SvAMAGIC_off(rv);
4113
4114     if (SvTYPE(rv) < SVt_RV)
4115       sv_upgrade(rv, SVt_RV);
4116
4117     (void)SvOK_off(rv);
4118     SvRV(rv) = SvREFCNT_inc(sv);
4119     SvROK_on(rv);
4120
4121     if (classname) {
4122         HV* stash = gv_stashpv(classname, TRUE);
4123         (void)sv_bless(rv, stash);
4124     }
4125     return sv;
4126 }
4127
4128 SV*
4129 sv_setref_pv(SV *rv, char *classname, void *pv)
4130 {
4131     if (!pv) {
4132         sv_setsv(rv, &PL_sv_undef);
4133         SvSETMAGIC(rv);
4134     }
4135     else
4136         sv_setiv(newSVrv(rv,classname), (IV)pv);
4137     return rv;
4138 }
4139
4140 SV*
4141 sv_setref_iv(SV *rv, char *classname, IV iv)
4142 {
4143     sv_setiv(newSVrv(rv,classname), iv);
4144     return rv;
4145 }
4146
4147 SV*
4148 sv_setref_nv(SV *rv, char *classname, double nv)
4149 {
4150     sv_setnv(newSVrv(rv,classname), nv);
4151     return rv;
4152 }
4153
4154 SV*
4155 sv_setref_pvn(SV *rv, char *classname, char *pv, I32 n)
4156 {
4157     sv_setpvn(newSVrv(rv,classname), pv, n);
4158     return rv;
4159 }
4160
4161 SV*
4162 sv_bless(SV *sv, HV *stash)
4163 {
4164     dTHR;
4165     SV *tmpRef;
4166     if (!SvROK(sv))
4167         croak("Can't bless non-reference value");
4168     tmpRef = SvRV(sv);
4169     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4170         if (SvREADONLY(tmpRef))
4171             croak(PL_no_modify);
4172         if (SvOBJECT(tmpRef)) {
4173             if (SvTYPE(tmpRef) != SVt_PVIO)
4174                 --PL_sv_objcount;
4175             SvREFCNT_dec(SvSTASH(tmpRef));
4176         }
4177     }
4178     SvOBJECT_on(tmpRef);
4179     if (SvTYPE(tmpRef) != SVt_PVIO)
4180         ++PL_sv_objcount;
4181     (void)SvUPGRADE(tmpRef, SVt_PVMG);
4182     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
4183
4184     if (Gv_AMG(stash))
4185         SvAMAGIC_on(sv);
4186     else
4187         SvAMAGIC_off(sv);
4188
4189     return sv;
4190 }
4191
4192 STATIC void
4193 sv_unglob(SV *sv)
4194 {
4195     assert(SvTYPE(sv) == SVt_PVGV);
4196     SvFAKE_off(sv);
4197     if (GvGP(sv))
4198         gp_free((GV*)sv);
4199     if (GvSTASH(sv)) {
4200         SvREFCNT_dec(GvSTASH(sv));
4201         GvSTASH(sv) = Nullhv;
4202     }
4203     sv_unmagic(sv, '*');
4204     Safefree(GvNAME(sv));
4205     GvMULTI_off(sv);
4206     SvFLAGS(sv) &= ~SVTYPEMASK;
4207     SvFLAGS(sv) |= SVt_PVMG;
4208 }
4209
4210 void
4211 sv_unref(SV *sv)
4212 {
4213     SV* rv = SvRV(sv);
4214     
4215     SvRV(sv) = 0;
4216     SvROK_off(sv);
4217     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4218         SvREFCNT_dec(rv);
4219     else
4220         sv_2mortal(rv);         /* Schedule for freeing later */
4221 }
4222
4223 void
4224 sv_taint(SV *sv)
4225 {
4226     sv_magic((sv), Nullsv, 't', Nullch, 0);
4227 }
4228
4229 void
4230 sv_untaint(SV *sv)
4231 {
4232     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4233         MAGIC *mg = mg_find(sv, 't');
4234         if (mg)
4235             mg->mg_len &= ~1;
4236     }
4237 }
4238
4239 bool
4240 sv_tainted(SV *sv)
4241 {
4242     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4243         MAGIC *mg = mg_find(sv, 't');
4244         if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
4245             return TRUE;
4246     }
4247     return FALSE;
4248 }
4249
4250 void
4251 sv_setpviv(SV *sv, IV iv)
4252 {
4253     STRLEN len;
4254     char buf[TYPE_DIGITS(UV)];
4255     char *ptr = buf + sizeof(buf);
4256     int sign;
4257     UV uv;
4258     char *p;
4259
4260     sv_setpvn(sv, "", 0);
4261     if (iv >= 0) {
4262         uv = iv;
4263         sign = 0;
4264     } else {
4265         uv = -iv;
4266         sign = 1;
4267     }
4268     do {
4269         *--ptr = '0' + (uv % 10);
4270     } while (uv /= 10);
4271     len = (buf + sizeof(buf)) - ptr;
4272     /* taking advantage of SvCUR(sv) == 0 */
4273     SvGROW(sv, sign + len + 1);
4274     p = SvPVX(sv);
4275     if (sign)
4276         *p++ = '-';
4277     memcpy(p, ptr, len);
4278     p += len;
4279     *p = '\0';
4280     SvCUR(sv) = p - SvPVX(sv);
4281 }
4282
4283
4284 void
4285 sv_setpviv_mg(SV *sv, IV iv)
4286 {
4287     sv_setpviv(sv,iv);
4288     SvSETMAGIC(sv);
4289 }
4290
4291 void
4292 sv_setpvf(SV *sv, const char* pat, ...)
4293 {
4294     va_list args;
4295     va_start(args, pat);
4296     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4297     va_end(args);
4298 }
4299
4300
4301 void
4302 sv_setpvf_mg(SV *sv, const char* pat, ...)
4303 {
4304     va_list args;
4305     va_start(args, pat);
4306     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4307     va_end(args);
4308     SvSETMAGIC(sv);
4309 }
4310
4311 void
4312 sv_catpvf(SV *sv, const char* pat, ...)
4313 {
4314     va_list args;
4315     va_start(args, pat);
4316     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4317     va_end(args);
4318 }
4319
4320 void
4321 sv_catpvf_mg(SV *sv, const char* pat, ...)
4322 {
4323     va_list args;
4324     va_start(args, pat);
4325     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4326     va_end(args);
4327     SvSETMAGIC(sv);
4328 }
4329
4330 void
4331 sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4332 {
4333     sv_setpvn(sv, "", 0);
4334     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4335 }
4336
4337 void
4338 sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4339 {
4340     dTHR;
4341     char *p;
4342     char *q;
4343     char *patend;
4344     STRLEN origlen;
4345     I32 svix = 0;
4346     static char nullstr[] = "(null)";
4347
4348     /* no matter what, this is a string now */
4349     (void)SvPV_force(sv, origlen);
4350
4351     /* special-case "", "%s", and "%_" */
4352     if (patlen == 0)
4353         return;
4354     if (patlen == 2 && pat[0] == '%') {
4355         switch (pat[1]) {
4356         case 's':
4357             if (args) {
4358                 char *s = va_arg(*args, char*);
4359                 sv_catpv(sv, s ? s : nullstr);
4360             }
4361             else if (svix < svmax)
4362                 sv_catsv(sv, *svargs);
4363             return;
4364         case '_':
4365             if (args) {
4366                 sv_catsv(sv, va_arg(*args, SV*));
4367                 return;
4368             }
4369             /* See comment on '_' below */
4370             break;
4371         }
4372     }
4373
4374     patend = (char*)pat + patlen;
4375     for (p = (char*)pat; p < patend; p = q) {
4376         bool alt = FALSE;
4377         bool left = FALSE;
4378         char fill = ' ';
4379         char plus = 0;
4380         char intsize = 0;
4381         STRLEN width = 0;
4382         STRLEN zeros = 0;
4383         bool has_precis = FALSE;
4384         STRLEN precis = 0;
4385
4386         char esignbuf[4];
4387         U8 utf8buf[10];
4388         STRLEN esignlen = 0;
4389
4390         char *eptr = Nullch;
4391         STRLEN elen = 0;
4392         char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
4393         char c;
4394         int i;
4395         unsigned base;
4396         IV iv;
4397         UV uv;
4398         double nv;
4399         STRLEN have;
4400         STRLEN need;
4401         STRLEN gap;
4402
4403         for (q = p; q < patend && *q != '%'; ++q) ;
4404         if (q > p) {
4405             sv_catpvn(sv, p, q - p);
4406             p = q;
4407         }
4408         if (q++ >= patend)
4409             break;
4410
4411         /* FLAGS */
4412
4413         while (*q) {
4414             switch (*q) {
4415             case ' ':
4416             case '+':
4417                 plus = *q++;
4418                 continue;
4419
4420             case '-':
4421                 left = TRUE;
4422                 q++;
4423                 continue;
4424
4425             case '0':
4426                 fill = *q++;
4427                 continue;
4428
4429             case '#':
4430                 alt = TRUE;
4431                 q++;
4432                 continue;
4433
4434             default:
4435                 break;
4436             }
4437             break;
4438         }
4439
4440         /* WIDTH */
4441
4442         switch (*q) {
4443         case '1': case '2': case '3':
4444         case '4': case '5': case '6':
4445         case '7': case '8': case '9':
4446             width = 0;
4447             while (isDIGIT(*q))
4448                 width = width * 10 + (*q++ - '0');
4449             break;
4450
4451         case '*':
4452             if (args)
4453                 i = va_arg(*args, int);
4454             else
4455                 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4456             left |= (i < 0);
4457             width = (i < 0) ? -i : i;
4458             q++;
4459             break;
4460         }
4461
4462         /* PRECISION */
4463
4464         if (*q == '.') {
4465             q++;
4466             if (*q == '*') {
4467                 if (args)
4468                     i = va_arg(*args, int);
4469                 else
4470                     i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4471                 precis = (i < 0) ? 0 : i;
4472                 q++;
4473             }
4474             else {
4475                 precis = 0;
4476                 while (isDIGIT(*q))
4477                     precis = precis * 10 + (*q++ - '0');
4478             }
4479             has_precis = TRUE;
4480         }
4481
4482         /* SIZE */
4483
4484         switch (*q) {
4485         case 'l':
4486 #if 0  /* when quads have better support within Perl */
4487             if (*(q + 1) == 'l') {
4488                 intsize = 'q';
4489                 q += 2;
4490                 break;
4491             }
4492 #endif
4493             /* FALL THROUGH */
4494         case 'h':
4495         case 'V':
4496             intsize = *q++;
4497             break;
4498         }
4499
4500         /* CONVERSION */
4501
4502         switch (c = *q++) {
4503
4504             /* STRINGS */
4505
4506         case '%':
4507             eptr = q - 1;
4508             elen = 1;
4509             goto string;
4510
4511         case 'c':
4512             if (IN_UTF8) {
4513                 if (args)
4514                     uv = va_arg(*args, int);
4515                 else
4516                     uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4517
4518                 eptr = (char*)utf8buf;
4519                 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
4520                 goto string;
4521             }
4522             if (args)
4523                 c = va_arg(*args, int);
4524             else
4525                 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4526             eptr = &c;
4527             elen = 1;
4528             goto string;
4529
4530         case 's':
4531             if (args) {
4532                 eptr = va_arg(*args, char*);
4533                 if (eptr)
4534                     elen = strlen(eptr);
4535                 else {
4536                     eptr = nullstr;
4537                     elen = sizeof nullstr - 1;
4538                 }
4539             }
4540             else if (svix < svmax) {
4541                 eptr = SvPVx(svargs[svix++], elen);
4542                 if (IN_UTF8) {
4543                     if (has_precis && precis < elen) {
4544                         I32 p = precis;
4545                         sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4546                         precis = p;
4547                     }
4548                     if (width) { /* fudge width (can't fudge elen) */
4549                         width += elen - sv_len_utf8(svargs[svix - 1]);
4550                     }
4551                 }
4552             }
4553             goto string;
4554
4555         case '_':
4556             /*
4557              * The "%_" hack might have to be changed someday,
4558              * if ISO or ANSI decide to use '_' for something.
4559              * So we keep it hidden from users' code.
4560              */
4561             if (!args)
4562                 goto unknown;
4563             eptr = SvPVx(va_arg(*args, SV*), elen);
4564
4565         string:
4566             if (has_precis && elen > precis)
4567                 elen = precis;
4568             break;
4569
4570             /* INTEGERS */
4571
4572         case 'p':
4573             if (args)
4574                 uv = (UV)va_arg(*args, void*);
4575             else
4576                 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4577             base = 16;
4578             goto integer;
4579
4580         case 'D':
4581             intsize = 'l';
4582             /* FALL THROUGH */
4583         case 'd':
4584         case 'i':
4585             if (args) {
4586                 switch (intsize) {
4587                 case 'h':       iv = (short)va_arg(*args, int); break;
4588                 default:        iv = va_arg(*args, int); break;
4589                 case 'l':       iv = va_arg(*args, long); break;
4590                 case 'V':       iv = va_arg(*args, IV); break;
4591                 }
4592             }
4593             else {
4594                 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4595                 switch (intsize) {
4596                 case 'h':       iv = (short)iv; break;
4597                 default:        iv = (int)iv; break;
4598                 case 'l':       iv = (long)iv; break;
4599                 case 'V':       break;
4600                 }
4601             }
4602             if (iv >= 0) {
4603                 uv = iv;
4604                 if (plus)
4605                     esignbuf[esignlen++] = plus;
4606             }
4607             else {
4608                 uv = -iv;
4609                 esignbuf[esignlen++] = '-';
4610             }
4611             base = 10;
4612             goto integer;
4613
4614         case 'U':
4615             intsize = 'l';
4616             /* FALL THROUGH */
4617         case 'u':
4618             base = 10;
4619             goto uns_integer;
4620
4621         case 'b':
4622             base = 2;
4623             goto uns_integer;
4624
4625         case 'O':
4626             intsize = 'l';
4627             /* FALL THROUGH */
4628         case 'o':
4629             base = 8;
4630             goto uns_integer;
4631
4632         case 'X':
4633         case 'x':
4634             base = 16;
4635
4636         uns_integer:
4637             if (args) {
4638                 switch (intsize) {
4639                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
4640                 default:   uv = va_arg(*args, unsigned); break;
4641                 case 'l':  uv = va_arg(*args, unsigned long); break;
4642                 case 'V':  uv = va_arg(*args, UV); break;
4643                 }
4644             }
4645             else {
4646                 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4647                 switch (intsize) {
4648                 case 'h':       uv = (unsigned short)uv; break;
4649                 default:        uv = (unsigned)uv; break;
4650                 case 'l':       uv = (unsigned long)uv; break;
4651                 case 'V':       break;
4652                 }
4653             }
4654
4655         integer:
4656             eptr = ebuf + sizeof ebuf;
4657             switch (base) {
4658                 unsigned dig;
4659             case 16:
4660                 if (!uv)
4661                     alt = FALSE;
4662                 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4663                 do {
4664                     dig = uv & 15;
4665                     *--eptr = p[dig];
4666                 } while (uv >>= 4);
4667                 if (alt) {
4668                     esignbuf[esignlen++] = '0';
4669                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
4670                 }
4671                 break;
4672             case 8:
4673                 do {
4674                     dig = uv & 7;
4675                     *--eptr = '0' + dig;
4676                 } while (uv >>= 3);
4677                 if (alt && *eptr != '0')
4678                     *--eptr = '0';
4679                 break;
4680             case 2:
4681                 do {
4682                     dig = uv & 1;
4683                     *--eptr = '0' + dig;
4684                 } while (uv >>= 1);
4685                 if (alt && *eptr != '0')
4686                     *--eptr = '0';
4687                 break;
4688             default:            /* it had better be ten or less */
4689                 do {
4690                     dig = uv % base;
4691                     *--eptr = '0' + dig;
4692                 } while (uv /= base);
4693                 break;
4694             }
4695             elen = (ebuf + sizeof ebuf) - eptr;
4696             if (has_precis) {
4697                 if (precis > elen)
4698                     zeros = precis - elen;
4699                 else if (precis == 0 && elen == 1 && *eptr == '0')
4700                     elen = 0;
4701             }
4702             break;
4703
4704             /* FLOATING POINT */
4705
4706         case 'F':
4707             c = 'f';            /* maybe %F isn't supported here */
4708             /* FALL THROUGH */
4709         case 'e': case 'E':
4710         case 'f':
4711         case 'g': case 'G':
4712
4713             /* This is evil, but floating point is even more evil */
4714
4715             if (args)
4716                 nv = va_arg(*args, double);
4717             else
4718                 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
4719
4720             need = 0;
4721             if (c != 'e' && c != 'E') {
4722                 i = PERL_INT_MIN;
4723                 (void)frexp(nv, &i);
4724                 if (i == PERL_INT_MIN)
4725                     die("panic: frexp");
4726                 if (i > 0)
4727                     need = BIT_DIGITS(i);
4728             }
4729             need += has_precis ? precis : 6; /* known default */
4730             if (need < width)
4731                 need = width;
4732
4733             need += 20; /* fudge factor */
4734             if (PL_efloatsize < need) {
4735                 Safefree(PL_efloatbuf);
4736                 PL_efloatsize = need + 20; /* more fudge */
4737                 New(906, PL_efloatbuf, PL_efloatsize, char);
4738             }
4739
4740             eptr = ebuf + sizeof ebuf;
4741             *--eptr = '\0';
4742             *--eptr = c;
4743             if (has_precis) {
4744                 base = precis;
4745                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4746                 *--eptr = '.';
4747             }
4748             if (width) {
4749                 base = width;
4750                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4751             }
4752             if (fill == '0')
4753                 *--eptr = fill;
4754             if (left)
4755                 *--eptr = '-';
4756             if (plus)
4757                 *--eptr = plus;
4758             if (alt)
4759                 *--eptr = '#';
4760             *--eptr = '%';
4761
4762             (void)sprintf(PL_efloatbuf, eptr, nv);
4763
4764             eptr = PL_efloatbuf;
4765             elen = strlen(PL_efloatbuf);
4766
4767 #ifdef LC_NUMERIC
4768             /*
4769              * User-defined locales may include arbitrary characters.
4770              * And, unfortunately, some system may alloc the "C" locale
4771              * to be overridden by a malicious user.
4772              */
4773             if (used_locale)
4774                 *used_locale = TRUE;
4775 #endif /* LC_NUMERIC */
4776
4777             break;
4778
4779             /* SPECIAL */
4780
4781         case 'n':
4782             i = SvCUR(sv) - origlen;
4783             if (args) {
4784                 switch (intsize) {
4785                 case 'h':       *(va_arg(*args, short*)) = i; break;
4786                 default:        *(va_arg(*args, int*)) = i; break;
4787                 case 'l':       *(va_arg(*args, long*)) = i; break;
4788                 case 'V':       *(va_arg(*args, IV*)) = i; break;
4789                 }
4790             }
4791             else if (svix < svmax)
4792                 sv_setuv(svargs[svix++], (UV)i);
4793             continue;   /* not "break" */
4794
4795             /* UNKNOWN */
4796
4797         default:
4798       unknown:
4799             if (!args && ckWARN(WARN_PRINTF) &&
4800                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
4801                 SV *msg = sv_newmortal();
4802                 sv_setpvf(msg, "Invalid conversion in %s: ",
4803                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
4804                 if (c)
4805                     sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
4806                               c & 0xFF);
4807                 else
4808                     sv_catpv(msg, "end of string");
4809                 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
4810             }
4811
4812             /* output mangled stuff ... */
4813             if (c == '\0')
4814                 --q;
4815             eptr = p;
4816             elen = q - p;
4817
4818             /* ... right here, because formatting flags should not apply */
4819             SvGROW(sv, SvCUR(sv) + elen + 1);
4820             p = SvEND(sv);
4821             memcpy(p, eptr, elen);
4822             p += elen;
4823             *p = '\0';
4824             SvCUR(sv) = p - SvPVX(sv);
4825             continue;   /* not "break" */
4826         }
4827
4828         have = esignlen + zeros + elen;
4829         need = (have > width ? have : width);
4830         gap = need - have;
4831
4832         SvGROW(sv, SvCUR(sv) + need + 1);
4833         p = SvEND(sv);
4834         if (esignlen && fill == '0') {
4835             for (i = 0; i < esignlen; i++)
4836                 *p++ = esignbuf[i];
4837         }
4838         if (gap && !left) {
4839             memset(p, fill, gap);
4840             p += gap;
4841         }
4842         if (esignlen && fill != '0') {
4843             for (i = 0; i < esignlen; i++)
4844                 *p++ = esignbuf[i];
4845         }
4846         if (zeros) {
4847             for (i = zeros; i; i--)
4848                 *p++ = '0';
4849         }
4850         if (elen) {
4851             memcpy(p, eptr, elen);
4852             p += elen;
4853         }
4854         if (gap && left) {
4855             memset(p, ' ', gap);
4856             p += gap;
4857         }
4858         *p = '\0';
4859         SvCUR(sv) = p - SvPVX(sv);
4860     }
4861 }