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