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