1 /* $RCSfile: sv.c,v $$Revision: 4.1 $$Date: 92/08/07 18:26:45 $
3 * Copyright (c) 1991, 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.
9 * Revision 4.1 92/08/07 18:26:45 lwall
11 * Revision 4.0.1.6 92/06/11 21:14:21 lwall
12 * patch34: quotes containing subscripts containing variables didn't parse right
14 * Revision 4.0.1.5 92/06/08 15:40:43 lwall
15 * patch20: removed implicit int declarations on functions
16 * patch20: Perl now distinguishes overlapped copies from non-overlapped
17 * patch20: paragraph mode now skips extra newlines automatically
18 * patch20: fixed memory leak in doube-quote interpretation
19 * patch20: made /\$$foo/ look for literal '$foo'
20 * patch20: "$var{$foo'bar}" didn't scan subscript correctly
21 * patch20: a splice on non-existent array elements could dump core
22 * patch20: running taintperl explicitly now does checks even if $< == $>
24 * Revision 4.0.1.4 91/11/05 18:40:51 lwall
25 * patch11: $foo .= <BAR> could overrun malloced memory
26 * patch11: \$ didn't always make it through double-quoter to regexp routines
27 * patch11: prepared for ctype implementations that don't define isascii()
29 * Revision 4.0.1.3 91/06/10 01:27:54 lwall
30 * patch10: $) and $| incorrectly handled in run-time patterns
32 * Revision 4.0.1.2 91/06/07 11:58:13 lwall
33 * patch4: new copyright notice
34 * patch4: taint check on undefined string could cause core dump
36 * Revision 4.0.1.1 91/04/12 09:15:30 lwall
37 * patch1: fixed undefined environ problem
38 * patch1: substr($ENV{"PATH"},0,0) = "/foo:" didn't modify environment
39 * patch1: $foo .= <BAR> could cause core dump for certain lengths of $foo
41 * Revision 4.0 91/03/20 01:39:55 lwall
63 sv_root = (SV*)SvANY(sv);
83 sv_root = (SV*)malloc(1008);
85 svend = &sv[1008 / sizeof(SV) - 1];
87 SvANY(sv) = (SV*)(sv + 1);
96 static XPVIV* more_xiv();
104 xiv_root = *(I32**)xiv;
105 return (XPVIV*)((char*)xiv - sizeof(XPV));
114 I32* xiv = (I32*)((char*)(p) + sizeof(XPV));
115 *(I32**)xiv = xiv_root;
124 register I32* xivend;
125 xiv = (I32*)malloc(1008);
126 xivend = &xiv[1008 / sizeof(I32) - 1];
127 xiv += (sizeof(XPV) - 1) / sizeof(I32) + 1; /* fudge by size of XPV */
129 while (xiv < xivend) {
130 *(I32**)xiv = (I32*)(xiv + 1); /* XXX busted on Alpha? */
137 static double* xnv_root;
139 static XPVNV* more_xnv();
147 xnv_root = *(double**)xnv;
148 return (XPVNV*)((char*)xnv - sizeof(XPVIV));
157 double* xnv = (double*)((char*)(p) + sizeof(XPVIV));
158 *(double**)xnv = xnv_root;
166 register double* xnv;
167 register double* xnvend;
168 xnv = (double*)malloc(1008);
169 xnvend = &xnv[1008 / sizeof(double) - 1];
170 xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
172 while (xnv < xnvend) {
173 *(double**)xnv = (double*)(xnv + 1);
180 static XRV* xrv_root;
182 static XRV* more_xrv();
190 xrv_root = (XRV*)xrv->xrv_rv;
200 p->xrv_rv = (SV*)xrv_root;
209 register XRV* xrvend;
210 xrv_root = (XRV*)malloc(1008);
212 xrvend = &xrv[1008 / sizeof(XRV) - 1];
213 while (xrv < xrvend) {
214 xrv->xrv_rv = (SV*)(xrv + 1);
221 static XPV* xpv_root;
223 static XPV* more_xpv();
231 xpv_root = (XPV*)xpv->xpv_pv;
241 p->xpv_pv = (char*)xpv_root;
250 register XPV* xpvend;
251 xpv_root = (XPV*)malloc(1008);
253 xpvend = &xpv[1008 / sizeof(XPV) - 1];
254 while (xpv < xpvend) {
255 xpv->xpv_pv = (char*)(xpv + 1);
264 #define new_SV() sv = (SV*)malloc(sizeof(SV))
265 #define del_SV(p) free((char*)p)
272 sv_root = (SV*)SvANY(sv); \
276 #define del_SV(p) del_sv(p)
281 #define new_XIV() (void*)malloc(sizeof(XPVIV))
282 #define del_XIV(p) free((char*)p)
284 #define new_XIV() new_xiv()
285 #define del_XIV(p) del_xiv(p)
289 #define new_XNV() (void*)malloc(sizeof(XPVNV))
290 #define del_XNV(p) free((char*)p)
292 #define new_XNV() new_xnv()
293 #define del_XNV(p) del_xnv(p)
297 #define new_XRV() (void*)malloc(sizeof(XRV))
298 #define del_XRV(p) free((char*)p)
300 #define new_XRV() new_xrv()
301 #define del_XRV(p) del_xrv(p)
305 #define new_XPV() (void*)malloc(sizeof(XPV))
306 #define del_XPV(p) free((char*)p)
308 #define new_XPV() new_xpv()
309 #define del_XPV(p) del_xpv(p)
312 #define new_XPVIV() (void*)malloc(sizeof(XPVIV))
313 #define del_XPVIV(p) free((char*)p)
315 #define new_XPVNV() (void*)malloc(sizeof(XPVNV))
316 #define del_XPVNV(p) free((char*)p)
318 #define new_XPVMG() (void*)malloc(sizeof(XPVMG))
319 #define del_XPVMG(p) free((char*)p)
321 #define new_XPVLV() (void*)malloc(sizeof(XPVLV))
322 #define del_XPVLV(p) free((char*)p)
324 #define new_XPVAV() (void*)malloc(sizeof(XPVAV))
325 #define del_XPVAV(p) free((char*)p)
327 #define new_XPVHV() (void*)malloc(sizeof(XPVHV))
328 #define del_XPVHV(p) free((char*)p)
330 #define new_XPVCV() (void*)malloc(sizeof(XPVCV))
331 #define del_XPVCV(p) free((char*)p)
333 #define new_XPVGV() (void*)malloc(sizeof(XPVGV))
334 #define del_XPVGV(p) free((char*)p)
336 #define new_XPVBM() (void*)malloc(sizeof(XPVBM))
337 #define del_XPVBM(p) free((char*)p)
339 #define new_XPVFM() (void*)malloc(sizeof(XPVFM))
340 #define del_XPVFM(p) free((char*)p)
355 if (SvTYPE(sv) == mt)
358 switch (SvTYPE(sv)) {
373 nv = (double)SvIVX(sv);
379 else if (mt < SVt_PVIV)
396 pv = (char*)SvRV(sv);
400 nv = (double)(unsigned long)pv;
425 del_XPVIV(SvANY(sv));
436 del_XPVNV(SvANY(sv));
446 del_XPVMG(SvANY(sv));
449 croak("Can't upgrade that kind of scalar");
454 croak("Can't upgrade to undef");
456 SvANY(sv) = new_XIV();
460 SvANY(sv) = new_XNV();
464 SvANY(sv) = new_XRV();
469 SvANY(sv) = new_XPV();
475 SvANY(sv) = new_XPVIV();
485 SvANY(sv) = new_XPVNV();
493 SvANY(sv) = new_XPVMG();
503 SvANY(sv) = new_XPVLV();
517 SvANY(sv) = new_XPVAV();
532 SvANY(sv) = new_XPVHV();
548 SvANY(sv) = new_XPVCV();
567 SvANY(sv) = new_XPVGV();
581 SvANY(sv) = new_XPVBM();
594 SvANY(sv) = new_XPVFM();
621 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
625 else if (SvREFCNT(sv) == 0 && !SvREADONLY(sv)) {
630 switch (SvTYPE(sv)) {
647 if (t - tokenbuf > 10) {
648 strcpy(tokenbuf + 3,"...");
694 sprintf(t,"(%d+\"%0.127s\")",SvIVX(sv),SvPVX(sv));
696 sprintf(t,"(\"%0.127s\")",SvPVX(sv));
699 sprintf(t,"(%g)",SvNVX(sv));
701 sprintf(t,"(%ld)",(long)SvIVX(sv));
714 SvLEN(sv) += SvIVX(sv);
715 SvPVX(sv) -= SvIVX(sv);
717 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
719 SvFLAGS(sv) &= ~SVf_OOK;
728 unsigned long newlen;
734 if (newlen >= 0x10000) {
735 fprintf(stderr, "Allocation too large: %lx\n", newlen);
739 if (SvTHINKFIRST(sv)) {
745 if (SvTYPE(sv) < SVt_PV) {
746 sv_upgrade(sv, SVt_PV);
749 else if (SvOOK(sv)) { /* pv is offset? */
752 if (newlen > SvLEN(sv))
753 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
757 if (newlen > SvLEN(sv)) { /* need more room? */
759 Renew(s,newlen,char);
761 New(703,s,newlen,char);
763 SvLEN_set(sv, newlen);
773 if (SvTHINKFIRST(sv)) {
779 switch (SvTYPE(sv)) {
781 sv_upgrade(sv, SVt_IV);
784 sv_upgrade(sv, SVt_PVNV);
788 sv_upgrade(sv, SVt_PVIV);
792 SvIOK_only(sv); /* validate number */
801 if (SvTHINKFIRST(sv)) {
807 if (SvTYPE(sv) < SVt_NV)
808 sv_upgrade(sv, SVt_NV);
809 else if (SvTYPE(sv) < SVt_PVNV)
810 sv_upgrade(sv, SVt_PVNV);
811 else if (SvPOK(sv)) {
815 SvNOK_only(sv); /* validate number */
830 return (I32)SvNVX(sv);
831 if (SvPOKp(sv) && SvLEN(sv))
832 return (I32)atol(SvPVX(sv));
835 if (SvTHINKFIRST(sv)) {
837 return (I32)SvRV(sv);
838 if (SvREADONLY(sv)) {
840 return (I32)SvNVX(sv);
841 if (SvPOK(sv) && SvLEN(sv))
842 return (I32)atol(SvPVX(sv));
844 warn("Use of uninitialized variable");
848 switch (SvTYPE(sv)) {
850 sv_upgrade(sv, SVt_IV);
853 sv_upgrade(sv, SVt_PVIV);
856 sv_upgrade(sv, SVt_PVNV);
860 SvIVX(sv) = (I32)SvNVX(sv);
861 else if (SvPOK(sv) && SvLEN(sv)) {
862 if (dowarn && !looks_like_number(sv)) {
864 warn("Argument wasn't numeric for \"%s\"",op_name[op->op_type]);
866 warn("Argument wasn't numeric");
868 SvIVX(sv) = (I32)atol(SvPVX(sv));
872 warn("Use of uninitialized variable");
873 SvUPGRADE(sv, SVt_IV);
877 DEBUG_c((stderr,"0x%lx 2iv(%d)\n",sv,SvIVX(sv)));
891 if (SvPOKp(sv) && SvLEN(sv))
892 return atof(SvPVX(sv));
894 return (double)SvIVX(sv);
897 if (SvTHINKFIRST(sv)) {
899 return (double)(unsigned long)SvRV(sv);
900 if (SvREADONLY(sv)) {
901 if (SvPOK(sv) && SvLEN(sv))
902 return atof(SvPVX(sv));
904 warn("Use of uninitialized variable");
908 if (SvTYPE(sv) < SVt_NV) {
909 if (SvTYPE(sv) == SVt_IV)
910 sv_upgrade(sv, SVt_PVNV);
912 sv_upgrade(sv, SVt_NV);
913 DEBUG_c((stderr,"0x%lx num(%g)\n",sv,SvNVX(sv)));
916 else if (SvTYPE(sv) < SVt_PVNV)
917 sv_upgrade(sv, SVt_PVNV);
919 (!SvPOK(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
921 SvNVX(sv) = (double)SvIVX(sv);
923 else if (SvPOK(sv) && SvLEN(sv)) {
924 if (dowarn && !SvIOK(sv) && !looks_like_number(sv)) {
926 warn("Argument wasn't numeric for \"%s\"",op_name[op->op_type]);
928 warn("Argument wasn't numeric");
930 SvNVX(sv) = atof(SvPVX(sv));
934 warn("Use of uninitialized variable");
938 DEBUG_c((stderr,"0x%lx 2nv(%g)\n",sv,SvNVX(sv)));
961 (void)sprintf(tokenbuf,"%ld",SvIVX(sv));
962 *lp = strlen(tokenbuf);
966 (void)sprintf(tokenbuf,"%.20g",SvNVX(sv));
967 *lp = strlen(tokenbuf);
973 if (SvTHINKFIRST(sv)) {
979 switch (SvTYPE(sv)) {
988 case SVt_PVMG: s = "SCALAR"; break;
989 case SVt_PVLV: s = "LVALUE"; break;
990 case SVt_PVAV: s = "ARRAY"; break;
991 case SVt_PVHV: s = "HASH"; break;
992 case SVt_PVCV: s = "CODE"; break;
993 case SVt_PVGV: s = "GLOB"; break;
994 case SVt_PVFM: s = "FORMATLINE"; break;
995 default: s = "UNKNOWN"; break;
998 sprintf(tokenbuf, "%s=%s(0x%lx)",
999 HvNAME(SvSTASH(sv)), s, (unsigned long)sv);
1001 sprintf(tokenbuf, "%s(0x%lx)", s, (unsigned long)sv);
1007 if (SvREADONLY(sv)) {
1009 (void)sprintf(tokenbuf,"%ld",SvIVX(sv));
1010 *lp = strlen(tokenbuf);
1014 (void)sprintf(tokenbuf,"%.20g",SvNVX(sv));
1015 *lp = strlen(tokenbuf);
1019 warn("Use of uninitialized variable");
1024 if (!SvUPGRADE(sv, SVt_PV))
1027 if (SvTYPE(sv) < SVt_PVNV)
1028 sv_upgrade(sv, SVt_PVNV);
1031 olderrno = errno; /* some Xenix systems wipe out errno here */
1032 #if defined(scs) && defined(ns32000)
1033 gcvt(SvNVX(sv),20,s);
1036 if (SvNVX(sv) == 0.0)
1037 (void)strcpy(s,"0");
1040 (void)sprintf(s,"%.20g",SvNVX(sv));
1049 else if (SvIOK(sv)) {
1050 if (SvTYPE(sv) < SVt_PVIV)
1051 sv_upgrade(sv, SVt_PVIV);
1054 olderrno = errno; /* some Xenix systems wipe out errno here */
1055 (void)sprintf(s,"%ld",SvIVX(sv));
1061 warn("Use of uninitialized variable");
1066 *lp = s - SvPVX(sv);
1069 DEBUG_c((stderr,"0x%lx 2pv(%s)\n",sv,SvPVX(sv)));
1073 /* This function is only called on magical items */
1082 return SvRV(sv) != 0;
1085 if ((Xpv = (XPV*)SvANY(sv)) &&
1086 (*Xpv->xpv_pv > '0' ||
1088 (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
1095 return SvIVX(sv) != 0;
1098 return SvNVX(sv) != 0.0;
1105 /* Note: sv_setsv() should not be called with a source string that needs
1106 * to be reused, since it may destroy the source string if it is marked
1119 if (SvTHINKFIRST(dstr)) {
1120 if (SvREADONLY(dstr))
1128 /* There's a lot of redundancy below but we're going for speed here */
1130 switch (SvTYPE(sstr)) {
1135 if (SvTYPE(dstr) < SVt_IV)
1136 sv_upgrade(dstr, SVt_IV);
1137 else if (SvTYPE(dstr) == SVt_PV)
1138 sv_upgrade(dstr, SVt_PVIV);
1139 else if (SvTYPE(dstr) == SVt_NV)
1140 sv_upgrade(dstr, SVt_PVNV);
1141 flags = SvFLAGS(sstr);
1144 if (SvTYPE(dstr) < SVt_NV)
1145 sv_upgrade(dstr, SVt_NV);
1146 else if (SvTYPE(dstr) == SVt_PV)
1147 sv_upgrade(dstr, SVt_PVNV);
1148 else if (SvTYPE(dstr) == SVt_PVIV)
1149 sv_upgrade(dstr, SVt_PVNV);
1150 flags = SvFLAGS(sstr);
1153 if (SvTYPE(dstr) < SVt_RV)
1154 sv_upgrade(dstr, SVt_RV);
1155 flags = SvFLAGS(sstr);
1158 if (SvTYPE(dstr) < SVt_PV)
1159 sv_upgrade(dstr, SVt_PV);
1160 flags = SvFLAGS(sstr);
1163 if (SvTYPE(dstr) < SVt_PVIV)
1164 sv_upgrade(dstr, SVt_PVIV);
1165 flags = SvFLAGS(sstr);
1168 if (SvTYPE(dstr) < SVt_PVNV)
1169 sv_upgrade(dstr, SVt_PVNV);
1170 flags = SvFLAGS(sstr);
1173 if (SvTYPE(dstr) <= SVt_PVGV) {
1174 if (SvTYPE(dstr) < SVt_PVGV)
1175 sv_upgrade(dstr, SVt_PVGV);
1182 GvIO(sstr) = newIO();
1185 GvGP(dstr) = gp_ref(GvGP(sstr));
1192 if (SvTYPE(dstr) < SvTYPE(sstr))
1193 sv_upgrade(dstr, SvTYPE(sstr));
1194 if (SvMAGICAL(sstr)) {
1196 flags = SvPRIVATE(sstr);
1199 flags = SvFLAGS(sstr);
1202 SvPRIVATE(dstr) = SvPRIVATE(sstr) & ~(SVf_IOK|SVf_POK|SVf_NOK);
1206 if (SvTYPE(dstr) >= SVt_PV && SvPVX(dstr))
1207 Safefree(SvPVX(dstr));
1208 SvRV(dstr) = sv_ref(SvRV(sstr));
1210 if (flags & SVf_NOK) {
1212 SvNVX(dstr) = SvNVX(sstr);
1214 if (flags & SVf_IOK) {
1216 SvIVX(dstr) = SvIVX(sstr);
1219 else if (flags & SVf_POK) {
1222 * Check to see if we can just swipe the string. If so, it's a
1223 * possible small lose on short strings, but a big win on long ones.
1224 * It might even be a win on short strings if SvPVX(dstr)
1225 * has to be allocated and SvPVX(sstr) has to be freed.
1228 if (SvTEMP(sstr)) { /* slated for free anyway? */
1231 Safefree(SvPVX(dstr));
1233 SvPV_set(dstr, SvPVX(sstr));
1234 SvLEN_set(dstr, SvLEN(sstr));
1235 SvCUR_set(dstr, SvCUR(sstr));
1238 SvPV_set(sstr, Nullch);
1240 SvPOK_off(sstr); /* wipe out any weird flags */
1241 SvPVX(sstr) = 0; /* so sstr frees uneventfully */
1243 else { /* have to copy actual string */
1244 if (SvPVX(dstr)) { /* XXX ck type */
1247 sv_setpvn(dstr,SvPVX(sstr),SvCUR(sstr));
1250 if (flags & SVf_NOK) {
1252 SvNVX(dstr) = SvNVX(sstr);
1254 if (flags & SVf_IOK) {
1256 SvIVX(dstr) = SvIVX(sstr);
1259 else if (flags & SVf_NOK) {
1260 SvNVX(dstr) = SvNVX(sstr);
1264 SvIVX(dstr) = SvIVX(sstr);
1267 else if (flags & SVf_IOK) {
1269 SvIVX(dstr) = SvIVX(sstr);
1278 sv_setpvn(sv,ptr,len)
1281 register STRLEN len;
1283 if (SvTHINKFIRST(sv)) {
1293 if (!SvUPGRADE(sv, SVt_PV))
1295 SvGROW(sv, len + 1);
1297 Move(ptr,SvPVX(sv),len,char);
1300 SvPOK_only(sv); /* validate pointer */
1309 register STRLEN len;
1311 if (SvTHINKFIRST(sv)) {
1322 if (!SvUPGRADE(sv, SVt_PV))
1324 SvGROW(sv, len + 1);
1325 Move(ptr,SvPVX(sv),len+1,char);
1327 SvPOK_only(sv); /* validate pointer */
1332 sv_usepvn(sv,ptr,len)
1335 register STRLEN len;
1337 if (SvTHINKFIRST(sv)) {
1343 if (!SvUPGRADE(sv, SVt_PV))
1350 Safefree(SvPVX(sv));
1351 Renew(ptr, len+1, char);
1354 SvLEN_set(sv, len+1);
1356 SvPOK_only(sv); /* validate pointer */
1361 sv_chop(sv,ptr) /* like set but assuming ptr is in sv */
1365 register STRLEN delta;
1367 if (!ptr || !SvPOK(sv))
1369 if (SvTHINKFIRST(sv)) {
1375 if (SvTYPE(sv) < SVt_PVIV)
1376 sv_upgrade(sv,SVt_PVIV);
1380 SvFLAGS(sv) |= SVf_OOK;
1382 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
1383 delta = ptr - SvPVX(sv);
1391 sv_catpvn(sv,ptr,len)
1394 register STRLEN len;
1398 if (SvTHINKFIRST(sv)) {
1405 SvGROW(sv, tlen + len + 1);
1406 Move(ptr,SvPVX(sv)+tlen,len,char);
1409 SvPOK_only(sv); /* validate pointer */
1422 if (s = SvPV(sstr, len))
1423 sv_catpvn(dstr,s,len);
1431 register STRLEN len;
1435 if (SvTHINKFIRST(sv)) {
1445 SvGROW(sv, tlen + len + 1);
1446 Move(ptr,SvPVX(sv)+tlen,len+1,char);
1448 SvPOK_only(sv); /* validate pointer */
1467 sv_upgrade(sv, SVt_PV);
1468 SvGROW(sv, len + 1);
1474 sv_magic(sv, obj, how, name, namlen)
1483 if (SvTHINKFIRST(sv)) {
1487 if (SvMAGICAL(sv)) {
1488 if (SvMAGIC(sv) && mg_find(sv, how))
1492 if (!SvUPGRADE(sv, SVt_PVMG))
1495 SvPRIVATE(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
1496 SvPRIVATE(sv) |= SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
1497 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
1499 Newz(702,mg, 1, MAGIC);
1500 mg->mg_moremagic = SvMAGIC(sv);
1503 mg->mg_obj = sv_ref(obj);
1505 mg->mg_len = namlen;
1506 if (name && namlen >= 0)
1507 mg->mg_ptr = nsavestr(name, namlen);
1510 mg->mg_virtual = &vtbl_sv;
1513 mg->mg_virtual = &vtbl_bm;
1516 mg->mg_virtual = &vtbl_env;
1519 mg->mg_virtual = &vtbl_envelem;
1522 mg->mg_virtual = &vtbl_mglob;
1525 mg->mg_virtual = &vtbl_isa;
1528 mg->mg_virtual = &vtbl_isaelem;
1534 mg->mg_virtual = &vtbl_dbline;
1537 mg->mg_virtual = &vtbl_pack;
1540 mg->mg_virtual = &vtbl_packelem;
1543 mg->mg_virtual = &vtbl_sig;
1546 mg->mg_virtual = &vtbl_sigelem;
1549 mg->mg_virtual = &vtbl_taint;
1552 mg->mg_virtual = &vtbl_uvar;
1555 mg->mg_virtual = &vtbl_vec;
1558 mg->mg_virtual = &vtbl_substr;
1561 mg->mg_virtual = &vtbl_glob;
1564 mg->mg_virtual = &vtbl_arylen;
1567 croak("Don't know how to handle magic of type '%c'", how);
1572 sv_unmagic(sv, type)
1581 for (mg = *mgp; mg; mg = *mgp) {
1582 if (mg->mg_type == type) {
1583 MGVTBL* vtbl = mg->mg_virtual;
1584 *mgp = mg->mg_moremagic;
1585 if (vtbl && vtbl->svt_free)
1586 (*vtbl->svt_free)(sv, mg);
1587 if (mg->mg_ptr && mg->mg_type != 'g')
1588 Safefree(mg->mg_ptr);
1589 sv_free(mg->mg_obj);
1593 mgp = &mg->mg_moremagic;
1597 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
1598 SvFLAGS(sv) |= SvPRIVATE(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
1599 SvPRIVATE(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
1606 sv_insert(bigstr,offset,len,little,littlelen)
1615 register char *midend;
1616 register char *bigend;
1619 if (SvTHINKFIRST(bigstr)) {
1620 if (SvREADONLY(bigstr))
1627 i = littlelen - len;
1628 if (i > 0) { /* string might grow */
1629 if (!SvUPGRADE(bigstr, SVt_PV))
1631 SvGROW(bigstr, SvCUR(bigstr) + i + 1);
1632 big = SvPVX(bigstr);
1633 mid = big + offset + len;
1634 midend = bigend = big + SvCUR(bigstr);
1637 while (midend > mid) /* shove everything down */
1638 *--bigend = *--midend;
1639 Move(little,big+offset,littlelen,char);
1645 Move(little,SvPVX(bigstr)+offset,len,char);
1650 big = SvPVX(bigstr);
1653 bigend = big + SvCUR(bigstr);
1655 if (midend > bigend)
1656 croak("panic: sv_insert");
1658 if (mid - big > bigend - midend) { /* faster to shorten from end */
1660 Move(little, mid, littlelen,char);
1663 i = bigend - midend;
1665 Move(midend, mid, i,char);
1669 SvCUR_set(bigstr, mid - big);
1672 else if (i = mid - big) { /* faster from front */
1673 midend -= littlelen;
1675 sv_chop(bigstr,midend-i);
1680 Move(little, mid, littlelen,char);
1682 else if (littlelen) {
1683 midend -= littlelen;
1684 sv_chop(bigstr,midend);
1685 Move(little,midend,littlelen,char);
1688 sv_chop(bigstr,midend);
1693 /* make sv point to what nstr did */
1700 U32 refcnt = SvREFCNT(sv);
1701 if (SvTHINKFIRST(sv)) {
1707 if (SvREFCNT(nsv) != 1)
1708 warn("Reference miscount in sv_replace()");
1709 if (SvMAGICAL(sv)) {
1710 SvUPGRADE(nsv, SVt_PVMG);
1711 SvMAGIC(nsv) = SvMAGIC(sv);
1718 StructCopy(nsv,sv,SV);
1719 SvREFCNT(sv) = refcnt;
1728 assert(SvREFCNT(sv) == 0);
1732 BINOP myop; /* fake syntax tree node */
1735 SvOBJECT_off(sv); /* Curse the object. */
1741 curcop = &compiling;
1742 curstash = SvSTASH(sv);
1743 destructor = gv_fetchpv("DESTROY", FALSE);
1745 if (destructor && GvCV(destructor)) {
1746 SV* ref = sv_mortalcopy(&sv_undef);
1747 sv_upgrade(ref, SVt_RV);
1748 SvRV(ref) = sv_ref(sv);
1753 myop.op_last = (OP*)&myop;
1754 myop.op_flags = OPf_STACKED;
1755 myop.op_next = Nullop;
1758 PUSHs((SV*)destructor);
1762 op = pp_entersubr();
1767 SvTYPE(ref) = SVt_NULL;
1772 switch (SvTYPE(sv)) {
1801 Safefree(SvPVX(sv));
1814 switch (SvTYPE(sv)) {
1830 del_XPVIV(SvANY(sv));
1833 del_XPVNV(SvANY(sv));
1836 del_XPVMG(SvANY(sv));
1839 del_XPVLV(SvANY(sv));
1842 del_XPVAV(SvANY(sv));
1845 del_XPVHV(SvANY(sv));
1848 del_XPVCV(SvANY(sv));
1851 del_XPVGV(SvANY(sv));
1854 del_XPVBM(SvANY(sv));
1857 del_XPVFM(SvANY(sv));
1860 DEB(SvTYPE(sv) = 0xff;)
1878 if (SvTHINKFIRST(sv)) {
1879 if (SvREADONLY(sv)) {
1880 if (sv == &sv_undef || sv == &sv_yes || sv == &sv_no)
1884 if (SvREFCNT(sv) == 0) {
1885 warn("Attempt to free unreferenced scalar");
1890 warn("Attempt to free temp prematurely");
1894 if (--SvREFCNT(sv) > 0)
1897 DEB(SvTYPE(sv) = 0xff;)
1930 pv1 = SvPV(str1, cur1);
1935 pv2 = SvPV(str2, cur2);
1940 return !bcmp(pv1, pv2, cur1);
1959 pv1 = SvPV(str1, cur1);
1966 pv2 = SvPV(str2, cur2);
1969 return cur2 ? -1 : 0;
1975 if (retval = memcmp(pv1, pv2, cur1))
1976 return retval < 0 ? -1 : 1;
1981 else if (retval = memcmp(pv1, pv2, cur2))
1982 return retval < 0 ? -1 : 1;
1983 else if (cur1 == cur2)
1990 sv_gets(sv,fp,append)
1995 register char *bp; /* we're going to steal some values */
1996 register I32 cnt; /* from the stdio struct and put EVERYTHING */
1997 register STDCHAR *ptr; /* in the innermost loop into registers */
1998 register I32 newline = rschar;/* (assuming >= 6 registers) */
2003 if (SvTHINKFIRST(sv)) {
2009 if (!SvUPGRADE(sv, SVt_PV))
2011 if (rspara) { /* have to do this both before and after */
2012 do { /* to make sure file boundaries work right */
2020 #ifdef STDSTDIO /* Here is some breathtakingly efficient cheating */
2021 cnt = fp->_cnt; /* get count into register */
2022 SvPOK_only(sv); /* validate pointer */
2023 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
2024 if (cnt > 80 && SvLEN(sv) > append) {
2025 shortbuffered = cnt - SvLEN(sv) + append + 1;
2026 cnt -= shortbuffered;
2030 SvGROW(sv, append+cnt+2);/* (remembering cnt can be -1) */
2035 bp = SvPVX(sv) + append; /* move these two too to registers */
2040 while (--cnt >= 0) { /* this */ /* eat */
2041 if ((*bp++ = *ptr++) == newline) /* really */ /* dust */
2042 goto thats_all_folks; /* screams */ /* sed :-) */
2046 if (shortbuffered) { /* oh well, must extend */
2047 cnt = shortbuffered;
2049 bpx = bp - SvPVX(sv); /* prepare for possible relocation */
2051 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
2052 bp = SvPVX(sv) + bpx; /* reconstitute our pointer */
2056 fp->_cnt = cnt; /* deregisterize cnt and ptr */
2058 i = _filbuf(fp); /* get more characters */
2060 ptr = fp->_ptr; /* reregisterize cnt and ptr */
2062 bpx = bp - SvPVX(sv); /* prepare for possible relocation */
2064 SvGROW(sv, bpx + cnt + 2);
2065 bp = SvPVX(sv) + bpx; /* reconstitute our pointer */
2067 if (i == newline) { /* all done for now? */
2069 goto thats_all_folks;
2071 else if (i == EOF) /* all done for ever? */
2072 goto thats_really_all_folks;
2073 *bp++ = i; /* now go back to screaming loop */
2077 if (rslen > 1 && (bp - SvPVX(sv) < rslen || bcmp(bp - rslen, rs, rslen)))
2078 goto screamer; /* go back to the fray */
2079 thats_really_all_folks:
2081 cnt += shortbuffered;
2082 fp->_cnt = cnt; /* put these back or we're in trouble */
2085 SvCUR_set(sv, bp - SvPVX(sv)); /* set length */
2087 #else /* !STDSTDIO */ /* The big, slow, and stupid way */
2091 register char * bpe = buf + sizeof(buf) - 3;
2095 while ((i = getc(fp)) != EOF && (*bp++ = i) != newline && bp < bpe) ;
2098 sv_catpvn(sv, buf, bp - buf);
2100 sv_setpvn(sv, buf, bp - buf);
2101 if (i != EOF /* joy */
2109 bcmp(SvPVX(sv) + SvCUR(sv) - rslen, rs, rslen)
2120 #endif /* STDSTDIO */
2131 return SvCUR(sv) - append ? SvPVX(sv) : Nullch;
2143 if (SvTHINKFIRST(sv)) {
2149 if (SvMAGICAL(sv)) {
2151 flags = SvPRIVATE(sv);
2154 flags = SvFLAGS(sv);
2155 if (flags & SVf_IOK) {
2160 if (flags & SVf_NOK) {
2165 if (!(flags & SVf_POK) || !*SvPVX(sv)) {
2166 if (!SvUPGRADE(sv, SVt_NV))
2173 while (isALPHA(*d)) d++;
2174 while (isDIGIT(*d)) d++;
2176 sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
2180 while (d >= SvPVX(sv)) {
2190 *(d--) -= 'z' - 'a' + 1;
2193 /* oh,oh, the number grew */
2194 SvGROW(sv, SvCUR(sv) + 2);
2196 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
2212 if (SvTHINKFIRST(sv)) {
2218 if (SvMAGICAL(sv)) {
2220 flags = SvPRIVATE(sv);
2223 flags = SvFLAGS(sv);
2224 if (flags & SVf_IOK) {
2229 if (flags & SVf_NOK) {
2234 if (!(flags & SVf_POK)) {
2235 if (!SvUPGRADE(sv, SVt_NV))
2241 sv_setnv(sv,atof(SvPVX(sv)) - 1.0);
2244 /* Make a string that will exist for the duration of the expression
2245 * evaluation. Actually, it may have to last longer than that, but
2246 * hopefully we won't free it until it has been assigned to a
2247 * permanent location. */
2250 sv_mortalcopy(oldstr)
2258 sv_setsv(sv,oldstr);
2259 if (++tmps_ix > tmps_max) {
2261 if (!(tmps_max & 127)) {
2263 Renew(tmps_stack, tmps_max + 128, SV*);
2265 New(702,tmps_stack, 128, SV*);
2268 tmps_stack[tmps_ix] = sv;
2274 /* same thing without the copying */
2282 if (SvTHINKFIRST(sv)) {
2288 if (++tmps_ix > tmps_max) {
2290 if (!(tmps_max & 127)) {
2292 Renew(tmps_stack, tmps_max + 128, SV*);
2294 New(704,tmps_stack, 128, SV*);
2297 tmps_stack[tmps_ix] = sv;
2315 sv_setpvn(sv,s,len);
2345 /* make an exact duplicate of old */
2355 if (SvTYPE(old) == 0xff) {
2356 warn("semi-panic: attempt to dup freed string");
2385 if (!*s) { /* reset ?? searches */
2386 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
2387 pm->op_pmflags &= ~PMf_USED;
2392 /* reset variables */
2394 if (!HvARRAY(stash))
2397 Zero(todo, 256, char);
2404 for ( ; i <= max; i++) {
2407 for (i = 0; i <= HvMAX(stash); i++) {
2408 for (entry = HvARRAY(stash)[i];
2410 entry = entry->hent_next) {
2411 if (!todo[(U8)*entry->hent_key])
2413 gv = (GV*)entry->hent_val;
2416 if (SvTYPE(sv) >= SVt_PV) {
2419 if (SvPVX(sv) != Nullch)
2428 environ[0] = Nullch;
2436 sv_2cv(sv, st, gvp, lref)
2446 return *gvp = Nullgv, Nullcv;
2447 switch (SvTYPE(sv)) {
2451 if (SvTYPE(cv) != SVt_PVCV)
2452 croak("Not a subroutine reference");
2470 gv = gv_fetchpv(SvPV(sv, na), lref);
2488 if ((Xpv = (XPV*)SvANY(sv)) &&
2489 (*Xpv->xpv_pv > '0' ||
2491 (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
2498 return SvIVX(sv) != 0;
2501 return SvNVX(sv) != 0.0;
2503 return sv_2bool(sv);
2516 return (double)SvIVX(Sv);
2529 return sv_2pv(sv, lp);
2544 return strEQ(HvNAME(SvSTASH(sv)), name);
2548 sv_setptrobj(rv, ptr, name)
2562 sv_setnv(sv, (double)(unsigned long)ptr);
2563 sv_upgrade(rv, SVt_RV);
2564 SvRV(rv) = sv_ref(sv);
2567 stash = fetch_stash(newSVpv(name,0), TRUE);
2569 SvUPGRADE(sv, SVt_PVMG);
2570 SvSTASH(sv) = stash;
2582 if (!SvREADONLY(sv))
2583 SvTHINKFIRST_off(sv);