This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
patch for daemonization docs in perlipc
[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);
97cc44eb 697 iv = (IV)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
925char *
8ac85365 926sv_peek(SV *sv)
79072805 927{
35ff7856 928#ifdef DEBUGGING
46fc3d4c 929 SV *t = sv_newmortal();
930 STRLEN prevlen;
a0d0e21e 931 int unref = 0;
79072805 932
2b98c477 933 sv_setpvn(t, "", 0);
79072805
LW
934 retry:
935 if (!sv) {
46fc3d4c 936 sv_catpv(t, "VOID");
a0d0e21e 937 goto finish;
79072805
LW
938 }
939 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
46fc3d4c 940 sv_catpv(t, "WILD");
a0d0e21e
LW
941 goto finish;
942 }
3280af22
NIS
943 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes) {
944 if (sv == &PL_sv_undef) {
46fc3d4c 945 sv_catpv(t, "SV_UNDEF");
a0d0e21e
LW
946 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
947 SVs_GMG|SVs_SMG|SVs_RMG)) &&
948 SvREADONLY(sv))
949 goto finish;
950 }
3280af22 951 else if (sv == &PL_sv_no) {
46fc3d4c 952 sv_catpv(t, "SV_NO");
a0d0e21e
LW
953 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
954 SVs_GMG|SVs_SMG|SVs_RMG)) &&
955 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
956 SVp_POK|SVp_NOK)) &&
957 SvCUR(sv) == 0 &&
958 SvNVX(sv) == 0.0)
959 goto finish;
960 }
961 else {
46fc3d4c 962 sv_catpv(t, "SV_YES");
a0d0e21e
LW
963 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
964 SVs_GMG|SVs_SMG|SVs_RMG)) &&
965 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
966 SVp_POK|SVp_NOK)) &&
967 SvCUR(sv) == 1 &&
968 SvPVX(sv) && *SvPVX(sv) == '1' &&
969 SvNVX(sv) == 1.0)
970 goto finish;
971 }
46fc3d4c 972 sv_catpv(t, ":");
79072805 973 }
a0d0e21e 974 else if (SvREFCNT(sv) == 0) {
46fc3d4c 975 sv_catpv(t, "(");
a0d0e21e 976 unref++;
79072805 977 }
a0d0e21e 978 if (SvROK(sv)) {
46fc3d4c 979 sv_catpv(t, "\\");
980 if (SvCUR(t) + unref > 10) {
981 SvCUR(t) = unref + 3;
982 *SvEND(t) = '\0';
983 sv_catpv(t, "...");
a0d0e21e 984 goto finish;
79072805 985 }
a0d0e21e
LW
986 sv = (SV*)SvRV(sv);
987 goto retry;
988 }
989 switch (SvTYPE(sv)) {
990 default:
46fc3d4c 991 sv_catpv(t, "FREED");
a0d0e21e
LW
992 goto finish;
993
994 case SVt_NULL:
46fc3d4c 995 sv_catpv(t, "UNDEF");
96827780 996 goto finish;
a0d0e21e 997 case SVt_IV:
46fc3d4c 998 sv_catpv(t, "IV");
a0d0e21e
LW
999 break;
1000 case SVt_NV:
46fc3d4c 1001 sv_catpv(t, "NV");
a0d0e21e
LW
1002 break;
1003 case SVt_RV:
46fc3d4c 1004 sv_catpv(t, "RV");
a0d0e21e
LW
1005 break;
1006 case SVt_PV:
46fc3d4c 1007 sv_catpv(t, "PV");
a0d0e21e
LW
1008 break;
1009 case SVt_PVIV:
46fc3d4c 1010 sv_catpv(t, "PVIV");
a0d0e21e
LW
1011 break;
1012 case SVt_PVNV:
46fc3d4c 1013 sv_catpv(t, "PVNV");
a0d0e21e
LW
1014 break;
1015 case SVt_PVMG:
46fc3d4c 1016 sv_catpv(t, "PVMG");
a0d0e21e
LW
1017 break;
1018 case SVt_PVLV:
46fc3d4c 1019 sv_catpv(t, "PVLV");
a0d0e21e
LW
1020 break;
1021 case SVt_PVAV:
46fc3d4c 1022 sv_catpv(t, "AV");
a0d0e21e
LW
1023 break;
1024 case SVt_PVHV:
46fc3d4c 1025 sv_catpv(t, "HV");
a0d0e21e
LW
1026 break;
1027 case SVt_PVCV:
1028 if (CvGV(sv))
46fc3d4c 1029 sv_catpvf(t, "CV(%s)", GvNAME(CvGV(sv)));
a0d0e21e 1030 else
46fc3d4c 1031 sv_catpv(t, "CV()");
a0d0e21e
LW
1032 goto finish;
1033 case SVt_PVGV:
46fc3d4c 1034 sv_catpv(t, "GV");
a0d0e21e
LW
1035 break;
1036 case SVt_PVBM:
46fc3d4c 1037 sv_catpv(t, "BM");
a0d0e21e
LW
1038 break;
1039 case SVt_PVFM:
46fc3d4c 1040 sv_catpv(t, "FM");
a0d0e21e
LW
1041 break;
1042 case SVt_PVIO:
46fc3d4c 1043 sv_catpv(t, "IO");
a0d0e21e 1044 break;
79072805 1045 }
79072805 1046
a0d0e21e 1047 if (SvPOKp(sv)) {
463ee0b2 1048 if (!SvPVX(sv))
46fc3d4c 1049 sv_catpv(t, "(null)");
79072805 1050 if (SvOOK(sv))
46fc3d4c 1051 sv_catpvf(t, "(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
79072805 1052 else
46fc3d4c 1053 sv_catpvf(t, "(\"%.127s\")",SvPVX(sv));
79072805 1054 }
bbce6d69 1055 else if (SvNOKp(sv)) {
36477c24 1056 SET_NUMERIC_STANDARD();
46fc3d4c 1057 sv_catpvf(t, "(%g)",SvNVX(sv));
bbce6d69 1058 }
a0d0e21e 1059 else if (SvIOKp(sv))
46fc3d4c 1060 sv_catpvf(t, "(%ld)",(long)SvIVX(sv));
79072805 1061 else
46fc3d4c 1062 sv_catpv(t, "()");
a0d0e21e
LW
1063
1064 finish:
1065 if (unref) {
a0d0e21e 1066 while (unref--)
46fc3d4c 1067 sv_catpv(t, ")");
a0d0e21e 1068 }
3280af22 1069 return SvPV(t, PL_na);
35ff7856
GS
1070#else /* DEBUGGING */
1071 return "";
1072#endif /* DEBUGGING */
79072805
LW
1073}
1074
1075int
8ac85365 1076sv_backoff(register SV *sv)
79072805
LW
1077{
1078 assert(SvOOK(sv));
463ee0b2
LW
1079 if (SvIVX(sv)) {
1080 char *s = SvPVX(sv);
1081 SvLEN(sv) += SvIVX(sv);
1082 SvPVX(sv) -= SvIVX(sv);
79072805 1083 SvIV_set(sv, 0);
463ee0b2 1084 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
1085 }
1086 SvFLAGS(sv) &= ~SVf_OOK;
a0d0e21e 1087 return 0;
79072805
LW
1088}
1089
1090char *
22c35a8c 1091sv_grow(register SV *sv, register STRLEN newlen)
79072805
LW
1092{
1093 register char *s;
1094
55497cff 1095#ifdef HAS_64K_LIMIT
79072805 1096 if (newlen >= 0x10000) {
d1bf51dd 1097 PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
79072805
LW
1098 my_exit(1);
1099 }
55497cff 1100#endif /* HAS_64K_LIMIT */
a0d0e21e
LW
1101 if (SvROK(sv))
1102 sv_unref(sv);
79072805
LW
1103 if (SvTYPE(sv) < SVt_PV) {
1104 sv_upgrade(sv, SVt_PV);
463ee0b2 1105 s = SvPVX(sv);
79072805
LW
1106 }
1107 else if (SvOOK(sv)) { /* pv is offset? */
1108 sv_backoff(sv);
463ee0b2 1109 s = SvPVX(sv);
79072805
LW
1110 if (newlen > SvLEN(sv))
1111 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
c6f8c383
GA
1112#ifdef HAS_64K_LIMIT
1113 if (newlen >= 0x10000)
1114 newlen = 0xFFFF;
1115#endif
79072805
LW
1116 }
1117 else
463ee0b2 1118 s = SvPVX(sv);
79072805 1119 if (newlen > SvLEN(sv)) { /* need more room? */
8d6dde3e 1120 if (SvLEN(sv) && s) {
1fe09876 1121#if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
8d6dde3e
IZ
1122 STRLEN l = malloced_size((void*)SvPVX(sv));
1123 if (newlen <= l) {
1124 SvLEN_set(sv, l);
1125 return s;
1126 } else
c70c8a0a 1127#endif
79072805 1128 Renew(s,newlen,char);
8d6dde3e 1129 }
79072805
LW
1130 else
1131 New(703,s,newlen,char);
1132 SvPV_set(sv, s);
1133 SvLEN_set(sv, newlen);
1134 }
1135 return s;
1136}
1137
1138void
8ac85365 1139sv_setiv(register SV *sv, IV i)
79072805 1140{
2213622d 1141 SV_CHECK_THINKFIRST(sv);
463ee0b2
LW
1142 switch (SvTYPE(sv)) {
1143 case SVt_NULL:
79072805 1144 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
1145 break;
1146 case SVt_NV:
1147 sv_upgrade(sv, SVt_PVNV);
1148 break;
ed6116ce 1149 case SVt_RV:
463ee0b2 1150 case SVt_PV:
79072805 1151 sv_upgrade(sv, SVt_PVIV);
463ee0b2 1152 break;
a0d0e21e
LW
1153
1154 case SVt_PVGV:
1155 if (SvFAKE(sv)) {
1156 sv_unglob(sv);
1157 break;
1158 }
1159 /* FALL THROUGH */
1160 case SVt_PVAV:
1161 case SVt_PVHV:
1162 case SVt_PVCV:
1163 case SVt_PVFM:
1164 case SVt_PVIO:
11343788
MB
1165 {
1166 dTHR;
1167 croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
22c35a8c 1168 PL_op_desc[PL_op->op_type]);
11343788 1169 }
463ee0b2 1170 }
a0d0e21e 1171 (void)SvIOK_only(sv); /* validate number */
a5f75d66 1172 SvIVX(sv) = i;
463ee0b2 1173 SvTAINT(sv);
79072805
LW
1174}
1175
1176void
ef50df4b
GS
1177sv_setiv_mg(register SV *sv, IV i)
1178{
1179 sv_setiv(sv,i);
1180 SvSETMAGIC(sv);
1181}
1182
1183void
8ac85365 1184sv_setuv(register SV *sv, UV u)
55497cff 1185{
1186 if (u <= IV_MAX)
1187 sv_setiv(sv, u);
1188 else
1189 sv_setnv(sv, (double)u);
1190}
1191
1192void
ef50df4b
GS
1193sv_setuv_mg(register SV *sv, UV u)
1194{
1195 sv_setuv(sv,u);
1196 SvSETMAGIC(sv);
1197}
1198
1199void
8ac85365 1200sv_setnv(register SV *sv, double num)
79072805 1201{
2213622d 1202 SV_CHECK_THINKFIRST(sv);
a0d0e21e
LW
1203 switch (SvTYPE(sv)) {
1204 case SVt_NULL:
1205 case SVt_IV:
79072805 1206 sv_upgrade(sv, SVt_NV);
a0d0e21e 1207 break;
a0d0e21e
LW
1208 case SVt_RV:
1209 case SVt_PV:
1210 case SVt_PVIV:
79072805 1211 sv_upgrade(sv, SVt_PVNV);
a0d0e21e 1212 break;
827b7e14 1213
a0d0e21e
LW
1214 case SVt_PVGV:
1215 if (SvFAKE(sv)) {
1216 sv_unglob(sv);
1217 break;
1218 }
1219 /* FALL THROUGH */
1220 case SVt_PVAV:
1221 case SVt_PVHV:
1222 case SVt_PVCV:
1223 case SVt_PVFM:
1224 case SVt_PVIO:
11343788
MB
1225 {
1226 dTHR;
1227 croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
22c35a8c 1228 PL_op_name[PL_op->op_type]);
11343788 1229 }
79072805 1230 }
463ee0b2 1231 SvNVX(sv) = num;
a0d0e21e 1232 (void)SvNOK_only(sv); /* validate number */
463ee0b2 1233 SvTAINT(sv);
79072805
LW
1234}
1235
ef50df4b
GS
1236void
1237sv_setnv_mg(register SV *sv, double num)
1238{
1239 sv_setnv(sv,num);
1240 SvSETMAGIC(sv);
1241}
1242
76e3520e 1243STATIC void
8ac85365 1244not_a_number(SV *sv)
a0d0e21e 1245{
11343788 1246 dTHR;
a0d0e21e
LW
1247 char tmpbuf[64];
1248 char *d = tmpbuf;
1249 char *s;
dc28f22b
GA
1250 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1251 /* each *s can expand to 4 chars + "...\0",
1252 i.e. need room for 8 chars */
a0d0e21e 1253
dc28f22b 1254 for (s = SvPVX(sv); *s && d < limit; s++) {
bbce6d69 1255 int ch = *s & 0xFF;
1256 if (ch & 128 && !isPRINT_LC(ch)) {
a0d0e21e
LW
1257 *d++ = 'M';
1258 *d++ = '-';
1259 ch &= 127;
1260 }
bbce6d69 1261 if (ch == '\n') {
1262 *d++ = '\\';
1263 *d++ = 'n';
1264 }
1265 else if (ch == '\r') {
1266 *d++ = '\\';
1267 *d++ = 'r';
1268 }
1269 else if (ch == '\f') {
1270 *d++ = '\\';
1271 *d++ = 'f';
1272 }
1273 else if (ch == '\\') {
1274 *d++ = '\\';
1275 *d++ = '\\';
1276 }
1277 else if (isPRINT_LC(ch))
a0d0e21e
LW
1278 *d++ = ch;
1279 else {
1280 *d++ = '^';
bbce6d69 1281 *d++ = toCTRL(ch);
a0d0e21e
LW
1282 }
1283 }
1284 if (*s) {
1285 *d++ = '.';
1286 *d++ = '.';
1287 *d++ = '.';
1288 }
1289 *d = '\0';
1290
533c011a 1291 if (PL_op)
599cee73 1292 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
22c35a8c 1293 PL_op_name[PL_op->op_type]);
a0d0e21e 1294 else
599cee73 1295 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
a0d0e21e
LW
1296}
1297
1298IV
8ac85365 1299sv_2iv(register SV *sv)
79072805
LW
1300{
1301 if (!sv)
1302 return 0;
8990e307 1303 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1304 mg_get(sv);
1305 if (SvIOKp(sv))
1306 return SvIVX(sv);
748a9306
LW
1307 if (SvNOKp(sv)) {
1308 if (SvNVX(sv) < 0.0)
1309 return I_V(SvNVX(sv));
1310 else
5d94fbed 1311 return (IV) U_V(SvNVX(sv));
748a9306 1312 }
36477c24 1313 if (SvPOKp(sv) && SvLEN(sv))
1314 return asIV(sv);
3fe9a6f1 1315 if (!SvROK(sv)) {
d008e5eb 1316 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1317 dTHR;
d008e5eb 1318 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1319 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1320 }
36477c24 1321 return 0;
3fe9a6f1 1322 }
463ee0b2 1323 }
ed6116ce 1324 if (SvTHINKFIRST(sv)) {
a0d0e21e
LW
1325 if (SvROK(sv)) {
1326#ifdef OVERLOAD
1327 SV* tmpstr;
1328 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1329 return SvIV(tmpstr);
1330#endif /* OVERLOAD */
1331 return (IV)SvRV(sv);
1332 }
ed6116ce 1333 if (SvREADONLY(sv)) {
748a9306
LW
1334 if (SvNOKp(sv)) {
1335 if (SvNVX(sv) < 0.0)
1336 return I_V(SvNVX(sv));
1337 else
5d94fbed 1338 return (IV) U_V(SvNVX(sv));
748a9306 1339 }
36477c24 1340 if (SvPOKp(sv) && SvLEN(sv))
1341 return asIV(sv);
d008e5eb
GS
1342 {
1343 dTHR;
1344 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1345 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1346 }
ed6116ce
LW
1347 return 0;
1348 }
79072805 1349 }
463ee0b2 1350 switch (SvTYPE(sv)) {
463ee0b2 1351 case SVt_NULL:
79072805 1352 sv_upgrade(sv, SVt_IV);
8ebc5c01 1353 break;
463ee0b2 1354 case SVt_PV:
79072805 1355 sv_upgrade(sv, SVt_PVIV);
463ee0b2
LW
1356 break;
1357 case SVt_NV:
1358 sv_upgrade(sv, SVt_PVNV);
1359 break;
1360 }
748a9306 1361 if (SvNOKp(sv)) {
a5f75d66 1362 (void)SvIOK_on(sv);
748a9306
LW
1363 if (SvNVX(sv) < 0.0)
1364 SvIVX(sv) = I_V(SvNVX(sv));
1365 else
ff68c719 1366 SvUVX(sv) = U_V(SvNVX(sv));
748a9306
LW
1367 }
1368 else if (SvPOKp(sv) && SvLEN(sv)) {
a5f75d66 1369 (void)SvIOK_on(sv);
36477c24 1370 SvIVX(sv) = asIV(sv);
93a17b20 1371 }
79072805 1372 else {
11343788 1373 dTHR;
599cee73 1374 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1375 warner(WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e 1376 return 0;
79072805 1377 }
760ac839 1378 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
a0d0e21e 1379 (unsigned long)sv,(long)SvIVX(sv)));
463ee0b2 1380 return SvIVX(sv);
79072805
LW
1381}
1382
ff68c719 1383UV
8ac85365 1384sv_2uv(register SV *sv)
ff68c719 1385{
1386 if (!sv)
1387 return 0;
1388 if (SvGMAGICAL(sv)) {
1389 mg_get(sv);
1390 if (SvIOKp(sv))
1391 return SvUVX(sv);
1392 if (SvNOKp(sv))
1393 return U_V(SvNVX(sv));
36477c24 1394 if (SvPOKp(sv) && SvLEN(sv))
1395 return asUV(sv);
3fe9a6f1 1396 if (!SvROK(sv)) {
d008e5eb 1397 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1398 dTHR;
d008e5eb 1399 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1400 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1401 }
36477c24 1402 return 0;
3fe9a6f1 1403 }
ff68c719 1404 }
1405 if (SvTHINKFIRST(sv)) {
1406 if (SvROK(sv)) {
1407#ifdef OVERLOAD
1408 SV* tmpstr;
1409 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1410 return SvUV(tmpstr);
1411#endif /* OVERLOAD */
1412 return (UV)SvRV(sv);
1413 }
1414 if (SvREADONLY(sv)) {
1415 if (SvNOKp(sv)) {
1416 return U_V(SvNVX(sv));
1417 }
36477c24 1418 if (SvPOKp(sv) && SvLEN(sv))
1419 return asUV(sv);
d008e5eb
GS
1420 {
1421 dTHR;
1422 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1423 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1424 }
ff68c719 1425 return 0;
1426 }
1427 }
1428 switch (SvTYPE(sv)) {
1429 case SVt_NULL:
1430 sv_upgrade(sv, SVt_IV);
8ebc5c01 1431 break;
ff68c719 1432 case SVt_PV:
1433 sv_upgrade(sv, SVt_PVIV);
1434 break;
1435 case SVt_NV:
1436 sv_upgrade(sv, SVt_PVNV);
1437 break;
1438 }
1439 if (SvNOKp(sv)) {
1440 (void)SvIOK_on(sv);
1441 SvUVX(sv) = U_V(SvNVX(sv));
1442 }
1443 else if (SvPOKp(sv) && SvLEN(sv)) {
ff68c719 1444 (void)SvIOK_on(sv);
36477c24 1445 SvUVX(sv) = asUV(sv);
ff68c719 1446 }
1447 else {
d008e5eb 1448 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1449 dTHR;
d008e5eb 1450 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1451 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1452 }
ff68c719 1453 return 0;
1454 }
1455 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1456 (unsigned long)sv,SvUVX(sv)));
1457 return SvUVX(sv);
1458}
1459
79072805 1460double
8ac85365 1461sv_2nv(register SV *sv)
79072805
LW
1462{
1463 if (!sv)
1464 return 0.0;
8990e307 1465 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1466 mg_get(sv);
1467 if (SvNOKp(sv))
1468 return SvNVX(sv);
a0d0e21e 1469 if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1470 dTHR;
599cee73 1471 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1472 not_a_number(sv);
36477c24 1473 SET_NUMERIC_STANDARD();
463ee0b2 1474 return atof(SvPVX(sv));
a0d0e21e 1475 }
463ee0b2
LW
1476 if (SvIOKp(sv))
1477 return (double)SvIVX(sv);
16d20bd9 1478 if (!SvROK(sv)) {
d008e5eb 1479 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1480 dTHR;
d008e5eb 1481 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1482 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1483 }
16d20bd9
AD
1484 return 0;
1485 }
463ee0b2 1486 }
ed6116ce 1487 if (SvTHINKFIRST(sv)) {
a0d0e21e
LW
1488 if (SvROK(sv)) {
1489#ifdef OVERLOAD
1490 SV* tmpstr;
1491 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
1492 return SvNV(tmpstr);
1493#endif /* OVERLOAD */
1494 return (double)(unsigned long)SvRV(sv);
1495 }
ed6116ce 1496 if (SvREADONLY(sv)) {
d008e5eb 1497 dTHR;
748a9306 1498 if (SvPOKp(sv) && SvLEN(sv)) {
599cee73 1499 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1500 not_a_number(sv);
36477c24 1501 SET_NUMERIC_STANDARD();
ed6116ce 1502 return atof(SvPVX(sv));
a0d0e21e 1503 }
748a9306 1504 if (SvIOKp(sv))
8990e307 1505 return (double)SvIVX(sv);
599cee73 1506 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1507 warner(WARN_UNINITIALIZED, PL_warn_uninit);
ed6116ce
LW
1508 return 0.0;
1509 }
79072805
LW
1510 }
1511 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
1512 if (SvTYPE(sv) == SVt_IV)
1513 sv_upgrade(sv, SVt_PVNV);
1514 else
1515 sv_upgrade(sv, SVt_NV);
36477c24 1516 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1517 DEBUG_c(PerlIO_printf(Perl_debug_log,
1518 "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
79072805
LW
1519 }
1520 else if (SvTYPE(sv) < SVt_PVNV)
1521 sv_upgrade(sv, SVt_PVNV);
748a9306
LW
1522 if (SvIOKp(sv) &&
1523 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 1524 {
463ee0b2 1525 SvNVX(sv) = (double)SvIVX(sv);
93a17b20 1526 }
748a9306 1527 else if (SvPOKp(sv) && SvLEN(sv)) {
d008e5eb 1528 dTHR;
599cee73 1529 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
a0d0e21e 1530 not_a_number(sv);
36477c24 1531 SET_NUMERIC_STANDARD();
463ee0b2 1532 SvNVX(sv) = atof(SvPVX(sv));
93a17b20 1533 }
79072805 1534 else {
11343788 1535 dTHR;
599cee73 1536 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1537 warner(WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e 1538 return 0.0;
79072805
LW
1539 }
1540 SvNOK_on(sv);
36477c24 1541 DEBUG_c(SET_NUMERIC_STANDARD());
bbce6d69 1542 DEBUG_c(PerlIO_printf(Perl_debug_log,
1543 "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
463ee0b2 1544 return SvNVX(sv);
79072805
LW
1545}
1546
76e3520e 1547STATIC IV
8ac85365 1548asIV(SV *sv)
36477c24 1549{
1550 I32 numtype = looks_like_number(sv);
1551 double d;
1552
1553 if (numtype == 1)
1554 return atol(SvPVX(sv));
d008e5eb
GS
1555 if (!numtype) {
1556 dTHR;
1557 if (ckWARN(WARN_NUMERIC))
1558 not_a_number(sv);
1559 }
36477c24 1560 SET_NUMERIC_STANDARD();
1561 d = atof(SvPVX(sv));
1562 if (d < 0.0)
1563 return I_V(d);
1564 else
1565 return (IV) U_V(d);
1566}
1567
76e3520e 1568STATIC UV
8ac85365 1569asUV(SV *sv)
36477c24 1570{
1571 I32 numtype = looks_like_number(sv);
1572
84902520 1573#ifdef HAS_STRTOUL
36477c24 1574 if (numtype == 1)
84902520
TB
1575 return strtoul(SvPVX(sv), Null(char**), 10);
1576#endif
d008e5eb
GS
1577 if (!numtype) {
1578 dTHR;
1579 if (ckWARN(WARN_NUMERIC))
1580 not_a_number(sv);
1581 }
36477c24 1582 SET_NUMERIC_STANDARD();
1583 return U_V(atof(SvPVX(sv)));
1584}
1585
1586I32
8ac85365 1587looks_like_number(SV *sv)
36477c24 1588{
1589 register char *s;
1590 register char *send;
1591 register char *sbegin;
ff0cee69 1592 I32 numtype;
36477c24 1593 STRLEN len;
1594
1595 if (SvPOK(sv)) {
1596 sbegin = SvPVX(sv);
1597 len = SvCUR(sv);
1598 }
1599 else if (SvPOKp(sv))
1600 sbegin = SvPV(sv, len);
1601 else
1602 return 1;
1603 send = sbegin + len;
1604
1605 s = sbegin;
1606 while (isSPACE(*s))
1607 s++;
36477c24 1608 if (*s == '+' || *s == '-')
1609 s++;
ff0cee69 1610
1611 /* next must be digit or '.' */
1612 if (isDIGIT(*s)) {
1613 do {
1614 s++;
1615 } while (isDIGIT(*s));
1616 if (*s == '.') {
1617 s++;
1618 while (isDIGIT(*s)) /* optional digits after "." */
1619 s++;
1620 }
36477c24 1621 }
ff0cee69 1622 else if (*s == '.') {
1623 s++;
1624 /* no digits before '.' means we need digits after it */
1625 if (isDIGIT(*s)) {
1626 do {
1627 s++;
1628 } while (isDIGIT(*s));
1629 }
1630 else
1631 return 0;
1632 }
1633 else
1634 return 0;
1635
1636 /*
1637 * we return 1 if the number can be converted to _integer_ with atol()
1638 * and 2 if you need (int)atof().
1639 */
1640 numtype = 1;
1641
1642 /* we can have an optional exponent part */
36477c24 1643 if (*s == 'e' || *s == 'E') {
1644 numtype = 2;
1645 s++;
1646 if (*s == '+' || *s == '-')
1647 s++;
ff0cee69 1648 if (isDIGIT(*s)) {
1649 do {
1650 s++;
1651 } while (isDIGIT(*s));
1652 }
1653 else
1654 return 0;
36477c24 1655 }
1656 while (isSPACE(*s))
1657 s++;
1658 if (s >= send)
1659 return numtype;
1660 if (len == 10 && memEQ(sbegin, "0 but true", 10))
1661 return 1;
1662 return 0;
1663}
1664
79072805 1665char *
8ac85365 1666sv_2pv(register SV *sv, STRLEN *lp)
79072805
LW
1667{
1668 register char *s;
1669 int olderrno;
46fc3d4c 1670 SV *tsv;
96827780 1671 char tmpbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
79072805 1672
463ee0b2
LW
1673 if (!sv) {
1674 *lp = 0;
1675 return "";
1676 }
8990e307 1677 if (SvGMAGICAL(sv)) {
463ee0b2
LW
1678 mg_get(sv);
1679 if (SvPOKp(sv)) {
1680 *lp = SvCUR(sv);
1681 return SvPVX(sv);
1682 }
1683 if (SvIOKp(sv)) {
96827780 1684 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
46fc3d4c 1685 tsv = Nullsv;
a0d0e21e 1686 goto tokensave;
463ee0b2
LW
1687 }
1688 if (SvNOKp(sv)) {
36477c24 1689 SET_NUMERIC_STANDARD();
96827780 1690 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1691 tsv = Nullsv;
a0d0e21e 1692 goto tokensave;
463ee0b2 1693 }
16d20bd9 1694 if (!SvROK(sv)) {
d008e5eb 1695 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
c6ee37c5 1696 dTHR;
d008e5eb 1697 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
22c35a8c 1698 warner(WARN_UNINITIALIZED, PL_warn_uninit);
c6ee37c5 1699 }
16d20bd9
AD
1700 *lp = 0;
1701 return "";
1702 }
463ee0b2 1703 }
ed6116ce
LW
1704 if (SvTHINKFIRST(sv)) {
1705 if (SvROK(sv)) {
a0d0e21e
LW
1706#ifdef OVERLOAD
1707 SV* tmpstr;
1708 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
1709 return SvPV(tmpstr,*lp);
1710#endif /* OVERLOAD */
ed6116ce
LW
1711 sv = (SV*)SvRV(sv);
1712 if (!sv)
1713 s = "NULLREF";
1714 else {
f9277f47
IZ
1715 MAGIC *mg;
1716
ed6116ce 1717 switch (SvTYPE(sv)) {
f9277f47
IZ
1718 case SVt_PVMG:
1719 if ( ((SvFLAGS(sv) &
1720 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3149a8e4 1721 == (SVs_OBJECT|SVs_RMG))
f9277f47
IZ
1722 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
1723 && (mg = mg_find(sv, 'r'))) {
5c0ca799 1724 dTHR;
2cd61cdb 1725 regexp *re = (regexp *)mg->mg_obj;
1bd3ad17 1726
2cd61cdb 1727 if (!mg->mg_ptr) {
8782bef2
GB
1728 char *fptr = "msix";
1729 char reflags[6];
1730 char ch;
1731 int left = 0;
1732 int right = 4;
1733 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1734
1735 while(ch = *fptr++) {
1736 if(reganch & 1) {
1737 reflags[left++] = ch;
1738 }
1739 else {
1740 reflags[right--] = ch;
1741 }
1742 reganch >>= 1;
1743 }
1744 if(left != 4) {
1745 reflags[left] = '-';
1746 left = 5;
1747 }
1748
1749 mg->mg_len = re->prelen + 4 + left;
1750 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1751 Copy("(?", mg->mg_ptr, 2, char);
1752 Copy(reflags, mg->mg_ptr+2, left, char);
1753 Copy(":", mg->mg_ptr+left+2, 1, char);
1754 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1bd3ad17
IZ
1755 mg->mg_ptr[mg->mg_len - 1] = ')';
1756 mg->mg_ptr[mg->mg_len] = 0;
1757 }
3280af22 1758 PL_reginterp_cnt += re->program[0].next_off;
1bd3ad17
IZ
1759 *lp = mg->mg_len;
1760 return mg->mg_ptr;
f9277f47
IZ
1761 }
1762 /* Fall through */
ed6116ce
LW
1763 case SVt_NULL:
1764 case SVt_IV:
1765 case SVt_NV:
1766 case SVt_RV:
1767 case SVt_PV:
1768 case SVt_PVIV:
1769 case SVt_PVNV:
f9277f47 1770 case SVt_PVBM: s = "SCALAR"; break;
ed6116ce
LW
1771 case SVt_PVLV: s = "LVALUE"; break;
1772 case SVt_PVAV: s = "ARRAY"; break;
1773 case SVt_PVHV: s = "HASH"; break;
1774 case SVt_PVCV: s = "CODE"; break;
1775 case SVt_PVGV: s = "GLOB"; break;
1d2dff63 1776 case SVt_PVFM: s = "FORMAT"; break;
36477c24 1777 case SVt_PVIO: s = "IO"; break;
ed6116ce
LW
1778 default: s = "UNKNOWN"; break;
1779 }
46fc3d4c 1780 tsv = NEWSV(0,0);
ed6116ce 1781 if (SvOBJECT(sv))
46fc3d4c 1782 sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
ed6116ce 1783 else
46fc3d4c 1784 sv_setpv(tsv, s);
1785 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
a0d0e21e 1786 goto tokensaveref;
463ee0b2 1787 }
ed6116ce
LW
1788 *lp = strlen(s);
1789 return s;
79072805 1790 }
ed6116ce 1791 if (SvREADONLY(sv)) {
748a9306 1792 if (SvNOKp(sv)) {
36477c24 1793 SET_NUMERIC_STANDARD();
96827780 1794 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
46fc3d4c 1795 tsv = Nullsv;
a0d0e21e 1796 goto tokensave;
ed6116ce 1797 }
8bb9dbe4 1798 if (SvIOKp(sv)) {
96827780 1799 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
46fc3d4c 1800 tsv = Nullsv;
8bb9dbe4
LW
1801 goto tokensave;
1802 }
d008e5eb
GS
1803 {
1804 dTHR;
1805 if (ckWARN(WARN_UNINITIALIZED))
22c35a8c 1806 warner(WARN_UNINITIALIZED, PL_warn_uninit);
d008e5eb 1807 }
ed6116ce
LW
1808 *lp = 0;
1809 return "";
79072805 1810 }
79072805 1811 }
c6f8c383 1812 (void)SvUPGRADE(sv, SVt_PV);
748a9306 1813 if (SvNOKp(sv)) {
79072805
LW
1814 if (SvTYPE(sv) < SVt_PVNV)
1815 sv_upgrade(sv, SVt_PVNV);
1816 SvGROW(sv, 28);
463ee0b2 1817 s = SvPVX(sv);
79072805 1818 olderrno = errno; /* some Xenix systems wipe out errno here */
79072805 1819#ifdef apollo
463ee0b2 1820 if (SvNVX(sv) == 0.0)
79072805
LW
1821 (void)strcpy(s,"0");
1822 else
1823#endif /*apollo*/
bbce6d69 1824 {
36477c24 1825 SET_NUMERIC_STANDARD();
a0d0e21e 1826 Gconvert(SvNVX(sv), DBL_DIG, 0, s);
bbce6d69 1827 }
79072805 1828 errno = olderrno;
a0d0e21e
LW
1829#ifdef FIXNEGATIVEZERO
1830 if (*s == '-' && s[1] == '0' && !s[2])
1831 strcpy(s,"0");
1832#endif
79072805
LW
1833 while (*s) s++;
1834#ifdef hcx
1835 if (s[-1] == '.')
46fc3d4c 1836 *--s = '\0';
79072805
LW
1837#endif
1838 }
748a9306 1839 else if (SvIOKp(sv)) {
64f14228 1840 U32 oldIOK = SvIOK(sv);
79072805
LW
1841 if (SvTYPE(sv) < SVt_PVIV)
1842 sv_upgrade(sv, SVt_PVIV);
79072805 1843 olderrno = errno; /* some Xenix systems wipe out errno here */
84902520 1844 sv_setpviv(sv, SvIVX(sv));
79072805 1845 errno = olderrno;
46fc3d4c 1846 s = SvEND(sv);
64f14228
GA
1847 if (oldIOK)
1848 SvIOK_on(sv);
1849 else
1850 SvIOKp_on(sv);
79072805
LW
1851 }
1852 else {
11343788 1853 dTHR;
599cee73 1854 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
22c35a8c 1855 warner(WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e
LW
1856 *lp = 0;
1857 return "";
79072805 1858 }
463ee0b2
LW
1859 *lp = s - SvPVX(sv);
1860 SvCUR_set(sv, *lp);
79072805 1861 SvPOK_on(sv);
760ac839 1862 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
463ee0b2 1863 return SvPVX(sv);
a0d0e21e
LW
1864
1865 tokensave:
1866 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
1867 /* Sneaky stuff here */
1868
1869 tokensaveref:
46fc3d4c 1870 if (!tsv)
96827780 1871 tsv = newSVpv(tmpbuf, 0);
46fc3d4c 1872 sv_2mortal(tsv);
1873 *lp = SvCUR(tsv);
1874 return SvPVX(tsv);
a0d0e21e
LW
1875 }
1876 else {
1877 STRLEN len;
46fc3d4c 1878 char *t;
1879
1880 if (tsv) {
1881 sv_2mortal(tsv);
1882 t = SvPVX(tsv);
1883 len = SvCUR(tsv);
1884 }
1885 else {
96827780
MB
1886 t = tmpbuf;
1887 len = strlen(tmpbuf);
46fc3d4c 1888 }
a0d0e21e 1889#ifdef FIXNEGATIVEZERO
46fc3d4c 1890 if (len == 2 && t[0] == '-' && t[1] == '0') {
1891 t = "0";
1892 len = 1;
1893 }
a0d0e21e
LW
1894#endif
1895 (void)SvUPGRADE(sv, SVt_PV);
46fc3d4c 1896 *lp = len;
a0d0e21e
LW
1897 s = SvGROW(sv, len + 1);
1898 SvCUR_set(sv, len);
46fc3d4c 1899 (void)strcpy(s, t);
6bf554b4 1900 SvPOKp_on(sv);
a0d0e21e
LW
1901 return s;
1902 }
463ee0b2
LW
1903}
1904
1905/* This function is only called on magical items */
1906bool
8ac85365 1907sv_2bool(register SV *sv)
463ee0b2 1908{
8990e307 1909 if (SvGMAGICAL(sv))
463ee0b2
LW
1910 mg_get(sv);
1911
a0d0e21e
LW
1912 if (!SvOK(sv))
1913 return 0;
1914 if (SvROK(sv)) {
1915#ifdef OVERLOAD
1916 {
11343788 1917 dTHR;
a0d0e21e
LW
1918 SV* tmpsv;
1919 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
1920 return SvTRUE(tmpsv);
1921 }
1922#endif /* OVERLOAD */
1923 return SvRV(sv) != 0;
1924 }
463ee0b2 1925 if (SvPOKp(sv)) {
11343788
MB
1926 register XPV* Xpvtmp;
1927 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
1928 (*Xpvtmp->xpv_pv > '0' ||
1929 Xpvtmp->xpv_cur > 1 ||
1930 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
463ee0b2
LW
1931 return 1;
1932 else
1933 return 0;
1934 }
1935 else {
1936 if (SvIOKp(sv))
1937 return SvIVX(sv) != 0;
1938 else {
1939 if (SvNOKp(sv))
1940 return SvNVX(sv) != 0.0;
1941 else
1942 return FALSE;
1943 }
1944 }
79072805
LW
1945}
1946
1947/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 1948 * to be reused, since it may destroy the source string if it is marked
79072805
LW
1949 * as temporary.
1950 */
1951
1952void
8ac85365 1953sv_setsv(SV *dstr, register SV *sstr)
79072805 1954{
11343788 1955 dTHR;
8990e307
LW
1956 register U32 sflags;
1957 register int dtype;
1958 register int stype;
463ee0b2 1959
79072805
LW
1960 if (sstr == dstr)
1961 return;
2213622d 1962 SV_CHECK_THINKFIRST(dstr);
79072805 1963 if (!sstr)
3280af22 1964 sstr = &PL_sv_undef;
8990e307
LW
1965 stype = SvTYPE(sstr);
1966 dtype = SvTYPE(dstr);
79072805 1967
8e07c86e
AD
1968 if (dtype == SVt_PVGV && (SvFLAGS(dstr) & SVf_FAKE)) {
1969 sv_unglob(dstr); /* so fake GLOB won't perpetuate */
4633a7c4
LW
1970 sv_setpvn(dstr, "", 0);
1971 (void)SvPOK_only(dstr);
8e07c86e
AD
1972 dtype = SvTYPE(dstr);
1973 }
1974
a0d0e21e
LW
1975#ifdef OVERLOAD
1976 SvAMAGIC_off(dstr);
1977#endif /* OVERLOAD */
463ee0b2 1978 /* There's a lot of redundancy below but we're going for speed here */
79072805 1979
8990e307 1980 switch (stype) {
79072805 1981 case SVt_NULL:
aece5585 1982 undef_sstr:
20408e3c
GS
1983 if (dtype != SVt_PVGV) {
1984 (void)SvOK_off(dstr);
1985 return;
1986 }
1987 break;
463ee0b2 1988 case SVt_IV:
aece5585
GA
1989 if (SvIOK(sstr)) {
1990 switch (dtype) {
1991 case SVt_NULL:
8990e307 1992 sv_upgrade(dstr, SVt_IV);
aece5585
GA
1993 break;
1994 case SVt_NV:
8990e307 1995 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
1996 break;
1997 case SVt_RV:
1998 case SVt_PV:
a0d0e21e 1999 sv_upgrade(dstr, SVt_PVIV);
aece5585
GA
2000 break;
2001 }
2002 (void)SvIOK_only(dstr);
2003 SvIVX(dstr) = SvIVX(sstr);
2004 SvTAINT(dstr);
2005 return;
8990e307 2006 }
aece5585
GA
2007 goto undef_sstr;
2008
463ee0b2 2009 case SVt_NV:
aece5585
GA
2010 if (SvNOK(sstr)) {
2011 switch (dtype) {
2012 case SVt_NULL:
2013 case SVt_IV:
8990e307 2014 sv_upgrade(dstr, SVt_NV);
aece5585
GA
2015 break;
2016 case SVt_RV:
2017 case SVt_PV:
2018 case SVt_PVIV:
a0d0e21e 2019 sv_upgrade(dstr, SVt_PVNV);
aece5585
GA
2020 break;
2021 }
2022 SvNVX(dstr) = SvNVX(sstr);
2023 (void)SvNOK_only(dstr);
2024 SvTAINT(dstr);
2025 return;
8990e307 2026 }
aece5585
GA
2027 goto undef_sstr;
2028
ed6116ce 2029 case SVt_RV:
8990e307 2030 if (dtype < SVt_RV)
ed6116ce 2031 sv_upgrade(dstr, SVt_RV);
c07a80fd 2032 else if (dtype == SVt_PVGV &&
2033 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2034 sstr = SvRV(sstr);
a5f75d66 2035 if (sstr == dstr) {
3280af22 2036 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2037 GvIMPORTED_on(dstr);
2038 GvMULTI_on(dstr);
2039 return;
2040 }
c07a80fd 2041 goto glob_assign;
2042 }
ed6116ce 2043 break;
463ee0b2 2044 case SVt_PV:
fc36a67e 2045 case SVt_PVFM:
8990e307 2046 if (dtype < SVt_PV)
463ee0b2 2047 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
2048 break;
2049 case SVt_PVIV:
8990e307 2050 if (dtype < SVt_PVIV)
463ee0b2 2051 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
2052 break;
2053 case SVt_PVNV:
8990e307 2054 if (dtype < SVt_PVNV)
463ee0b2 2055 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 2056 break;
4633a7c4
LW
2057 case SVt_PVAV:
2058 case SVt_PVHV:
2059 case SVt_PVCV:
4633a7c4 2060 case SVt_PVIO:
533c011a 2061 if (PL_op)
4633a7c4 2062 croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
22c35a8c 2063 PL_op_name[PL_op->op_type]);
4633a7c4
LW
2064 else
2065 croak("Bizarre copy of %s", sv_reftype(sstr, 0));
2066 break;
2067
79072805 2068 case SVt_PVGV:
8990e307 2069 if (dtype <= SVt_PVGV) {
c07a80fd 2070 glob_assign:
a5f75d66 2071 if (dtype != SVt_PVGV) {
a0d0e21e
LW
2072 char *name = GvNAME(sstr);
2073 STRLEN len = GvNAMELEN(sstr);
463ee0b2 2074 sv_upgrade(dstr, SVt_PVGV);
a0d0e21e 2075 sv_magic(dstr, dstr, '*', name, len);
85aff577 2076 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
a0d0e21e
LW
2077 GvNAME(dstr) = savepvn(name, len);
2078 GvNAMELEN(dstr) = len;
2079 SvFAKE_on(dstr); /* can coerce to non-glob */
2080 }
7bac28a0 2081 /* ahem, death to those who redefine active sort subs */
3280af22
NIS
2082 else if (PL_curstackinfo->si_type == PERLSI_SORT
2083 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
7bac28a0 2084 croak("Can't redefine active sort subroutine %s",
2085 GvNAME(dstr));
a0d0e21e 2086 (void)SvOK_off(dstr);
a5f75d66 2087 GvINTRO_off(dstr); /* one-shot flag */
1edc1566 2088 gp_free((GV*)dstr);
79072805 2089 GvGP(dstr) = gp_ref(GvGP(sstr));
8990e307 2090 SvTAINT(dstr);
3280af22 2091 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66
AD
2092 GvIMPORTED_on(dstr);
2093 GvMULTI_on(dstr);
79072805
LW
2094 return;
2095 }
2096 /* FALL THROUGH */
2097
2098 default:
973f89ab
CS
2099 if (SvGMAGICAL(sstr)) {
2100 mg_get(sstr);
2101 if (SvTYPE(sstr) != stype) {
2102 stype = SvTYPE(sstr);
2103 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2104 goto glob_assign;
2105 }
2106 }
ded42b9f
CS
2107 if (stype == SVt_PVLV)
2108 SvUPGRADE(dstr, SVt_PVNV);
2109 else
2110 SvUPGRADE(dstr, stype);
79072805
LW
2111 }
2112
8990e307
LW
2113 sflags = SvFLAGS(sstr);
2114
2115 if (sflags & SVf_ROK) {
2116 if (dtype >= SVt_PV) {
2117 if (dtype == SVt_PVGV) {
2118 SV *sref = SvREFCNT_inc(SvRV(sstr));
2119 SV *dref = 0;
a5f75d66 2120 int intro = GvINTRO(dstr);
a0d0e21e
LW
2121
2122 if (intro) {
2123 GP *gp;
2124 GvGP(dstr)->gp_refcnt--;
a5f75d66 2125 GvINTRO_off(dstr); /* one-shot flag */
a0d0e21e 2126 Newz(602,gp, 1, GP);
44a8e56a 2127 GvGP(dstr) = gp_ref(gp);
a0d0e21e 2128 GvSV(dstr) = NEWSV(72,0);
3280af22 2129 GvLINE(dstr) = PL_curcop->cop_line;
1edc1566 2130 GvEGV(dstr) = (GV*)dstr;
a0d0e21e 2131 }
a5f75d66 2132 GvMULTI_on(dstr);
8990e307
LW
2133 switch (SvTYPE(sref)) {
2134 case SVt_PVAV:
a0d0e21e
LW
2135 if (intro)
2136 SAVESPTR(GvAV(dstr));
2137 else
2138 dref = (SV*)GvAV(dstr);
8990e307 2139 GvAV(dstr) = (AV*)sref;
3280af22 2140 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2141 GvIMPORTED_AV_on(dstr);
8990e307
LW
2142 break;
2143 case SVt_PVHV:
a0d0e21e
LW
2144 if (intro)
2145 SAVESPTR(GvHV(dstr));
2146 else
2147 dref = (SV*)GvHV(dstr);
8990e307 2148 GvHV(dstr) = (HV*)sref;
3280af22 2149 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2150 GvIMPORTED_HV_on(dstr);
8990e307
LW
2151 break;
2152 case SVt_PVCV:
8ebc5c01 2153 if (intro) {
2154 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2155 SvREFCNT_dec(GvCV(dstr));
2156 GvCV(dstr) = Nullcv;
68dc0745 2157 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3280af22 2158 PL_sub_generation++;
8ebc5c01 2159 }
a0d0e21e 2160 SAVESPTR(GvCV(dstr));
8ebc5c01 2161 }
68dc0745 2162 else
2163 dref = (SV*)GvCV(dstr);
2164 if (GvCV(dstr) != (CV*)sref) {
748a9306 2165 CV* cv = GvCV(dstr);
4633a7c4 2166 if (cv) {
68dc0745 2167 if (!GvCVGEN((GV*)dstr) &&
2168 (CvROOT(cv) || CvXSUB(cv)))
2169 {
fe5e78ed
GS
2170 SV *const_sv = cv_const_sv(cv);
2171 bool const_changed = TRUE;
2172 if(const_sv)
2173 const_changed = sv_cmp(const_sv,
2174 op_const_sv(CvSTART((CV*)sref),
2175 Nullcv));
7bac28a0 2176 /* ahem, death to those who redefine
2177 * active sort subs */
3280af22
NIS
2178 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2179 PL_sortcop == CvSTART(cv))
7bac28a0 2180 croak(
2181 "Can't redefine active sort subroutine %s",
2182 GvENAME((GV*)dstr));
599cee73 2183 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2f34f9d4
IZ
2184 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2185 && HvNAME(GvSTASH(CvGV(cv)))
2186 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2187 "autouse")))
599cee73 2188 warner(WARN_REDEFINE, const_sv ?
fe5e78ed
GS
2189 "Constant subroutine %s redefined"
2190 : "Subroutine %s redefined",
2f34f9d4
IZ
2191 GvENAME((GV*)dstr));
2192 }
9607fc9c 2193 }
3fe9a6f1 2194 cv_ckproto(cv, (GV*)dstr,
2195 SvPOK(sref) ? SvPVX(sref) : Nullch);
4633a7c4 2196 }
a5f75d66 2197 GvCV(dstr) = (CV*)sref;
7a4c00b4 2198 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
a5f75d66 2199 GvASSUMECV_on(dstr);
3280af22 2200 PL_sub_generation++;
a5f75d66 2201 }
3280af22 2202 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2203 GvIMPORTED_CV_on(dstr);
8990e307 2204 break;
91bba347
LW
2205 case SVt_PVIO:
2206 if (intro)
2207 SAVESPTR(GvIOp(dstr));
2208 else
2209 dref = (SV*)GvIOp(dstr);
2210 GvIOp(dstr) = (IO*)sref;
2211 break;
8990e307 2212 default:
a0d0e21e
LW
2213 if (intro)
2214 SAVESPTR(GvSV(dstr));
2215 else
2216 dref = (SV*)GvSV(dstr);
8990e307 2217 GvSV(dstr) = sref;
3280af22 2218 if (PL_curcop->cop_stash != GvSTASH(dstr))
a5f75d66 2219 GvIMPORTED_SV_on(dstr);
8990e307
LW
2220 break;
2221 }
2222 if (dref)
2223 SvREFCNT_dec(dref);
a0d0e21e
LW
2224 if (intro)
2225 SAVEFREESV(sref);
8990e307
LW
2226 SvTAINT(dstr);
2227 return;
2228 }
a0d0e21e 2229 if (SvPVX(dstr)) {
760ac839 2230 (void)SvOOK_off(dstr); /* backoff */
8990e307 2231 Safefree(SvPVX(dstr));
a0d0e21e
LW
2232 SvLEN(dstr)=SvCUR(dstr)=0;
2233 }
8990e307 2234 }
a0d0e21e 2235 (void)SvOK_off(dstr);
8990e307 2236 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
ed6116ce 2237 SvROK_on(dstr);
8990e307 2238 if (sflags & SVp_NOK) {
ed6116ce
LW
2239 SvNOK_on(dstr);
2240 SvNVX(dstr) = SvNVX(sstr);
2241 }
8990e307 2242 if (sflags & SVp_IOK) {
a0d0e21e 2243 (void)SvIOK_on(dstr);
ed6116ce
LW
2244 SvIVX(dstr) = SvIVX(sstr);
2245 }
a0d0e21e
LW
2246#ifdef OVERLOAD
2247 if (SvAMAGIC(sstr)) {
2248 SvAMAGIC_on(dstr);
2249 }
2250#endif /* OVERLOAD */
ed6116ce 2251 }
8990e307 2252 else if (sflags & SVp_POK) {
79072805
LW
2253
2254 /*
2255 * Check to see if we can just swipe the string. If so, it's a
2256 * possible small lose on short strings, but a big win on long ones.
463ee0b2
LW
2257 * It might even be a win on short strings if SvPVX(dstr)
2258 * has to be allocated and SvPVX(sstr) has to be freed.
79072805
LW
2259 */
2260
ff68c719 2261 if (SvTEMP(sstr) && /* slated for free anyway? */
01b73108 2262 SvREFCNT(sstr) == 1 && /* and no other references to it? */
a5f75d66
AD
2263 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2264 {
adbc6bb1 2265 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
a5f75d66
AD
2266 if (SvOOK(dstr)) {
2267 SvFLAGS(dstr) &= ~SVf_OOK;
2268 Safefree(SvPVX(dstr) - SvIVX(dstr));
2269 }
2270 else
2271 Safefree(SvPVX(dstr));
79072805 2272 }
a5f75d66 2273 (void)SvPOK_only(dstr);
463ee0b2 2274 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
2275 SvLEN_set(dstr, SvLEN(sstr));
2276 SvCUR_set(dstr, SvCUR(sstr));
79072805 2277 SvTEMP_off(dstr);
a5f75d66 2278 (void)SvOK_off(sstr);
79072805
LW
2279 SvPV_set(sstr, Nullch);
2280 SvLEN_set(sstr, 0);
a5f75d66
AD
2281 SvCUR_set(sstr, 0);
2282 SvTEMP_off(sstr);
79072805
LW
2283 }
2284 else { /* have to copy actual string */
8990e307
LW
2285 STRLEN len = SvCUR(sstr);
2286
2287 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2288 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2289 SvCUR_set(dstr, len);
2290 *SvEND(dstr) = '\0';
a0d0e21e 2291 (void)SvPOK_only(dstr);
79072805
LW
2292 }
2293 /*SUPPRESS 560*/
8990e307 2294 if (sflags & SVp_NOK) {
79072805 2295 SvNOK_on(dstr);
463ee0b2 2296 SvNVX(dstr) = SvNVX(sstr);
79072805 2297 }
8990e307 2298 if (sflags & SVp_IOK) {
a0d0e21e 2299 (void)SvIOK_on(dstr);
463ee0b2 2300 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
2301 }
2302 }
8990e307 2303 else if (sflags & SVp_NOK) {
463ee0b2 2304 SvNVX(dstr) = SvNVX(sstr);
a0d0e21e 2305 (void)SvNOK_only(dstr);
79072805 2306 if (SvIOK(sstr)) {
a0d0e21e 2307 (void)SvIOK_on(dstr);
463ee0b2 2308 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
2309 }
2310 }
8990e307 2311 else if (sflags & SVp_IOK) {
a0d0e21e 2312 (void)SvIOK_only(dstr);
463ee0b2 2313 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
2314 }
2315 else {
20408e3c 2316 if (dtype == SVt_PVGV) {
599cee73
PM
2317 if (ckWARN(WARN_UNSAFE))
2318 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
20408e3c
GS
2319 }
2320 else
2321 (void)SvOK_off(dstr);
a0d0e21e 2322 }
463ee0b2 2323 SvTAINT(dstr);
79072805
LW
2324}
2325
2326void
ef50df4b
GS
2327sv_setsv_mg(SV *dstr, register SV *sstr)
2328{
2329 sv_setsv(dstr,sstr);
2330 SvSETMAGIC(dstr);
2331}
2332
2333void
8ac85365 2334sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
79072805 2335{
c6f8c383 2336 register char *dptr;
4561caa4
CS
2337 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2338 elicit a warning, but it won't hurt. */
2213622d 2339 SV_CHECK_THINKFIRST(sv);
463ee0b2 2340 if (!ptr) {
a0d0e21e 2341 (void)SvOK_off(sv);
463ee0b2
LW
2342 return;
2343 }
c07a80fd 2344 if (SvTYPE(sv) >= SVt_PV) {
2345 if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2346 sv_unglob(sv);
2347 }
c6f8c383
GA
2348 else
2349 sv_upgrade(sv, SVt_PV);
2350
79072805 2351 SvGROW(sv, len + 1);
c6f8c383
GA
2352 dptr = SvPVX(sv);
2353 Move(ptr,dptr,len,char);
2354 dptr[len] = '\0';
79072805 2355 SvCUR_set(sv, len);
a0d0e21e 2356 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2357 SvTAINT(sv);
79072805
LW
2358}
2359
2360void
ef50df4b
GS
2361sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2362{
2363 sv_setpvn(sv,ptr,len);
2364 SvSETMAGIC(sv);
2365}
2366
2367void
8ac85365 2368sv_setpv(register SV *sv, register const char *ptr)
79072805
LW
2369{
2370 register STRLEN len;
2371
2213622d 2372 SV_CHECK_THINKFIRST(sv);
463ee0b2 2373 if (!ptr) {
a0d0e21e 2374 (void)SvOK_off(sv);
463ee0b2
LW
2375 return;
2376 }
79072805 2377 len = strlen(ptr);
c07a80fd 2378 if (SvTYPE(sv) >= SVt_PV) {
2379 if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2380 sv_unglob(sv);
2381 }
c6f8c383
GA
2382 else
2383 sv_upgrade(sv, SVt_PV);
2384
79072805 2385 SvGROW(sv, len + 1);
463ee0b2 2386 Move(ptr,SvPVX(sv),len+1,char);
79072805 2387 SvCUR_set(sv, len);
a0d0e21e 2388 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
2389 SvTAINT(sv);
2390}
2391
2392void
ef50df4b
GS
2393sv_setpv_mg(register SV *sv, register const char *ptr)
2394{
2395 sv_setpv(sv,ptr);
2396 SvSETMAGIC(sv);
2397}
2398
2399void
8ac85365 2400sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
463ee0b2 2401{
2213622d 2402 SV_CHECK_THINKFIRST(sv);
c6f8c383 2403 (void)SvUPGRADE(sv, SVt_PV);
463ee0b2 2404 if (!ptr) {
a0d0e21e 2405 (void)SvOK_off(sv);
463ee0b2
LW
2406 return;
2407 }
a0ed51b3 2408 (void)SvOOK_off(sv);
463ee0b2
LW
2409 if (SvPVX(sv))
2410 Safefree(SvPVX(sv));
2411 Renew(ptr, len+1, char);
2412 SvPVX(sv) = ptr;
2413 SvCUR_set(sv, len);
2414 SvLEN_set(sv, len+1);
2415 *SvEND(sv) = '\0';
a0d0e21e 2416 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2417 SvTAINT(sv);
79072805
LW
2418}
2419
ef50df4b
GS
2420void
2421sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2422{
51c1089b 2423 sv_usepvn(sv,ptr,len);
ef50df4b
GS
2424 SvSETMAGIC(sv);
2425}
2426
76e3520e 2427STATIC void
8ac85365 2428sv_check_thinkfirst(register SV *sv)
0f15f207 2429{
2213622d
GA
2430 if (SvREADONLY(sv)) {
2431 dTHR;
3280af22 2432 if (PL_curcop != &PL_compiling)
22c35a8c 2433 croak(PL_no_modify);
0f15f207 2434 }
2213622d
GA
2435 if (SvROK(sv))
2436 sv_unref(sv);
0f15f207
MB
2437}
2438
79072805 2439void
8ac85365
NIS
2440sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
2441
2442
79072805
LW
2443{
2444 register STRLEN delta;
2445
a0d0e21e 2446 if (!ptr || !SvPOKp(sv))
79072805 2447 return;
2213622d 2448 SV_CHECK_THINKFIRST(sv);
79072805
LW
2449 if (SvTYPE(sv) < SVt_PVIV)
2450 sv_upgrade(sv,SVt_PVIV);
2451
2452 if (!SvOOK(sv)) {
463ee0b2 2453 SvIVX(sv) = 0;
79072805
LW
2454 SvFLAGS(sv) |= SVf_OOK;
2455 }
8990e307 2456 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
463ee0b2 2457 delta = ptr - SvPVX(sv);
79072805
LW
2458 SvLEN(sv) -= delta;
2459 SvCUR(sv) -= delta;
463ee0b2
LW
2460 SvPVX(sv) += delta;
2461 SvIVX(sv) += delta;
79072805
LW
2462}
2463
2464void
8ac85365 2465sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
79072805 2466{
463ee0b2 2467 STRLEN tlen;
748a9306 2468 char *junk;
a0d0e21e 2469
748a9306 2470 junk = SvPV_force(sv, tlen);
463ee0b2 2471 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2472 if (ptr == junk)
2473 ptr = SvPVX(sv);
463ee0b2 2474 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
2475 SvCUR(sv) += len;
2476 *SvEND(sv) = '\0';
a0d0e21e 2477 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2478 SvTAINT(sv);
79072805
LW
2479}
2480
2481void
ef50df4b
GS
2482sv_catpvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2483{
2484 sv_catpvn(sv,ptr,len);
2485 SvSETMAGIC(sv);
2486}
2487
2488void
8ac85365 2489sv_catsv(SV *dstr, register SV *sstr)
79072805
LW
2490{
2491 char *s;
463ee0b2 2492 STRLEN len;
79072805
LW
2493 if (!sstr)
2494 return;
463ee0b2
LW
2495 if (s = SvPV(sstr, len))
2496 sv_catpvn(dstr,s,len);
79072805
LW
2497}
2498
2499void
ef50df4b
GS
2500sv_catsv_mg(SV *dstr, register SV *sstr)
2501{
2502 sv_catsv(dstr,sstr);
2503 SvSETMAGIC(dstr);
2504}
2505
2506void
8ac85365 2507sv_catpv(register SV *sv, register char *ptr)
79072805
LW
2508{
2509 register STRLEN len;
463ee0b2 2510 STRLEN tlen;
748a9306 2511 char *junk;
79072805 2512
79072805
LW
2513 if (!ptr)
2514 return;
748a9306 2515 junk = SvPV_force(sv, tlen);
79072805 2516 len = strlen(ptr);
463ee0b2 2517 SvGROW(sv, tlen + len + 1);
4633a7c4
LW
2518 if (ptr == junk)
2519 ptr = SvPVX(sv);
463ee0b2 2520 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805 2521 SvCUR(sv) += len;
a0d0e21e 2522 (void)SvPOK_only(sv); /* validate pointer */
463ee0b2 2523 SvTAINT(sv);
79072805
LW
2524}
2525
ef50df4b
GS
2526void
2527sv_catpv_mg(register SV *sv, register char *ptr)
2528{
51c1089b 2529 sv_catpv(sv,ptr);
ef50df4b
GS
2530 SvSETMAGIC(sv);
2531}
2532
79072805 2533SV *
8ac85365 2534newSV(STRLEN len)
79072805
LW
2535{
2536 register SV *sv;
2537
4561caa4 2538 new_SV(sv);
8990e307
LW
2539 SvANY(sv) = 0;
2540 SvREFCNT(sv) = 1;
2541 SvFLAGS(sv) = 0;
79072805
LW
2542 if (len) {
2543 sv_upgrade(sv, SVt_PV);
2544 SvGROW(sv, len + 1);
2545 }
2546 return sv;
2547}
2548
1edc1566 2549/* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2550
79072805 2551void
8ac85365 2552sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
79072805
LW
2553{
2554 MAGIC* mg;
2555
0f15f207
MB
2556 if (SvREADONLY(sv)) {
2557 dTHR;
3280af22 2558 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
22c35a8c 2559 croak(PL_no_modify);
0f15f207 2560 }
4633a7c4 2561 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
748a9306
LW
2562 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2563 if (how == 't')
565764a8 2564 mg->mg_len |= 1;
463ee0b2 2565 return;
748a9306 2566 }
463ee0b2
LW
2567 }
2568 else {
c6f8c383 2569 (void)SvUPGRADE(sv, SVt_PVMG);
463ee0b2 2570 }
79072805
LW
2571 Newz(702,mg, 1, MAGIC);
2572 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 2573
79072805 2574 SvMAGIC(sv) = mg;
c277df42 2575 if (!obj || obj == sv || how == '#' || how == 'r')
8990e307 2576 mg->mg_obj = obj;
85e6fe83 2577 else {
11343788 2578 dTHR;
8990e307 2579 mg->mg_obj = SvREFCNT_inc(obj);
85e6fe83
LW
2580 mg->mg_flags |= MGf_REFCOUNTED;
2581 }
79072805 2582 mg->mg_type = how;
565764a8 2583 mg->mg_len = namlen;
1edc1566 2584 if (name)
2585 if (namlen >= 0)
2586 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 2587 else if (namlen == HEf_SVKEY)
1edc1566 2588 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2589
79072805
LW
2590 switch (how) {
2591 case 0:
22c35a8c 2592 mg->mg_virtual = &PL_vtbl_sv;
79072805 2593 break;
a0d0e21e
LW
2594#ifdef OVERLOAD
2595 case 'A':
22c35a8c 2596 mg->mg_virtual = &PL_vtbl_amagic;
a0d0e21e
LW
2597 break;
2598 case 'a':
22c35a8c 2599 mg->mg_virtual = &PL_vtbl_amagicelem;
a0d0e21e
LW
2600 break;
2601 case 'c':
2602 mg->mg_virtual = 0;
2603 break;
2604#endif /* OVERLOAD */
79072805 2605 case 'B':
22c35a8c 2606 mg->mg_virtual = &PL_vtbl_bm;
79072805 2607 break;
6cef1e77 2608 case 'D':
22c35a8c 2609 mg->mg_virtual = &PL_vtbl_regdata;
6cef1e77
IZ
2610 break;
2611 case 'd':
22c35a8c 2612 mg->mg_virtual = &PL_vtbl_regdatum;
6cef1e77 2613 break;
79072805 2614 case 'E':
22c35a8c 2615 mg->mg_virtual = &PL_vtbl_env;
79072805 2616 break;
55497cff 2617 case 'f':
22c35a8c 2618 mg->mg_virtual = &PL_vtbl_fm;
55497cff 2619 break;
79072805 2620 case 'e':
22c35a8c 2621 mg->mg_virtual = &PL_vtbl_envelem;
79072805 2622 break;
93a17b20 2623 case 'g':
22c35a8c 2624 mg->mg_virtual = &PL_vtbl_mglob;
93a17b20 2625 break;
463ee0b2 2626 case 'I':
22c35a8c 2627 mg->mg_virtual = &PL_vtbl_isa;
463ee0b2
LW
2628 break;
2629 case 'i':
22c35a8c 2630 mg->mg_virtual = &PL_vtbl_isaelem;
463ee0b2 2631 break;
16660edb 2632 case 'k':
22c35a8c 2633 mg->mg_virtual = &PL_vtbl_nkeys;
16660edb 2634 break;
79072805 2635 case 'L':
a0d0e21e 2636 SvRMAGICAL_on(sv);
93a17b20
LW
2637 mg->mg_virtual = 0;
2638 break;
2639 case 'l':
22c35a8c 2640 mg->mg_virtual = &PL_vtbl_dbline;
79072805 2641 break;
f93b4edd
MB
2642#ifdef USE_THREADS
2643 case 'm':
22c35a8c 2644 mg->mg_virtual = &PL_vtbl_mutex;
f93b4edd
MB
2645 break;
2646#endif /* USE_THREADS */
36477c24 2647#ifdef USE_LOCALE_COLLATE
bbce6d69 2648 case 'o':
22c35a8c 2649 mg->mg_virtual = &PL_vtbl_collxfrm;
bbce6d69 2650 break;
36477c24 2651#endif /* USE_LOCALE_COLLATE */
463ee0b2 2652 case 'P':
22c35a8c 2653 mg->mg_virtual = &PL_vtbl_pack;
463ee0b2
LW
2654 break;
2655 case 'p':
a0d0e21e 2656 case 'q':
22c35a8c 2657 mg->mg_virtual = &PL_vtbl_packelem;
463ee0b2 2658 break;
c277df42 2659 case 'r':
22c35a8c 2660 mg->mg_virtual = &PL_vtbl_regexp;
c277df42 2661 break;
79072805 2662 case 'S':
22c35a8c 2663 mg->mg_virtual = &PL_vtbl_sig;
79072805
LW
2664 break;
2665 case 's':
22c35a8c 2666 mg->mg_virtual = &PL_vtbl_sigelem;
79072805 2667 break;
463ee0b2 2668 case 't':
22c35a8c 2669 mg->mg_virtual = &PL_vtbl_taint;
565764a8 2670 mg->mg_len = 1;
463ee0b2 2671 break;
79072805 2672 case 'U':
22c35a8c 2673 mg->mg_virtual = &PL_vtbl_uvar;
79072805
LW
2674 break;
2675 case 'v':
22c35a8c 2676 mg->mg_virtual = &PL_vtbl_vec;
79072805
LW
2677 break;
2678 case 'x':
22c35a8c 2679 mg->mg_virtual = &PL_vtbl_substr;
79072805 2680 break;
5f05dabc 2681 case 'y':
22c35a8c 2682 mg->mg_virtual = &PL_vtbl_defelem;
5f05dabc 2683 break;
79072805 2684 case '*':
22c35a8c 2685 mg->mg_virtual = &PL_vtbl_glob;
79072805
LW
2686 break;
2687 case '#':
22c35a8c 2688 mg->mg_virtual = &PL_vtbl_arylen;
79072805 2689 break;
a0d0e21e 2690 case '.':
22c35a8c 2691 mg->mg_virtual = &PL_vtbl_pos;
a0d0e21e 2692 break;
4633a7c4
LW
2693 case '~': /* Reserved for use by extensions not perl internals. */
2694 /* Useful for attaching extension internal data to perl vars. */
2695 /* Note that multiple extensions may clash if magical scalars */
2696 /* etc holding private data from one are passed to another. */
2697 SvRMAGICAL_on(sv);
a0d0e21e 2698 break;
79072805 2699 default:
463ee0b2
LW
2700 croak("Don't know how to handle magic of type '%c'", how);
2701 }
8990e307
LW
2702 mg_magical(sv);
2703 if (SvGMAGICAL(sv))
2704 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
463ee0b2
LW
2705}
2706
2707int
8ac85365 2708sv_unmagic(SV *sv, int type)
463ee0b2
LW
2709{
2710 MAGIC* mg;
2711 MAGIC** mgp;
91bba347 2712 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2
LW
2713 return 0;
2714 mgp = &SvMAGIC(sv);
2715 for (mg = *mgp; mg; mg = *mgp) {
2716 if (mg->mg_type == type) {
2717 MGVTBL* vtbl = mg->mg_virtual;
2718 *mgp = mg->mg_moremagic;
76e3520e
GS
2719 if (vtbl && (vtbl->svt_free != NULL))
2720 (VTBL->svt_free)(sv, mg);
463ee0b2 2721 if (mg->mg_ptr && mg->mg_type != 'g')
565764a8 2722 if (mg->mg_len >= 0)
1edc1566 2723 Safefree(mg->mg_ptr);
565764a8 2724 else if (mg->mg_len == HEf_SVKEY)
1edc1566 2725 SvREFCNT_dec((SV*)mg->mg_ptr);
a0d0e21e
LW
2726 if (mg->mg_flags & MGf_REFCOUNTED)
2727 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
2728 Safefree(mg);
2729 }
2730 else
2731 mgp = &mg->mg_moremagic;
79072805 2732 }
91bba347 2733 if (!SvMAGIC(sv)) {
463ee0b2 2734 SvMAGICAL_off(sv);
8990e307 2735 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2
LW
2736 }
2737
2738 return 0;
79072805
LW
2739}
2740
2741void
8ac85365 2742sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
79072805
LW
2743{
2744 register char *big;
2745 register char *mid;
2746 register char *midend;
2747 register char *bigend;
2748 register I32 i;
6ff81951
GS
2749 STRLEN curlen;
2750
79072805 2751
8990e307
LW
2752 if (!bigstr)
2753 croak("Can't modify non-existent substring");
6ff81951
GS
2754 SvPV_force(bigstr, curlen);
2755 if (offset + len > curlen) {
2756 SvGROW(bigstr, offset+len+1);
2757 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2758 SvCUR_set(bigstr, offset+len);
2759 }
79072805
LW
2760
2761 i = littlelen - len;
2762 if (i > 0) { /* string might grow */
a0d0e21e 2763 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
2764 mid = big + offset + len;
2765 midend = bigend = big + SvCUR(bigstr);
2766 bigend += i;
2767 *bigend = '\0';
2768 while (midend > mid) /* shove everything down */
2769 *--bigend = *--midend;
2770 Move(little,big+offset,littlelen,char);
2771 SvCUR(bigstr) += i;
2772 SvSETMAGIC(bigstr);
2773 return;
2774 }
2775 else if (i == 0) {
463ee0b2 2776 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
2777 SvSETMAGIC(bigstr);
2778 return;
2779 }
2780
463ee0b2 2781 big = SvPVX(bigstr);
79072805
LW
2782 mid = big + offset;
2783 midend = mid + len;
2784 bigend = big + SvCUR(bigstr);
2785
2786 if (midend > bigend)
463ee0b2 2787 croak("panic: sv_insert");
79072805
LW
2788
2789 if (mid - big > bigend - midend) { /* faster to shorten from end */
2790 if (littlelen) {
2791 Move(little, mid, littlelen,char);
2792 mid += littlelen;
2793 }
2794 i = bigend - midend;
2795 if (i > 0) {
2796 Move(midend, mid, i,char);
2797 mid += i;
2798 }
2799 *mid = '\0';
2800 SvCUR_set(bigstr, mid - big);
2801 }
2802 /*SUPPRESS 560*/
2803 else if (i = mid - big) { /* faster from front */
2804 midend -= littlelen;
2805 mid = midend;
2806 sv_chop(bigstr,midend-i);
2807 big += i;
2808 while (i--)
2809 *--midend = *--big;
2810 if (littlelen)
2811 Move(little, mid, littlelen,char);
2812 }
2813 else if (littlelen) {
2814 midend -= littlelen;
2815 sv_chop(bigstr,midend);
2816 Move(little,midend,littlelen,char);
2817 }
2818 else {
2819 sv_chop(bigstr,midend);
2820 }
2821 SvSETMAGIC(bigstr);
2822}
2823
2824/* make sv point to what nstr did */
2825
2826void
8ac85365 2827sv_replace(register SV *sv, register SV *nsv)
79072805
LW
2828{
2829 U32 refcnt = SvREFCNT(sv);
2213622d 2830 SV_CHECK_THINKFIRST(sv);
79072805
LW
2831 if (SvREFCNT(nsv) != 1)
2832 warn("Reference miscount in sv_replace()");
93a17b20 2833 if (SvMAGICAL(sv)) {
a0d0e21e
LW
2834 if (SvMAGICAL(nsv))
2835 mg_free(nsv);
2836 else
2837 sv_upgrade(nsv, SVt_PVMG);
93a17b20 2838 SvMAGIC(nsv) = SvMAGIC(sv);
a0d0e21e 2839 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20
LW
2840 SvMAGICAL_off(sv);
2841 SvMAGIC(sv) = 0;
2842 }
79072805
LW
2843 SvREFCNT(sv) = 0;
2844 sv_clear(sv);
477f5d66 2845 assert(!SvREFCNT(sv));
79072805
LW
2846 StructCopy(nsv,sv,SV);
2847 SvREFCNT(sv) = refcnt;
1edc1566 2848 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
463ee0b2 2849 del_SV(nsv);
79072805
LW
2850}
2851
2852void
8ac85365 2853sv_clear(register SV *sv)
79072805 2854{
ec12f114 2855 HV* stash;
79072805
LW
2856 assert(sv);
2857 assert(SvREFCNT(sv) == 0);
2858
ed6116ce 2859 if (SvOBJECT(sv)) {
e858de61 2860 dTHR;
3280af22 2861 if (PL_defstash) { /* Still have a symbol table? */
4e35701f 2862 djSP;
8ebc5c01 2863 GV* destructor;
837485b6 2864 SV tmpref;
a0d0e21e 2865
837485b6
GS
2866 Zero(&tmpref, 1, SV);
2867 sv_upgrade(&tmpref, SVt_RV);
2868 SvROK_on(&tmpref);
2869 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
2870 SvREFCNT(&tmpref) = 1;
8ebc5c01 2871
4e8e7886
GS
2872 do {
2873 stash = SvSTASH(sv);
2874 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
2875 if (destructor) {
2876 ENTER;
e788e7d3 2877 PUSHSTACKi(PERLSI_DESTROY);
837485b6 2878 SvRV(&tmpref) = SvREFCNT_inc(sv);
4e8e7886
GS
2879 EXTEND(SP, 2);
2880 PUSHMARK(SP);
837485b6 2881 PUSHs(&tmpref);
4e8e7886
GS
2882 PUTBACK;
2883 perl_call_sv((SV*)GvCV(destructor),
2884 G_DISCARD|G_EVAL|G_KEEPERR);
2885 SvREFCNT(sv)--;
d3acc0f7 2886 POPSTACK;
4e8e7886
GS
2887 LEAVE;
2888 }
2889 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 2890
837485b6 2891 del_XRV(SvANY(&tmpref));
a0d0e21e 2892 }
4e8e7886 2893
a0d0e21e 2894 if (SvOBJECT(sv)) {
4e8e7886 2895 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e
LW
2896 SvOBJECT_off(sv); /* Curse the object. */
2897 if (SvTYPE(sv) != SVt_PVIO)
3280af22 2898 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 2899 }
1edc1566 2900 if (SvREFCNT(sv)) {
3280af22 2901 if (PL_in_clean_objs)
477f5d66
CS
2902 croak("DESTROY created new reference to dead object");
2903 /* DESTROY gave object new lease on life */
2904 return;
1edc1566 2905 }
463ee0b2 2906 }
c07a80fd 2907 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
a0d0e21e 2908 mg_free(sv);
ec12f114 2909 stash = NULL;
79072805 2910 switch (SvTYPE(sv)) {
8990e307 2911 case SVt_PVIO:
df0bd2f4
GS
2912 if (IoIFP(sv) &&
2913 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 2914 IoIFP(sv) != PerlIO_stdout() &&
2915 IoIFP(sv) != PerlIO_stderr())
2916 io_close((IO*)sv);
8990e307
LW
2917 Safefree(IoTOP_NAME(sv));
2918 Safefree(IoFMT_NAME(sv));
2919 Safefree(IoBOTTOM_NAME(sv));
a0d0e21e 2920 /* FALL THROUGH */
79072805 2921 case SVt_PVBM:
a0d0e21e 2922 goto freescalar;
79072805 2923 case SVt_PVCV:
748a9306 2924 case SVt_PVFM:
85e6fe83 2925 cv_undef((CV*)sv);
a0d0e21e 2926 goto freescalar;
79072805 2927 case SVt_PVHV:
85e6fe83 2928 hv_undef((HV*)sv);
a0d0e21e 2929 break;
79072805 2930 case SVt_PVAV:
85e6fe83 2931 av_undef((AV*)sv);
a0d0e21e 2932 break;
02270b4e
GS
2933 case SVt_PVLV:
2934 SvREFCNT_dec(LvTARG(sv));
2935 goto freescalar;
a0d0e21e 2936 case SVt_PVGV:
1edc1566 2937 gp_free((GV*)sv);
a0d0e21e 2938 Safefree(GvNAME(sv));
ec12f114
JPC
2939 /* cannot decrease stash refcount yet, as we might recursively delete
2940 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
2941 of stash until current sv is completely gone.
2942 -- JohnPC, 27 Mar 1998 */
2943 stash = GvSTASH(sv);
a0d0e21e 2944 /* FALL THROUGH */
79072805 2945 case SVt_PVMG:
79072805
LW
2946 case SVt_PVNV:
2947 case SVt_PVIV:
a0d0e21e
LW
2948 freescalar:
2949 (void)SvOOK_off(sv);
79072805
LW
2950 /* FALL THROUGH */
2951 case SVt_PV:
a0d0e21e 2952 case SVt_RV:
8990e307
LW
2953 if (SvROK(sv))
2954 SvREFCNT_dec(SvRV(sv));
1edc1566 2955 else if (SvPVX(sv) && SvLEN(sv))
463ee0b2 2956 Safefree(SvPVX(sv));
79072805 2957 break;
a0d0e21e 2958/*
79072805 2959 case SVt_NV:
79072805 2960 case SVt_IV:
79072805
LW
2961 case SVt_NULL:
2962 break;
a0d0e21e 2963*/
79072805
LW
2964 }
2965
2966 switch (SvTYPE(sv)) {
2967 case SVt_NULL:
2968 break;
79072805
LW
2969 case SVt_IV:
2970 del_XIV(SvANY(sv));
2971 break;
2972 case SVt_NV:
2973 del_XNV(SvANY(sv));
2974 break;
ed6116ce
LW
2975 case SVt_RV:
2976 del_XRV(SvANY(sv));
2977 break;
79072805
LW
2978 case SVt_PV:
2979 del_XPV(SvANY(sv));
2980 break;
2981 case SVt_PVIV:
2982 del_XPVIV(SvANY(sv));
2983 break;
2984 case SVt_PVNV:
2985 del_XPVNV(SvANY(sv));
2986 break;
2987 case SVt_PVMG:
2988 del_XPVMG(SvANY(sv));
2989 break;
2990 case SVt_PVLV:
2991 del_XPVLV(SvANY(sv));
2992 break;
2993 case SVt_PVAV:
2994 del_XPVAV(SvANY(sv));
2995 break;
2996 case SVt_PVHV:
2997 del_XPVHV(SvANY(sv));
2998 break;
2999 case SVt_PVCV:
3000 del_XPVCV(SvANY(sv));
3001 break;
3002 case SVt_PVGV:
3003 del_XPVGV(SvANY(sv));
ec12f114
JPC
3004 /* code duplication for increased performance. */
3005 SvFLAGS(sv) &= SVf_BREAK;
3006 SvFLAGS(sv) |= SVTYPEMASK;
3007 /* decrease refcount of the stash that owns this GV, if any */
3008 if (stash)
3009 SvREFCNT_dec(stash);
3010 return; /* not break, SvFLAGS reset already happened */
79072805
LW
3011 case SVt_PVBM:
3012 del_XPVBM(SvANY(sv));
3013 break;
3014 case SVt_PVFM:
3015 del_XPVFM(SvANY(sv));
3016 break;
8990e307
LW
3017 case SVt_PVIO:
3018 del_XPVIO(SvANY(sv));
3019 break;
79072805 3020 }
a0d0e21e 3021 SvFLAGS(sv) &= SVf_BREAK;
8990e307 3022 SvFLAGS(sv) |= SVTYPEMASK;
79072805
LW
3023}
3024
3025SV *
8ac85365 3026sv_newref(SV *sv)
79072805 3027{
463ee0b2 3028 if (sv)
dce16143 3029 ATOMIC_INC(SvREFCNT(sv));
79072805
LW
3030 return sv;
3031}
3032
3033void
8ac85365 3034sv_free(SV *sv)
79072805 3035{
dce16143
MB
3036 int refcount_is_zero;
3037
79072805
LW
3038 if (!sv)
3039 return;
a0d0e21e
LW
3040 if (SvREFCNT(sv) == 0) {
3041 if (SvFLAGS(sv) & SVf_BREAK)
3042 return;
3280af22 3043 if (PL_in_clean_all) /* All is fair */
1edc1566 3044 return;
d689ffdd
JP
3045 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3046 /* make sure SvREFCNT(sv)==0 happens very seldom */
3047 SvREFCNT(sv) = (~(U32)0)/2;
3048 return;
3049 }
79072805
LW
3050 warn("Attempt to free unreferenced scalar");
3051 return;
3052 }
dce16143
MB
3053 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3054 if (!refcount_is_zero)
8990e307 3055 return;
463ee0b2
LW
3056#ifdef DEBUGGING
3057 if (SvTEMP(sv)) {
7f20e9dd 3058 warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
79072805 3059 return;
79072805 3060 }
463ee0b2 3061#endif
d689ffdd
JP
3062 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3063 /* make sure SvREFCNT(sv)==0 happens very seldom */
3064 SvREFCNT(sv) = (~(U32)0)/2;
3065 return;
3066 }
79072805 3067 sv_clear(sv);
477f5d66
CS
3068 if (! SvREFCNT(sv))
3069 del_SV(sv);
79072805
LW
3070}
3071
3072STRLEN
8ac85365 3073sv_len(register SV *sv)
79072805 3074{
748a9306 3075 char *junk;
463ee0b2 3076 STRLEN len;
79072805
LW
3077
3078 if (!sv)
3079 return 0;
3080
8990e307 3081 if (SvGMAGICAL(sv))
565764a8 3082 len = mg_length(sv);
8990e307 3083 else
748a9306 3084 junk = SvPV(sv, len);
463ee0b2 3085 return len;
79072805
LW
3086}
3087
a0ed51b3
LW
3088STRLEN
3089sv_len_utf8(register SV *sv)
3090{
dfe13c55
GS
3091 U8 *s;
3092 U8 *send;
a0ed51b3
LW
3093 STRLEN len;
3094
3095 if (!sv)
3096 return 0;
3097
3098#ifdef NOTYET
3099 if (SvGMAGICAL(sv))
3100 len = mg_length(sv);
3101 else
3102#endif
dfe13c55 3103 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3104 send = s + len;
3105 len = 0;
3106 while (s < send) {
3107 s += UTF8SKIP(s);
3108 len++;
3109 }
3110 return len;
3111}
3112
3113void
3114sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
3115{
dfe13c55
GS
3116 U8 *start;
3117 U8 *s;
3118 U8 *send;
a0ed51b3
LW
3119 I32 uoffset = *offsetp;
3120 STRLEN len;
3121
3122 if (!sv)
3123 return;
3124
dfe13c55 3125 start = s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3126 send = s + len;
3127 while (s < send && uoffset--)
3128 s += UTF8SKIP(s);
bb40f870
GA
3129 if (s >= send)
3130 s = send;
a0ed51b3
LW
3131 *offsetp = s - start;
3132 if (lenp) {
3133 I32 ulen = *lenp;
3134 start = s;
3135 while (s < send && ulen--)
3136 s += UTF8SKIP(s);
bb40f870
GA
3137 if (s >= send)
3138 s = send;
a0ed51b3
LW
3139 *lenp = s - start;
3140 }
3141 return;
3142}
3143
3144void
3145sv_pos_b2u(register SV *sv, I32* offsetp)
3146{
dfe13c55
GS
3147 U8 *s;
3148 U8 *send;
a0ed51b3
LW
3149 STRLEN len;
3150
3151 if (!sv)
3152 return;
3153
dfe13c55 3154 s = (U8*)SvPV(sv, len);
a0ed51b3
LW
3155 if (len < *offsetp)
3156 croak("panic: bad byte offset");
3157 send = s + *offsetp;
3158 len = 0;
3159 while (s < send) {
3160 s += UTF8SKIP(s);
3161 ++len;
3162 }
3163 if (s != send) {
3164 warn("Malformed UTF-8 character");
3165 --len;
3166 }
3167 *offsetp = len;
3168 return;
3169}
3170
79072805 3171I32
8ac85365 3172sv_eq(register SV *str1, register SV *str2)
79072805
LW
3173{
3174 char *pv1;
463ee0b2 3175 STRLEN cur1;
79072805 3176 char *pv2;
463ee0b2 3177 STRLEN cur2;
79072805
LW
3178
3179 if (!str1) {
3180 pv1 = "";
3181 cur1 = 0;
3182 }
463ee0b2
LW
3183 else
3184 pv1 = SvPV(str1, cur1);
79072805
LW
3185
3186 if (!str2)
3187 return !cur1;
463ee0b2
LW
3188 else
3189 pv2 = SvPV(str2, cur2);
79072805
LW
3190
3191 if (cur1 != cur2)
3192 return 0;
3193
36477c24 3194 return memEQ(pv1, pv2, cur1);
79072805
LW
3195}
3196
3197I32
8ac85365 3198sv_cmp(register SV *str1, register SV *str2)
79072805 3199{
bbce6d69 3200 STRLEN cur1 = 0;
8ac85365 3201 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
bbce6d69 3202 STRLEN cur2 = 0;
8ac85365 3203 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
79072805 3204 I32 retval;
79072805 3205
bbce6d69 3206 if (!cur1)
3207 return cur2 ? -1 : 0;
16660edb 3208
bbce6d69 3209 if (!cur2)
3210 return 1;
79072805 3211
bbce6d69 3212 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
16660edb 3213
bbce6d69 3214 if (retval)
3215 return retval < 0 ? -1 : 1;
16660edb 3216
bbce6d69 3217 if (cur1 == cur2)
3218 return 0;
3219 else
3220 return cur1 < cur2 ? -1 : 1;
3221}
16660edb 3222
bbce6d69 3223I32
8ac85365 3224sv_cmp_locale(register SV *sv1, register SV *sv2)
bbce6d69 3225{
36477c24 3226#ifdef USE_LOCALE_COLLATE
16660edb 3227
bbce6d69 3228 char *pv1, *pv2;
3229 STRLEN len1, len2;
3230 I32 retval;
16660edb 3231
3280af22 3232 if (PL_collation_standard)
bbce6d69 3233 goto raw_compare;
16660edb 3234
bbce6d69 3235 len1 = 0;
8ac85365 3236 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 3237 len2 = 0;
8ac85365 3238 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 3239
bbce6d69 3240 if (!pv1 || !len1) {
3241 if (pv2 && len2)
3242 return -1;
3243 else
3244 goto raw_compare;
3245 }
3246 else {
3247 if (!pv2 || !len2)
3248 return 1;
3249 }
16660edb 3250
bbce6d69 3251 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 3252
bbce6d69 3253 if (retval)
16660edb 3254 return retval < 0 ? -1 : 1;
3255
bbce6d69 3256 /*
3257 * When the result of collation is equality, that doesn't mean
3258 * that there are no differences -- some locales exclude some
3259 * characters from consideration. So to avoid false equalities,
3260 * we use the raw string as a tiebreaker.
3261 */
16660edb 3262
bbce6d69 3263 raw_compare:
3264 /* FALL THROUGH */
16660edb 3265
36477c24 3266#endif /* USE_LOCALE_COLLATE */
16660edb 3267
bbce6d69 3268 return sv_cmp(sv1, sv2);
3269}
79072805 3270
36477c24 3271#ifdef USE_LOCALE_COLLATE
7a4c00b4 3272/*
3273 * Any scalar variable may carry an 'o' magic that contains the
3274 * scalar data of the variable transformed to such a format that
3275 * a normal memory comparison can be used to compare the data
3276 * according to the locale settings.
3277 */
bbce6d69 3278char *
8ac85365 3279sv_collxfrm(SV *sv, STRLEN *nxp)
bbce6d69 3280{
7a4c00b4 3281 MAGIC *mg;
16660edb 3282
8ac85365 3283 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3280af22 3284 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
bbce6d69 3285 char *s, *xf;
3286 STRLEN len, xlen;
3287
7a4c00b4 3288 if (mg)
3289 Safefree(mg->mg_ptr);
bbce6d69 3290 s = SvPV(sv, len);
3291 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 3292 if (SvREADONLY(sv)) {
3293 SAVEFREEPV(xf);
3294 *nxp = xlen;
3280af22 3295 return xf + sizeof(PL_collation_ix);
ff0cee69 3296 }
7a4c00b4 3297 if (! mg) {
3298 sv_magic(sv, 0, 'o', 0, 0);
3299 mg = mg_find(sv, 'o');
3300 assert(mg);
bbce6d69 3301 }
7a4c00b4 3302 mg->mg_ptr = xf;
565764a8 3303 mg->mg_len = xlen;
7a4c00b4 3304 }
3305 else {
ff0cee69 3306 if (mg) {
3307 mg->mg_ptr = NULL;
565764a8 3308 mg->mg_len = -1;
ff0cee69 3309 }
bbce6d69 3310 }
3311 }
7a4c00b4 3312 if (mg && mg->mg_ptr) {
565764a8 3313 *nxp = mg->mg_len;
3280af22 3314 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 3315 }
3316 else {
3317 *nxp = 0;
3318 return NULL;
16660edb 3319 }
79072805
LW
3320}
3321
36477c24 3322#endif /* USE_LOCALE_COLLATE */
bbce6d69 3323
79072805 3324char *
76e3520e 3325sv_gets(register SV *sv, register PerlIO *fp, I32 append)
79072805 3326{
aeea060c 3327 dTHR;
c07a80fd 3328 char *rsptr;
3329 STRLEN rslen;
3330 register STDCHAR rslast;
3331 register STDCHAR *bp;
3332 register I32 cnt;
3333 I32 i;
3334
2213622d 3335 SV_CHECK_THINKFIRST(sv);
c6f8c383 3336 (void)SvUPGRADE(sv, SVt_PV);
ff68c719 3337 SvSCREAM_off(sv);
c07a80fd 3338
3280af22 3339 if (RsSNARF(PL_rs)) {
c07a80fd 3340 rsptr = NULL;
3341 rslen = 0;
3342 }
3280af22 3343 else if (RsRECORD(PL_rs)) {
5b2b9c68
HM
3344 I32 recsize, bytesread;
3345 char *buffer;
3346
3347 /* Grab the size of the record we're getting */
3280af22 3348 recsize = SvIV(SvRV(PL_rs));
5b2b9c68 3349 (void)SvPOK_only(sv); /* Validate pointer */
e670df4e 3350 buffer = SvGROW(sv, recsize + 1);
5b2b9c68
HM
3351 /* Go yank in */
3352#ifdef VMS
3353 /* VMS wants read instead of fread, because fread doesn't respect */
3354 /* RMS record boundaries. This is not necessarily a good thing to be */
3355 /* doing, but we've got no other real choice */
3356 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3357#else
3358 bytesread = PerlIO_read(fp, buffer, recsize);
3359#endif
3360 SvCUR_set(sv, bytesread);
e670df4e 3361 buffer[bytesread] = '\0';
5b2b9c68
HM
3362 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3363 }
3280af22 3364 else if (RsPARA(PL_rs)) {
c07a80fd 3365 rsptr = "\n\n";
3366 rslen = 2;
3367 }
3368 else
3280af22 3369 rsptr = SvPV(PL_rs, rslen);
c07a80fd 3370 rslast = rslen ? rsptr[rslen - 1] : '\0';
3371
3280af22 3372 if (RsPARA(PL_rs)) { /* have to do this both before and after */
79072805 3373 do { /* to make sure file boundaries work right */
760ac839 3374 if (PerlIO_eof(fp))
a0d0e21e 3375 return 0;
760ac839 3376 i = PerlIO_getc(fp);
79072805 3377 if (i != '\n') {
a0d0e21e
LW
3378 if (i == -1)
3379 return 0;
760ac839 3380 PerlIO_ungetc(fp,i);
79072805
LW
3381 break;
3382 }
3383 } while (i != EOF);
3384 }
c07a80fd 3385
760ac839
LW
3386 /* See if we know enough about I/O mechanism to cheat it ! */
3387
3388 /* This used to be #ifdef test - it is made run-time test for ease
3389 of abstracting out stdio interface. One call should be cheap
3390 enough here - and may even be a macro allowing compile
3391 time optimization.
3392 */
3393
3394 if (PerlIO_fast_gets(fp)) {
3395
3396 /*
3397 * We're going to steal some values from the stdio struct
3398 * and put EVERYTHING in the innermost loop into registers.
3399 */
3400 register STDCHAR *ptr;
3401 STRLEN bpx;
3402 I32 shortbuffered;
3403
16660edb 3404#if defined(VMS) && defined(PERLIO_IS_STDIO)
3405 /* An ungetc()d char is handled separately from the regular
3406 * buffer, so we getc() it back out and stuff it in the buffer.
3407 */
3408 i = PerlIO_getc(fp);
3409 if (i == EOF) return 0;
3410 *(--((*fp)->_ptr)) = (unsigned char) i;
3411 (*fp)->_cnt++;
3412#endif
c07a80fd 3413
c2960299 3414 /* Here is some breathtakingly efficient cheating */
c07a80fd 3415
760ac839 3416 cnt = PerlIO_get_cnt(fp); /* get count into register */
a0d0e21e 3417 (void)SvPOK_only(sv); /* validate pointer */
79072805
LW
3418 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3419 if (cnt > 80 && SvLEN(sv) > append) {
3420 shortbuffered = cnt - SvLEN(sv) + append + 1;
3421 cnt -= shortbuffered;
3422 }
3423 else {
3424 shortbuffered = 0;
bbce6d69 3425 /* remember that cnt can be negative */
3426 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
79072805
LW
3427 }
3428 }
3429 else
3430 shortbuffered = 0;
c07a80fd 3431 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
760ac839 3432 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 3433 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3434 "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
16660edb 3435 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3436 "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3437 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3438 (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
3439 for (;;) {
3440 screamer:
93a17b20 3441 if (cnt > 0) {
c07a80fd 3442 if (rslen) {
760ac839
LW
3443 while (cnt > 0) { /* this | eat */
3444 cnt--;
c07a80fd 3445 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3446 goto thats_all_folks; /* screams | sed :-) */
3447 }
3448 }
3449 else {
36477c24 3450 Copy(ptr, bp, cnt, char); /* this | eat */
c07a80fd 3451 bp += cnt; /* screams | dust */
3452 ptr += cnt; /* louder | sed :-) */
a5f75d66 3453 cnt = 0;
93a17b20 3454 }
79072805
LW
3455 }
3456
748a9306 3457 if (shortbuffered) { /* oh well, must extend */
79072805
LW
3458 cnt = shortbuffered;
3459 shortbuffered = 0;
c07a80fd 3460 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3461 SvCUR_set(sv, bpx);
3462 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
c07a80fd 3463 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
79072805
LW
3464 continue;
3465 }
3466
16660edb 3467 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3468 "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3469 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
16660edb 3470 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3471 "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3472 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3473 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
16660edb 3474 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 3475 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3476 another abstraction. */
760ac839 3477 i = PerlIO_getc(fp); /* get more characters */
16660edb 3478 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3479 "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3480 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3481 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
760ac839
LW
3482 cnt = PerlIO_get_cnt(fp);
3483 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 3484 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3485 "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
79072805 3486
748a9306
LW
3487 if (i == EOF) /* all done for ever? */
3488 goto thats_really_all_folks;
3489
c07a80fd 3490 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
79072805
LW
3491 SvCUR_set(sv, bpx);
3492 SvGROW(sv, bpx + cnt + 2);
c07a80fd 3493 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3494
760ac839 3495 *bp++ = i; /* store character from PerlIO_getc */
79072805 3496
c07a80fd 3497 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 3498 goto thats_all_folks;
79072805
LW
3499 }
3500
3501thats_all_folks:
c07a80fd 3502 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
36477c24 3503 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 3504 goto screamer; /* go back to the fray */
79072805
LW
3505thats_really_all_folks:
3506 if (shortbuffered)
3507 cnt += shortbuffered;
16660edb 3508 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3509 "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
d1bf51dd 3510 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
16660edb 3511 DEBUG_P(PerlIO_printf(Perl_debug_log,
68dc0745 3512 "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3513 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3514 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 3515 *bp = '\0';
760ac839 3516 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
16660edb 3517 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 3518 "Screamer: done, len=%ld, string=|%.*s|\n",
3519 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
760ac839
LW
3520 }
3521 else
79072805 3522 {
760ac839 3523 /*The big, slow, and stupid way */
c07a80fd 3524 STDCHAR buf[8192];
79072805 3525
760ac839 3526screamer2:
c07a80fd 3527 if (rslen) {
760ac839
LW
3528 register STDCHAR *bpe = buf + sizeof(buf);
3529 bp = buf;
3530 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3531 ; /* keep reading */
3532 cnt = bp - buf;
c07a80fd 3533 }
3534 else {
760ac839 3535 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 3536 /* Accomodate broken VAXC compiler, which applies U8 cast to
3537 * both args of ?: operator, causing EOF to change into 255
3538 */
3539 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
c07a80fd 3540 }
79072805
LW
3541
3542 if (append)
760ac839 3543 sv_catpvn(sv, (char *) buf, cnt);
79072805 3544 else
760ac839 3545 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 3546
3547 if (i != EOF && /* joy */
3548 (!rslen ||
3549 SvCUR(sv) < rslen ||
36477c24 3550 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
3551 {
3552 append = -1;
63e4d877
CS
3553 /*
3554 * If we're reading from a TTY and we get a short read,
3555 * indicating that the user hit his EOF character, we need
3556 * to notice it now, because if we try to read from the TTY
3557 * again, the EOF condition will disappear.
3558 *
3559 * The comparison of cnt to sizeof(buf) is an optimization
3560 * that prevents unnecessary calls to feof().
3561 *
3562 * - jik 9/25/96
3563 */
3564 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3565 goto screamer2;
79072805
LW
3566 }
3567 }
3568
3280af22 3569 if (RsPARA(PL_rs)) { /* have to do this both before and after */
c07a80fd 3570 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 3571 i = PerlIO_getc(fp);
79072805 3572 if (i != '\n') {
760ac839 3573 PerlIO_ungetc(fp,i);
79072805
LW
3574 break;
3575 }
3576 }
3577 }
c07a80fd 3578
a868473f
NIS
3579#ifdef WIN32
3580 win32_strip_return(sv);
3581#endif
3582
c07a80fd 3583 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
79072805
LW
3584}
3585
760ac839 3586
79072805 3587void
8ac85365 3588sv_inc(register SV *sv)
79072805
LW
3589{
3590 register char *d;
463ee0b2 3591 int flags;
79072805
LW
3592
3593 if (!sv)
3594 return;
b23a5f78
GB
3595 if (SvGMAGICAL(sv))
3596 mg_get(sv);
ed6116ce 3597 if (SvTHINKFIRST(sv)) {
0f15f207
MB
3598 if (SvREADONLY(sv)) {
3599 dTHR;
3280af22 3600 if (PL_curcop != &PL_compiling)
22c35a8c 3601 croak(PL_no_modify);
0f15f207 3602 }
a0d0e21e 3603 if (SvROK(sv)) {
b5be31e9 3604 IV i;
a0d0e21e 3605#ifdef OVERLOAD
b5be31e9 3606 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
a0d0e21e 3607#endif /* OVERLOAD */
b5be31e9
SM
3608 i = (IV)SvRV(sv);
3609 sv_unref(sv);
3610 sv_setiv(sv, i);
a0d0e21e 3611 }
ed6116ce 3612 }
8990e307 3613 flags = SvFLAGS(sv);
8990e307 3614 if (flags & SVp_NOK) {
a0d0e21e 3615 (void)SvNOK_only(sv);
55497cff 3616 SvNVX(sv) += 1.0;
3617 return;
3618 }
3619 if (flags & SVp_IOK) {
3620 if (SvIVX(sv) == IV_MAX)
3621 sv_setnv(sv, (double)IV_MAX + 1.0);
3622 else {
3623 (void)SvIOK_only(sv);
3624 ++SvIVX(sv);
3625 }
79072805
LW
3626 return;
3627 }
8990e307 3628 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
4633a7c4
LW
3629 if ((flags & SVTYPEMASK) < SVt_PVNV)
3630 sv_upgrade(sv, SVt_NV);
463ee0b2 3631 SvNVX(sv) = 1.0;
a0d0e21e 3632 (void)SvNOK_only(sv);
79072805
LW
3633 return;
3634 }
463ee0b2 3635 d = SvPVX(sv);
79072805
LW
3636 while (isALPHA(*d)) d++;
3637 while (isDIGIT(*d)) d++;
3638 if (*d) {
36477c24 3639 SET_NUMERIC_STANDARD();
bbce6d69 3640 sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
79072805
LW
3641 return;
3642 }
3643 d--;
463ee0b2 3644 while (d >= SvPVX(sv)) {
79072805
LW
3645 if (isDIGIT(*d)) {
3646 if (++*d <= '9')
3647 return;
3648 *(d--) = '0';
3649 }
3650 else {
9d116dd7
JH
3651#ifdef EBCDIC
3652 /* MKS: The original code here died if letters weren't consecutive.
3653 * at least it didn't have to worry about non-C locales. The
3654 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3655 * arranged in order (although not consecutively) and that only
3656 * [A-Za-z] are accepted by isALPHA in the C locale.
3657 */
3658 if (*d != 'z' && *d != 'Z') {
3659 do { ++*d; } while (!isALPHA(*d));
3660 return;
3661 }
3662 *(d--) -= 'z' - 'a';
3663#else
79072805
LW
3664 ++*d;
3665 if (isALPHA(*d))
3666 return;
3667 *(d--) -= 'z' - 'a' + 1;
9d116dd7 3668#endif
79072805
LW
3669 }
3670 }
3671 /* oh,oh, the number grew */
3672 SvGROW(sv, SvCUR(sv) + 2);
3673 SvCUR(sv)++;
463ee0b2 3674 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
3675 *d = d[-1];
3676 if (isDIGIT(d[1]))
3677 *d = '1';
3678 else
3679 *d = d[1];
3680}
3681
3682void
8ac85365 3683sv_dec(register SV *sv)
79072805 3684{
463ee0b2
LW
3685 int flags;
3686
79072805
LW
3687 if (!sv)
3688 return;
b23a5f78
GB
3689 if (SvGMAGICAL(sv))
3690 mg_get(sv);
ed6116ce 3691 if (SvTHINKFIRST(sv)) {
0f15f207
MB
3692 if (SvREADONLY(sv)) {
3693 dTHR;
3280af22 3694 if (PL_curcop != &PL_compiling)
22c35a8c 3695 croak(PL_no_modify);
0f15f207 3696 }
a0d0e21e 3697 if (SvROK(sv)) {
b5be31e9 3698 IV i;
a0d0e21e 3699#ifdef OVERLOAD
b5be31e9 3700 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
a0d0e21e 3701#endif /* OVERLOAD */
b5be31e9
SM
3702 i = (IV)SvRV(sv);
3703 sv_unref(sv);
3704 sv_setiv(sv, i);
a0d0e21e 3705 }
ed6116ce 3706 }
8990e307 3707 flags = SvFLAGS(sv);
8990e307 3708 if (flags & SVp_NOK) {
463ee0b2 3709 SvNVX(sv) -= 1.0;
a0d0e21e 3710 (void)SvNOK_only(sv);
79072805
LW
3711 return;
3712 }
55497cff 3713 if (flags & SVp_IOK) {
3714 if (SvIVX(sv) == IV_MIN)
3715 sv_setnv(sv, (double)IV_MIN - 1.0);
3716 else {
3717 (void)SvIOK_only(sv);
3718 --SvIVX(sv);
3719 }
3720 return;
3721 }
8990e307 3722 if (!(flags & SVp_POK)) {
4633a7c4
LW
3723 if ((flags & SVTYPEMASK) < SVt_PVNV)
3724 sv_upgrade(sv, SVt_NV);
463ee0b2 3725 SvNVX(sv) = -1.0;
a0d0e21e 3726 (void)SvNOK_only(sv);
79072805
LW
3727 return;
3728 }
36477c24 3729 SET_NUMERIC_STANDARD();
bbce6d69 3730 sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
79072805
LW
3731}
3732
3733/* Make a string that will exist for the duration of the expression
3734 * evaluation. Actually, it may have to last longer than that, but
3735 * hopefully we won't free it until it has been assigned to a
3736 * permanent location. */
3737
76e3520e 3738STATIC void
8ac85365 3739sv_mortalgrow(void)
8990e307 3740{
11343788 3741 dTHR;
3280af22
NIS
3742 PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
3743 Renew(PL_tmps_stack, PL_tmps_max, SV*);
8990e307
LW
3744}
3745
79072805 3746SV *
8ac85365 3747sv_mortalcopy(SV *oldstr)
79072805 3748{
11343788 3749 dTHR;
463ee0b2 3750 register SV *sv;
79072805 3751
4561caa4 3752 new_SV(sv);
8990e307
LW
3753 SvANY(sv) = 0;
3754 SvREFCNT(sv) = 1;
3755 SvFLAGS(sv) = 0;
79072805 3756 sv_setsv(sv,oldstr);
3280af22 3757 if (++PL_tmps_ix >= PL_tmps_max)
8990e307 3758 sv_mortalgrow();
3280af22 3759 PL_tmps_stack[PL_tmps_ix] = sv;
8990e307
LW
3760 SvTEMP_on(sv);
3761 return sv;
3762}
3763
3764SV *
8ac85365 3765sv_newmortal(void)
8990e307 3766{
11343788 3767 dTHR;
8990e307
LW
3768 register SV *sv;
3769
4561caa4 3770 new_SV(sv);
8990e307
LW
3771 SvANY(sv) = 0;
3772 SvREFCNT(sv) = 1;
3773 SvFLAGS(sv) = SVs_TEMP;
3280af22 3774 if (++PL_tmps_ix >= PL_tmps_max)
8990e307 3775 sv_mortalgrow();
3280af22 3776 PL_tmps_stack[PL_tmps_ix] = sv;
79072805
LW
3777 return sv;
3778}
3779
3780/* same thing without the copying */
3781
3782SV *
8ac85365 3783sv_2mortal(register SV *sv)
79072805 3784{
11343788 3785 dTHR;
79072805
LW
3786 if (!sv)
3787 return sv;
d689ffdd 3788 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 3789 return sv;
3280af22 3790 if (++PL_tmps_ix >= PL_tmps_max)
8990e307 3791 sv_mortalgrow();
3280af22 3792 PL_tmps_stack[PL_tmps_ix] = sv;
8990e307 3793 SvTEMP_on(sv);
79072805
LW
3794 return sv;
3795}
3796
3797SV *
8ac85365 3798newSVpv(char *s, STRLEN len)
79072805 3799{
463ee0b2 3800 register SV *sv;
79072805 3801
4561caa4 3802 new_SV(sv);
8990e307
LW
3803 SvANY(sv) = 0;
3804 SvREFCNT(sv) = 1;
3805 SvFLAGS(sv) = 0;
79072805
LW
3806 if (!len)
3807 len = strlen(s);
3808 sv_setpvn(sv,s,len);
3809 return sv;
3810}
3811
9da1e3b5 3812SV *
9d8a25dc 3813newSVpvn(char *s, STRLEN len)
9da1e3b5
MUN
3814{
3815 register SV *sv;
3816
3817 new_SV(sv);
3818 SvANY(sv) = 0;
3819 SvREFCNT(sv) = 1;
3820 SvFLAGS(sv) = 0;
3821 sv_setpvn(sv,s,len);
3822 return sv;
3823}
3824
46fc3d4c 3825SV *
3826newSVpvf(const char* pat, ...)
46fc3d4c 3827{
3828 register SV *sv;
3829 va_list args;
3830
3831 new_SV(sv);
3832 SvANY(sv) = 0;
3833 SvREFCNT(sv) = 1;
3834 SvFLAGS(sv) = 0;
46fc3d4c 3835 va_start(args, pat);
fc36a67e 3836 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 3837 va_end(args);
3838 return sv;
3839}
3840
3841
79072805 3842SV *
8ac85365 3843newSVnv(double n)
79072805 3844{
463ee0b2 3845 register SV *sv;
79072805 3846
4561caa4 3847 new_SV(sv);
8990e307
LW
3848 SvANY(sv) = 0;
3849 SvREFCNT(sv) = 1;
3850 SvFLAGS(sv) = 0;
79072805
LW
3851 sv_setnv(sv,n);
3852 return sv;
3853}
3854
3855SV *
8ac85365 3856newSViv(IV i)
79072805 3857{
463ee0b2 3858 register SV *sv;
79072805 3859
4561caa4 3860 new_SV(sv);
8990e307
LW
3861 SvANY(sv) = 0;
3862 SvREFCNT(sv) = 1;
3863 SvFLAGS(sv) = 0;
79072805
LW
3864 sv_setiv(sv,i);
3865 return sv;
3866}
3867
2304df62 3868SV *
d689ffdd 3869newRV_noinc(SV *tmpRef)
2304df62 3870{
11343788 3871 dTHR;
2304df62
AD
3872 register SV *sv;
3873
4561caa4 3874 new_SV(sv);
2304df62
AD
3875 SvANY(sv) = 0;
3876 SvREFCNT(sv) = 1;
3877 SvFLAGS(sv) = 0;
3878 sv_upgrade(sv, SVt_RV);
76e3520e 3879 SvTEMP_off(tmpRef);
d689ffdd 3880 SvRV(sv) = tmpRef;
2304df62 3881 SvROK_on(sv);
2304df62
AD
3882 return sv;
3883}
3884
5f05dabc 3885SV *
d689ffdd 3886newRV(SV *tmpRef)
5f05dabc 3887{
5f6447b6 3888 return newRV_noinc(SvREFCNT_inc(tmpRef));
5f05dabc 3889}
5f05dabc 3890
79072805
LW
3891/* make an exact duplicate of old */
3892
3893SV *
8ac85365 3894newSVsv(register SV *old)
79072805 3895{
463ee0b2 3896 register SV *sv;
79072805
LW
3897
3898 if (!old)
3899 return Nullsv;
8990e307 3900 if (SvTYPE(old) == SVTYPEMASK) {
79072805
LW
3901 warn("semi-panic: attempt to dup freed string");
3902 return Nullsv;
3903 }
4561caa4 3904 new_SV(sv);
8990e307
LW
3905 SvANY(sv) = 0;
3906 SvREFCNT(sv) = 1;
3907 SvFLAGS(sv) = 0;
ff68c719 3908 if (SvTEMP(old)) {
3909 SvTEMP_off(old);
463ee0b2 3910 sv_setsv(sv,old);
ff68c719 3911 SvTEMP_on(old);
79072805
LW
3912 }
3913 else
463ee0b2
LW
3914 sv_setsv(sv,old);
3915 return sv;
79072805
LW
3916}
3917
3918void
8ac85365 3919sv_reset(register char *s, HV *stash)
79072805
LW
3920{
3921 register HE *entry;
3922 register GV *gv;
3923 register SV *sv;
3924 register I32 i;
3925 register PMOP *pm;
3926 register I32 max;
463ee0b2 3927 char todo[256];
79072805 3928
49d8d3a1
MB
3929 if (!stash)
3930 return;
3931
79072805
LW
3932 if (!*s) { /* reset ?? searches */
3933 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
48c036b1 3934 pm->op_pmdynflags &= ~PMdf_USED;
79072805
LW
3935 }
3936 return;
3937 }
3938
3939 /* reset variables */
3940
3941 if (!HvARRAY(stash))
3942 return;
463ee0b2
LW
3943
3944 Zero(todo, 256, char);
79072805
LW
3945 while (*s) {
3946 i = *s;
3947 if (s[1] == '-') {
3948 s += 2;
3949 }
3950 max = *s++;
3951 for ( ; i <= max; i++) {
463ee0b2
LW
3952 todo[i] = 1;
3953 }
a0d0e21e 3954 for (i = 0; i <= (I32) HvMAX(stash); i++) {
79072805 3955 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
3956 entry;
3957 entry = HeNEXT(entry))
3958 {
1edc1566 3959 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 3960 continue;
1edc1566 3961 gv = (GV*)HeVAL(entry);
79072805 3962 sv = GvSV(gv);
9e35f4b3
GS
3963 if (SvTHINKFIRST(sv)) {
3964 if (!SvREADONLY(sv) && SvROK(sv))
3965 sv_unref(sv);
3966 continue;
3967 }
a0d0e21e 3968 (void)SvOK_off(sv);
79072805
LW
3969 if (SvTYPE(sv) >= SVt_PV) {
3970 SvCUR_set(sv, 0);
463ee0b2
LW
3971 if (SvPVX(sv) != Nullch)
3972 *SvPVX(sv) = '\0';
44a8e56a 3973 SvTAINT(sv);
79072805
LW
3974 }
3975 if (GvAV(gv)) {
3976 av_clear(GvAV(gv));
3977 }
44a8e56a 3978 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
463ee0b2 3979 hv_clear(GvHV(gv));
a0d0e21e 3980#ifndef VMS /* VMS has no environ array */
3280af22 3981 if (gv == PL_envgv)
79072805 3982 environ[0] = Nullch;
a0d0e21e 3983#endif
79072805
LW
3984 }
3985 }
3986 }
3987 }
3988}
3989
46fc3d4c 3990IO*
8ac85365 3991sv_2io(SV *sv)
46fc3d4c 3992{
3993 IO* io;
3994 GV* gv;
3995
3996 switch (SvTYPE(sv)) {
3997 case SVt_PVIO:
3998 io = (IO*)sv;
3999 break;
4000 case SVt_PVGV:
4001 gv = (GV*)sv;
4002 io = GvIO(gv);
4003 if (!io)
4004 croak("Bad filehandle: %s", GvNAME(gv));
4005 break;
4006 default:
4007 if (!SvOK(sv))
22c35a8c 4008 croak(PL_no_usym, "filehandle");
46fc3d4c 4009 if (SvROK(sv))
4010 return sv_2io(SvRV(sv));
3280af22 4011 gv = gv_fetchpv(SvPV(sv,PL_na), FALSE, SVt_PVIO);
46fc3d4c 4012 if (gv)
4013 io = GvIO(gv);
4014 else
4015 io = 0;
4016 if (!io)
3280af22 4017 croak("Bad filehandle: %s", SvPV(sv,PL_na));
46fc3d4c 4018 break;
4019 }
4020 return io;
4021}
4022
79072805 4023CV *
8ac85365 4024sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
79072805
LW
4025{
4026 GV *gv;
4027 CV *cv;
4028
4029 if (!sv)
93a17b20 4030 return *gvp = Nullgv, Nullcv;
79072805 4031 switch (SvTYPE(sv)) {
79072805
LW
4032 case SVt_PVCV:
4033 *st = CvSTASH(sv);
4034 *gvp = Nullgv;
4035 return (CV*)sv;
4036 case SVt_PVHV:
4037 case SVt_PVAV:
4038 *gvp = Nullgv;
4039 return Nullcv;
8990e307
LW
4040 case SVt_PVGV:
4041 gv = (GV*)sv;
a0d0e21e 4042 *gvp = gv;
8990e307
LW
4043 *st = GvESTASH(gv);
4044 goto fix_gv;
4045
79072805 4046 default:
a0d0e21e
LW
4047 if (SvGMAGICAL(sv))
4048 mg_get(sv);
4049 if (SvROK(sv)) {
4050 cv = (CV*)SvRV(sv);
4051 if (SvTYPE(cv) != SVt_PVCV)
4052 croak("Not a subroutine reference");
4053 *gvp = Nullgv;
4054 *st = CvSTASH(cv);
4055 return cv;
4056 }
79072805
LW
4057 if (isGV(sv))
4058 gv = (GV*)sv;
4059 else
3280af22 4060 gv = gv_fetchpv(SvPV(sv, PL_na), lref, SVt_PVCV);
79072805
LW
4061 *gvp = gv;
4062 if (!gv)
4063 return Nullcv;
4064 *st = GvESTASH(gv);
8990e307 4065 fix_gv:
8ebc5c01 4066 if (lref && !GvCVu(gv)) {
4633a7c4 4067 SV *tmpsv;
748a9306 4068 ENTER;
4633a7c4 4069 tmpsv = NEWSV(704,0);
16660edb 4070 gv_efullname3(tmpsv, gv, Nullch);
774d564b 4071 newSUB(start_subparse(FALSE, 0),
4633a7c4
LW
4072 newSVOP(OP_CONST, 0, tmpsv),
4073 Nullop,
8990e307 4074 Nullop);
748a9306 4075 LEAVE;
8ebc5c01 4076 if (!GvCVu(gv))
3280af22 4077 croak("Unable to create sub named \"%s\"", SvPV(sv,PL_na));
8990e307 4078 }
8ebc5c01 4079 return GvCVu(gv);
79072805
LW
4080 }
4081}
4082
79072805 4083I32
4e35701f 4084sv_true(register SV *sv)
79072805 4085{
4e35701f 4086 dTHR;
8990e307
LW
4087 if (!sv)
4088 return 0;
79072805 4089 if (SvPOK(sv)) {
4e35701f
NIS
4090 register XPV* tXpv;
4091 if ((tXpv = (XPV*)SvANY(sv)) &&
4092 (*tXpv->xpv_pv > '0' ||
4093 tXpv->xpv_cur > 1 ||
4094 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
79072805
LW
4095 return 1;
4096 else
4097 return 0;
4098 }
4099 else {
4100 if (SvIOK(sv))
463ee0b2 4101 return SvIVX(sv) != 0;
79072805
LW
4102 else {
4103 if (SvNOK(sv))
463ee0b2 4104 return SvNVX(sv) != 0.0;
79072805 4105 else
463ee0b2 4106 return sv_2bool(sv);
79072805
LW
4107 }
4108 }
4109}
79072805 4110
ff68c719 4111IV
4e35701f 4112sv_iv(register SV *sv)
85e6fe83 4113{
ff68c719 4114 if (SvIOK(sv))
4115 return SvIVX(sv);
4116 return sv_2iv(sv);
85e6fe83 4117}
85e6fe83 4118
ff68c719 4119UV
4e35701f 4120sv_uv(register SV *sv)
ff68c719 4121{
4122 if (SvIOK(sv))
4123 return SvUVX(sv);
4124 return sv_2uv(sv);
4125}
85e6fe83 4126
ff68c719 4127double
4e35701f 4128sv_nv(register SV *sv)
79072805 4129{
ff68c719 4130 if (SvNOK(sv))
4131 return SvNVX(sv);
4132 return sv_2nv(sv);
79072805 4133}
79072805 4134
79072805 4135char *
8ac85365 4136sv_pvn(SV *sv, STRLEN *lp)
79072805 4137{
85e6fe83
LW
4138 if (SvPOK(sv)) {
4139 *lp = SvCUR(sv);
a0d0e21e 4140 return SvPVX(sv);
85e6fe83 4141 }
463ee0b2 4142 return sv_2pv(sv, lp);
79072805 4143}
79072805 4144
a0d0e21e 4145char *
8ac85365 4146sv_pvn_force(SV *sv, STRLEN *lp)
a0d0e21e
LW
4147{
4148 char *s;
4149
0f15f207
MB
4150 if (SvREADONLY(sv)) {
4151 dTHR;
3280af22 4152 if (PL_curcop != &PL_compiling)
22c35a8c 4153 croak(PL_no_modify);
0f15f207 4154 }
a0d0e21e
LW
4155
4156 if (SvPOK(sv)) {
4157 *lp = SvCUR(sv);
4158 }
4159 else {
748a9306 4160 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4633a7c4 4161 if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
a0d0e21e 4162 sv_unglob(sv);
4633a7c4
LW
4163 s = SvPVX(sv);
4164 *lp = SvCUR(sv);
4165 }
11343788
MB
4166 else {
4167 dTHR;
a0d0e21e 4168 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
22c35a8c 4169 PL_op_name[PL_op->op_type]);
11343788 4170 }
a0d0e21e 4171 }
4633a7c4
LW
4172 else
4173 s = sv_2pv(sv, lp);
a0d0e21e
LW
4174 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
4175 STRLEN len = *lp;
4176
4177 if (SvROK(sv))
4178 sv_unref(sv);
4179 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
4180 SvGROW(sv, len + 1);
4181 Move(s,SvPVX(sv),len,char);
4182 SvCUR_set(sv, len);
4183 *SvEND(sv) = '\0';
4184 }
4185 if (!SvPOK(sv)) {
4186 SvPOK_on(sv); /* validate pointer */
4187 SvTAINT(sv);
760ac839 4188 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
a0d0e21e
LW
4189 (unsigned long)sv,SvPVX(sv)));
4190 }
4191 }
4192 return SvPVX(sv);
4193}
4194
4195char *
8ac85365 4196sv_reftype(SV *sv, int ob)
a0d0e21e
LW
4197{
4198 if (ob && SvOBJECT(sv))
4199 return HvNAME(SvSTASH(sv));
4200 else {
4201 switch (SvTYPE(sv)) {
4202 case SVt_NULL:
4203 case SVt_IV:
4204 case SVt_NV:
4205 case SVt_RV:
4206 case SVt_PV:
4207 case SVt_PVIV:
4208 case SVt_PVNV:
4209 case SVt_PVMG:
4210 case SVt_PVBM:
4211 if (SvROK(sv))
4212 return "REF";
4213 else
4214 return "SCALAR";
4215 case SVt_PVLV: return "LVALUE";
4216 case SVt_PVAV: return "ARRAY";
4217 case SVt_PVHV: return "HASH";
4218 case SVt_PVCV: return "CODE";
4219 case SVt_PVGV: return "GLOB";
1d2dff63 4220 case SVt_PVFM: return "FORMAT";
a0d0e21e
LW
4221 default: return "UNKNOWN";
4222 }
4223 }
4224}
4225
463ee0b2 4226int
8ac85365 4227sv_isobject(SV *sv)
85e6fe83 4228{
68dc0745 4229 if (!sv)
4230 return 0;
4231 if (SvGMAGICAL(sv))
4232 mg_get(sv);
85e6fe83
LW
4233 if (!SvROK(sv))
4234 return 0;
4235 sv = (SV*)SvRV(sv);
4236 if (!SvOBJECT(sv))
4237 return 0;
4238 return 1;
4239}
4240
4241int
8ac85365 4242sv_isa(SV *sv, char *name)
463ee0b2 4243{
68dc0745 4244 if (!sv)
4245 return 0;
4246 if (SvGMAGICAL(sv))
4247 mg_get(sv);
ed6116ce 4248 if (!SvROK(sv))
463ee0b2 4249 return 0;
ed6116ce
LW
4250 sv = (SV*)SvRV(sv);
4251 if (!SvOBJECT(sv))
463ee0b2
LW
4252 return 0;
4253
4254 return strEQ(HvNAME(SvSTASH(sv)), name);
4255}
4256
4257SV*
8ac85365 4258newSVrv(SV *rv, char *classname)
463ee0b2 4259{
11343788 4260 dTHR;
463ee0b2
LW
4261 SV *sv;
4262
4561caa4 4263 new_SV(sv);
8990e307 4264 SvANY(sv) = 0;
a0d0e21e 4265 SvREFCNT(sv) = 0;
8990e307 4266 SvFLAGS(sv) = 0;
51cf62d8 4267
2213622d 4268 SV_CHECK_THINKFIRST(rv);
51cf62d8
OT
4269#ifdef OVERLOAD
4270 SvAMAGIC_off(rv);
4271#endif /* OVERLOAD */
4272
4273 if (SvTYPE(rv) < SVt_RV)
4274 sv_upgrade(rv, SVt_RV);
4275
4276 (void)SvOK_off(rv);
8990e307 4277 SvRV(rv) = SvREFCNT_inc(sv);
ed6116ce 4278 SvROK_on(rv);
463ee0b2 4279
a0d0e21e
LW
4280 if (classname) {
4281 HV* stash = gv_stashpv(classname, TRUE);
4282 (void)sv_bless(rv, stash);
4283 }
4284 return sv;
4285}
4286
4287SV*
8ac85365 4288sv_setref_pv(SV *rv, char *classname, void *pv)
a0d0e21e 4289{
189b2af5 4290 if (!pv) {
3280af22 4291 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
4292 SvSETMAGIC(rv);
4293 }
a0d0e21e
LW
4294 else
4295 sv_setiv(newSVrv(rv,classname), (IV)pv);
4296 return rv;
4297}
4298
4299SV*
8ac85365 4300sv_setref_iv(SV *rv, char *classname, IV iv)
a0d0e21e
LW
4301{
4302 sv_setiv(newSVrv(rv,classname), iv);
4303 return rv;
4304}
4305
4306SV*
8ac85365 4307sv_setref_nv(SV *rv, char *classname, double nv)
a0d0e21e
LW
4308{
4309 sv_setnv(newSVrv(rv,classname), nv);
4310 return rv;
4311}
463ee0b2 4312
a0d0e21e 4313SV*
8ac85365 4314sv_setref_pvn(SV *rv, char *classname, char *pv, I32 n)
a0d0e21e
LW
4315{
4316 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
4317 return rv;
4318}
4319
a0d0e21e 4320SV*
8ac85365 4321sv_bless(SV *sv, HV *stash)
a0d0e21e 4322{
11343788 4323 dTHR;
76e3520e 4324 SV *tmpRef;
a0d0e21e
LW
4325 if (!SvROK(sv))
4326 croak("Can't bless non-reference value");
76e3520e
GS
4327 tmpRef = SvRV(sv);
4328 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4329 if (SvREADONLY(tmpRef))
22c35a8c 4330 croak(PL_no_modify);
76e3520e
GS
4331 if (SvOBJECT(tmpRef)) {
4332 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 4333 --PL_sv_objcount;
76e3520e 4334 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 4335 }
a0d0e21e 4336 }
76e3520e
GS
4337 SvOBJECT_on(tmpRef);
4338 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 4339 ++PL_sv_objcount;
76e3520e
GS
4340 (void)SvUPGRADE(tmpRef, SVt_PVMG);
4341 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
a0d0e21e
LW
4342
4343#ifdef OVERLOAD
2e3febc6
CS
4344 if (Gv_AMG(stash))
4345 SvAMAGIC_on(sv);
4346 else
4347 SvAMAGIC_off(sv);
a0d0e21e
LW
4348#endif /* OVERLOAD */
4349
4350 return sv;
4351}
4352
76e3520e 4353STATIC void
8ac85365 4354sv_unglob(SV *sv)
a0d0e21e
LW
4355{
4356 assert(SvTYPE(sv) == SVt_PVGV);
4357 SvFAKE_off(sv);
4358 if (GvGP(sv))
1edc1566 4359 gp_free((GV*)sv);
e826b3c7
GS
4360 if (GvSTASH(sv)) {
4361 SvREFCNT_dec(GvSTASH(sv));
4362 GvSTASH(sv) = Nullhv;
4363 }
a0d0e21e
LW
4364 sv_unmagic(sv, '*');
4365 Safefree(GvNAME(sv));
a5f75d66 4366 GvMULTI_off(sv);
a0d0e21e
LW
4367 SvFLAGS(sv) &= ~SVTYPEMASK;
4368 SvFLAGS(sv) |= SVt_PVMG;
4369}
4370
ed6116ce 4371void
8ac85365 4372sv_unref(SV *sv)
ed6116ce 4373{
a0d0e21e
LW
4374 SV* rv = SvRV(sv);
4375
ed6116ce
LW
4376 SvRV(sv) = 0;
4377 SvROK_off(sv);
4633a7c4
LW
4378 if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4379 SvREFCNT_dec(rv);
8e07c86e 4380 else
4633a7c4 4381 sv_2mortal(rv); /* Schedule for freeing later */
ed6116ce 4382}
8990e307 4383
bbce6d69 4384void
8ac85365 4385sv_taint(SV *sv)
bbce6d69 4386{
4387 sv_magic((sv), Nullsv, 't', Nullch, 0);
4388}
4389
4390void
8ac85365 4391sv_untaint(SV *sv)
bbce6d69 4392{
13f57bf8 4393 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 4394 MAGIC *mg = mg_find(sv, 't');
4395 if (mg)
565764a8 4396 mg->mg_len &= ~1;
36477c24 4397 }
bbce6d69 4398}
4399
4400bool
8ac85365 4401sv_tainted(SV *sv)
bbce6d69 4402{
13f57bf8 4403 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
36477c24 4404 MAGIC *mg = mg_find(sv, 't');
565764a8 4405 if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
36477c24 4406 return TRUE;
4407 }
4408 return FALSE;
bbce6d69 4409}
4410
84902520 4411void
8ac85365 4412sv_setpviv(SV *sv, IV iv)
84902520
TB
4413{
4414 STRLEN len;
4415 char buf[TYPE_DIGITS(UV)];
4416 char *ptr = buf + sizeof(buf);
4417 int sign;
4418 UV uv;
4419 char *p;
84902520
TB
4420
4421 sv_setpvn(sv, "", 0);
4422 if (iv >= 0) {
4423 uv = iv;
4424 sign = 0;
4425 } else {
4426 uv = -iv;
4427 sign = 1;
4428 }
4429 do {
4430 *--ptr = '0' + (uv % 10);
4431 } while (uv /= 10);
4432 len = (buf + sizeof(buf)) - ptr;
4433 /* taking advantage of SvCUR(sv) == 0 */
4434 SvGROW(sv, sign + len + 1);
4435 p = SvPVX(sv);
4436 if (sign)
4437 *p++ = '-';
4438 memcpy(p, ptr, len);
4439 p += len;
4440 *p = '\0';
4441 SvCUR(sv) = p - SvPVX(sv);
4442}
4443
ef50df4b
GS
4444
4445void
4446sv_setpviv_mg(SV *sv, IV iv)
4447{
4448 sv_setpviv(sv,iv);
4449 SvSETMAGIC(sv);
4450}
4451
46fc3d4c 4452void
4453sv_setpvf(SV *sv, const char* pat, ...)
46fc3d4c 4454{
4455 va_list args;
46fc3d4c 4456 va_start(args, pat);
fc36a67e 4457 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 4458 va_end(args);
4459}
4460
ef50df4b 4461
ef50df4b
GS
4462void
4463sv_setpvf_mg(SV *sv, const char* pat, ...)
ef50df4b
GS
4464{
4465 va_list args;
ef50df4b 4466 va_start(args, pat);
ef50df4b
GS
4467 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4468 va_end(args);
4469 SvSETMAGIC(sv);
4470}
4471
46fc3d4c 4472void
4473sv_catpvf(SV *sv, const char* pat, ...)
46fc3d4c 4474{
4475 va_list args;
46fc3d4c 4476 va_start(args, pat);
fc36a67e 4477 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
46fc3d4c 4478 va_end(args);
4479}
4480
ef50df4b
GS
4481void
4482sv_catpvf_mg(SV *sv, const char* pat, ...)
ef50df4b
GS
4483{
4484 va_list args;
ef50df4b 4485 va_start(args, pat);
ef50df4b
GS
4486 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4487 va_end(args);
4488 SvSETMAGIC(sv);
4489}
4490
46fc3d4c 4491void
ad8d18a8 4492sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
46fc3d4c 4493{
4494 sv_setpvn(sv, "", 0);
4495 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4496}
4497
4498void
ad8d18a8 4499sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
46fc3d4c 4500{
e858de61 4501 dTHR;
46fc3d4c 4502 char *p;
4503 char *q;
4504 char *patend;
fc36a67e 4505 STRLEN origlen;
46fc3d4c 4506 I32 svix = 0;
c635e13b 4507 static char nullstr[] = "(null)";
46fc3d4c 4508
4509 /* no matter what, this is a string now */
fc36a67e 4510 (void)SvPV_force(sv, origlen);
46fc3d4c 4511
fc36a67e 4512 /* special-case "", "%s", and "%_" */
46fc3d4c 4513 if (patlen == 0)
4514 return;
fc36a67e 4515 if (patlen == 2 && pat[0] == '%') {
4516 switch (pat[1]) {
4517 case 's':
c635e13b 4518 if (args) {
4519 char *s = va_arg(*args, char*);
4520 sv_catpv(sv, s ? s : nullstr);
4521 }
fc36a67e 4522 else if (svix < svmax)
4523 sv_catsv(sv, *svargs);
4524 return;
4525 case '_':
4526 if (args) {
4527 sv_catsv(sv, va_arg(*args, SV*));
4528 return;
4529 }
4530 /* See comment on '_' below */
4531 break;
4532 }
46fc3d4c 4533 }
4534
4535 patend = (char*)pat + patlen;
4536 for (p = (char*)pat; p < patend; p = q) {
4537 bool alt = FALSE;
4538 bool left = FALSE;
4539 char fill = ' ';
4540 char plus = 0;
4541 char intsize = 0;
4542 STRLEN width = 0;
fc36a67e 4543 STRLEN zeros = 0;
46fc3d4c 4544 bool has_precis = FALSE;
4545 STRLEN precis = 0;
4546
4547 char esignbuf[4];
dfe13c55 4548 U8 utf8buf[10];
46fc3d4c 4549 STRLEN esignlen = 0;
4550
4551 char *eptr = Nullch;
fc36a67e 4552 STRLEN elen = 0;
4553 char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
46fc3d4c 4554
4555 static char *efloatbuf = Nullch;
4556 static STRLEN efloatsize = 0;
4557
4558 char c;
4559 int i;
4560 unsigned base;
4561 IV iv;
4562 UV uv;
4563 double nv;
4564 STRLEN have;
4565 STRLEN need;
4566 STRLEN gap;
4567
4568 for (q = p; q < patend && *q != '%'; ++q) ;
4569 if (q > p) {
4570 sv_catpvn(sv, p, q - p);
4571 p = q;
4572 }
4573 if (q++ >= patend)
4574 break;
4575
fc36a67e 4576 /* FLAGS */
4577
46fc3d4c 4578 while (*q) {
4579 switch (*q) {
4580 case ' ':
4581 case '+':
4582 plus = *q++;
4583 continue;
4584
4585 case '-':
4586 left = TRUE;
4587 q++;
4588 continue;
4589
4590 case '0':
4591 fill = *q++;
4592 continue;
4593
4594 case '#':
4595 alt = TRUE;
4596 q++;
4597 continue;
4598
fc36a67e 4599 default:
4600 break;
4601 }
4602 break;
4603 }
46fc3d4c 4604
fc36a67e 4605 /* WIDTH */
4606
4607 switch (*q) {
4608 case '1': case '2': case '3':
4609 case '4': case '5': case '6':
4610 case '7': case '8': case '9':
4611 width = 0;
4612 while (isDIGIT(*q))
4613 width = width * 10 + (*q++ - '0');
4614 break;
4615
4616 case '*':
4617 if (args)
4618 i = va_arg(*args, int);
4619 else
4620 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4621 left |= (i < 0);
4622 width = (i < 0) ? -i : i;
4623 q++;
4624 break;
4625 }
4626
4627 /* PRECISION */
46fc3d4c 4628
fc36a67e 4629 if (*q == '.') {
4630 q++;
4631 if (*q == '*') {
46fc3d4c 4632 if (args)
4633 i = va_arg(*args, int);
4634 else
4635 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
fc36a67e 4636 precis = (i < 0) ? 0 : i;
46fc3d4c 4637 q++;
fc36a67e 4638 }
4639 else {
4640 precis = 0;
4641 while (isDIGIT(*q))
4642 precis = precis * 10 + (*q++ - '0');
4643 }
4644 has_precis = TRUE;
4645 }
46fc3d4c 4646
fc36a67e 4647 /* SIZE */
46fc3d4c 4648
fc36a67e 4649 switch (*q) {
4650 case 'l':
4651#if 0 /* when quads have better support within Perl */
4652 if (*(q + 1) == 'l') {
4653 intsize = 'q';
4654 q += 2;
46fc3d4c 4655 break;
4656 }
fc36a67e 4657#endif
4658 /* FALL THROUGH */
4659 case 'h':
4660 case 'V':
4661 intsize = *q++;
46fc3d4c 4662 break;
4663 }
4664
fc36a67e 4665 /* CONVERSION */
4666
46fc3d4c 4667 switch (c = *q++) {
4668
4669 /* STRINGS */
4670
4671 case '%':
4672 eptr = q - 1;
4673 elen = 1;
4674 goto string;
4675
4676 case 'c':
a0ed51b3
LW
4677 if (IN_UTF8) {
4678 if (args)
4679 uv = va_arg(*args, int);
4680 else
4681 uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4682
dfe13c55
GS
4683 eptr = (char*)utf8buf;
4684 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
a0ed51b3
LW
4685 goto string;
4686 }
46fc3d4c 4687 if (args)
4688 c = va_arg(*args, int);
4689 else
4690 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4691 eptr = &c;
4692 elen = 1;
4693 goto string;
4694
46fc3d4c 4695 case 's':
4696 if (args) {
fc36a67e 4697 eptr = va_arg(*args, char*);
c635e13b 4698 if (eptr)
4699 elen = strlen(eptr);
4700 else {
4701 eptr = nullstr;
4702 elen = sizeof nullstr - 1;
4703 }
46fc3d4c 4704 }
a0ed51b3 4705 else if (svix < svmax) {
46fc3d4c 4706 eptr = SvPVx(svargs[svix++], elen);
a0ed51b3
LW
4707 if (IN_UTF8) {
4708 if (has_precis && precis < elen) {
4709 I32 p = precis;
4710 sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4711 precis = p;
4712 }
4713 if (width) { /* fudge width (can't fudge elen) */
4714 width += elen - sv_len_utf8(svargs[svix - 1]);
4715 }
4716 }
4717 }
46fc3d4c 4718 goto string;
4719
fc36a67e 4720 case '_':
4721 /*
4722 * The "%_" hack might have to be changed someday,
4723 * if ISO or ANSI decide to use '_' for something.
4724 * So we keep it hidden from users' code.
4725 */
4726 if (!args)
4727 goto unknown;
4728 eptr = SvPVx(va_arg(*args, SV*), elen);
4729
46fc3d4c 4730 string:
4731 if (has_precis && elen > precis)
4732 elen = precis;
4733 break;
4734
4735 /* INTEGERS */
4736
fc36a67e 4737 case 'p':
4738 if (args)
4739 uv = (UV)va_arg(*args, void*);
4740 else
4741 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4742 base = 16;
4743 goto integer;
4744
46fc3d4c 4745 case 'D':
4746 intsize = 'l';
4747 /* FALL THROUGH */
4748 case 'd':
4749 case 'i':
4750 if (args) {
4751 switch (intsize) {
4752 case 'h': iv = (short)va_arg(*args, int); break;
4753 default: iv = va_arg(*args, int); break;
4754 case 'l': iv = va_arg(*args, long); break;
fc36a67e 4755 case 'V': iv = va_arg(*args, IV); break;
46fc3d4c 4756 }
4757 }
4758 else {
4759 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4760 switch (intsize) {
4761 case 'h': iv = (short)iv; break;
4762 default: iv = (int)iv; break;
4763 case 'l': iv = (long)iv; break;
fc36a67e 4764 case 'V': break;
46fc3d4c 4765 }
4766 }
4767 if (iv >= 0) {
4768 uv = iv;
4769 if (plus)
4770 esignbuf[esignlen++] = plus;
4771 }
4772 else {
4773 uv = -iv;
4774 esignbuf[esignlen++] = '-';
4775 }
4776 base = 10;
4777 goto integer;
4778
fc36a67e 4779 case 'U':
4780 intsize = 'l';
4781 /* FALL THROUGH */
4782 case 'u':
4783 base = 10;
4784 goto uns_integer;
4785
46fc3d4c 4786 case 'O':
4787 intsize = 'l';
4788 /* FALL THROUGH */
4789 case 'o':
4790 base = 8;
4791 goto uns_integer;
4792
4793 case 'X':
46fc3d4c 4794 case 'x':
4795 base = 16;
46fc3d4c 4796
4797 uns_integer:
4798 if (args) {
4799 switch (intsize) {
4800 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
4801 default: uv = va_arg(*args, unsigned); break;
4802 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 4803 case 'V': uv = va_arg(*args, UV); break;
46fc3d4c 4804 }
4805 }
4806 else {
4807 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4808 switch (intsize) {
4809 case 'h': uv = (unsigned short)uv; break;
4810 default: uv = (unsigned)uv; break;
4811 case 'l': uv = (unsigned long)uv; break;
fc36a67e 4812 case 'V': break;
46fc3d4c 4813 }
4814 }
4815
4816 integer:
46fc3d4c 4817 eptr = ebuf + sizeof ebuf;
fc36a67e 4818 switch (base) {
4819 unsigned dig;
4820 case 16:
c10ed8b9
HS
4821 if (!uv)
4822 alt = FALSE;
fc36a67e 4823 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4824 do {
4825 dig = uv & 15;
4826 *--eptr = p[dig];
4827 } while (uv >>= 4);
4828 if (alt) {
46fc3d4c 4829 esignbuf[esignlen++] = '0';
fc36a67e 4830 esignbuf[esignlen++] = c; /* 'x' or 'X' */
46fc3d4c 4831 }
fc36a67e 4832 break;
4833 case 8:
4834 do {
4835 dig = uv & 7;
4836 *--eptr = '0' + dig;
4837 } while (uv >>= 3);
4838 if (alt && *eptr != '0')
4839 *--eptr = '0';
4840 break;
4841 default: /* it had better be ten or less */
4842 do {
4843 dig = uv % base;
4844 *--eptr = '0' + dig;
4845 } while (uv /= base);
4846 break;
46fc3d4c 4847 }
4848 elen = (ebuf + sizeof ebuf) - eptr;
c10ed8b9
HS
4849 if (has_precis) {
4850 if (precis > elen)
4851 zeros = precis - elen;
4852 else if (precis == 0 && elen == 1 && *eptr == '0')
4853 elen = 0;
4854 }
46fc3d4c 4855 break;
4856
4857 /* FLOATING POINT */
4858
fc36a67e 4859 case 'F':
4860 c = 'f'; /* maybe %F isn't supported here */
4861 /* FALL THROUGH */
46fc3d4c 4862 case 'e': case 'E':
fc36a67e 4863 case 'f':
46fc3d4c 4864 case 'g': case 'G':
4865
4866 /* This is evil, but floating point is even more evil */
4867
fc36a67e 4868 if (args)
4869 nv = va_arg(*args, double);
4870 else
4871 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
4872
4873 need = 0;
4874 if (c != 'e' && c != 'E') {
4875 i = PERL_INT_MIN;
4876 (void)frexp(nv, &i);
4877 if (i == PERL_INT_MIN)
c635e13b 4878 die("panic: frexp");
4879 if (i > 0)
fc36a67e 4880 need = BIT_DIGITS(i);
4881 }
4882 need += has_precis ? precis : 6; /* known default */
4883 if (need < width)
4884 need = width;
4885
46fc3d4c 4886 need += 20; /* fudge factor */
4887 if (efloatsize < need) {
4888 Safefree(efloatbuf);
4889 efloatsize = need + 20; /* more fudge */
4890 New(906, efloatbuf, efloatsize, char);
4891 }
4892
4893 eptr = ebuf + sizeof ebuf;
4894 *--eptr = '\0';
4895 *--eptr = c;
4896 if (has_precis) {
4897 base = precis;
4898 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4899 *--eptr = '.';
4900 }
4901 if (width) {
4902 base = width;
4903 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4904 }
4905 if (fill == '0')
4906 *--eptr = fill;
84902520
TB
4907 if (left)
4908 *--eptr = '-';
46fc3d4c 4909 if (plus)
4910 *--eptr = plus;
4911 if (alt)
4912 *--eptr = '#';
4913 *--eptr = '%';
4914
46fc3d4c 4915 (void)sprintf(efloatbuf, eptr, nv);
4916
4917 eptr = efloatbuf;
4918 elen = strlen(efloatbuf);
4919
4920#ifdef LC_NUMERIC
4921 /*
4922 * User-defined locales may include arbitrary characters.
4923 * And, unfortunately, some system may alloc the "C" locale
4924 * to be overridden by a malicious user.
4925 */
4926 if (used_locale)
4927 *used_locale = TRUE;
4928#endif /* LC_NUMERIC */
4929
4930 break;
4931
fc36a67e 4932 /* SPECIAL */
4933
4934 case 'n':
4935 i = SvCUR(sv) - origlen;
4936 if (args) {
c635e13b 4937 switch (intsize) {
4938 case 'h': *(va_arg(*args, short*)) = i; break;
4939 default: *(va_arg(*args, int*)) = i; break;
4940 case 'l': *(va_arg(*args, long*)) = i; break;
4941 case 'V': *(va_arg(*args, IV*)) = i; break;
4942 }
fc36a67e 4943 }
4944 else if (svix < svmax)
4945 sv_setuv(svargs[svix++], (UV)i);
4946 continue; /* not "break" */
4947
4948 /* UNKNOWN */
4949
46fc3d4c 4950 default:
fc36a67e 4951 unknown:
599cee73 4952 if (!args && ckWARN(WARN_PRINTF) &&
533c011a 4953 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
c635e13b 4954 SV *msg = sv_newmortal();
4955 sv_setpvf(msg, "Invalid conversion in %s: ",
533c011a 4956 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
c635e13b 4957 if (c)
4958 sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
4959 c & 0xFF);
4960 else
4961 sv_catpv(msg, "end of string");
599cee73 4962 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
c635e13b 4963 }
fb73857a 4964
4965 /* output mangled stuff ... */
4966 if (c == '\0')
4967 --q;
46fc3d4c 4968 eptr = p;
4969 elen = q - p;
fb73857a 4970
4971 /* ... right here, because formatting flags should not apply */
4972 SvGROW(sv, SvCUR(sv) + elen + 1);
4973 p = SvEND(sv);
4974 memcpy(p, eptr, elen);
4975 p += elen;
4976 *p = '\0';
4977 SvCUR(sv) = p - SvPVX(sv);
4978 continue; /* not "break" */
46fc3d4c 4979 }
4980
fc36a67e 4981 have = esignlen + zeros + elen;
46fc3d4c 4982 need = (have > width ? have : width);
4983 gap = need - have;
4984
7bc39d62 4985 SvGROW(sv, SvCUR(sv) + need + 1);
46fc3d4c 4986 p = SvEND(sv);
4987 if (esignlen && fill == '0') {
4988 for (i = 0; i < esignlen; i++)
4989 *p++ = esignbuf[i];
4990 }
4991 if (gap && !left) {
4992 memset(p, fill, gap);
4993 p += gap;
4994 }
4995 if (esignlen && fill != '0') {
4996 for (i = 0; i < esignlen; i++)
4997 *p++ = esignbuf[i];
4998 }
fc36a67e 4999 if (zeros) {
5000 for (i = zeros; i; i--)
5001 *p++ = '0';
5002 }
46fc3d4c 5003 if (elen) {
5004 memcpy(p, eptr, elen);
5005 p += elen;
5006 }
5007 if (gap && left) {
5008 memset(p, ' ', gap);
5009 p += gap;
5010 }
5011 *p = '\0';
5012 SvCUR(sv) = p - SvPVX(sv);
5013 }
5014}
5015
8990e307 5016void
8ac85365 5017sv_dump(SV *sv)
8990e307 5018{
35ff7856 5019#ifdef DEBUGGING
46fc3d4c 5020 SV *d = sv_newmortal();
5021 char *s;
8990e307
LW
5022 U32 flags;
5023 U32 type;
5024
5025 if (!sv) {
760ac839 5026 PerlIO_printf(Perl_debug_log, "SV = 0\n");
8990e307
LW
5027 return;
5028 }
5029
5030 flags = SvFLAGS(sv);
5031 type = SvTYPE(sv);
5032
46fc3d4c 5033 sv_setpvf(d, "(0x%lx)\n REFCNT = %ld\n FLAGS = (",
5034 (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
5035 if (flags & SVs_PADBUSY) sv_catpv(d, "PADBUSY,");
5036 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
5037 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
5038 if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
5039 if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
5040 if (flags & SVs_GMG) sv_catpv(d, "GMG,");
5041 if (flags & SVs_SMG) sv_catpv(d, "SMG,");
5042 if (flags & SVs_RMG) sv_catpv(d, "RMG,");
5043
5044 if (flags & SVf_IOK) sv_catpv(d, "IOK,");
5045 if (flags & SVf_NOK) sv_catpv(d, "NOK,");
5046 if (flags & SVf_POK) sv_catpv(d, "POK,");
5047 if (flags & SVf_ROK) sv_catpv(d, "ROK,");
5048 if (flags & SVf_OOK) sv_catpv(d, "OOK,");
5049 if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
5050 if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
8990e307 5051
1edc1566 5052#ifdef OVERLOAD
46fc3d4c 5053 if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
1edc1566 5054#endif /* OVERLOAD */
46fc3d4c 5055 if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
5056 if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
5057 if (flags & SVp_POK) sv_catpv(d, "pPOK,");
5058 if (flags & SVp_SCREAM) sv_catpv(d, "SCREAM,");
1edc1566 5059
5060 switch (type) {
5061 case SVt_PVCV:
774d564b 5062 case SVt_PVFM:
46fc3d4c 5063 if (CvANON(sv)) sv_catpv(d, "ANON,");
5064 if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
5065 if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
5066 if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
5067 if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
5068 break;
55497cff 5069 case SVt_PVHV:
46fc3d4c 5070 if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
5071 if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
5072 break;
1edc1566 5073 case SVt_PVGV:
46fc3d4c 5074 if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
5075 if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
5076 if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
5077 if (GvIMPORTED(sv)) {
5078 sv_catpv(d, "IMPORT");
5079 if (GvIMPORTED(sv) == GVf_IMPORTED)
5080 sv_catpv(d, "ALL,");
5081 else {
5082 sv_catpv(d, "(");
5083 if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
5084 if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
5085 if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
5086 if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
5087 sv_catpv(d, " ),");
5088 }
5089 }
c277df42
IZ
5090 case SVt_PVBM:
5091 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
5092 if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
5093 break;
1edc1566 5094 }
5095
46fc3d4c 5096 if (*(SvEND(d) - 1) == ',')
5097 SvPVX(d)[--SvCUR(d)] = '\0';
5098 sv_catpv(d, ")");
5099 s = SvPVX(d);
8990e307 5100
760ac839 5101 PerlIO_printf(Perl_debug_log, "SV = ");
8990e307
LW
5102 switch (type) {
5103 case SVt_NULL:
46fc3d4c 5104 PerlIO_printf(Perl_debug_log, "NULL%s\n", s);
8990e307
LW
5105 return;
5106 case SVt_IV:
46fc3d4c 5107 PerlIO_printf(Perl_debug_log, "IV%s\n", s);
8990e307
LW
5108 break;
5109 case SVt_NV:
46fc3d4c 5110 PerlIO_printf(Perl_debug_log, "NV%s\n", s);
8990e307
LW
5111 break;
5112 case SVt_RV:
46fc3d4c 5113 PerlIO_printf(Perl_debug_log, "RV%s\n", s);
8990e307
LW
5114 break;
5115 case SVt_PV:
46fc3d4c 5116 PerlIO_printf(Perl_debug_log, "PV%s\n", s);
8990e307
LW
5117 break;
5118 case SVt_PVIV:
46fc3d4c 5119 PerlIO_printf(Perl_debug_log, "PVIV%s\n", s);
8990e307
LW
5120 break;
5121 case SVt_PVNV:
46fc3d4c 5122 PerlIO_printf(Perl_debug_log, "PVNV%s\n", s);
8990e307
LW
5123 break;
5124 case SVt_PVBM:
46fc3d4c 5125 PerlIO_printf(Perl_debug_log, "PVBM%s\n", s);
8990e307
LW
5126 break;
5127 case SVt_PVMG:
46fc3d4c 5128 PerlIO_printf(Perl_debug_log, "PVMG%s\n", s);
8990e307
LW
5129 break;
5130 case SVt_PVLV:
46fc3d4c 5131 PerlIO_printf(Perl_debug_log, "PVLV%s\n", s);
8990e307
LW
5132 break;
5133 case SVt_PVAV:
46fc3d4c 5134 PerlIO_printf(Perl_debug_log, "PVAV%s\n", s);
8990e307
LW
5135 break;
5136 case SVt_PVHV:
46fc3d4c 5137 PerlIO_printf(Perl_debug_log, "PVHV%s\n", s);
8990e307
LW
5138 break;
5139 case SVt_PVCV:
46fc3d4c 5140 PerlIO_printf(Perl_debug_log, "PVCV%s\n", s);
8990e307
LW
5141 break;
5142 case SVt_PVGV:
46fc3d4c 5143 PerlIO_printf(Perl_debug_log, "PVGV%s\n", s);
8990e307
LW
5144 break;
5145 case SVt_PVFM:
46fc3d4c 5146 PerlIO_printf(Perl_debug_log, "PVFM%s\n", s);
8990e307
LW
5147 break;
5148 case SVt_PVIO:
46fc3d4c 5149 PerlIO_printf(Perl_debug_log, "PVIO%s\n", s);
8990e307
LW
5150 break;
5151 default:
46fc3d4c 5152 PerlIO_printf(Perl_debug_log, "UNKNOWN%s\n", s);
8990e307
LW
5153 return;
5154 }
5155 if (type >= SVt_PVIV || type == SVt_IV)
760ac839 5156 PerlIO_printf(Perl_debug_log, " IV = %ld\n", (long)SvIVX(sv));
bbce6d69 5157 if (type >= SVt_PVNV || type == SVt_NV) {
36477c24 5158 SET_NUMERIC_STANDARD();
760ac839 5159 PerlIO_printf(Perl_debug_log, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
bbce6d69 5160 }
8990e307 5161 if (SvROK(sv)) {
760ac839 5162 PerlIO_printf(Perl_debug_log, " RV = 0x%lx\n", (long)SvRV(sv));
8990e307
LW
5163 sv_dump(SvRV(sv));
5164 return;
5165 }
5166 if (type < SVt_PV)
5167 return;
5168 if (type <= SVt_PVLV) {
5169 if (SvPVX(sv))
760ac839 5170 PerlIO_printf(Perl_debug_log, " PV = 0x%lx \"%s\"\n CUR = %ld\n LEN = %ld\n",
a0d0e21e 5171 (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
8990e307 5172 else
760ac839 5173 PerlIO_printf(Perl_debug_log, " PV = 0\n");
8990e307
LW
5174 }
5175 if (type >= SVt_PVMG) {
5176 if (SvMAGIC(sv)) {
760ac839 5177 PerlIO_printf(Perl_debug_log, " MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
8990e307
LW
5178 }
5179 if (SvSTASH(sv))
760ac839 5180 PerlIO_printf(Perl_debug_log, " STASH = \"%s\"\n", HvNAME(SvSTASH(sv)));
8990e307
LW
5181 }
5182 switch (type) {
5183 case SVt_PVLV:
760ac839
LW
5184 PerlIO_printf(Perl_debug_log, " TYPE = %c\n", LvTYPE(sv));
5185 PerlIO_printf(Perl_debug_log, " TARGOFF = %ld\n", (long)LvTARGOFF(sv));
5186 PerlIO_printf(Perl_debug_log, " TARGLEN = %ld\n", (long)LvTARGLEN(sv));
5187 PerlIO_printf(Perl_debug_log, " TARG = 0x%lx\n", (long)LvTARG(sv));
8990e307
LW
5188 sv_dump(LvTARG(sv));
5189 break;
5190 case SVt_PVAV:
760ac839
LW
5191 PerlIO_printf(Perl_debug_log, " ARRAY = 0x%lx\n", (long)AvARRAY(sv));
5192 PerlIO_printf(Perl_debug_log, " ALLOC = 0x%lx\n", (long)AvALLOC(sv));
93965878 5193 PerlIO_printf(Perl_debug_log, " FILL = %ld\n", (long)AvFILLp(sv));
760ac839
LW
5194 PerlIO_printf(Perl_debug_log, " MAX = %ld\n", (long)AvMAX(sv));
5195 PerlIO_printf(Perl_debug_log, " ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
4633a7c4 5196 flags = AvFLAGS(sv);
46fc3d4c 5197 sv_setpv(d, "");
5198 if (flags & AVf_REAL) sv_catpv(d, ",REAL");
5199 if (flags & AVf_REIFY) sv_catpv(d, ",REIFY");
5200 if (flags & AVf_REUSED) sv_catpv(d, ",REUSED");
5201 PerlIO_printf(Perl_debug_log, " FLAGS = (%s)\n",
5202 SvCUR(d) ? SvPVX(d) + 1 : "");
8990e307
LW
5203 break;
5204 case SVt_PVHV:
760ac839
LW
5205 PerlIO_printf(Perl_debug_log, " ARRAY = 0x%lx\n",(long)HvARRAY(sv));
5206 PerlIO_printf(Perl_debug_log, " KEYS = %ld\n", (long)HvKEYS(sv));
5207 PerlIO_printf(Perl_debug_log, " FILL = %ld\n", (long)HvFILL(sv));
5208 PerlIO_printf(Perl_debug_log, " MAX = %ld\n", (long)HvMAX(sv));
5209 PerlIO_printf(Perl_debug_log, " RITER = %ld\n", (long)HvRITER(sv));
5210 PerlIO_printf(Perl_debug_log, " EITER = 0x%lx\n",(long) HvEITER(sv));
8990e307 5211 if (HvPMROOT(sv))
760ac839 5212 PerlIO_printf(Perl_debug_log, " PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
8990e307 5213 if (HvNAME(sv))
760ac839 5214 PerlIO_printf(Perl_debug_log, " NAME = \"%s\"\n", HvNAME(sv));
8990e307 5215 break;
8990e307 5216 case SVt_PVCV:
1edc1566 5217 if (SvPOK(sv))
3280af22 5218 PerlIO_printf(Perl_debug_log, " PROTOTYPE = \"%s\"\n", SvPV(sv,PL_na));
fa83b5b6 5219 /* FALL THROUGH */
5220 case SVt_PVFM:
760ac839
LW
5221 PerlIO_printf(Perl_debug_log, " STASH = 0x%lx\n", (long)CvSTASH(sv));
5222 PerlIO_printf(Perl_debug_log, " START = 0x%lx\n", (long)CvSTART(sv));
5223 PerlIO_printf(Perl_debug_log, " ROOT = 0x%lx\n", (long)CvROOT(sv));
5224 PerlIO_printf(Perl_debug_log, " XSUB = 0x%lx\n", (long)CvXSUB(sv));
5225 PerlIO_printf(Perl_debug_log, " XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
d1bf51dd 5226 PerlIO_printf(Perl_debug_log, " GV = 0x%lx", (long)CvGV(sv));
1edc1566 5227 if (CvGV(sv) && GvNAME(CvGV(sv))) {
d1bf51dd 5228 PerlIO_printf(Perl_debug_log, " \"%s\"\n", GvNAME(CvGV(sv)));
1edc1566 5229 } else {
d1bf51dd 5230 PerlIO_printf(Perl_debug_log, "\n");
1edc1566 5231 }
760ac839
LW
5232 PerlIO_printf(Perl_debug_log, " FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
5233 PerlIO_printf(Perl_debug_log, " DEPTH = %ld\n", (long)CvDEPTH(sv));
5234 PerlIO_printf(Perl_debug_log, " PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
5235 PerlIO_printf(Perl_debug_log, " OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
11343788 5236#ifdef USE_THREADS
5dc0d613 5237 PerlIO_printf(Perl_debug_log, " MUTEXP = 0x%lx\n", (long)CvMUTEXP(sv));
5dc0d613 5238 PerlIO_printf(Perl_debug_log, " OWNER = 0x%lx\n", (long)CvOWNER(sv));
11343788 5239#endif /* USE_THREADS */
77a005ab
MB
5240 PerlIO_printf(Perl_debug_log, " FLAGS = 0x%lx\n",
5241 (unsigned long)CvFLAGS(sv));
8990e307 5242 if (type == SVt_PVFM)
760ac839 5243 PerlIO_printf(Perl_debug_log, " LINES = %ld\n", (long)FmLINES(sv));
8990e307
LW
5244 break;
5245 case SVt_PVGV:
760ac839
LW
5246 PerlIO_printf(Perl_debug_log, " NAME = \"%s\"\n", GvNAME(sv));
5247 PerlIO_printf(Perl_debug_log, " NAMELEN = %ld\n", (long)GvNAMELEN(sv));
ec12f114
JPC
5248 PerlIO_printf(Perl_debug_log, " STASH = \"%s\"\n",
5249 SvTYPE(GvSTASH(sv)) == SVt_PVHV ? HvNAME(GvSTASH(sv)) : "(deleted)");
760ac839
LW
5250 PerlIO_printf(Perl_debug_log, " GP = 0x%lx\n", (long)GvGP(sv));
5251 PerlIO_printf(Perl_debug_log, " SV = 0x%lx\n", (long)GvSV(sv));
5252 PerlIO_printf(Perl_debug_log, " REFCNT = %ld\n", (long)GvREFCNT(sv));
5253 PerlIO_printf(Perl_debug_log, " IO = 0x%lx\n", (long)GvIOp(sv));
5254 PerlIO_printf(Perl_debug_log, " FORM = 0x%lx\n", (long)GvFORM(sv));
5255 PerlIO_printf(Perl_debug_log, " AV = 0x%lx\n", (long)GvAV(sv));
5256 PerlIO_printf(Perl_debug_log, " HV = 0x%lx\n", (long)GvHV(sv));
5257 PerlIO_printf(Perl_debug_log, " CV = 0x%lx\n", (long)GvCV(sv));
5258 PerlIO_printf(Perl_debug_log, " CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
5259 PerlIO_printf(Perl_debug_log, " LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
5260 PerlIO_printf(Perl_debug_log, " LINE = %ld\n", (long)GvLINE(sv));
55497cff 5261 PerlIO_printf(Perl_debug_log, " FILEGV = 0x%lx\n", (long)GvFILEGV(sv));
760ac839 5262 PerlIO_printf(Perl_debug_log, " EGV = 0x%lx\n", (long)GvEGV(sv));
8990e307
LW
5263 break;
5264 case SVt_PVIO:
760ac839
LW
5265 PerlIO_printf(Perl_debug_log, " IFP = 0x%lx\n", (long)IoIFP(sv));
5266 PerlIO_printf(Perl_debug_log, " OFP = 0x%lx\n", (long)IoOFP(sv));
5267 PerlIO_printf(Perl_debug_log, " DIRP = 0x%lx\n", (long)IoDIRP(sv));
5268 PerlIO_printf(Perl_debug_log, " LINES = %ld\n", (long)IoLINES(sv));
5269 PerlIO_printf(Perl_debug_log, " PAGE = %ld\n", (long)IoPAGE(sv));
5270 PerlIO_printf(Perl_debug_log, " PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
5271 PerlIO_printf(Perl_debug_log, " LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
5272 PerlIO_printf(Perl_debug_log, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
5273 PerlIO_printf(Perl_debug_log, " TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
5274 PerlIO_printf(Perl_debug_log, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
5275 PerlIO_printf(Perl_debug_log, " FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
5276 PerlIO_printf(Perl_debug_log, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
5277 PerlIO_printf(Perl_debug_log, " BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
5278 PerlIO_printf(Perl_debug_log, " SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
5279 PerlIO_printf(Perl_debug_log, " TYPE = %c\n", IoTYPE(sv));
5280 PerlIO_printf(Perl_debug_log, " FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
8990e307
LW
5281 break;
5282 }
35ff7856 5283#endif /* DEBUGGING */
8990e307 5284}