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