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