3 * Copyright (c) 1991-1999, Larry Wall
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.
11 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
18 /* Use an overridden DBL_DIG */
22 # define DBL_DIG OVR_DBL_DIG
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.
35 #define DBL_DIG 15 /* A guess that works lots of places */
40 #define FCALL this->*f
41 #define VTBL this->*vtbl
43 #else /* !PERL_OBJECT */
45 static IV asIV _((SV* sv));
46 static UV asUV _((SV* sv));
47 static SV *more_sv _((void));
48 static void more_xiv _((void));
49 static void more_xnv _((void));
50 static void more_xpv _((void));
51 static void more_xrv _((void));
52 static XPVIV *new_xiv _((void));
53 static XPVNV *new_xnv _((void));
54 static XPV *new_xpv _((void));
55 static XRV *new_xrv _((void));
56 static void del_xiv _((XPVIV* p));
57 static void del_xnv _((XPVNV* p));
58 static void del_xpv _((XPV* p));
59 static void del_xrv _((XRV* p));
60 static void sv_unglob _((SV* sv));
63 static void *my_safemalloc(MEM_SIZE size);
66 typedef void (*SVFUNC) _((SV*));
70 #endif /* PERL_OBJECT */
72 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
79 (p) = (SV*)safemalloc(sizeof(SV)); \
91 Safefree((char*)(p)); \
96 static I32 registry_size;
98 #define REGHASH(sv,size) ((((U32)(sv)) >> 2) % (size))
100 #define REG_REPLACE(sv,a,b) \
102 void* p = sv->sv_any; \
103 I32 h = REGHASH(sv, registry_size); \
105 while (registry[i] != (a)) { \
106 if (++i >= registry_size) \
109 die("SV registry bug"); \
114 #define REG_ADD(sv) REG_REPLACE(sv,Nullsv,sv)
115 #define REG_REMOVE(sv) REG_REPLACE(sv,sv,Nullsv)
121 if (PL_sv_count >= (registry_size >> 1))
123 SV **oldreg = registry;
124 I32 oldsize = registry_size;
126 registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
127 Newz(707, registry, registry_size, SV*);
132 for (i = 0; i < oldsize; ++i) {
133 SV* oldsv = oldreg[i];
159 for (i = 0; i < registry_size; ++i) {
160 SV* sv = registry[i];
161 if (sv && SvTYPE(sv) != SVTYPEMASK)
167 sv_add_arena(ptr, size, flags)
172 if (!(flags & SVf_FAKE))
179 * "A time to plant, and a time to uproot what was planted..."
182 #define plant_SV(p) \
184 SvANY(p) = (void *)PL_sv_root; \
185 SvFLAGS(p) = SVTYPEMASK; \
190 /* sv_mutex must be held while calling uproot_SV() */
191 #define uproot_SV(p) \
194 PL_sv_root = (SV*)SvANY(p); \
216 if (PL_debug & 32768) \
226 if (PL_debug & 32768) {
231 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
233 svend = &sva[SvREFCNT(sva)];
234 if (p >= sv && p < svend)
238 warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
245 #else /* ! DEBUGGING */
247 #define del_SV(p) plant_SV(p)
249 #endif /* DEBUGGING */
252 sv_add_arena(char *ptr, U32 size, U32 flags)
257 Zero(sva, size, char);
259 /* The first SV in an arena isn't an SV. */
260 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
261 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
262 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
264 PL_sv_arenaroot = sva;
265 PL_sv_root = sva + 1;
267 svend = &sva[SvREFCNT(sva) - 1];
270 SvANY(sv) = (void *)(SV*)(sv + 1);
271 SvFLAGS(sv) = SVTYPEMASK;
275 SvFLAGS(sv) = SVTYPEMASK;
278 /* sv_mutex must be held while calling more_sv() */
285 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
286 PL_nice_chunk = Nullch;
289 char *chunk; /* must use New here to match call to */
290 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
291 sv_add_arena(chunk, 1008, 0);
304 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
305 svend = &sva[SvREFCNT(sva)];
306 for (sv = sva + 1; sv < svend; ++sv) {
307 if (SvTYPE(sv) != SVTYPEMASK)
316 do_report_used(SV *sv)
318 if (SvTYPE(sv) != SVTYPEMASK) {
319 /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
320 PerlIO_printf(PerlIO_stderr(), "****\n");
328 visit(FUNC_NAME_TO_PTR(do_report_used));
332 do_clean_objs(SV *sv)
336 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
337 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
343 /* XXX Might want to check arrays, etc. */
346 #ifndef DISABLE_DESTRUCTOR_KLUDGE
348 do_clean_named_objs(SV *sv)
350 if (SvTYPE(sv) == SVt_PVGV) {
351 if ( SvOBJECT(GvSV(sv)) ||
352 GvAV(sv) && SvOBJECT(GvAV(sv)) ||
353 GvHV(sv) && SvOBJECT(GvHV(sv)) ||
354 GvIO(sv) && SvOBJECT(GvIO(sv)) ||
355 GvCV(sv) && SvOBJECT(GvCV(sv)) )
357 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
367 PL_in_clean_objs = TRUE;
368 visit(FUNC_NAME_TO_PTR(do_clean_objs));
369 #ifndef DISABLE_DESTRUCTOR_KLUDGE
370 /* some barnacles may yet remain, clinging to typeglobs */
371 visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
373 PL_in_clean_objs = FALSE;
379 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
380 SvFLAGS(sv) |= SVf_BREAK;
387 PL_in_clean_all = TRUE;
388 visit(FUNC_NAME_TO_PTR(do_clean_all));
389 PL_in_clean_all = FALSE;
398 /* Free arenas here, but be careful about fake ones. (We assume
399 contiguity of the fake ones with the corresponding real ones.) */
401 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
402 svanext = (SV*) SvANY(sva);
403 while (svanext && SvFAKE(svanext))
404 svanext = (SV*) SvANY(svanext);
407 Safefree((void *)sva);
411 Safefree(PL_nice_chunk);
412 PL_nice_chunk = Nullch;
413 PL_nice_chunk_size = 0;
427 * See comment in more_xiv() -- RAM.
429 PL_xiv_root = *(IV**)xiv;
431 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
437 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
439 *(IV**)xiv = PL_xiv_root;
450 New(705, ptr, 1008/sizeof(XPV), XPV);
451 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
452 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
455 xivend = &xiv[1008 / sizeof(IV) - 1];
456 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
458 while (xiv < xivend) {
459 *(IV**)xiv = (IV *)(xiv + 1);
473 PL_xnv_root = *(double**)xnv;
475 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
481 double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
483 *(double**)xnv = PL_xnv_root;
491 register double* xnv;
492 register double* xnvend;
493 New(711, xnv, 1008/sizeof(double), double);
494 xnvend = &xnv[1008 / sizeof(double) - 1];
495 xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
497 while (xnv < xnvend) {
498 *(double**)xnv = (double*)(xnv + 1);
512 PL_xrv_root = (XRV*)xrv->xrv_rv;
521 p->xrv_rv = (SV*)PL_xrv_root;
530 register XRV* xrvend;
531 New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
533 xrvend = &xrv[1008 / sizeof(XRV) - 1];
534 while (xrv < xrvend) {
535 xrv->xrv_rv = (SV*)(xrv + 1);
549 PL_xpv_root = (XPV*)xpv->xpv_pv;
558 p->xpv_pv = (char*)PL_xpv_root;
567 register XPV* xpvend;
568 New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
570 xpvend = &xpv[1008 / sizeof(XPV) - 1];
571 while (xpv < xpvend) {
572 xpv->xpv_pv = (char*)(xpv + 1);
579 #define new_XIV() (void*)safemalloc(sizeof(XPVIV))
580 #define del_XIV(p) Safefree((char*)p)
582 #define new_XIV() (void*)new_xiv()
583 #define del_XIV(p) del_xiv((XPVIV*) p)
587 #define new_XNV() (void*)safemalloc(sizeof(XPVNV))
588 #define del_XNV(p) Safefree((char*)p)
590 #define new_XNV() (void*)new_xnv()
591 #define del_XNV(p) del_xnv((XPVNV*) p)
595 #define new_XRV() (void*)safemalloc(sizeof(XRV))
596 #define del_XRV(p) Safefree((char*)p)
598 #define new_XRV() (void*)new_xrv()
599 #define del_XRV(p) del_xrv((XRV*) p)
603 #define new_XPV() (void*)safemalloc(sizeof(XPV))
604 #define del_XPV(p) Safefree((char*)p)
606 #define new_XPV() (void*)new_xpv()
607 #define del_XPV(p) del_xpv((XPV *)p)
611 # define my_safemalloc(s) safemalloc(s)
612 # define my_safefree(s) safefree(s)
615 my_safemalloc(MEM_SIZE size)
618 New(717, p, size, char);
621 # define my_safefree(s) Safefree(s)
624 #define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
625 #define del_XPVIV(p) my_safefree((char*)p)
627 #define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
628 #define del_XPVNV(p) my_safefree((char*)p)
630 #define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
631 #define del_XPVMG(p) my_safefree((char*)p)
633 #define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
634 #define del_XPVLV(p) my_safefree((char*)p)
636 #define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
637 #define del_XPVAV(p) my_safefree((char*)p)
639 #define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
640 #define del_XPVHV(p) my_safefree((char*)p)
642 #define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
643 #define del_XPVCV(p) my_safefree((char*)p)
645 #define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
646 #define del_XPVGV(p) my_safefree((char*)p)
648 #define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
649 #define del_XPVBM(p) my_safefree((char*)p)
651 #define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
652 #define del_XPVFM(p) my_safefree((char*)p)
654 #define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
655 #define del_XPVIO(p) my_safefree((char*)p)
658 sv_upgrade(register SV *sv, U32 mt)
668 if (SvTYPE(sv) == mt)
674 switch (SvTYPE(sv)) {
689 nv = (double)SvIVX(sv);
695 else if (mt < SVt_PVIV)
712 pv = (char*)SvRV(sv);
716 nv = (double)(unsigned long)pv;
732 else if (mt == SVt_NV)
743 del_XPVIV(SvANY(sv));
753 del_XPVNV(SvANY(sv));
763 del_XPVMG(SvANY(sv));
766 croak("Can't upgrade that kind of scalar");
771 croak("Can't upgrade to undef");
773 SvANY(sv) = new_XIV();
777 SvANY(sv) = new_XNV();
781 SvANY(sv) = new_XRV();
785 SvANY(sv) = new_XPV();
791 SvANY(sv) = new_XPVIV();
801 SvANY(sv) = new_XPVNV();
809 SvANY(sv) = new_XPVMG();
819 SvANY(sv) = new_XPVLV();
833 SvANY(sv) = new_XPVAV();
848 SvANY(sv) = new_XPVHV();
864 SvANY(sv) = new_XPVCV();
865 Zero(SvANY(sv), 1, XPVCV);
875 SvANY(sv) = new_XPVGV();
890 SvANY(sv) = new_XPVBM();
903 SvANY(sv) = new_XPVFM();
904 Zero(SvANY(sv), 1, XPVFM);
914 SvANY(sv) = new_XPVIO();
915 Zero(SvANY(sv), 1, XPVIO);
926 SvFLAGS(sv) &= ~SVTYPEMASK;
932 sv_backoff(register SV *sv)
937 SvLEN(sv) += SvIVX(sv);
938 SvPVX(sv) -= SvIVX(sv);
940 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
942 SvFLAGS(sv) &= ~SVf_OOK;
947 sv_grow(register SV *sv, register STRLEN newlen)
952 if (newlen >= 0x10000) {
953 PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
956 #endif /* HAS_64K_LIMIT */
959 if (SvTYPE(sv) < SVt_PV) {
960 sv_upgrade(sv, SVt_PV);
963 else if (SvOOK(sv)) { /* pv is offset? */
966 if (newlen > SvLEN(sv))
967 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
969 if (newlen >= 0x10000)
975 if (newlen > SvLEN(sv)) { /* need more room? */
976 if (SvLEN(sv) && s) {
977 #if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
978 STRLEN l = malloced_size((void*)SvPVX(sv));
984 Renew(s,newlen,char);
987 New(703,s,newlen,char);
989 SvLEN_set(sv, newlen);
995 sv_setiv(register SV *sv, IV i)
997 SV_CHECK_THINKFIRST(sv);
998 switch (SvTYPE(sv)) {
1000 sv_upgrade(sv, SVt_IV);
1003 sv_upgrade(sv, SVt_PVNV);
1007 sv_upgrade(sv, SVt_PVIV);
1018 croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
1019 PL_op_desc[PL_op->op_type]);
1022 (void)SvIOK_only(sv); /* validate number */
1028 sv_setiv_mg(register SV *sv, IV i)
1035 sv_setuv(register SV *sv, UV u)
1043 sv_setuv_mg(register SV *sv, UV u)
1050 sv_setnv(register SV *sv, double num)
1052 SV_CHECK_THINKFIRST(sv);
1053 switch (SvTYPE(sv)) {
1056 sv_upgrade(sv, SVt_NV);
1061 sv_upgrade(sv, SVt_PVNV);
1072 croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
1073 PL_op_name[PL_op->op_type]);
1077 (void)SvNOK_only(sv); /* validate number */
1082 sv_setnv_mg(register SV *sv, double num)
1089 not_a_number(SV *sv)
1095 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1096 /* each *s can expand to 4 chars + "...\0",
1097 i.e. need room for 8 chars */
1099 for (s = SvPVX(sv); *s && d < limit; s++) {
1101 if (ch & 128 && !isPRINT_LC(ch)) {
1110 else if (ch == '\r') {
1114 else if (ch == '\f') {
1118 else if (ch == '\\') {
1122 else if (isPRINT_LC(ch))
1137 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric in %s", tmpbuf,
1138 PL_op_name[PL_op->op_type]);
1140 warner(WARN_NUMERIC, "Argument \"%s\" isn't numeric", tmpbuf);
1143 /* the number can be converted to _integer_ with atol() */
1144 #define IS_NUMBER_TO_INT_BY_ATOL 0x01
1145 #define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1146 #define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
1147 #define IS_NUMBER_NEG 0x08 /* not good to cache UV */
1149 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1150 until proven guilty, assume that things are not that bad... */
1153 sv_2iv(register SV *sv)
1157 if (SvGMAGICAL(sv)) {
1162 return I_V(SvNVX(sv));
1164 if (SvPOKp(sv) && SvLEN(sv))
1167 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1169 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1170 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1175 if (SvTHINKFIRST(sv)) {
1178 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1179 return SvIV(tmpstr);
1180 return (IV)SvRV(sv);
1182 if (SvREADONLY(sv)) {
1184 return I_V(SvNVX(sv));
1186 if (SvPOKp(sv) && SvLEN(sv))
1190 if (ckWARN(WARN_UNINITIALIZED))
1191 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1198 return (IV)(SvUVX(sv));
1205 /* We can cache the IV/UV value even if it not good enough
1206 * to reconstruct NV, since the conversion to PV will prefer
1207 * NV over IV/UV. XXXX 64-bit?
1210 if (SvTYPE(sv) == SVt_NV)
1211 sv_upgrade(sv, SVt_PVNV);
1214 if (SvNVX(sv) < (double)IV_MAX + 0.5)
1215 SvIVX(sv) = I_V(SvNVX(sv));
1217 SvUVX(sv) = U_V(SvNVX(sv));
1220 DEBUG_c(PerlIO_printf(Perl_debug_log,
1221 "0x%lx 2iv(%lu => %ld) (as unsigned)\n",
1223 (unsigned long)SvUVX(sv), (long)(IV)SvUVX(sv)));
1224 return (IV)SvUVX(sv);
1227 else if (SvPOKp(sv) && SvLEN(sv)) {
1228 I32 numtype = looks_like_number(sv);
1230 /* We want to avoid a possible problem when we cache an IV which
1231 may be later translated to an NV, and the resulting NV is not
1232 the translation of the initial data.
1234 This means that if we cache such an IV, we need to cache the
1235 NV as well. Moreover, we trade speed for space, and do not
1236 cache the NV if not needed.
1238 if (numtype & IS_NUMBER_NOT_IV) {
1239 /* May be not an integer. Need to cache NV if we cache IV
1240 * - otherwise future conversion to NV will be wrong. */
1243 SET_NUMERIC_STANDARD();
1244 d = atof(SvPVX(sv));
1246 if (SvTYPE(sv) < SVt_PVNV)
1247 sv_upgrade(sv, SVt_PVNV);
1251 DEBUG_c(PerlIO_printf(Perl_debug_log,
1252 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1254 if (SvNVX(sv) < (double)IV_MAX + 0.5)
1255 SvIVX(sv) = I_V(SvNVX(sv));
1257 SvUVX(sv) = U_V(SvNVX(sv));
1263 /* The NV may be reconstructed from IV - safe to cache IV,
1264 which may be calculated by atol(). */
1265 if (SvTYPE(sv) == SVt_PV)
1266 sv_upgrade(sv, SVt_PVIV);
1268 SvIVX(sv) = atol(SvPVX(sv)); /* XXXX 64-bit? */
1270 else { /* Not a number. Cache 0. */
1273 if (SvTYPE(sv) < SVt_PVIV)
1274 sv_upgrade(sv, SVt_PVIV);
1277 if (ckWARN(WARN_NUMERIC))
1283 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1284 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1285 if (SvTYPE(sv) < SVt_IV)
1286 /* Typically the caller expects that sv_any is not NULL now. */
1287 sv_upgrade(sv, SVt_IV);
1290 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
1291 (unsigned long)sv,(long)SvIVX(sv)));
1292 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
1296 sv_2uv(register SV *sv)
1300 if (SvGMAGICAL(sv)) {
1305 return U_V(SvNVX(sv));
1306 if (SvPOKp(sv) && SvLEN(sv))
1309 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1311 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1312 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1317 if (SvTHINKFIRST(sv)) {
1320 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1321 return SvUV(tmpstr);
1322 return (UV)SvRV(sv);
1324 if (SvREADONLY(sv)) {
1326 return U_V(SvNVX(sv));
1328 if (SvPOKp(sv) && SvLEN(sv))
1332 if (ckWARN(WARN_UNINITIALIZED))
1333 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1343 return (UV)SvIVX(sv);
1347 /* We can cache the IV/UV value even if it not good enough
1348 * to reconstruct NV, since the conversion to PV will prefer
1349 * NV over IV/UV. XXXX 64-bit?
1351 if (SvTYPE(sv) == SVt_NV)
1352 sv_upgrade(sv, SVt_PVNV);
1354 if (SvNVX(sv) >= -0.5) {
1356 SvUVX(sv) = U_V(SvNVX(sv));
1359 SvIVX(sv) = I_V(SvNVX(sv));
1361 DEBUG_c(PerlIO_printf(Perl_debug_log,
1362 "0x%lx 2uv(%ld => %lu) (as signed)\n",
1363 (unsigned long)sv,(long)SvIVX(sv),
1364 (long)(UV)SvIVX(sv)));
1365 return (UV)SvIVX(sv);
1368 else if (SvPOKp(sv) && SvLEN(sv)) {
1369 I32 numtype = looks_like_number(sv);
1371 /* We want to avoid a possible problem when we cache a UV which
1372 may be later translated to an NV, and the resulting NV is not
1373 the translation of the initial data.
1375 This means that if we cache such a UV, we need to cache the
1376 NV as well. Moreover, we trade speed for space, and do not
1377 cache the NV if not needed.
1379 if (numtype & IS_NUMBER_NOT_IV) {
1380 /* May be not an integer. Need to cache NV if we cache IV
1381 * - otherwise future conversion to NV will be wrong. */
1384 SET_NUMERIC_STANDARD();
1385 d = atof(SvPVX(sv)); /* XXXX 64-bit? */
1387 if (SvTYPE(sv) < SVt_PVNV)
1388 sv_upgrade(sv, SVt_PVNV);
1392 DEBUG_c(PerlIO_printf(Perl_debug_log,
1393 "0x%lx 2nv(%g)\n",(unsigned long)sv,
1395 if (SvNVX(sv) < -0.5) {
1396 SvIVX(sv) = I_V(SvNVX(sv));
1399 SvUVX(sv) = U_V(SvNVX(sv));
1403 else if (numtype & IS_NUMBER_NEG) {
1404 /* The NV may be reconstructed from IV - safe to cache IV,
1405 which may be calculated by atol(). */
1406 if (SvTYPE(sv) == SVt_PV)
1407 sv_upgrade(sv, SVt_PVIV);
1409 SvIVX(sv) = (IV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1411 else if (numtype) { /* Non-negative */
1412 /* The NV may be reconstructed from UV - safe to cache UV,
1413 which may be calculated by strtoul()/atol. */
1414 if (SvTYPE(sv) == SVt_PV)
1415 sv_upgrade(sv, SVt_PVIV);
1417 (void)SvIsUV_on(sv);
1419 SvUVX(sv) = strtoul(SvPVX(sv), Null(char**), 10); /* XXXX 64-bit? */
1420 #else /* no atou(), but we know the number fits into IV... */
1421 /* The only problem may be if it is negative... */
1422 SvUVX(sv) = (UV)atol(SvPVX(sv)); /* XXXX 64-bit? */
1425 else { /* Not a number. Cache 0. */
1428 if (SvTYPE(sv) < SVt_PVIV)
1429 sv_upgrade(sv, SVt_PVIV);
1430 SvUVX(sv) = 0; /* We assume that 0s have the
1431 same bitmap in IV and UV. */
1433 (void)SvIsUV_on(sv);
1434 if (ckWARN(WARN_NUMERIC))
1439 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1441 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1442 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1444 if (SvTYPE(sv) < SVt_IV)
1445 /* Typically the caller expects that sv_any is not NULL now. */
1446 sv_upgrade(sv, SVt_IV);
1450 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
1451 (unsigned long)sv,SvUVX(sv)));
1452 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
1456 sv_2nv(register SV *sv)
1460 if (SvGMAGICAL(sv)) {
1464 if (SvPOKp(sv) && SvLEN(sv)) {
1466 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1468 SET_NUMERIC_STANDARD();
1469 return atof(SvPVX(sv));
1473 return (double)SvUVX(sv);
1475 return (double)SvIVX(sv);
1478 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1480 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1481 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1486 if (SvTHINKFIRST(sv)) {
1489 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
1490 return SvNV(tmpstr);
1491 return (double)(unsigned long)SvRV(sv);
1493 if (SvREADONLY(sv)) {
1495 if (SvPOKp(sv) && SvLEN(sv)) {
1496 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1498 SET_NUMERIC_STANDARD();
1499 return atof(SvPVX(sv));
1503 return (double)SvUVX(sv);
1505 return (double)SvIVX(sv);
1507 if (ckWARN(WARN_UNINITIALIZED))
1508 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1512 if (SvTYPE(sv) < SVt_NV) {
1513 if (SvTYPE(sv) == SVt_IV)
1514 sv_upgrade(sv, SVt_PVNV);
1516 sv_upgrade(sv, SVt_NV);
1517 DEBUG_c(SET_NUMERIC_STANDARD());
1518 DEBUG_c(PerlIO_printf(Perl_debug_log,
1519 "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
1521 else if (SvTYPE(sv) < SVt_PVNV)
1522 sv_upgrade(sv, SVt_PVNV);
1524 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
1526 SvNVX(sv) = SvIsUV(sv) ? (double)SvUVX(sv) : (double)SvIVX(sv);
1528 else if (SvPOKp(sv) && SvLEN(sv)) {
1530 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1532 SET_NUMERIC_STANDARD();
1533 SvNVX(sv) = atof(SvPVX(sv));
1537 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1538 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1539 if (SvTYPE(sv) < SVt_NV)
1540 /* Typically the caller expects that sv_any is not NULL now. */
1541 sv_upgrade(sv, SVt_NV);
1545 DEBUG_c(SET_NUMERIC_STANDARD());
1546 DEBUG_c(PerlIO_printf(Perl_debug_log,
1547 "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
1554 I32 numtype = looks_like_number(sv);
1557 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1558 return atol(SvPVX(sv)); /* XXXX 64-bit? */
1561 if (ckWARN(WARN_NUMERIC))
1564 SET_NUMERIC_STANDARD();
1565 d = atof(SvPVX(sv));
1572 I32 numtype = looks_like_number(sv);
1575 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1576 return strtoul(SvPVX(sv), Null(char**), 10);
1580 if (ckWARN(WARN_NUMERIC))
1583 SET_NUMERIC_STANDARD();
1584 return U_V(atof(SvPVX(sv)));
1588 * Returns a combination of (advisory only - can get false negatives)
1589 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1591 * 0 if does not look like number.
1593 * In fact possible values are 0 and
1594 * IS_NUMBER_TO_INT_BY_ATOL 123
1595 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1596 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1597 * with a possible addition of IS_NUMBER_NEG.
1601 looks_like_number(SV *sv)
1603 /* XXXX 64-bit? It may be not IS_NUMBER_TO_INT_BY_ATOL, but
1604 * using atof() may lose precision. */
1606 register char *send;
1607 register char *sbegin;
1608 register char *nbegin;
1616 else if (SvPOKp(sv))
1617 sbegin = SvPV(sv, len);
1620 send = sbegin + len;
1627 numtype = IS_NUMBER_NEG;
1634 * we return 1 if the number can be converted to _integer_ with atol()
1635 * and 2 if you need (int)atof().
1638 /* next must be digit or '.' */
1642 } while (isDIGIT(*s));
1644 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1645 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1647 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1651 numtype |= IS_NUMBER_NOT_IV;
1652 while (isDIGIT(*s)) /* optional digits after "." */
1656 else if (*s == '.') {
1658 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
1659 /* no digits before '.' means we need digits after it */
1663 } while (isDIGIT(*s));
1671 /* we can have an optional exponent part */
1672 if (*s == 'e' || *s == 'E') {
1673 numtype &= ~IS_NUMBER_NEG;
1674 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1676 if (*s == '+' || *s == '-')
1681 } while (isDIGIT(*s));
1690 if (len == 10 && memEQ(sbegin, "0 but true", 10))
1691 return IS_NUMBER_TO_INT_BY_ATOL;
1696 sv_2pv_nolen(register SV *sv)
1699 return sv_2pv(sv, &n_a);
1702 /* We assume that buf is at least TYPE_CHARS(UV) long. */
1704 uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1707 char *ptr = buf + TYPE_CHARS(UV);
1722 *--ptr = '0' + (uv % 10);
1731 sv_2pv(register SV *sv, STRLEN *lp)
1736 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
1737 char *tmpbuf = tbuf;
1743 if (SvGMAGICAL(sv)) {
1749 if (SvIOKp(sv)) { /* XXXX 64-bit? */
1751 (void)sprintf(tmpbuf,"%lu",(unsigned long)SvUVX(sv));
1753 (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
1758 SET_NUMERIC_STANDARD();
1759 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1764 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1766 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1767 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1773 if (SvTHINKFIRST(sv)) {
1776 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
1777 return SvPV(tmpstr,*lp);
1784 switch (SvTYPE(sv)) {
1786 if ( ((SvFLAGS(sv) &
1787 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
1788 == (SVs_OBJECT|SVs_RMG))
1789 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
1790 && (mg = mg_find(sv, 'r'))) {
1792 regexp *re = (regexp *)mg->mg_obj;
1795 char *fptr = "msix";
1800 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
1802 while(ch = *fptr++) {
1804 reflags[left++] = ch;
1807 reflags[right--] = ch;
1812 reflags[left] = '-';
1816 mg->mg_len = re->prelen + 4 + left;
1817 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
1818 Copy("(?", mg->mg_ptr, 2, char);
1819 Copy(reflags, mg->mg_ptr+2, left, char);
1820 Copy(":", mg->mg_ptr+left+2, 1, char);
1821 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
1822 mg->mg_ptr[mg->mg_len - 1] = ')';
1823 mg->mg_ptr[mg->mg_len] = 0;
1825 PL_reginterp_cnt += re->program[0].next_off;
1837 case SVt_PVBM: s = "SCALAR"; break;
1838 case SVt_PVLV: s = "LVALUE"; break;
1839 case SVt_PVAV: s = "ARRAY"; break;
1840 case SVt_PVHV: s = "HASH"; break;
1841 case SVt_PVCV: s = "CODE"; break;
1842 case SVt_PVGV: s = "GLOB"; break;
1843 case SVt_PVFM: s = "FORMAT"; break;
1844 case SVt_PVIO: s = "IO"; break;
1845 default: s = "UNKNOWN"; break;
1849 sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
1853 sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
1859 if (SvREADONLY(sv)) {
1860 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1861 /* XXXX 64-bit? IV may have better precision... */
1862 SET_NUMERIC_STANDARD();
1863 Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
1871 tmpbuf = uiv_2buf(tbuf, 0, SvUVX(sv), 1, &ebuf);
1873 tmpbuf = uiv_2buf(tbuf, SvIVX(sv), 0, 0, &ebuf);
1880 if (ckWARN(WARN_UNINITIALIZED))
1881 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1887 if (SvNOKp(sv)) { /* See note in sv_2uv() */
1888 /* XXXX 64-bit? IV may have better precision... */
1889 if (SvTYPE(sv) < SVt_PVNV)
1890 sv_upgrade(sv, SVt_PVNV);
1893 olderrno = errno; /* some Xenix systems wipe out errno here */
1895 if (SvNVX(sv) == 0.0)
1896 (void)strcpy(s,"0");
1900 SET_NUMERIC_STANDARD();
1901 Gconvert(SvNVX(sv), DBL_DIG, 0, s);
1904 #ifdef FIXNEGATIVEZERO
1905 if (*s == '-' && s[1] == '0' && !s[2])
1914 else if (SvIOKp(sv)) {
1915 U32 isIOK = SvIOK(sv);
1916 char buf[TYPE_CHARS(UV)];
1919 if (SvTYPE(sv) < SVt_PVIV)
1920 sv_upgrade(sv, SVt_PVIV);
1922 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
1923 sv_setpvn(sv, ptr, ebuf - ptr);
1927 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
1928 sv_setpvn(sv, ptr, ebuf - ptr);
1938 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1939 warner(WARN_UNINITIALIZED, PL_warn_uninit);
1941 if (SvTYPE(sv) < SVt_PV)
1942 /* Typically the caller expects that sv_any is not NULL now. */
1943 sv_upgrade(sv, SVt_PV);
1946 *lp = s - SvPVX(sv);
1949 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
1953 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
1954 /* Sneaky stuff here */
1958 tsv = newSVpv(tmpbuf, 0);
1974 len = strlen(tmpbuf);
1976 #ifdef FIXNEGATIVEZERO
1977 if (len == 2 && t[0] == '-' && t[1] == '0') {
1982 (void)SvUPGRADE(sv, SVt_PV);
1984 s = SvGROW(sv, len + 1);
1992 /* This function is only called on magical items */
1994 sv_2bool(register SV *sv)
2004 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
2005 return SvTRUE(tmpsv);
2006 return SvRV(sv) != 0;
2009 register XPV* Xpvtmp;
2010 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2011 (*Xpvtmp->xpv_pv > '0' ||
2012 Xpvtmp->xpv_cur > 1 ||
2013 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
2020 return SvIVX(sv) != 0;
2023 return SvNVX(sv) != 0.0;
2030 /* Note: sv_setsv() should not be called with a source string that needs
2031 * to be reused, since it may destroy the source string if it is marked
2036 sv_setsv(SV *dstr, register SV *sstr)
2039 register U32 sflags;
2045 SV_CHECK_THINKFIRST(dstr);
2047 sstr = &PL_sv_undef;
2048 stype = SvTYPE(sstr);
2049 dtype = SvTYPE(dstr);
2053 /* There's a lot of redundancy below but we're going for speed here */
2058 if (dtype != SVt_PVGV) {
2059 (void)SvOK_off(dstr);
2067 sv_upgrade(dstr, SVt_IV);
2070 sv_upgrade(dstr, SVt_PVNV);
2074 sv_upgrade(dstr, SVt_PVIV);
2077 (void)SvIOK_only(dstr);
2078 SvIVX(dstr) = SvIVX(sstr);
2091 sv_upgrade(dstr, SVt_NV);
2096 sv_upgrade(dstr, SVt_PVNV);
2099 SvNVX(dstr) = SvNVX(sstr);
2100 (void)SvNOK_only(dstr);
2108 sv_upgrade(dstr, SVt_RV);
2109 else if (dtype == SVt_PVGV &&
2110 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2113 if (PL_curcop->cop_stash != GvSTASH(dstr))
2114 GvIMPORTED_on(dstr);
2124 sv_upgrade(dstr, SVt_PV);
2127 if (dtype < SVt_PVIV)
2128 sv_upgrade(dstr, SVt_PVIV);
2131 if (dtype < SVt_PVNV)
2132 sv_upgrade(dstr, SVt_PVNV);
2139 croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
2140 PL_op_name[PL_op->op_type]);
2142 croak("Bizarre copy of %s", sv_reftype(sstr, 0));
2146 if (dtype <= SVt_PVGV) {
2148 if (dtype != SVt_PVGV) {
2149 char *name = GvNAME(sstr);
2150 STRLEN len = GvNAMELEN(sstr);
2151 sv_upgrade(dstr, SVt_PVGV);
2152 sv_magic(dstr, dstr, '*', name, len);
2153 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
2154 GvNAME(dstr) = savepvn(name, len);
2155 GvNAMELEN(dstr) = len;
2156 SvFAKE_on(dstr); /* can coerce to non-glob */
2158 /* ahem, death to those who redefine active sort subs */
2159 else if (PL_curstackinfo->si_type == PERLSI_SORT
2160 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
2161 croak("Can't redefine active sort subroutine %s",
2163 (void)SvOK_off(dstr);
2164 GvINTRO_off(dstr); /* one-shot flag */
2166 GvGP(dstr) = gp_ref(GvGP(sstr));
2168 if (PL_curcop->cop_stash != GvSTASH(dstr))
2169 GvIMPORTED_on(dstr);
2176 if (SvGMAGICAL(sstr)) {
2178 if (SvTYPE(sstr) != stype) {
2179 stype = SvTYPE(sstr);
2180 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2184 if (stype == SVt_PVLV)
2185 (void)SvUPGRADE(dstr, SVt_PVNV);
2187 (void)SvUPGRADE(dstr, stype);
2190 sflags = SvFLAGS(sstr);
2192 if (sflags & SVf_ROK) {
2193 if (dtype >= SVt_PV) {
2194 if (dtype == SVt_PVGV) {
2195 SV *sref = SvREFCNT_inc(SvRV(sstr));
2197 int intro = GvINTRO(dstr);
2201 GvGP(dstr)->gp_refcnt--;
2202 GvINTRO_off(dstr); /* one-shot flag */
2203 Newz(602,gp, 1, GP);
2204 GvGP(dstr) = gp_ref(gp);
2205 GvSV(dstr) = NEWSV(72,0);
2206 GvLINE(dstr) = PL_curcop->cop_line;
2207 GvEGV(dstr) = (GV*)dstr;
2210 switch (SvTYPE(sref)) {
2213 SAVESPTR(GvAV(dstr));
2215 dref = (SV*)GvAV(dstr);
2216 GvAV(dstr) = (AV*)sref;
2217 if (PL_curcop->cop_stash != GvSTASH(dstr))
2218 GvIMPORTED_AV_on(dstr);
2222 SAVESPTR(GvHV(dstr));
2224 dref = (SV*)GvHV(dstr);
2225 GvHV(dstr) = (HV*)sref;
2226 if (PL_curcop->cop_stash != GvSTASH(dstr))
2227 GvIMPORTED_HV_on(dstr);
2231 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2232 SvREFCNT_dec(GvCV(dstr));
2233 GvCV(dstr) = Nullcv;
2234 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2235 PL_sub_generation++;
2237 SAVESPTR(GvCV(dstr));
2240 dref = (SV*)GvCV(dstr);
2241 if (GvCV(dstr) != (CV*)sref) {
2242 CV* cv = GvCV(dstr);
2244 if (!GvCVGEN((GV*)dstr) &&
2245 (CvROOT(cv) || CvXSUB(cv)))
2247 SV *const_sv = cv_const_sv(cv);
2248 bool const_changed = TRUE;
2250 const_changed = sv_cmp(const_sv,
2251 op_const_sv(CvSTART((CV*)sref),
2253 /* ahem, death to those who redefine
2254 * active sort subs */
2255 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2256 PL_sortcop == CvSTART(cv))
2258 "Can't redefine active sort subroutine %s",
2259 GvENAME((GV*)dstr));
2260 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2261 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2262 && HvNAME(GvSTASH(CvGV(cv)))
2263 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2265 warner(WARN_REDEFINE, const_sv ?
2266 "Constant subroutine %s redefined"
2267 : "Subroutine %s redefined",
2268 GvENAME((GV*)dstr));
2271 cv_ckproto(cv, (GV*)dstr,
2272 SvPOK(sref) ? SvPVX(sref) : Nullch);
2274 GvCV(dstr) = (CV*)sref;
2275 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2276 GvASSUMECV_on(dstr);
2277 PL_sub_generation++;
2279 if (PL_curcop->cop_stash != GvSTASH(dstr))
2280 GvIMPORTED_CV_on(dstr);
2284 SAVESPTR(GvIOp(dstr));
2286 dref = (SV*)GvIOp(dstr);
2287 GvIOp(dstr) = (IO*)sref;
2291 SAVESPTR(GvSV(dstr));
2293 dref = (SV*)GvSV(dstr);
2295 if (PL_curcop->cop_stash != GvSTASH(dstr))
2296 GvIMPORTED_SV_on(dstr);
2307 (void)SvOOK_off(dstr); /* backoff */
2309 Safefree(SvPVX(dstr));
2310 SvLEN(dstr)=SvCUR(dstr)=0;
2313 (void)SvOK_off(dstr);
2314 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
2316 if (sflags & SVp_NOK) {
2318 SvNVX(dstr) = SvNVX(sstr);
2320 if (sflags & SVp_IOK) {
2321 (void)SvIOK_on(dstr);
2322 SvIVX(dstr) = SvIVX(sstr);
2326 if (SvAMAGIC(sstr)) {
2330 else if (sflags & SVp_POK) {
2333 * Check to see if we can just swipe the string. If so, it's a
2334 * possible small lose on short strings, but a big win on long ones.
2335 * It might even be a win on short strings if SvPVX(dstr)
2336 * has to be allocated and SvPVX(sstr) has to be freed.
2339 if (SvTEMP(sstr) && /* slated for free anyway? */
2340 SvREFCNT(sstr) == 1 && /* and no other references to it? */
2341 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2343 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
2345 SvFLAGS(dstr) &= ~SVf_OOK;
2346 Safefree(SvPVX(dstr) - SvIVX(dstr));
2348 else if (SvLEN(dstr))
2349 Safefree(SvPVX(dstr));
2351 (void)SvPOK_only(dstr);
2352 SvPV_set(dstr, SvPVX(sstr));
2353 SvLEN_set(dstr, SvLEN(sstr));
2354 SvCUR_set(dstr, SvCUR(sstr));
2356 (void)SvOK_off(sstr);
2357 SvPV_set(sstr, Nullch);
2362 else { /* have to copy actual string */
2363 STRLEN len = SvCUR(sstr);
2365 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2366 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2367 SvCUR_set(dstr, len);
2368 *SvEND(dstr) = '\0';
2369 (void)SvPOK_only(dstr);
2372 if (sflags & SVp_NOK) {
2374 SvNVX(dstr) = SvNVX(sstr);
2376 if (sflags & SVp_IOK) {
2377 (void)SvIOK_on(dstr);
2378 SvIVX(dstr) = SvIVX(sstr);
2383 else if (sflags & SVp_NOK) {
2384 SvNVX(dstr) = SvNVX(sstr);
2385 (void)SvNOK_only(dstr);
2387 (void)SvIOK_on(dstr);
2388 SvIVX(dstr) = SvIVX(sstr);
2389 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2394 else if (sflags & SVp_IOK) {
2395 (void)SvIOK_only(dstr);
2396 SvIVX(dstr) = SvIVX(sstr);
2401 if (dtype == SVt_PVGV) {
2402 if (ckWARN(WARN_UNSAFE))
2403 warner(WARN_UNSAFE, "Undefined value assigned to typeglob");
2406 (void)SvOK_off(dstr);
2412 sv_setsv_mg(SV *dstr, register SV *sstr)
2414 sv_setsv(dstr,sstr);
2419 sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
2421 register char *dptr;
2422 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2423 elicit a warning, but it won't hurt. */
2424 SV_CHECK_THINKFIRST(sv);
2429 (void)SvUPGRADE(sv, SVt_PV);
2431 SvGROW(sv, len + 1);
2433 Move(ptr,dptr,len,char);
2436 (void)SvPOK_only(sv); /* validate pointer */
2441 sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2443 sv_setpvn(sv,ptr,len);
2448 sv_setpv(register SV *sv, register const char *ptr)
2450 register STRLEN len;
2452 SV_CHECK_THINKFIRST(sv);
2458 (void)SvUPGRADE(sv, SVt_PV);
2460 SvGROW(sv, len + 1);
2461 Move(ptr,SvPVX(sv),len+1,char);
2463 (void)SvPOK_only(sv); /* validate pointer */
2468 sv_setpv_mg(register SV *sv, register const char *ptr)
2475 sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
2477 SV_CHECK_THINKFIRST(sv);
2478 (void)SvUPGRADE(sv, SVt_PV);
2483 (void)SvOOK_off(sv);
2484 if (SvPVX(sv) && SvLEN(sv))
2485 Safefree(SvPVX(sv));
2486 Renew(ptr, len+1, char);
2489 SvLEN_set(sv, len+1);
2491 (void)SvPOK_only(sv); /* validate pointer */
2496 sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
2498 sv_usepvn(sv,ptr,len);
2503 sv_force_normal(register SV *sv)
2505 if (SvREADONLY(sv)) {
2507 if (PL_curcop != &PL_compiling)
2508 croak(PL_no_modify);
2512 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2517 sv_chop(register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
2521 register STRLEN delta;
2523 if (!ptr || !SvPOKp(sv))
2525 SV_CHECK_THINKFIRST(sv);
2526 if (SvTYPE(sv) < SVt_PVIV)
2527 sv_upgrade(sv,SVt_PVIV);
2530 if (!SvLEN(sv)) { /* make copy of shared string */
2531 char *pvx = SvPVX(sv);
2532 STRLEN len = SvCUR(sv);
2533 SvGROW(sv, len + 1);
2534 Move(pvx,SvPVX(sv),len,char);
2538 SvFLAGS(sv) |= SVf_OOK;
2540 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
2541 delta = ptr - SvPVX(sv);
2549 sv_catpvn(register SV *sv, register const char *ptr, register STRLEN len)
2554 junk = SvPV_force(sv, tlen);
2555 SvGROW(sv, tlen + len + 1);
2558 Move(ptr,SvPVX(sv)+tlen,len,char);
2561 (void)SvPOK_only(sv); /* validate pointer */
2566 sv_catpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
2568 sv_catpvn(sv,ptr,len);
2573 sv_catsv(SV *dstr, register SV *sstr)
2579 if (s = SvPV(sstr, len))
2580 sv_catpvn(dstr,s,len);
2584 sv_catsv_mg(SV *dstr, register SV *sstr)
2586 sv_catsv(dstr,sstr);
2591 sv_catpv(register SV *sv, register const char *ptr)
2593 register STRLEN len;
2599 junk = SvPV_force(sv, tlen);
2601 SvGROW(sv, tlen + len + 1);
2604 Move(ptr,SvPVX(sv)+tlen,len+1,char);
2606 (void)SvPOK_only(sv); /* validate pointer */
2611 sv_catpv_mg(register SV *sv, register const char *ptr)
2624 sv_upgrade(sv, SVt_PV);
2625 SvGROW(sv, len + 1);
2630 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2633 sv_magic(register SV *sv, SV *obj, int how, const char *name, I32 namlen)
2637 if (SvREADONLY(sv)) {
2639 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
2640 croak(PL_no_modify);
2642 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
2643 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2650 (void)SvUPGRADE(sv, SVt_PVMG);
2652 Newz(702,mg, 1, MAGIC);
2653 mg->mg_moremagic = SvMAGIC(sv);
2656 if (!obj || obj == sv || how == '#' || how == 'r')
2660 mg->mg_obj = SvREFCNT_inc(obj);
2661 mg->mg_flags |= MGf_REFCOUNTED;
2664 mg->mg_len = namlen;
2667 mg->mg_ptr = savepvn(name, namlen);
2668 else if (namlen == HEf_SVKEY)
2669 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2673 mg->mg_virtual = &PL_vtbl_sv;
2676 mg->mg_virtual = &PL_vtbl_amagic;
2679 mg->mg_virtual = &PL_vtbl_amagicelem;
2685 mg->mg_virtual = &PL_vtbl_bm;
2688 mg->mg_virtual = &PL_vtbl_regdata;
2691 mg->mg_virtual = &PL_vtbl_regdatum;
2694 mg->mg_virtual = &PL_vtbl_env;
2697 mg->mg_virtual = &PL_vtbl_fm;
2700 mg->mg_virtual = &PL_vtbl_envelem;
2703 mg->mg_virtual = &PL_vtbl_mglob;
2706 mg->mg_virtual = &PL_vtbl_isa;
2709 mg->mg_virtual = &PL_vtbl_isaelem;
2712 mg->mg_virtual = &PL_vtbl_nkeys;
2719 mg->mg_virtual = &PL_vtbl_dbline;
2723 mg->mg_virtual = &PL_vtbl_mutex;
2725 #endif /* USE_THREADS */
2726 #ifdef USE_LOCALE_COLLATE
2728 mg->mg_virtual = &PL_vtbl_collxfrm;
2730 #endif /* USE_LOCALE_COLLATE */
2732 mg->mg_virtual = &PL_vtbl_pack;
2736 mg->mg_virtual = &PL_vtbl_packelem;
2739 mg->mg_virtual = &PL_vtbl_regexp;
2742 mg->mg_virtual = &PL_vtbl_sig;
2745 mg->mg_virtual = &PL_vtbl_sigelem;
2748 mg->mg_virtual = &PL_vtbl_taint;
2752 mg->mg_virtual = &PL_vtbl_uvar;
2755 mg->mg_virtual = &PL_vtbl_vec;
2758 mg->mg_virtual = &PL_vtbl_substr;
2761 mg->mg_virtual = &PL_vtbl_defelem;
2764 mg->mg_virtual = &PL_vtbl_glob;
2767 mg->mg_virtual = &PL_vtbl_arylen;
2770 mg->mg_virtual = &PL_vtbl_pos;
2772 case '~': /* Reserved for use by extensions not perl internals. */
2773 /* Useful for attaching extension internal data to perl vars. */
2774 /* Note that multiple extensions may clash if magical scalars */
2775 /* etc holding private data from one are passed to another. */
2779 croak("Don't know how to handle magic of type '%c'", how);
2783 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2787 sv_unmagic(SV *sv, int type)
2791 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
2794 for (mg = *mgp; mg; mg = *mgp) {
2795 if (mg->mg_type == type) {
2796 MGVTBL* vtbl = mg->mg_virtual;
2797 *mgp = mg->mg_moremagic;
2798 if (vtbl && (vtbl->svt_free != NULL))
2799 (VTBL->svt_free)(sv, mg);
2800 if (mg->mg_ptr && mg->mg_type != 'g')
2801 if (mg->mg_len >= 0)
2802 Safefree(mg->mg_ptr);
2803 else if (mg->mg_len == HEf_SVKEY)
2804 SvREFCNT_dec((SV*)mg->mg_ptr);
2805 if (mg->mg_flags & MGf_REFCOUNTED)
2806 SvREFCNT_dec(mg->mg_obj);
2810 mgp = &mg->mg_moremagic;
2814 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
2821 sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
2825 register char *midend;
2826 register char *bigend;
2832 croak("Can't modify non-existent substring");
2833 SvPV_force(bigstr, curlen);
2834 if (offset + len > curlen) {
2835 SvGROW(bigstr, offset+len+1);
2836 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
2837 SvCUR_set(bigstr, offset+len);
2840 i = littlelen - len;
2841 if (i > 0) { /* string might grow */
2842 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
2843 mid = big + offset + len;
2844 midend = bigend = big + SvCUR(bigstr);
2847 while (midend > mid) /* shove everything down */
2848 *--bigend = *--midend;
2849 Move(little,big+offset,littlelen,char);
2855 Move(little,SvPVX(bigstr)+offset,len,char);
2860 big = SvPVX(bigstr);
2863 bigend = big + SvCUR(bigstr);
2865 if (midend > bigend)
2866 croak("panic: sv_insert");
2868 if (mid - big > bigend - midend) { /* faster to shorten from end */
2870 Move(little, mid, littlelen,char);
2873 i = bigend - midend;
2875 Move(midend, mid, i,char);
2879 SvCUR_set(bigstr, mid - big);
2882 else if (i = mid - big) { /* faster from front */
2883 midend -= littlelen;
2885 sv_chop(bigstr,midend-i);
2890 Move(little, mid, littlelen,char);
2892 else if (littlelen) {
2893 midend -= littlelen;
2894 sv_chop(bigstr,midend);
2895 Move(little,midend,littlelen,char);
2898 sv_chop(bigstr,midend);
2903 /* make sv point to what nstr did */
2906 sv_replace(register SV *sv, register SV *nsv)
2908 U32 refcnt = SvREFCNT(sv);
2909 SV_CHECK_THINKFIRST(sv);
2910 if (SvREFCNT(nsv) != 1)
2911 warn("Reference miscount in sv_replace()");
2912 if (SvMAGICAL(sv)) {
2916 sv_upgrade(nsv, SVt_PVMG);
2917 SvMAGIC(nsv) = SvMAGIC(sv);
2918 SvFLAGS(nsv) |= SvMAGICAL(sv);
2924 assert(!SvREFCNT(sv));
2925 StructCopy(nsv,sv,SV);
2926 SvREFCNT(sv) = refcnt;
2927 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
2932 sv_clear(register SV *sv)
2936 assert(SvREFCNT(sv) == 0);
2940 if (PL_defstash) { /* Still have a symbol table? */
2945 Zero(&tmpref, 1, SV);
2946 sv_upgrade(&tmpref, SVt_RV);
2948 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
2949 SvREFCNT(&tmpref) = 1;
2952 stash = SvSTASH(sv);
2953 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
2956 PUSHSTACKi(PERLSI_DESTROY);
2957 SvRV(&tmpref) = SvREFCNT_inc(sv);
2962 perl_call_sv((SV*)GvCV(destructor),
2963 G_DISCARD|G_EVAL|G_KEEPERR);
2969 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
2971 del_XRV(SvANY(&tmpref));
2974 if (PL_in_clean_objs)
2975 croak("DESTROY created new reference to dead object '%s'",
2977 /* DESTROY gave object new lease on life */
2983 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
2984 SvOBJECT_off(sv); /* Curse the object. */
2985 if (SvTYPE(sv) != SVt_PVIO)
2986 --PL_sv_objcount; /* XXX Might want something more general */
2989 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2992 switch (SvTYPE(sv)) {
2995 IoIFP(sv) != PerlIO_stdin() &&
2996 IoIFP(sv) != PerlIO_stdout() &&
2997 IoIFP(sv) != PerlIO_stderr())
3002 PerlDir_close(IoDIRP(sv));
3005 Safefree(IoTOP_NAME(sv));
3006 Safefree(IoFMT_NAME(sv));
3007 Safefree(IoBOTTOM_NAME(sv));
3022 SvREFCNT_dec(LvTARG(sv));
3026 Safefree(GvNAME(sv));
3027 /* cannot decrease stash refcount yet, as we might recursively delete
3028 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3029 of stash until current sv is completely gone.
3030 -- JohnPC, 27 Mar 1998 */
3031 stash = GvSTASH(sv);
3037 (void)SvOOK_off(sv);
3042 SvREFCNT_dec(SvRV(sv));
3043 else if (SvPVX(sv) && SvLEN(sv))
3044 Safefree(SvPVX(sv));
3054 switch (SvTYPE(sv)) {
3070 del_XPVIV(SvANY(sv));
3073 del_XPVNV(SvANY(sv));
3076 del_XPVMG(SvANY(sv));
3079 del_XPVLV(SvANY(sv));
3082 del_XPVAV(SvANY(sv));
3085 del_XPVHV(SvANY(sv));
3088 del_XPVCV(SvANY(sv));
3091 del_XPVGV(SvANY(sv));
3092 /* code duplication for increased performance. */
3093 SvFLAGS(sv) &= SVf_BREAK;
3094 SvFLAGS(sv) |= SVTYPEMASK;
3095 /* decrease refcount of the stash that owns this GV, if any */
3097 SvREFCNT_dec(stash);
3098 return; /* not break, SvFLAGS reset already happened */
3100 del_XPVBM(SvANY(sv));
3103 del_XPVFM(SvANY(sv));
3106 del_XPVIO(SvANY(sv));
3109 SvFLAGS(sv) &= SVf_BREAK;
3110 SvFLAGS(sv) |= SVTYPEMASK;
3117 ATOMIC_INC(SvREFCNT(sv));
3124 int refcount_is_zero;
3128 if (SvREFCNT(sv) == 0) {
3129 if (SvFLAGS(sv) & SVf_BREAK)
3131 if (PL_in_clean_all) /* All is fair */
3133 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3134 /* make sure SvREFCNT(sv)==0 happens very seldom */
3135 SvREFCNT(sv) = (~(U32)0)/2;
3138 warn("Attempt to free unreferenced scalar");
3141 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3142 if (!refcount_is_zero)
3146 warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
3150 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3151 /* make sure SvREFCNT(sv)==0 happens very seldom */
3152 SvREFCNT(sv) = (~(U32)0)/2;
3161 sv_len(register SV *sv)
3170 len = mg_length(sv);
3172 junk = SvPV(sv, len);
3177 sv_len_utf8(register SV *sv)
3188 len = mg_length(sv);
3191 s = (U8*)SvPV(sv, len);
3202 sv_pos_u2b(register SV *sv, I32* offsetp, I32* lenp)
3207 I32 uoffset = *offsetp;
3213 start = s = (U8*)SvPV(sv, len);
3215 while (s < send && uoffset--)
3219 *offsetp = s - start;
3223 while (s < send && ulen--)
3233 sv_pos_b2u(register SV *sv, I32* offsetp)
3242 s = (U8*)SvPV(sv, len);
3244 croak("panic: bad byte offset");
3245 send = s + *offsetp;
3252 warn("Malformed UTF-8 character");
3260 sv_eq(register SV *str1, register SV *str2)
3272 pv1 = SvPV(str1, cur1);
3277 pv2 = SvPV(str2, cur2);
3282 return memEQ(pv1, pv2, cur1);
3286 sv_cmp(register SV *str1, register SV *str2)
3289 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
3291 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
3295 return cur2 ? -1 : 0;
3300 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
3303 return retval < 0 ? -1 : 1;
3308 return cur1 < cur2 ? -1 : 1;
3312 sv_cmp_locale(register SV *sv1, register SV *sv2)
3314 #ifdef USE_LOCALE_COLLATE
3320 if (PL_collation_standard)
3324 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
3326 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
3328 if (!pv1 || !len1) {
3339 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
3342 return retval < 0 ? -1 : 1;
3345 * When the result of collation is equality, that doesn't mean
3346 * that there are no differences -- some locales exclude some
3347 * characters from consideration. So to avoid false equalities,
3348 * we use the raw string as a tiebreaker.
3354 #endif /* USE_LOCALE_COLLATE */
3356 return sv_cmp(sv1, sv2);
3359 #ifdef USE_LOCALE_COLLATE
3361 * Any scalar variable may carry an 'o' magic that contains the
3362 * scalar data of the variable transformed to such a format that
3363 * a normal memory comparison can be used to compare the data
3364 * according to the locale settings.
3367 sv_collxfrm(SV *sv, STRLEN *nxp)
3371 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3372 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
3377 Safefree(mg->mg_ptr);
3379 if ((xf = mem_collxfrm(s, len, &xlen))) {
3380 if (SvREADONLY(sv)) {
3383 return xf + sizeof(PL_collation_ix);
3386 sv_magic(sv, 0, 'o', 0, 0);
3387 mg = mg_find(sv, 'o');
3400 if (mg && mg->mg_ptr) {
3402 return mg->mg_ptr + sizeof(PL_collation_ix);
3410 #endif /* USE_LOCALE_COLLATE */
3413 sv_gets(register SV *sv, register PerlIO *fp, I32 append)
3418 register STDCHAR rslast;
3419 register STDCHAR *bp;
3423 SV_CHECK_THINKFIRST(sv);
3424 (void)SvUPGRADE(sv, SVt_PV);
3428 if (RsSNARF(PL_rs)) {
3432 else if (RsRECORD(PL_rs)) {
3433 I32 recsize, bytesread;
3436 /* Grab the size of the record we're getting */
3437 recsize = SvIV(SvRV(PL_rs));
3438 (void)SvPOK_only(sv); /* Validate pointer */
3439 buffer = SvGROW(sv, recsize + 1);
3442 /* VMS wants read instead of fread, because fread doesn't respect */
3443 /* RMS record boundaries. This is not necessarily a good thing to be */
3444 /* doing, but we've got no other real choice */
3445 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3447 bytesread = PerlIO_read(fp, buffer, recsize);
3449 SvCUR_set(sv, bytesread);
3450 buffer[bytesread] = '\0';
3451 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3453 else if (RsPARA(PL_rs)) {
3458 rsptr = SvPV(PL_rs, rslen);
3459 rslast = rslen ? rsptr[rslen - 1] : '\0';
3461 if (RsPARA(PL_rs)) { /* have to do this both before and after */
3462 do { /* to make sure file boundaries work right */
3465 i = PerlIO_getc(fp);
3469 PerlIO_ungetc(fp,i);
3475 /* See if we know enough about I/O mechanism to cheat it ! */
3477 /* This used to be #ifdef test - it is made run-time test for ease
3478 of abstracting out stdio interface. One call should be cheap
3479 enough here - and may even be a macro allowing compile
3483 if (PerlIO_fast_gets(fp)) {
3486 * We're going to steal some values from the stdio struct
3487 * and put EVERYTHING in the innermost loop into registers.
3489 register STDCHAR *ptr;
3493 #if defined(VMS) && defined(PERLIO_IS_STDIO)
3494 /* An ungetc()d char is handled separately from the regular
3495 * buffer, so we getc() it back out and stuff it in the buffer.
3497 i = PerlIO_getc(fp);
3498 if (i == EOF) return 0;
3499 *(--((*fp)->_ptr)) = (unsigned char) i;
3503 /* Here is some breathtakingly efficient cheating */
3505 cnt = PerlIO_get_cnt(fp); /* get count into register */
3506 (void)SvPOK_only(sv); /* validate pointer */
3507 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3508 if (cnt > 80 && SvLEN(sv) > append) {
3509 shortbuffered = cnt - SvLEN(sv) + append + 1;
3510 cnt -= shortbuffered;
3514 /* remember that cnt can be negative */
3515 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
3520 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
3521 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
3522 DEBUG_P(PerlIO_printf(Perl_debug_log,
3523 "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3524 DEBUG_P(PerlIO_printf(Perl_debug_log,
3525 "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3526 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3527 (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
3532 while (cnt > 0) { /* this | eat */
3534 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3535 goto thats_all_folks; /* screams | sed :-) */
3539 Copy(ptr, bp, cnt, char); /* this | eat */
3540 bp += cnt; /* screams | dust */
3541 ptr += cnt; /* louder | sed :-) */
3546 if (shortbuffered) { /* oh well, must extend */
3547 cnt = shortbuffered;
3549 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3551 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3552 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3556 DEBUG_P(PerlIO_printf(Perl_debug_log,
3557 "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3558 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
3559 DEBUG_P(PerlIO_printf(Perl_debug_log,
3560 "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3561 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3562 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3563 /* This used to call 'filbuf' in stdio form, but as that behaves like
3564 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3565 another abstraction. */
3566 i = PerlIO_getc(fp); /* get more characters */
3567 DEBUG_P(PerlIO_printf(Perl_debug_log,
3568 "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3569 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3570 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3571 cnt = PerlIO_get_cnt(fp);
3572 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
3573 DEBUG_P(PerlIO_printf(Perl_debug_log,
3574 "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3576 if (i == EOF) /* all done for ever? */
3577 goto thats_really_all_folks;
3579 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3581 SvGROW(sv, bpx + cnt + 2);
3582 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3584 *bp++ = i; /* store character from PerlIO_getc */
3586 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
3587 goto thats_all_folks;
3591 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
3592 memNE((char*)bp - rslen, rsptr, rslen))
3593 goto screamer; /* go back to the fray */
3594 thats_really_all_folks:
3596 cnt += shortbuffered;
3597 DEBUG_P(PerlIO_printf(Perl_debug_log,
3598 "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
3599 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
3600 DEBUG_P(PerlIO_printf(Perl_debug_log,
3601 "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
3602 (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp),
3603 (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3605 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
3606 DEBUG_P(PerlIO_printf(Perl_debug_log,
3607 "Screamer: done, len=%ld, string=|%.*s|\n",
3608 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
3612 /*The big, slow, and stupid way */
3617 register STDCHAR *bpe = buf + sizeof(buf);
3619 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
3620 ; /* keep reading */
3624 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
3625 /* Accomodate broken VAXC compiler, which applies U8 cast to
3626 * both args of ?: operator, causing EOF to change into 255
3628 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
3632 sv_catpvn(sv, (char *) buf, cnt);
3634 sv_setpvn(sv, (char *) buf, cnt);
3636 if (i != EOF && /* joy */
3638 SvCUR(sv) < rslen ||
3639 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
3643 * If we're reading from a TTY and we get a short read,
3644 * indicating that the user hit his EOF character, we need
3645 * to notice it now, because if we try to read from the TTY
3646 * again, the EOF condition will disappear.
3648 * The comparison of cnt to sizeof(buf) is an optimization
3649 * that prevents unnecessary calls to feof().
3653 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
3658 if (RsPARA(PL_rs)) { /* have to do this both before and after */
3659 while (i != EOF) { /* to make sure file boundaries work right */
3660 i = PerlIO_getc(fp);
3662 PerlIO_ungetc(fp,i);
3669 win32_strip_return(sv);
3672 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
3677 sv_inc(register SV *sv)
3686 if (SvTHINKFIRST(sv)) {
3687 if (SvREADONLY(sv)) {
3689 if (PL_curcop != &PL_compiling)
3690 croak(PL_no_modify);
3694 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
3701 flags = SvFLAGS(sv);
3702 if (flags & SVp_NOK) {
3703 (void)SvNOK_only(sv);
3707 if (flags & SVp_IOK) {
3709 if (SvUVX(sv) == UV_MAX)
3710 sv_setnv(sv, (double)UV_MAX + 1.0);
3712 (void)SvIOK_only_UV(sv);
3715 if (SvIVX(sv) == IV_MAX)
3716 sv_setnv(sv, (double)IV_MAX + 1.0);
3718 (void)SvIOK_only(sv);
3724 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
3725 if ((flags & SVTYPEMASK) < SVt_PVNV)
3726 sv_upgrade(sv, SVt_NV);
3728 (void)SvNOK_only(sv);
3732 while (isALPHA(*d)) d++;
3733 while (isDIGIT(*d)) d++;
3735 SET_NUMERIC_STANDARD();
3736 sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
3740 while (d >= SvPVX(sv)) {
3748 /* MKS: The original code here died if letters weren't consecutive.
3749 * at least it didn't have to worry about non-C locales. The
3750 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
3751 * arranged in order (although not consecutively) and that only
3752 * [A-Za-z] are accepted by isALPHA in the C locale.
3754 if (*d != 'z' && *d != 'Z') {
3755 do { ++*d; } while (!isALPHA(*d));
3758 *(d--) -= 'z' - 'a';
3763 *(d--) -= 'z' - 'a' + 1;
3767 /* oh,oh, the number grew */
3768 SvGROW(sv, SvCUR(sv) + 2);
3770 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
3779 sv_dec(register SV *sv)
3787 if (SvTHINKFIRST(sv)) {
3788 if (SvREADONLY(sv)) {
3790 if (PL_curcop != &PL_compiling)
3791 croak(PL_no_modify);
3795 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
3802 flags = SvFLAGS(sv);
3803 if (flags & SVp_NOK) {
3805 (void)SvNOK_only(sv);
3808 if (flags & SVp_IOK) {
3810 if (SvUVX(sv) == 0) {
3811 (void)SvIOK_only(sv);
3815 (void)SvIOK_only_UV(sv);
3819 if (SvIVX(sv) == IV_MIN)
3820 sv_setnv(sv, (double)IV_MIN - 1.0);
3822 (void)SvIOK_only(sv);
3828 if (!(flags & SVp_POK)) {
3829 if ((flags & SVTYPEMASK) < SVt_PVNV)
3830 sv_upgrade(sv, SVt_NV);
3832 (void)SvNOK_only(sv);
3835 SET_NUMERIC_STANDARD();
3836 sv_setnv(sv,atof(SvPVX(sv)) - 1.0); /* punt */
3839 /* Make a string that will exist for the duration of the expression
3840 * evaluation. Actually, it may have to last longer than that, but
3841 * hopefully we won't free it until it has been assigned to a
3842 * permanent location. */
3845 sv_mortalcopy(SV *oldstr)
3851 sv_setsv(sv,oldstr);
3853 PL_tmps_stack[++PL_tmps_ix] = sv;
3865 SvFLAGS(sv) = SVs_TEMP;
3867 PL_tmps_stack[++PL_tmps_ix] = sv;
3871 /* same thing without the copying */
3874 sv_2mortal(register SV *sv)
3879 if (SvREADONLY(sv) && SvIMMORTAL(sv))
3882 PL_tmps_stack[++PL_tmps_ix] = sv;
3888 newSVpv(const char *s, STRLEN len)
3895 sv_setpvn(sv,s,len);
3900 newSVpvn(const char *s, STRLEN len)
3905 sv_setpvn(sv,s,len);
3910 newSVpvf(const char* pat, ...)
3916 va_start(args, pat);
3917 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
3944 newRV_noinc(SV *tmpRef)
3950 sv_upgrade(sv, SVt_RV);
3960 return newRV_noinc(SvREFCNT_inc(tmpRef));
3963 /* make an exact duplicate of old */
3966 newSVsv(register SV *old)
3972 if (SvTYPE(old) == SVTYPEMASK) {
3973 warn("semi-panic: attempt to dup freed string");
3988 sv_reset(register char *s, HV *stash)
4001 if (!*s) { /* reset ?? searches */
4002 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
4003 pm->op_pmdynflags &= ~PMdf_USED;
4008 /* reset variables */
4010 if (!HvARRAY(stash))
4013 Zero(todo, 256, char);
4020 for ( ; i <= max; i++) {
4023 for (i = 0; i <= (I32) HvMAX(stash); i++) {
4024 for (entry = HvARRAY(stash)[i];
4026 entry = HeNEXT(entry))
4028 if (!todo[(U8)*HeKEY(entry)])
4030 gv = (GV*)HeVAL(entry);
4032 if (SvTHINKFIRST(sv)) {
4033 if (!SvREADONLY(sv) && SvROK(sv))
4038 if (SvTYPE(sv) >= SVt_PV) {
4040 if (SvPVX(sv) != Nullch)
4047 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
4049 #ifndef VMS /* VMS has no environ array */
4051 environ[0] = Nullch;
4066 switch (SvTYPE(sv)) {
4074 croak("Bad filehandle: %s", GvNAME(gv));
4078 croak(PL_no_usym, "filehandle");
4080 return sv_2io(SvRV(sv));
4081 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
4087 croak("Bad filehandle: %s", SvPV(sv,n_a));
4094 sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
4101 return *gvp = Nullgv, Nullcv;
4102 switch (SvTYPE(sv)) {
4122 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
4123 tryAMAGICunDEREF(to_cv);
4126 if (SvTYPE(sv) == SVt_PVCV) {
4135 croak("Not a subroutine reference");
4140 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
4146 if (lref && !GvCVu(gv)) {
4149 tmpsv = NEWSV(704,0);
4150 gv_efullname3(tmpsv, gv, Nullch);
4151 newSUB(start_subparse(FALSE, 0),
4152 newSVOP(OP_CONST, 0, tmpsv),
4157 croak("Unable to create sub named \"%s\"", SvPV(sv,n_a));
4164 sv_true(register SV *sv)
4171 if ((tXpv = (XPV*)SvANY(sv)) &&
4172 (*tXpv->xpv_pv > '0' ||
4173 tXpv->xpv_cur > 1 ||
4174 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
4181 return SvIVX(sv) != 0;
4184 return SvNVX(sv) != 0.0;
4186 return sv_2bool(sv);
4192 sv_iv(register SV *sv)
4196 return (IV)SvUVX(sv);
4203 sv_uv(register SV *sv)
4208 return (UV)SvIVX(sv);
4214 sv_nv(register SV *sv)
4229 return sv_2pv(sv, &n_a);
4233 sv_pvn(SV *sv, STRLEN *lp)
4239 return sv_2pv(sv, lp);
4243 sv_pvn_force(SV *sv, STRLEN *lp)
4247 if (SvTHINKFIRST(sv) && !SvROK(sv))
4248 sv_force_normal(sv);
4254 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4256 croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
4257 PL_op_name[PL_op->op_type]);
4261 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
4266 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
4267 SvGROW(sv, len + 1);
4268 Move(s,SvPVX(sv),len,char);
4273 SvPOK_on(sv); /* validate pointer */
4275 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
4276 (unsigned long)sv,SvPVX(sv)));
4283 sv_reftype(SV *sv, int ob)
4285 if (ob && SvOBJECT(sv))
4286 return HvNAME(SvSTASH(sv));
4288 switch (SvTYPE(sv)) {
4302 case SVt_PVLV: return "LVALUE";
4303 case SVt_PVAV: return "ARRAY";
4304 case SVt_PVHV: return "HASH";
4305 case SVt_PVCV: return "CODE";
4306 case SVt_PVGV: return "GLOB";
4307 case SVt_PVFM: return "FORMAT";
4308 default: return "UNKNOWN";
4329 sv_isa(SV *sv, const char *name)
4341 return strEQ(HvNAME(SvSTASH(sv)), name);
4345 newSVrv(SV *rv, const char *classname)
4352 SV_CHECK_THINKFIRST(rv);
4355 if (SvTYPE(rv) < SVt_RV)
4356 sv_upgrade(rv, SVt_RV);
4363 HV* stash = gv_stashpv(classname, TRUE);
4364 (void)sv_bless(rv, stash);
4370 sv_setref_pv(SV *rv, const char *classname, void *pv)
4373 sv_setsv(rv, &PL_sv_undef);
4377 sv_setiv(newSVrv(rv,classname), (IV)pv);
4382 sv_setref_iv(SV *rv, const char *classname, IV iv)
4384 sv_setiv(newSVrv(rv,classname), iv);
4389 sv_setref_nv(SV *rv, const char *classname, double nv)
4391 sv_setnv(newSVrv(rv,classname), nv);
4396 sv_setref_pvn(SV *rv, const char *classname, char *pv, STRLEN n)
4398 sv_setpvn(newSVrv(rv,classname), pv, n);
4403 sv_bless(SV *sv, HV *stash)
4408 croak("Can't bless non-reference value");
4410 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4411 if (SvREADONLY(tmpRef))
4412 croak(PL_no_modify);
4413 if (SvOBJECT(tmpRef)) {
4414 if (SvTYPE(tmpRef) != SVt_PVIO)
4416 SvREFCNT_dec(SvSTASH(tmpRef));
4419 SvOBJECT_on(tmpRef);
4420 if (SvTYPE(tmpRef) != SVt_PVIO)
4422 (void)SvUPGRADE(tmpRef, SVt_PVMG);
4423 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
4436 assert(SvTYPE(sv) == SVt_PVGV);
4441 SvREFCNT_dec(GvSTASH(sv));
4442 GvSTASH(sv) = Nullhv;
4444 sv_unmagic(sv, '*');
4445 Safefree(GvNAME(sv));
4447 SvFLAGS(sv) &= ~SVTYPEMASK;
4448 SvFLAGS(sv) |= SVt_PVMG;
4458 if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4461 sv_2mortal(rv); /* Schedule for freeing later */
4467 sv_magic((sv), Nullsv, 't', Nullch, 0);
4473 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4474 MAGIC *mg = mg_find(sv, 't');
4483 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4484 MAGIC *mg = mg_find(sv, 't');
4485 if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
4492 sv_setpviv(SV *sv, IV iv)
4494 char buf[TYPE_CHARS(UV)];
4496 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
4498 sv_setpvn(sv, ptr, ebuf - ptr);
4503 sv_setpviv_mg(SV *sv, IV iv)
4505 char buf[TYPE_CHARS(UV)];
4507 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
4509 sv_setpvn(sv, ptr, ebuf - ptr);
4514 sv_setpvf(SV *sv, const char* pat, ...)
4517 va_start(args, pat);
4518 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4524 sv_setpvf_mg(SV *sv, const char* pat, ...)
4527 va_start(args, pat);
4528 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4534 sv_catpvf(SV *sv, const char* pat, ...)
4537 va_start(args, pat);
4538 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4543 sv_catpvf_mg(SV *sv, const char* pat, ...)
4546 va_start(args, pat);
4547 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
4553 sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4555 sv_setpvn(sv, "", 0);
4556 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
4560 sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
4568 static char nullstr[] = "(null)";
4570 /* no matter what, this is a string now */
4571 (void)SvPV_force(sv, origlen);
4573 /* special-case "", "%s", and "%_" */
4576 if (patlen == 2 && pat[0] == '%') {
4580 char *s = va_arg(*args, char*);
4581 sv_catpv(sv, s ? s : nullstr);
4583 else if (svix < svmax)
4584 sv_catsv(sv, *svargs);
4588 sv_catsv(sv, va_arg(*args, SV*));
4591 /* See comment on '_' below */
4596 patend = (char*)pat + patlen;
4597 for (p = (char*)pat; p < patend; p = q) {
4605 bool has_precis = FALSE;
4610 STRLEN esignlen = 0;
4612 char *eptr = Nullch;
4614 char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
4625 for (q = p; q < patend && *q != '%'; ++q) ;
4627 sv_catpvn(sv, p, q - p);
4665 case '1': case '2': case '3':
4666 case '4': case '5': case '6':
4667 case '7': case '8': case '9':
4670 width = width * 10 + (*q++ - '0');
4675 i = va_arg(*args, int);
4677 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4679 width = (i < 0) ? -i : i;
4690 i = va_arg(*args, int);
4692 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4693 precis = (i < 0) ? 0 : i;
4699 precis = precis * 10 + (*q++ - '0');
4708 #if 0 /* when quads have better support within Perl */
4709 if (*(q + 1) == 'l') {
4736 uv = va_arg(*args, int);
4738 uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4740 eptr = (char*)utf8buf;
4741 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
4745 c = va_arg(*args, int);
4747 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4754 eptr = va_arg(*args, char*);
4756 elen = strlen(eptr);
4759 elen = sizeof nullstr - 1;
4762 else if (svix < svmax) {
4763 eptr = SvPVx(svargs[svix++], elen);
4765 if (has_precis && precis < elen) {
4767 sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
4770 if (width) { /* fudge width (can't fudge elen) */
4771 width += elen - sv_len_utf8(svargs[svix - 1]);
4779 * The "%_" hack might have to be changed someday,
4780 * if ISO or ANSI decide to use '_' for something.
4781 * So we keep it hidden from users' code.
4785 eptr = SvPVx(va_arg(*args, SV*), elen);
4788 if (has_precis && elen > precis)
4796 uv = (UV)va_arg(*args, void*);
4798 uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
4809 case 'h': iv = (short)va_arg(*args, int); break;
4810 default: iv = va_arg(*args, int); break;
4811 case 'l': iv = va_arg(*args, long); break;
4812 case 'V': iv = va_arg(*args, IV); break;
4816 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
4818 case 'h': iv = (short)iv; break;
4819 default: iv = (int)iv; break;
4820 case 'l': iv = (long)iv; break;
4827 esignbuf[esignlen++] = plus;
4831 esignbuf[esignlen++] = '-';
4861 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
4862 default: uv = va_arg(*args, unsigned); break;
4863 case 'l': uv = va_arg(*args, unsigned long); break;
4864 case 'V': uv = va_arg(*args, UV); break;
4868 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
4870 case 'h': uv = (unsigned short)uv; break;
4871 default: uv = (unsigned)uv; break;
4872 case 'l': uv = (unsigned long)uv; break;
4878 eptr = ebuf + sizeof ebuf;
4884 p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
4890 esignbuf[esignlen++] = '0';
4891 esignbuf[esignlen++] = c; /* 'x' or 'X' */
4897 *--eptr = '0' + dig;
4899 if (alt && *eptr != '0')
4905 *--eptr = '0' + dig;
4907 if (alt && *eptr != '0')
4910 default: /* it had better be ten or less */
4913 *--eptr = '0' + dig;
4914 } while (uv /= base);
4917 elen = (ebuf + sizeof ebuf) - eptr;
4920 zeros = precis - elen;
4921 else if (precis == 0 && elen == 1 && *eptr == '0')
4926 /* FLOATING POINT */
4929 c = 'f'; /* maybe %F isn't supported here */
4935 /* This is evil, but floating point is even more evil */
4938 nv = va_arg(*args, double);
4940 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
4943 if (c != 'e' && c != 'E') {
4945 (void)frexp(nv, &i);
4946 if (i == PERL_INT_MIN)
4947 die("panic: frexp");
4949 need = BIT_DIGITS(i);
4951 need += has_precis ? precis : 6; /* known default */
4955 need += 20; /* fudge factor */
4956 if (PL_efloatsize < need) {
4957 Safefree(PL_efloatbuf);
4958 PL_efloatsize = need + 20; /* more fudge */
4959 New(906, PL_efloatbuf, PL_efloatsize, char);
4962 eptr = ebuf + sizeof ebuf;
4967 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4972 do { *--eptr = '0' + (base % 10); } while (base /= 10);
4984 (void)sprintf(PL_efloatbuf, eptr, nv);
4986 eptr = PL_efloatbuf;
4987 elen = strlen(PL_efloatbuf);
4991 * User-defined locales may include arbitrary characters.
4992 * And, unfortunately, some system may alloc the "C" locale
4993 * to be overridden by a malicious user.
4996 *used_locale = TRUE;
4997 #endif /* LC_NUMERIC */
5004 i = SvCUR(sv) - origlen;
5007 case 'h': *(va_arg(*args, short*)) = i; break;
5008 default: *(va_arg(*args, int*)) = i; break;
5009 case 'l': *(va_arg(*args, long*)) = i; break;
5010 case 'V': *(va_arg(*args, IV*)) = i; break;
5013 else if (svix < svmax)
5014 sv_setuv(svargs[svix++], (UV)i);
5015 continue; /* not "break" */
5021 if (!args && ckWARN(WARN_PRINTF) &&
5022 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
5023 SV *msg = sv_newmortal();
5024 sv_setpvf(msg, "Invalid conversion in %s: ",
5025 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
5027 sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
5030 sv_catpv(msg, "end of string");
5031 warner(WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
5034 /* output mangled stuff ... */
5040 /* ... right here, because formatting flags should not apply */
5041 SvGROW(sv, SvCUR(sv) + elen + 1);
5043 memcpy(p, eptr, elen);
5046 SvCUR(sv) = p - SvPVX(sv);
5047 continue; /* not "break" */
5050 have = esignlen + zeros + elen;
5051 need = (have > width ? have : width);
5054 SvGROW(sv, SvCUR(sv) + need + 1);
5056 if (esignlen && fill == '0') {
5057 for (i = 0; i < esignlen; i++)
5061 memset(p, fill, gap);
5064 if (esignlen && fill != '0') {
5065 for (i = 0; i < esignlen; i++)
5069 for (i = zeros; i; i--)
5073 memcpy(p, eptr, elen);
5077 memset(p, ' ', gap);
5081 SvCUR(sv) = p - SvPVX(sv);