This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.0 alpha 5
[perl5.git] / sv.c
CommitLineData
79072805
LW
1/* $RCSfile: sv.c,v $$Revision: 4.1 $$Date: 92/08/07 18:26:45 $
2 *
3 * Copyright (c) 1991, Larry Wall
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 * $Log: sv.c,v $
9 * Revision 4.1 92/08/07 18:26:45 lwall
10 *
11 * Revision 4.0.1.6 92/06/11 21:14:21 lwall
12 * patch34: quotes containing subscripts containing variables didn't parse right
13 *
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 $< == $>
23 *
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()
28 *
29 * Revision 4.0.1.3 91/06/10 01:27:54 lwall
30 * patch10: $) and $| incorrectly handled in run-time patterns
31 *
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
35 *
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
40 *
41 * Revision 4.0 91/03/20 01:39:55 lwall
42 * 4.0 baseline.
43 *
44 */
45
46#include "EXTERN.h"
47#include "perl.h"
48#include "perly.h"
49
50static void ucase();
51static void lcase();
52
463ee0b2
LW
53static SV* sv_root;
54
55static SV* more_sv();
56
57static SV*
58new_sv()
59{
60 SV* sv;
61 if (sv_root) {
62 sv = sv_root;
63 sv_root = (SV*)SvANY(sv);
64 return sv;
65 }
66 return more_sv();
67}
68
69static void
70del_sv(p)
71SV* p;
72{
73 SvANY(p) = sv_root;
74 sv_root = p;
75}
76
77static SV*
78more_sv()
79{
80 register int i;
81 register SV* sv;
82 register SV* svend;
83 sv_root = (SV*)malloc(1008);
84 sv = sv_root;
85 svend = &sv[1008 / sizeof(SV) - 1];
86 while (sv < svend) {
87 SvANY(sv) = (SV*)(sv + 1);
88 sv++;
89 }
90 SvANY(sv) = 0;
91 return new_sv();
92}
93
94static I32* xiv_root;
95
96static XPVIV* more_xiv();
97
98static XPVIV*
99new_xiv()
100{
101 I32* xiv;
102 if (xiv_root) {
103 xiv = xiv_root;
104 xiv_root = *(I32**)xiv;
105 return (XPVIV*)((char*)xiv - sizeof(XPV));
106 }
107 return more_xiv();
108}
109
110static void
111del_xiv(p)
112XPVIV* p;
113{
114 I32* xiv = (I32*)((char*)(p) + sizeof(XPV));
115 *(I32**)xiv = xiv_root;
116 xiv_root = xiv;
117}
118
119static XPVIV*
120more_xiv()
121{
122 register int i;
123 register I32* xiv;
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 */
128 xiv_root = xiv;
129 while (xiv < xivend) {
130 *(I32**)xiv = (I32*)(xiv + 1); /* XXX busted on Alpha? */
131 xiv++;
132 }
133 *(I32**)xiv = 0;
134 return new_xiv();
135}
136
137static double* xnv_root;
138
139static XPVNV* more_xnv();
140
141static XPVNV*
142new_xnv()
143{
144 double* xnv;
145 if (xnv_root) {
146 xnv = xnv_root;
147 xnv_root = *(double**)xnv;
148 return (XPVNV*)((char*)xnv - sizeof(XPVIV));
149 }
150 return more_xnv();
151}
152
153static void
154del_xnv(p)
155XPVNV* p;
156{
157 double* xnv = (double*)((char*)(p) + sizeof(XPVIV));
158 *(double**)xnv = xnv_root;
159 xnv_root = xnv;
160}
161
162static XPVNV*
163more_xnv()
164{
165 register int i;
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 */
171 xnv_root = xnv;
172 while (xnv < xnvend) {
173 *(double**)xnv = (double*)(xnv + 1);
174 xnv++;
175 }
176 *(double**)xnv = 0;
177 return new_xnv();
178}
179
ed6116ce
LW
180static XRV* xrv_root;
181
182static XRV* more_xrv();
183
184static XRV*
185new_xrv()
186{
187 XRV* xrv;
188 if (xrv_root) {
189 xrv = xrv_root;
190 xrv_root = (XRV*)xrv->xrv_rv;
191 return xrv;
192 }
193 return more_xrv();
194}
195
196static void
197del_xrv(p)
198XRV* p;
199{
200 p->xrv_rv = (SV*)xrv_root;
201 xrv_root = p;
202}
203
204static XRV*
205more_xrv()
206{
207 register int i;
208 register XRV* xrv;
209 register XRV* xrvend;
210 xrv_root = (XRV*)malloc(1008);
211 xrv = xrv_root;
212 xrvend = &xrv[1008 / sizeof(XRV) - 1];
213 while (xrv < xrvend) {
214 xrv->xrv_rv = (SV*)(xrv + 1);
215 xrv++;
216 }
217 xrv->xrv_rv = 0;
218 return new_xrv();
219}
220
463ee0b2
LW
221static XPV* xpv_root;
222
223static XPV* more_xpv();
224
225static XPV*
226new_xpv()
227{
228 XPV* xpv;
229 if (xpv_root) {
230 xpv = xpv_root;
231 xpv_root = (XPV*)xpv->xpv_pv;
232 return xpv;
233 }
234 return more_xpv();
235}
236
237static void
238del_xpv(p)
239XPV* p;
240{
241 p->xpv_pv = (char*)xpv_root;
242 xpv_root = p;
243}
244
245static XPV*
246more_xpv()
247{
248 register int i;
249 register XPV* xpv;
250 register XPV* xpvend;
251 xpv_root = (XPV*)malloc(1008);
252 xpv = xpv_root;
253 xpvend = &xpv[1008 / sizeof(XPV) - 1];
254 while (xpv < xpvend) {
255 xpv->xpv_pv = (char*)(xpv + 1);
256 xpv++;
257 }
258 xpv->xpv_pv = 0;
259 return new_xpv();
260}
261
262#ifdef PURIFY
263
264#define new_SV() sv = (SV*)malloc(sizeof(SV))
265#define del_SV(p) free((char*)p)
266
267#else
268
269#define new_SV() \
270 if (sv_root) { \
271 sv = sv_root; \
272 sv_root = (SV*)SvANY(sv); \
273 } \
274 else \
275 sv = more_sv();
276#define del_SV(p) del_sv(p)
277
278#endif
279
280#ifdef PURIFY
281#define new_XIV() (void*)malloc(sizeof(XPVIV))
282#define del_XIV(p) free((char*)p)
283#else
284#define new_XIV() new_xiv()
285#define del_XIV(p) del_xiv(p)
286#endif
287
288#ifdef PURIFY
289#define new_XNV() (void*)malloc(sizeof(XPVNV))
290#define del_XNV(p) free((char*)p)
291#else
292#define new_XNV() new_xnv()
293#define del_XNV(p) del_xnv(p)
294#endif
295
296#ifdef PURIFY
ed6116ce
LW
297#define new_XRV() (void*)malloc(sizeof(XRV))
298#define del_XRV(p) free((char*)p)
299#else
300#define new_XRV() new_xrv()
301#define del_XRV(p) del_xrv(p)
302#endif
303
304#ifdef PURIFY
463ee0b2
LW
305#define new_XPV() (void*)malloc(sizeof(XPV))
306#define del_XPV(p) free((char*)p)
307#else
308#define new_XPV() new_xpv()
309#define del_XPV(p) del_xpv(p)
310#endif
311
312#define new_XPVIV() (void*)malloc(sizeof(XPVIV))
313#define del_XPVIV(p) free((char*)p)
314
315#define new_XPVNV() (void*)malloc(sizeof(XPVNV))
316#define del_XPVNV(p) free((char*)p)
317
318#define new_XPVMG() (void*)malloc(sizeof(XPVMG))
319#define del_XPVMG(p) free((char*)p)
320
321#define new_XPVLV() (void*)malloc(sizeof(XPVLV))
322#define del_XPVLV(p) free((char*)p)
323
324#define new_XPVAV() (void*)malloc(sizeof(XPVAV))
325#define del_XPVAV(p) free((char*)p)
326
327#define new_XPVHV() (void*)malloc(sizeof(XPVHV))
328#define del_XPVHV(p) free((char*)p)
329
330#define new_XPVCV() (void*)malloc(sizeof(XPVCV))
331#define del_XPVCV(p) free((char*)p)
332
333#define new_XPVGV() (void*)malloc(sizeof(XPVGV))
334#define del_XPVGV(p) free((char*)p)
335
336#define new_XPVBM() (void*)malloc(sizeof(XPVBM))
337#define del_XPVBM(p) free((char*)p)
338
339#define new_XPVFM() (void*)malloc(sizeof(XPVFM))
340#define del_XPVFM(p) free((char*)p)
341
79072805
LW
342bool
343sv_upgrade(sv, mt)
344register SV* sv;
345U32 mt;
346{
347 char* pv;
348 U32 cur;
349 U32 len;
350 I32 iv;
351 double nv;
352 MAGIC* magic;
353 HV* stash;
354
355 if (SvTYPE(sv) == mt)
356 return TRUE;
357
358 switch (SvTYPE(sv)) {
359 case SVt_NULL:
360 pv = 0;
361 cur = 0;
362 len = 0;
363 iv = 0;
364 nv = 0.0;
365 magic = 0;
366 stash = 0;
367 break;
79072805
LW
368 case SVt_IV:
369 pv = 0;
370 cur = 0;
371 len = 0;
463ee0b2
LW
372 iv = SvIVX(sv);
373 nv = (double)SvIVX(sv);
79072805
LW
374 del_XIV(SvANY(sv));
375 magic = 0;
376 stash = 0;
ed6116ce 377 if (mt == SVt_NV)
463ee0b2 378 mt = SVt_PVNV;
ed6116ce
LW
379 else if (mt < SVt_PVIV)
380 mt = SVt_PVIV;
79072805
LW
381 break;
382 case SVt_NV:
383 pv = 0;
384 cur = 0;
385 len = 0;
463ee0b2 386 nv = SvNVX(sv);
ed6116ce 387 iv = I_32(nv);
79072805
LW
388 magic = 0;
389 stash = 0;
390 del_XNV(SvANY(sv));
391 SvANY(sv) = 0;
ed6116ce 392 if (mt < SVt_PVNV)
79072805
LW
393 mt = SVt_PVNV;
394 break;
ed6116ce
LW
395 case SVt_RV:
396 pv = (char*)SvRV(sv);
397 cur = 0;
398 len = 0;
399 iv = (I32)pv;
400 nv = (double)(unsigned long)pv;
401 del_XRV(SvANY(sv));
402 magic = 0;
403 stash = 0;
404 break;
79072805
LW
405 case SVt_PV:
406 nv = 0.0;
463ee0b2 407 pv = SvPVX(sv);
79072805
LW
408 cur = SvCUR(sv);
409 len = SvLEN(sv);
410 iv = 0;
411 nv = 0.0;
412 magic = 0;
413 stash = 0;
414 del_XPV(SvANY(sv));
415 break;
416 case SVt_PVIV:
417 nv = 0.0;
463ee0b2 418 pv = SvPVX(sv);
79072805
LW
419 cur = SvCUR(sv);
420 len = SvLEN(sv);
463ee0b2 421 iv = SvIVX(sv);
79072805
LW
422 nv = 0.0;
423 magic = 0;
424 stash = 0;
425 del_XPVIV(SvANY(sv));
426 break;
427 case SVt_PVNV:
463ee0b2
LW
428 nv = SvNVX(sv);
429 pv = SvPVX(sv);
79072805
LW
430 cur = SvCUR(sv);
431 len = SvLEN(sv);
463ee0b2
LW
432 iv = SvIVX(sv);
433 nv = SvNVX(sv);
79072805
LW
434 magic = 0;
435 stash = 0;
436 del_XPVNV(SvANY(sv));
437 break;
438 case SVt_PVMG:
463ee0b2 439 pv = SvPVX(sv);
79072805
LW
440 cur = SvCUR(sv);
441 len = SvLEN(sv);
463ee0b2
LW
442 iv = SvIVX(sv);
443 nv = SvNVX(sv);
79072805
LW
444 magic = SvMAGIC(sv);
445 stash = SvSTASH(sv);
446 del_XPVMG(SvANY(sv));
447 break;
448 default:
463ee0b2 449 croak("Can't upgrade that kind of scalar");
79072805
LW
450 }
451
452 switch (mt) {
453 case SVt_NULL:
463ee0b2 454 croak("Can't upgrade to undef");
79072805
LW
455 case SVt_IV:
456 SvANY(sv) = new_XIV();
463ee0b2 457 SvIVX(sv) = iv;
79072805
LW
458 break;
459 case SVt_NV:
460 SvANY(sv) = new_XNV();
463ee0b2 461 SvNVX(sv) = nv;
79072805 462 break;
ed6116ce
LW
463 case SVt_RV:
464 SvANY(sv) = new_XRV();
465 SvRV(sv) = (SV*)pv;
466 SvOK_on(sv);
467 break;
79072805
LW
468 case SVt_PV:
469 SvANY(sv) = new_XPV();
463ee0b2 470 SvPVX(sv) = pv;
79072805
LW
471 SvCUR(sv) = cur;
472 SvLEN(sv) = len;
473 break;
474 case SVt_PVIV:
475 SvANY(sv) = new_XPVIV();
463ee0b2 476 SvPVX(sv) = pv;
79072805
LW
477 SvCUR(sv) = cur;
478 SvLEN(sv) = len;
463ee0b2 479 SvIVX(sv) = iv;
79072805
LW
480 if (SvNIOK(sv))
481 SvIOK_on(sv);
482 SvNOK_off(sv);
483 break;
484 case SVt_PVNV:
485 SvANY(sv) = new_XPVNV();
463ee0b2 486 SvPVX(sv) = pv;
79072805
LW
487 SvCUR(sv) = cur;
488 SvLEN(sv) = len;
463ee0b2
LW
489 SvIVX(sv) = iv;
490 SvNVX(sv) = nv;
79072805
LW
491 break;
492 case SVt_PVMG:
493 SvANY(sv) = new_XPVMG();
463ee0b2 494 SvPVX(sv) = pv;
79072805
LW
495 SvCUR(sv) = cur;
496 SvLEN(sv) = len;
463ee0b2
LW
497 SvIVX(sv) = iv;
498 SvNVX(sv) = nv;
79072805
LW
499 SvMAGIC(sv) = magic;
500 SvSTASH(sv) = stash;
501 break;
502 case SVt_PVLV:
503 SvANY(sv) = new_XPVLV();
463ee0b2 504 SvPVX(sv) = pv;
79072805
LW
505 SvCUR(sv) = cur;
506 SvLEN(sv) = len;
463ee0b2
LW
507 SvIVX(sv) = iv;
508 SvNVX(sv) = nv;
79072805
LW
509 SvMAGIC(sv) = magic;
510 SvSTASH(sv) = stash;
511 LvTARGOFF(sv) = 0;
512 LvTARGLEN(sv) = 0;
513 LvTARG(sv) = 0;
514 LvTYPE(sv) = 0;
515 break;
516 case SVt_PVAV:
517 SvANY(sv) = new_XPVAV();
463ee0b2
LW
518 if (pv)
519 Safefree(pv);
79072805 520 AvARRAY(sv) = 0;
79072805
LW
521 AvMAX(sv) = 0;
522 AvFILL(sv) = 0;
463ee0b2
LW
523 SvIVX(sv) = 0;
524 SvNVX(sv) = 0.0;
525 SvMAGIC(sv) = magic;
526 SvSTASH(sv) = stash;
527 AvALLOC(sv) = 0;
79072805
LW
528 AvARYLEN(sv) = 0;
529 AvFLAGS(sv) = 0;
530 break;
531 case SVt_PVHV:
532 SvANY(sv) = new_XPVHV();
463ee0b2
LW
533 if (pv)
534 Safefree(pv);
535 SvPVX(sv) = 0;
536 HvFILL(sv) = 0;
537 HvMAX(sv) = 0;
538 HvKEYS(sv) = 0;
539 SvNVX(sv) = 0.0;
79072805
LW
540 SvMAGIC(sv) = magic;
541 SvSTASH(sv) = stash;
79072805
LW
542 HvRITER(sv) = 0;
543 HvEITER(sv) = 0;
544 HvPMROOT(sv) = 0;
545 HvNAME(sv) = 0;
79072805
LW
546 break;
547 case SVt_PVCV:
548 SvANY(sv) = new_XPVCV();
463ee0b2 549 SvPVX(sv) = pv;
79072805
LW
550 SvCUR(sv) = cur;
551 SvLEN(sv) = len;
463ee0b2
LW
552 SvIVX(sv) = iv;
553 SvNVX(sv) = nv;
79072805
LW
554 SvMAGIC(sv) = magic;
555 SvSTASH(sv) = stash;
556 CvSTASH(sv) = 0;
557 CvSTART(sv) = 0;
558 CvROOT(sv) = 0;
559 CvUSERSUB(sv) = 0;
560 CvUSERINDEX(sv) = 0;
561 CvFILEGV(sv) = 0;
562 CvDEPTH(sv) = 0;
563 CvPADLIST(sv) = 0;
564 CvDELETED(sv) = 0;
565 break;
566 case SVt_PVGV:
567 SvANY(sv) = new_XPVGV();
463ee0b2 568 SvPVX(sv) = pv;
79072805
LW
569 SvCUR(sv) = cur;
570 SvLEN(sv) = len;
463ee0b2
LW
571 SvIVX(sv) = iv;
572 SvNVX(sv) = nv;
79072805
LW
573 SvMAGIC(sv) = magic;
574 SvSTASH(sv) = stash;
93a17b20 575 GvGP(sv) = 0;
79072805
LW
576 GvNAME(sv) = 0;
577 GvNAMELEN(sv) = 0;
578 GvSTASH(sv) = 0;
579 break;
580 case SVt_PVBM:
581 SvANY(sv) = new_XPVBM();
463ee0b2 582 SvPVX(sv) = pv;
79072805
LW
583 SvCUR(sv) = cur;
584 SvLEN(sv) = len;
463ee0b2
LW
585 SvIVX(sv) = iv;
586 SvNVX(sv) = nv;
79072805
LW
587 SvMAGIC(sv) = magic;
588 SvSTASH(sv) = stash;
589 BmRARE(sv) = 0;
590 BmUSEFUL(sv) = 0;
591 BmPREVIOUS(sv) = 0;
592 break;
593 case SVt_PVFM:
594 SvANY(sv) = new_XPVFM();
463ee0b2 595 SvPVX(sv) = pv;
79072805
LW
596 SvCUR(sv) = cur;
597 SvLEN(sv) = len;
463ee0b2
LW
598 SvIVX(sv) = iv;
599 SvNVX(sv) = nv;
79072805
LW
600 SvMAGIC(sv) = magic;
601 SvSTASH(sv) = stash;
602 FmLINES(sv) = 0;
603 break;
604 }
605 SvTYPE(sv) = mt;
606 return TRUE;
607}
608
609char *
610sv_peek(sv)
611register SV *sv;
612{
613 char *t = tokenbuf;
614 *t = '\0';
615
616 retry:
617 if (!sv) {
618 strcpy(t, "VOID");
619 return tokenbuf;
620 }
621 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
622 strcpy(t, "WILD");
623 return tokenbuf;
624 }
625 else if (SvREFCNT(sv) == 0 && !SvREADONLY(sv)) {
626 strcpy(t, "UNREF");
627 return tokenbuf;
628 }
629 else {
630 switch (SvTYPE(sv)) {
631 default:
632 strcpy(t,"FREED");
633 return tokenbuf;
634 break;
635
636 case SVt_NULL:
93a17b20
LW
637 strcpy(t,"UNDEF");
638 return tokenbuf;
79072805
LW
639 case SVt_IV:
640 strcpy(t,"IV");
641 break;
642 case SVt_NV:
643 strcpy(t,"NV");
644 break;
ed6116ce
LW
645 case SVt_RV:
646 *t++ = '\\';
647 if (t - tokenbuf > 10) {
648 strcpy(tokenbuf + 3,"...");
649 return tokenbuf;
650 }
651 sv = (SV*)SvRV(sv);
652 goto retry;
79072805
LW
653 case SVt_PV:
654 strcpy(t,"PV");
655 break;
656 case SVt_PVIV:
657 strcpy(t,"PVIV");
658 break;
659 case SVt_PVNV:
660 strcpy(t,"PVNV");
661 break;
662 case SVt_PVMG:
663 strcpy(t,"PVMG");
664 break;
665 case SVt_PVLV:
666 strcpy(t,"PVLV");
667 break;
668 case SVt_PVAV:
669 strcpy(t,"AV");
670 break;
671 case SVt_PVHV:
672 strcpy(t,"HV");
673 break;
674 case SVt_PVCV:
675 strcpy(t,"CV");
676 break;
677 case SVt_PVGV:
678 strcpy(t,"GV");
679 break;
680 case SVt_PVBM:
681 strcpy(t,"BM");
682 break;
683 case SVt_PVFM:
684 strcpy(t,"FM");
685 break;
686 }
687 }
688 t += strlen(t);
689
690 if (SvPOK(sv)) {
463ee0b2 691 if (!SvPVX(sv))
79072805
LW
692 return "(null)";
693 if (SvOOK(sv))
463ee0b2 694 sprintf(t,"(%d+\"%0.127s\")",SvIVX(sv),SvPVX(sv));
79072805 695 else
463ee0b2 696 sprintf(t,"(\"%0.127s\")",SvPVX(sv));
79072805
LW
697 }
698 else if (SvNOK(sv))
463ee0b2 699 sprintf(t,"(%g)",SvNVX(sv));
79072805 700 else if (SvIOK(sv))
463ee0b2 701 sprintf(t,"(%ld)",(long)SvIVX(sv));
79072805
LW
702 else
703 strcpy(t,"()");
704 return tokenbuf;
705}
706
707int
708sv_backoff(sv)
709register SV *sv;
710{
711 assert(SvOOK(sv));
463ee0b2
LW
712 if (SvIVX(sv)) {
713 char *s = SvPVX(sv);
714 SvLEN(sv) += SvIVX(sv);
715 SvPVX(sv) -= SvIVX(sv);
79072805 716 SvIV_set(sv, 0);
463ee0b2 717 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
79072805
LW
718 }
719 SvFLAGS(sv) &= ~SVf_OOK;
720}
721
722char *
723sv_grow(sv,newlen)
724register SV *sv;
725#ifndef DOSISH
726register I32 newlen;
727#else
728unsigned long newlen;
729#endif
730{
731 register char *s;
732
733#ifdef MSDOS
734 if (newlen >= 0x10000) {
735 fprintf(stderr, "Allocation too large: %lx\n", newlen);
736 my_exit(1);
737 }
738#endif /* MSDOS */
ed6116ce
LW
739 if (SvTHINKFIRST(sv)) {
740 if (SvREADONLY(sv))
741 croak(no_modify);
742 if (SvROK(sv))
743 sv_unref(sv);
744 }
79072805
LW
745 if (SvTYPE(sv) < SVt_PV) {
746 sv_upgrade(sv, SVt_PV);
463ee0b2 747 s = SvPVX(sv);
79072805
LW
748 }
749 else if (SvOOK(sv)) { /* pv is offset? */
750 sv_backoff(sv);
463ee0b2 751 s = SvPVX(sv);
79072805
LW
752 if (newlen > SvLEN(sv))
753 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
754 }
755 else
463ee0b2 756 s = SvPVX(sv);
79072805
LW
757 if (newlen > SvLEN(sv)) { /* need more room? */
758 if (SvLEN(sv))
759 Renew(s,newlen,char);
760 else
761 New(703,s,newlen,char);
762 SvPV_set(sv, s);
763 SvLEN_set(sv, newlen);
764 }
765 return s;
766}
767
768void
769sv_setiv(sv,i)
770register SV *sv;
771I32 i;
772{
ed6116ce
LW
773 if (SvTHINKFIRST(sv)) {
774 if (SvREADONLY(sv))
775 croak(no_modify);
776 if (SvROK(sv))
777 sv_unref(sv);
778 }
463ee0b2
LW
779 switch (SvTYPE(sv)) {
780 case SVt_NULL:
79072805 781 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
782 break;
783 case SVt_NV:
784 sv_upgrade(sv, SVt_PVNV);
785 break;
ed6116ce 786 case SVt_RV:
463ee0b2 787 case SVt_PV:
79072805 788 sv_upgrade(sv, SVt_PVIV);
463ee0b2
LW
789 break;
790 }
791 SvIVX(sv) = i;
79072805 792 SvIOK_only(sv); /* validate number */
463ee0b2 793 SvTAINT(sv);
79072805
LW
794}
795
796void
797sv_setnv(sv,num)
798register SV *sv;
799double num;
800{
ed6116ce
LW
801 if (SvTHINKFIRST(sv)) {
802 if (SvREADONLY(sv))
803 croak(no_modify);
804 if (SvROK(sv))
805 sv_unref(sv);
806 }
79072805
LW
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)) {
812 SvOOK_off(sv);
813 }
463ee0b2 814 SvNVX(sv) = num;
79072805 815 SvNOK_only(sv); /* validate number */
463ee0b2 816 SvTAINT(sv);
79072805
LW
817}
818
819I32
820sv_2iv(sv)
821register SV *sv;
822{
823 if (!sv)
824 return 0;
463ee0b2
LW
825 if (SvMAGICAL(sv)) {
826 mg_get(sv);
827 if (SvIOKp(sv))
828 return SvIVX(sv);
829 if (SvNOKp(sv))
830 return (I32)SvNVX(sv);
831 if (SvPOKp(sv) && SvLEN(sv))
832 return (I32)atol(SvPVX(sv));
833 return 0;
834 }
ed6116ce
LW
835 if (SvTHINKFIRST(sv)) {
836 if (SvROK(sv))
837 return (I32)SvRV(sv);
838 if (SvREADONLY(sv)) {
839 if (SvNOK(sv))
840 return (I32)SvNVX(sv);
841 if (SvPOK(sv) && SvLEN(sv))
842 return (I32)atol(SvPVX(sv));
843 if (dowarn)
844 warn("Use of uninitialized variable");
845 return 0;
846 }
79072805 847 }
463ee0b2 848 switch (SvTYPE(sv)) {
463ee0b2 849 case SVt_NULL:
79072805 850 sv_upgrade(sv, SVt_IV);
463ee0b2
LW
851 return SvIVX(sv);
852 case SVt_PV:
79072805 853 sv_upgrade(sv, SVt_PVIV);
463ee0b2
LW
854 break;
855 case SVt_NV:
856 sv_upgrade(sv, SVt_PVNV);
857 break;
858 }
79072805 859 if (SvNOK(sv))
463ee0b2 860 SvIVX(sv) = (I32)SvNVX(sv);
93a17b20
LW
861 else if (SvPOK(sv) && SvLEN(sv)) {
862 if (dowarn && !looks_like_number(sv)) {
863 if (op)
864 warn("Argument wasn't numeric for \"%s\"",op_name[op->op_type]);
865 else
866 warn("Argument wasn't numeric");
867 }
463ee0b2 868 SvIVX(sv) = (I32)atol(SvPVX(sv));
93a17b20 869 }
79072805
LW
870 else {
871 if (dowarn)
872 warn("Use of uninitialized variable");
873 SvUPGRADE(sv, SVt_IV);
463ee0b2 874 SvIVX(sv) = 0;
79072805
LW
875 }
876 SvIOK_on(sv);
463ee0b2
LW
877 DEBUG_c((stderr,"0x%lx 2iv(%d)\n",sv,SvIVX(sv)));
878 return SvIVX(sv);
79072805
LW
879}
880
881double
882sv_2nv(sv)
883register SV *sv;
884{
885 if (!sv)
886 return 0.0;
463ee0b2
LW
887 if (SvMAGICAL(sv)) {
888 mg_get(sv);
889 if (SvNOKp(sv))
890 return SvNVX(sv);
891 if (SvPOKp(sv) && SvLEN(sv))
892 return atof(SvPVX(sv));
893 if (SvIOKp(sv))
894 return (double)SvIVX(sv);
895 return 0;
896 }
ed6116ce
LW
897 if (SvTHINKFIRST(sv)) {
898 if (SvROK(sv))
899 return (double)(unsigned long)SvRV(sv);
900 if (SvREADONLY(sv)) {
901 if (SvPOK(sv) && SvLEN(sv))
902 return atof(SvPVX(sv));
903 if (dowarn)
904 warn("Use of uninitialized variable");
905 return 0.0;
906 }
79072805
LW
907 }
908 if (SvTYPE(sv) < SVt_NV) {
463ee0b2
LW
909 if (SvTYPE(sv) == SVt_IV)
910 sv_upgrade(sv, SVt_PVNV);
911 else
912 sv_upgrade(sv, SVt_NV);
913 DEBUG_c((stderr,"0x%lx num(%g)\n",sv,SvNVX(sv)));
914 return SvNVX(sv);
79072805
LW
915 }
916 else if (SvTYPE(sv) < SVt_PVNV)
917 sv_upgrade(sv, SVt_PVNV);
93a17b20 918 if (SvIOK(sv) &&
463ee0b2 919 (!SvPOK(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
93a17b20 920 {
463ee0b2 921 SvNVX(sv) = (double)SvIVX(sv);
93a17b20
LW
922 }
923 else if (SvPOK(sv) && SvLEN(sv)) {
924 if (dowarn && !SvIOK(sv) && !looks_like_number(sv)) {
925 if (op)
926 warn("Argument wasn't numeric for \"%s\"",op_name[op->op_type]);
927 else
928 warn("Argument wasn't numeric");
929 }
463ee0b2 930 SvNVX(sv) = atof(SvPVX(sv));
93a17b20 931 }
79072805
LW
932 else {
933 if (dowarn)
934 warn("Use of uninitialized variable");
463ee0b2 935 SvNVX(sv) = 0.0;
79072805
LW
936 }
937 SvNOK_on(sv);
463ee0b2
LW
938 DEBUG_c((stderr,"0x%lx 2nv(%g)\n",sv,SvNVX(sv)));
939 return SvNVX(sv);
79072805
LW
940}
941
942char *
463ee0b2 943sv_2pv(sv, lp)
79072805 944register SV *sv;
463ee0b2 945STRLEN *lp;
79072805
LW
946{
947 register char *s;
948 int olderrno;
949
463ee0b2
LW
950 if (!sv) {
951 *lp = 0;
952 return "";
953 }
954 if (SvMAGICAL(sv)) {
955 mg_get(sv);
956 if (SvPOKp(sv)) {
957 *lp = SvCUR(sv);
958 return SvPVX(sv);
959 }
960 if (SvIOKp(sv)) {
961 (void)sprintf(tokenbuf,"%ld",SvIVX(sv));
962 *lp = strlen(tokenbuf);
963 return tokenbuf;
964 }
965 if (SvNOKp(sv)) {
966 (void)sprintf(tokenbuf,"%.20g",SvNVX(sv));
967 *lp = strlen(tokenbuf);
968 return tokenbuf;
969 }
970 *lp = 0;
79072805 971 return "";
463ee0b2 972 }
ed6116ce
LW
973 if (SvTHINKFIRST(sv)) {
974 if (SvROK(sv)) {
975 sv = (SV*)SvRV(sv);
976 if (!sv)
977 s = "NULLREF";
978 else {
979 switch (SvTYPE(sv)) {
980 case SVt_NULL:
981 case SVt_IV:
982 case SVt_NV:
983 case SVt_RV:
984 case SVt_PV:
985 case SVt_PVIV:
986 case SVt_PVNV:
987 case SVt_PVBM:
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;
996 }
997 if (SvOBJECT(sv))
998 sprintf(tokenbuf, "%s=%s(0x%lx)",
999 HvNAME(SvSTASH(sv)), s, (unsigned long)sv);
1000 else
1001 sprintf(tokenbuf, "%s(0x%lx)", s, (unsigned long)sv);
1002 s = tokenbuf;
463ee0b2 1003 }
ed6116ce
LW
1004 *lp = strlen(s);
1005 return s;
79072805 1006 }
ed6116ce
LW
1007 if (SvREADONLY(sv)) {
1008 if (SvIOK(sv)) {
1009 (void)sprintf(tokenbuf,"%ld",SvIVX(sv));
1010 *lp = strlen(tokenbuf);
1011 return tokenbuf;
1012 }
1013 if (SvNOK(sv)) {
1014 (void)sprintf(tokenbuf,"%.20g",SvNVX(sv));
1015 *lp = strlen(tokenbuf);
1016 return tokenbuf;
1017 }
1018 if (dowarn)
1019 warn("Use of uninitialized variable");
1020 *lp = 0;
1021 return "";
79072805 1022 }
79072805
LW
1023 }
1024 if (!SvUPGRADE(sv, SVt_PV))
1025 return 0;
1026 if (SvNOK(sv)) {
1027 if (SvTYPE(sv) < SVt_PVNV)
1028 sv_upgrade(sv, SVt_PVNV);
1029 SvGROW(sv, 28);
463ee0b2 1030 s = SvPVX(sv);
79072805
LW
1031 olderrno = errno; /* some Xenix systems wipe out errno here */
1032#if defined(scs) && defined(ns32000)
463ee0b2 1033 gcvt(SvNVX(sv),20,s);
79072805
LW
1034#else
1035#ifdef apollo
463ee0b2 1036 if (SvNVX(sv) == 0.0)
79072805
LW
1037 (void)strcpy(s,"0");
1038 else
1039#endif /*apollo*/
463ee0b2 1040 (void)sprintf(s,"%.20g",SvNVX(sv));
79072805
LW
1041#endif /*scs*/
1042 errno = olderrno;
1043 while (*s) s++;
1044#ifdef hcx
1045 if (s[-1] == '.')
1046 s--;
1047#endif
1048 }
1049 else if (SvIOK(sv)) {
1050 if (SvTYPE(sv) < SVt_PVIV)
1051 sv_upgrade(sv, SVt_PVIV);
1052 SvGROW(sv, 11);
463ee0b2 1053 s = SvPVX(sv);
79072805 1054 olderrno = errno; /* some Xenix systems wipe out errno here */
463ee0b2 1055 (void)sprintf(s,"%ld",SvIVX(sv));
79072805
LW
1056 errno = olderrno;
1057 while (*s) s++;
1058 }
1059 else {
1060 if (dowarn)
1061 warn("Use of uninitialized variable");
1062 sv_grow(sv, 1);
463ee0b2 1063 s = SvPVX(sv);
79072805
LW
1064 }
1065 *s = '\0';
463ee0b2
LW
1066 *lp = s - SvPVX(sv);
1067 SvCUR_set(sv, *lp);
79072805 1068 SvPOK_on(sv);
463ee0b2
LW
1069 DEBUG_c((stderr,"0x%lx 2pv(%s)\n",sv,SvPVX(sv)));
1070 return SvPVX(sv);
1071}
1072
1073/* This function is only called on magical items */
1074bool
1075sv_2bool(sv)
1076register SV *sv;
1077{
1078 if (SvMAGICAL(sv))
1079 mg_get(sv);
1080
ed6116ce
LW
1081 if (SvROK(sv))
1082 return SvRV(sv) != 0;
463ee0b2
LW
1083 if (SvPOKp(sv)) {
1084 register XPV* Xpv;
1085 if ((Xpv = (XPV*)SvANY(sv)) &&
1086 (*Xpv->xpv_pv > '0' ||
1087 Xpv->xpv_cur > 1 ||
1088 (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
1089 return 1;
1090 else
1091 return 0;
1092 }
1093 else {
1094 if (SvIOKp(sv))
1095 return SvIVX(sv) != 0;
1096 else {
1097 if (SvNOKp(sv))
1098 return SvNVX(sv) != 0.0;
1099 else
1100 return FALSE;
1101 }
1102 }
79072805
LW
1103}
1104
1105/* Note: sv_setsv() should not be called with a source string that needs
463ee0b2 1106 * to be reused, since it may destroy the source string if it is marked
79072805
LW
1107 * as temporary.
1108 */
1109
1110void
1111sv_setsv(dstr,sstr)
1112SV *dstr;
1113register SV *sstr;
1114{
463ee0b2
LW
1115 int flags;
1116
79072805
LW
1117 if (sstr == dstr)
1118 return;
ed6116ce
LW
1119 if (SvTHINKFIRST(dstr)) {
1120 if (SvREADONLY(dstr))
1121 croak(no_modify);
1122 if (SvROK(dstr))
1123 sv_unref(dstr);
1124 }
79072805
LW
1125 if (!sstr)
1126 sstr = &sv_undef;
1127
463ee0b2 1128 /* There's a lot of redundancy below but we're going for speed here */
79072805
LW
1129
1130 switch (SvTYPE(sstr)) {
1131 case SVt_NULL:
ed6116ce 1132 SvOK_off(dstr);
79072805 1133 return;
463ee0b2
LW
1134 case SVt_IV:
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);
1142 break;
1143 case SVt_NV:
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);
1151 break;
ed6116ce
LW
1152 case SVt_RV:
1153 if (SvTYPE(dstr) < SVt_RV)
1154 sv_upgrade(dstr, SVt_RV);
1155 flags = SvFLAGS(sstr);
1156 break;
463ee0b2
LW
1157 case SVt_PV:
1158 if (SvTYPE(dstr) < SVt_PV)
1159 sv_upgrade(dstr, SVt_PV);
1160 flags = SvFLAGS(sstr);
1161 break;
1162 case SVt_PVIV:
1163 if (SvTYPE(dstr) < SVt_PVIV)
1164 sv_upgrade(dstr, SVt_PVIV);
1165 flags = SvFLAGS(sstr);
1166 break;
1167 case SVt_PVNV:
1168 if (SvTYPE(dstr) < SVt_PVNV)
1169 sv_upgrade(dstr, SVt_PVNV);
1170 flags = SvFLAGS(sstr);
1171 break;
79072805 1172 case SVt_PVGV:
463ee0b2
LW
1173 if (SvTYPE(dstr) <= SVt_PVGV) {
1174 if (SvTYPE(dstr) < SVt_PVGV)
1175 sv_upgrade(dstr, SVt_PVGV);
79072805
LW
1176 SvOK_off(dstr);
1177 if (!GvAV(sstr))
1178 gv_AVadd(sstr);
1179 if (!GvHV(sstr))
1180 gv_HVadd(sstr);
1181 if (!GvIO(sstr))
1182 GvIO(sstr) = newIO();
1183 if (GvGP(dstr))
1184 gp_free(dstr);
1185 GvGP(dstr) = gp_ref(GvGP(sstr));
463ee0b2 1186 SvTAINT(sstr);
79072805
LW
1187 return;
1188 }
1189 /* FALL THROUGH */
1190
1191 default:
463ee0b2
LW
1192 if (SvTYPE(dstr) < SvTYPE(sstr))
1193 sv_upgrade(dstr, SvTYPE(sstr));
1194 if (SvMAGICAL(sstr)) {
79072805 1195 mg_get(sstr);
463ee0b2
LW
1196 flags = SvPRIVATE(sstr);
1197 }
1198 else
1199 flags = SvFLAGS(sstr);
79072805
LW
1200 }
1201
463ee0b2 1202 SvPRIVATE(dstr) = SvPRIVATE(sstr) & ~(SVf_IOK|SVf_POK|SVf_NOK);
79072805 1203
ed6116ce
LW
1204 if (SvROK(sstr)) {
1205 SvOK_off(dstr);
1206 if (SvTYPE(dstr) >= SVt_PV && SvPVX(dstr))
1207 Safefree(SvPVX(dstr));
1208 SvRV(dstr) = sv_ref(SvRV(sstr));
1209 SvROK_on(dstr);
1210 if (flags & SVf_NOK) {
1211 SvNOK_on(dstr);
1212 SvNVX(dstr) = SvNVX(sstr);
1213 }
1214 if (flags & SVf_IOK) {
1215 SvIOK_on(dstr);
1216 SvIVX(dstr) = SvIVX(sstr);
1217 }
1218 }
1219 else if (flags & SVf_POK) {
79072805
LW
1220
1221 /*
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.
463ee0b2
LW
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.
79072805
LW
1226 */
1227
1228 if (SvTEMP(sstr)) { /* slated for free anyway? */
1229 if (SvPOK(dstr)) {
1230 SvOOK_off(dstr);
463ee0b2 1231 Safefree(SvPVX(dstr));
79072805 1232 }
463ee0b2 1233 SvPV_set(dstr, SvPVX(sstr));
79072805
LW
1234 SvLEN_set(dstr, SvLEN(sstr));
1235 SvCUR_set(dstr, SvCUR(sstr));
79072805
LW
1236 SvPOK_only(dstr);
1237 SvTEMP_off(dstr);
1238 SvPV_set(sstr, Nullch);
1239 SvLEN_set(sstr, 0);
1240 SvPOK_off(sstr); /* wipe out any weird flags */
463ee0b2 1241 SvPVX(sstr) = 0; /* so sstr frees uneventfully */
79072805
LW
1242 }
1243 else { /* have to copy actual string */
463ee0b2 1244 if (SvPVX(dstr)) { /* XXX ck type */
79072805
LW
1245 SvOOK_off(dstr);
1246 }
463ee0b2 1247 sv_setpvn(dstr,SvPVX(sstr),SvCUR(sstr));
79072805
LW
1248 }
1249 /*SUPPRESS 560*/
463ee0b2 1250 if (flags & SVf_NOK) {
79072805 1251 SvNOK_on(dstr);
463ee0b2 1252 SvNVX(dstr) = SvNVX(sstr);
79072805 1253 }
463ee0b2 1254 if (flags & SVf_IOK) {
79072805 1255 SvIOK_on(dstr);
463ee0b2 1256 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
1257 }
1258 }
463ee0b2
LW
1259 else if (flags & SVf_NOK) {
1260 SvNVX(dstr) = SvNVX(sstr);
79072805
LW
1261 SvNOK_only(dstr);
1262 if (SvIOK(sstr)) {
1263 SvIOK_on(dstr);
463ee0b2 1264 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
1265 }
1266 }
463ee0b2 1267 else if (flags & SVf_IOK) {
79072805 1268 SvIOK_only(dstr);
463ee0b2 1269 SvIVX(dstr) = SvIVX(sstr);
79072805
LW
1270 }
1271 else {
79072805
LW
1272 SvOK_off(dstr);
1273 }
463ee0b2 1274 SvTAINT(dstr);
79072805
LW
1275}
1276
1277void
1278sv_setpvn(sv,ptr,len)
1279register SV *sv;
1280register char *ptr;
1281register STRLEN len;
1282{
ed6116ce
LW
1283 if (SvTHINKFIRST(sv)) {
1284 if (SvREADONLY(sv))
1285 croak(no_modify);
1286 if (SvROK(sv))
1287 sv_unref(sv);
1288 }
463ee0b2
LW
1289 if (!ptr) {
1290 SvOK_off(sv);
1291 return;
1292 }
79072805
LW
1293 if (!SvUPGRADE(sv, SVt_PV))
1294 return;
1295 SvGROW(sv, len + 1);
1296 if (ptr)
463ee0b2 1297 Move(ptr,SvPVX(sv),len,char);
79072805
LW
1298 SvCUR_set(sv, len);
1299 *SvEND(sv) = '\0';
1300 SvPOK_only(sv); /* validate pointer */
463ee0b2 1301 SvTAINT(sv);
79072805
LW
1302}
1303
1304void
1305sv_setpv(sv,ptr)
1306register SV *sv;
1307register char *ptr;
1308{
1309 register STRLEN len;
1310
ed6116ce
LW
1311 if (SvTHINKFIRST(sv)) {
1312 if (SvREADONLY(sv))
1313 croak(no_modify);
1314 if (SvROK(sv))
1315 sv_unref(sv);
1316 }
463ee0b2
LW
1317 if (!ptr) {
1318 SvOK_off(sv);
1319 return;
1320 }
79072805
LW
1321 len = strlen(ptr);
1322 if (!SvUPGRADE(sv, SVt_PV))
1323 return;
1324 SvGROW(sv, len + 1);
463ee0b2 1325 Move(ptr,SvPVX(sv),len+1,char);
79072805
LW
1326 SvCUR_set(sv, len);
1327 SvPOK_only(sv); /* validate pointer */
463ee0b2
LW
1328 SvTAINT(sv);
1329}
1330
1331void
1332sv_usepvn(sv,ptr,len)
1333register SV *sv;
1334register char *ptr;
1335register STRLEN len;
1336{
ed6116ce
LW
1337 if (SvTHINKFIRST(sv)) {
1338 if (SvREADONLY(sv))
1339 croak(no_modify);
1340 if (SvROK(sv))
1341 sv_unref(sv);
1342 }
463ee0b2
LW
1343 if (!SvUPGRADE(sv, SVt_PV))
1344 return;
1345 if (!ptr) {
1346 SvOK_off(sv);
1347 return;
1348 }
1349 if (SvPVX(sv))
1350 Safefree(SvPVX(sv));
1351 Renew(ptr, len+1, char);
1352 SvPVX(sv) = ptr;
1353 SvCUR_set(sv, len);
1354 SvLEN_set(sv, len+1);
1355 *SvEND(sv) = '\0';
1356 SvPOK_only(sv); /* validate pointer */
1357 SvTAINT(sv);
79072805
LW
1358}
1359
1360void
1361sv_chop(sv,ptr) /* like set but assuming ptr is in sv */
1362register SV *sv;
1363register char *ptr;
1364{
1365 register STRLEN delta;
1366
1367 if (!ptr || !SvPOK(sv))
1368 return;
ed6116ce
LW
1369 if (SvTHINKFIRST(sv)) {
1370 if (SvREADONLY(sv))
1371 croak(no_modify);
1372 if (SvROK(sv))
1373 sv_unref(sv);
1374 }
79072805
LW
1375 if (SvTYPE(sv) < SVt_PVIV)
1376 sv_upgrade(sv,SVt_PVIV);
1377
1378 if (!SvOOK(sv)) {
463ee0b2 1379 SvIVX(sv) = 0;
79072805
LW
1380 SvFLAGS(sv) |= SVf_OOK;
1381 }
1382 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
463ee0b2 1383 delta = ptr - SvPVX(sv);
79072805
LW
1384 SvLEN(sv) -= delta;
1385 SvCUR(sv) -= delta;
463ee0b2
LW
1386 SvPVX(sv) += delta;
1387 SvIVX(sv) += delta;
79072805
LW
1388}
1389
1390void
1391sv_catpvn(sv,ptr,len)
1392register SV *sv;
1393register char *ptr;
1394register STRLEN len;
1395{
463ee0b2
LW
1396 STRLEN tlen;
1397 char *s;
ed6116ce
LW
1398 if (SvTHINKFIRST(sv)) {
1399 if (SvREADONLY(sv))
1400 croak(no_modify);
1401 if (SvROK(sv))
1402 sv_unref(sv);
1403 }
463ee0b2
LW
1404 s = SvPV(sv, tlen);
1405 SvGROW(sv, tlen + len + 1);
1406 Move(ptr,SvPVX(sv)+tlen,len,char);
79072805
LW
1407 SvCUR(sv) += len;
1408 *SvEND(sv) = '\0';
1409 SvPOK_only(sv); /* validate pointer */
463ee0b2 1410 SvTAINT(sv);
79072805
LW
1411}
1412
1413void
1414sv_catsv(dstr,sstr)
1415SV *dstr;
1416register SV *sstr;
1417{
1418 char *s;
463ee0b2 1419 STRLEN len;
79072805
LW
1420 if (!sstr)
1421 return;
463ee0b2
LW
1422 if (s = SvPV(sstr, len))
1423 sv_catpvn(dstr,s,len);
79072805
LW
1424}
1425
1426void
1427sv_catpv(sv,ptr)
1428register SV *sv;
1429register char *ptr;
1430{
1431 register STRLEN len;
463ee0b2
LW
1432 STRLEN tlen;
1433 char *s;
79072805 1434
ed6116ce
LW
1435 if (SvTHINKFIRST(sv)) {
1436 if (SvREADONLY(sv))
1437 croak(no_modify);
1438 if (SvROK(sv))
1439 sv_unref(sv);
1440 }
79072805
LW
1441 if (!ptr)
1442 return;
463ee0b2 1443 s = SvPV(sv, tlen);
79072805 1444 len = strlen(ptr);
463ee0b2
LW
1445 SvGROW(sv, tlen + len + 1);
1446 Move(ptr,SvPVX(sv)+tlen,len+1,char);
79072805
LW
1447 SvCUR(sv) += len;
1448 SvPOK_only(sv); /* validate pointer */
463ee0b2 1449 SvTAINT(sv);
79072805
LW
1450}
1451
79072805
LW
1452SV *
1453#ifdef LEAKTEST
1454newSV(x,len)
1455I32 x;
1456#else
1457newSV(len)
1458#endif
1459STRLEN len;
1460{
1461 register SV *sv;
1462
463ee0b2 1463 new_SV();
79072805
LW
1464 Zero(sv, 1, SV);
1465 SvREFCNT(sv)++;
1466 if (len) {
1467 sv_upgrade(sv, SVt_PV);
1468 SvGROW(sv, len + 1);
1469 }
1470 return sv;
1471}
1472
1473void
1474sv_magic(sv, obj, how, name, namlen)
1475register SV *sv;
1476SV *obj;
1477char how;
1478char *name;
463ee0b2 1479I32 namlen;
79072805
LW
1480{
1481 MAGIC* mg;
1482
ed6116ce
LW
1483 if (SvTHINKFIRST(sv)) {
1484 if (SvREADONLY(sv))
1485 croak(no_modify);
1486 }
463ee0b2
LW
1487 if (SvMAGICAL(sv)) {
1488 if (SvMAGIC(sv) && mg_find(sv, how))
1489 return;
1490 }
1491 else {
1492 if (!SvUPGRADE(sv, SVt_PVMG))
1493 return;
1494 SvMAGICAL_on(sv);
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);
1498 }
79072805
LW
1499 Newz(702,mg, 1, MAGIC);
1500 mg->mg_moremagic = SvMAGIC(sv);
463ee0b2 1501
79072805 1502 SvMAGIC(sv) = mg;
463ee0b2 1503 mg->mg_obj = sv_ref(obj);
79072805 1504 mg->mg_type = how;
463ee0b2
LW
1505 mg->mg_len = namlen;
1506 if (name && namlen >= 0)
79072805 1507 mg->mg_ptr = nsavestr(name, namlen);
79072805
LW
1508 switch (how) {
1509 case 0:
1510 mg->mg_virtual = &vtbl_sv;
1511 break;
1512 case 'B':
1513 mg->mg_virtual = &vtbl_bm;
1514 break;
79072805
LW
1515 case 'E':
1516 mg->mg_virtual = &vtbl_env;
1517 break;
1518 case 'e':
1519 mg->mg_virtual = &vtbl_envelem;
1520 break;
93a17b20
LW
1521 case 'g':
1522 mg->mg_virtual = &vtbl_mglob;
1523 break;
463ee0b2
LW
1524 case 'I':
1525 mg->mg_virtual = &vtbl_isa;
1526 break;
1527 case 'i':
1528 mg->mg_virtual = &vtbl_isaelem;
1529 break;
79072805 1530 case 'L':
93a17b20
LW
1531 mg->mg_virtual = 0;
1532 break;
1533 case 'l':
79072805
LW
1534 mg->mg_virtual = &vtbl_dbline;
1535 break;
463ee0b2
LW
1536 case 'P':
1537 mg->mg_virtual = &vtbl_pack;
1538 break;
1539 case 'p':
1540 mg->mg_virtual = &vtbl_packelem;
1541 break;
79072805
LW
1542 case 'S':
1543 mg->mg_virtual = &vtbl_sig;
1544 break;
1545 case 's':
1546 mg->mg_virtual = &vtbl_sigelem;
1547 break;
463ee0b2
LW
1548 case 't':
1549 mg->mg_virtual = &vtbl_taint;
1550 break;
79072805
LW
1551 case 'U':
1552 mg->mg_virtual = &vtbl_uvar;
1553 break;
1554 case 'v':
1555 mg->mg_virtual = &vtbl_vec;
1556 break;
1557 case 'x':
1558 mg->mg_virtual = &vtbl_substr;
1559 break;
1560 case '*':
1561 mg->mg_virtual = &vtbl_glob;
1562 break;
1563 case '#':
1564 mg->mg_virtual = &vtbl_arylen;
1565 break;
1566 default:
463ee0b2
LW
1567 croak("Don't know how to handle magic of type '%c'", how);
1568 }
1569}
1570
1571int
1572sv_unmagic(sv, type)
1573SV* sv;
1574char type;
1575{
1576 MAGIC* mg;
1577 MAGIC** mgp;
1578 if (!SvMAGICAL(sv))
1579 return 0;
1580 mgp = &SvMAGIC(sv);
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);
1590 Safefree(mg);
1591 }
1592 else
1593 mgp = &mg->mg_moremagic;
79072805 1594 }
463ee0b2
LW
1595 if (!SvMAGIC(sv)) {
1596 SvMAGICAL_off(sv);
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);
1600 }
1601
1602 return 0;
79072805
LW
1603}
1604
1605void
1606sv_insert(bigstr,offset,len,little,littlelen)
1607SV *bigstr;
1608STRLEN offset;
1609STRLEN len;
1610char *little;
1611STRLEN littlelen;
1612{
1613 register char *big;
1614 register char *mid;
1615 register char *midend;
1616 register char *bigend;
1617 register I32 i;
1618
ed6116ce
LW
1619 if (SvTHINKFIRST(bigstr)) {
1620 if (SvREADONLY(bigstr))
1621 croak(no_modify);
1622 if (SvROK(bigstr))
1623 sv_unref(bigstr);
1624 }
79072805
LW
1625 SvPOK_only(bigstr);
1626
1627 i = littlelen - len;
1628 if (i > 0) { /* string might grow */
1629 if (!SvUPGRADE(bigstr, SVt_PV))
1630 return;
1631 SvGROW(bigstr, SvCUR(bigstr) + i + 1);
463ee0b2 1632 big = SvPVX(bigstr);
79072805
LW
1633 mid = big + offset + len;
1634 midend = bigend = big + SvCUR(bigstr);
1635 bigend += i;
1636 *bigend = '\0';
1637 while (midend > mid) /* shove everything down */
1638 *--bigend = *--midend;
1639 Move(little,big+offset,littlelen,char);
1640 SvCUR(bigstr) += i;
1641 SvSETMAGIC(bigstr);
1642 return;
1643 }
1644 else if (i == 0) {
463ee0b2 1645 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
1646 SvSETMAGIC(bigstr);
1647 return;
1648 }
1649
463ee0b2 1650 big = SvPVX(bigstr);
79072805
LW
1651 mid = big + offset;
1652 midend = mid + len;
1653 bigend = big + SvCUR(bigstr);
1654
1655 if (midend > bigend)
463ee0b2 1656 croak("panic: sv_insert");
79072805
LW
1657
1658 if (mid - big > bigend - midend) { /* faster to shorten from end */
1659 if (littlelen) {
1660 Move(little, mid, littlelen,char);
1661 mid += littlelen;
1662 }
1663 i = bigend - midend;
1664 if (i > 0) {
1665 Move(midend, mid, i,char);
1666 mid += i;
1667 }
1668 *mid = '\0';
1669 SvCUR_set(bigstr, mid - big);
1670 }
1671 /*SUPPRESS 560*/
1672 else if (i = mid - big) { /* faster from front */
1673 midend -= littlelen;
1674 mid = midend;
1675 sv_chop(bigstr,midend-i);
1676 big += i;
1677 while (i--)
1678 *--midend = *--big;
1679 if (littlelen)
1680 Move(little, mid, littlelen,char);
1681 }
1682 else if (littlelen) {
1683 midend -= littlelen;
1684 sv_chop(bigstr,midend);
1685 Move(little,midend,littlelen,char);
1686 }
1687 else {
1688 sv_chop(bigstr,midend);
1689 }
1690 SvSETMAGIC(bigstr);
1691}
1692
1693/* make sv point to what nstr did */
1694
1695void
1696sv_replace(sv,nsv)
1697register SV *sv;
1698register SV *nsv;
1699{
1700 U32 refcnt = SvREFCNT(sv);
ed6116ce
LW
1701 if (SvTHINKFIRST(sv)) {
1702 if (SvREADONLY(sv))
1703 croak(no_modify);
1704 if (SvROK(sv))
1705 sv_unref(sv);
1706 }
79072805
LW
1707 if (SvREFCNT(nsv) != 1)
1708 warn("Reference miscount in sv_replace()");
93a17b20
LW
1709 if (SvMAGICAL(sv)) {
1710 SvUPGRADE(nsv, SVt_PVMG);
1711 SvMAGIC(nsv) = SvMAGIC(sv);
1712 SvMAGICAL_on(nsv);
1713 SvMAGICAL_off(sv);
1714 SvMAGIC(sv) = 0;
1715 }
79072805
LW
1716 SvREFCNT(sv) = 0;
1717 sv_clear(sv);
1718 StructCopy(nsv,sv,SV);
1719 SvREFCNT(sv) = refcnt;
463ee0b2 1720 del_SV(nsv);
79072805
LW
1721}
1722
1723void
1724sv_clear(sv)
1725register SV *sv;
1726{
1727 assert(sv);
1728 assert(SvREFCNT(sv) == 0);
1729
ed6116ce 1730 if (SvOBJECT(sv)) {
463ee0b2
LW
1731 dSP;
1732 BINOP myop; /* fake syntax tree node */
1733 GV* destructor;
1734
ed6116ce 1735 SvOBJECT_off(sv); /* Curse the object. */
463ee0b2
LW
1736
1737 ENTER;
1738 SAVETMPS;
1739 SAVESPTR(curcop);
1740 SAVESPTR(op);
1741 curcop = &compiling;
1742 curstash = SvSTASH(sv);
1743 destructor = gv_fetchpv("DESTROY", FALSE);
1744
1745 if (destructor && GvCV(destructor)) {
1746 SV* ref = sv_mortalcopy(&sv_undef);
ed6116ce
LW
1747 sv_upgrade(ref, SVt_RV);
1748 SvRV(ref) = sv_ref(sv);
1749 SvROK_on(ref);
463ee0b2
LW
1750
1751 op = (OP*)&myop;
1752 Zero(op, 1, OP);
1753 myop.op_last = (OP*)&myop;
1754 myop.op_flags = OPf_STACKED;
1755 myop.op_next = Nullop;
1756
1757 EXTEND(SP, 2);
1758 PUSHs((SV*)destructor);
1759 pp_pushmark();
1760 PUSHs(ref);
1761 PUTBACK;
1762 op = pp_entersubr();
1763 if (op)
1764 run();
1765 stack_sp--;
1766 SvREFCNT(sv) = 0;
1767 SvTYPE(ref) = SVt_NULL;
1768 free_tmps();
1769 }
1770 LEAVE;
1771 }
79072805
LW
1772 switch (SvTYPE(sv)) {
1773 case SVt_PVFM:
1774 goto freemagic;
1775 case SVt_PVBM:
1776 goto freemagic;
1777 case SVt_PVGV:
1778 gp_free(sv);
1779 goto freemagic;
1780 case SVt_PVCV:
463ee0b2 1781 cv_clear((CV*)sv);
79072805
LW
1782 goto freemagic;
1783 case SVt_PVHV:
463ee0b2 1784 hv_clear((HV*)sv);
79072805
LW
1785 goto freemagic;
1786 case SVt_PVAV:
463ee0b2 1787 av_clear((AV*)sv);
79072805
LW
1788 goto freemagic;
1789 case SVt_PVLV:
1790 goto freemagic;
1791 case SVt_PVMG:
1792 freemagic:
1793 if (SvMAGICAL(sv))
463ee0b2 1794 mg_free(sv);
79072805
LW
1795 case SVt_PVNV:
1796 case SVt_PVIV:
1797 SvOOK_off(sv);
1798 /* FALL THROUGH */
1799 case SVt_PV:
463ee0b2
LW
1800 if (SvPVX(sv))
1801 Safefree(SvPVX(sv));
79072805
LW
1802 break;
1803 case SVt_NV:
1804 break;
1805 case SVt_IV:
1806 break;
ed6116ce
LW
1807 case SVt_RV:
1808 sv_free(SvRV(sv));
79072805
LW
1809 break;
1810 case SVt_NULL:
1811 break;
1812 }
1813
1814 switch (SvTYPE(sv)) {
1815 case SVt_NULL:
1816 break;
79072805
LW
1817 case SVt_IV:
1818 del_XIV(SvANY(sv));
1819 break;
1820 case SVt_NV:
1821 del_XNV(SvANY(sv));
1822 break;
ed6116ce
LW
1823 case SVt_RV:
1824 del_XRV(SvANY(sv));
1825 break;
79072805
LW
1826 case SVt_PV:
1827 del_XPV(SvANY(sv));
1828 break;
1829 case SVt_PVIV:
1830 del_XPVIV(SvANY(sv));
1831 break;
1832 case SVt_PVNV:
1833 del_XPVNV(SvANY(sv));
1834 break;
1835 case SVt_PVMG:
1836 del_XPVMG(SvANY(sv));
1837 break;
1838 case SVt_PVLV:
1839 del_XPVLV(SvANY(sv));
1840 break;
1841 case SVt_PVAV:
1842 del_XPVAV(SvANY(sv));
1843 break;
1844 case SVt_PVHV:
1845 del_XPVHV(SvANY(sv));
1846 break;
1847 case SVt_PVCV:
1848 del_XPVCV(SvANY(sv));
1849 break;
1850 case SVt_PVGV:
1851 del_XPVGV(SvANY(sv));
1852 break;
1853 case SVt_PVBM:
1854 del_XPVBM(SvANY(sv));
1855 break;
1856 case SVt_PVFM:
1857 del_XPVFM(SvANY(sv));
1858 break;
1859 }
1860 DEB(SvTYPE(sv) = 0xff;)
1861}
1862
1863SV *
1864sv_ref(sv)
1865SV* sv;
1866{
463ee0b2
LW
1867 if (sv)
1868 SvREFCNT(sv)++;
79072805
LW
1869 return sv;
1870}
1871
1872void
1873sv_free(sv)
1874SV *sv;
1875{
1876 if (!sv)
1877 return;
ed6116ce
LW
1878 if (SvTHINKFIRST(sv)) {
1879 if (SvREADONLY(sv)) {
1880 if (sv == &sv_undef || sv == &sv_yes || sv == &sv_no)
1881 return;
1882 }
79072805
LW
1883 }
1884 if (SvREFCNT(sv) == 0) {
1885 warn("Attempt to free unreferenced scalar");
1886 return;
1887 }
463ee0b2
LW
1888#ifdef DEBUGGING
1889 if (SvTEMP(sv)) {
1890 warn("Attempt to free temp prematurely");
79072805 1891 return;
79072805 1892 }
463ee0b2
LW
1893#endif
1894 if (--SvREFCNT(sv) > 0)
1895 return;
79072805
LW
1896 sv_clear(sv);
1897 DEB(SvTYPE(sv) = 0xff;)
1898 del_SV(sv);
1899}
1900
1901STRLEN
1902sv_len(sv)
1903register SV *sv;
1904{
79072805 1905 char *s;
463ee0b2 1906 STRLEN len;
79072805
LW
1907
1908 if (!sv)
1909 return 0;
1910
463ee0b2
LW
1911 s = SvPV(sv, len);
1912 return len;
79072805
LW
1913}
1914
1915I32
1916sv_eq(str1,str2)
1917register SV *str1;
1918register SV *str2;
1919{
1920 char *pv1;
463ee0b2 1921 STRLEN cur1;
79072805 1922 char *pv2;
463ee0b2 1923 STRLEN cur2;
79072805
LW
1924
1925 if (!str1) {
1926 pv1 = "";
1927 cur1 = 0;
1928 }
463ee0b2
LW
1929 else
1930 pv1 = SvPV(str1, cur1);
79072805
LW
1931
1932 if (!str2)
1933 return !cur1;
463ee0b2
LW
1934 else
1935 pv2 = SvPV(str2, cur2);
79072805
LW
1936
1937 if (cur1 != cur2)
1938 return 0;
1939
1940 return !bcmp(pv1, pv2, cur1);
1941}
1942
1943I32
1944sv_cmp(str1,str2)
1945register SV *str1;
1946register SV *str2;
1947{
1948 I32 retval;
1949 char *pv1;
463ee0b2 1950 STRLEN cur1;
79072805 1951 char *pv2;
463ee0b2 1952 STRLEN cur2;
79072805
LW
1953
1954 if (!str1) {
1955 pv1 = "";
1956 cur1 = 0;
1957 }
463ee0b2
LW
1958 else
1959 pv1 = SvPV(str1, cur1);
79072805
LW
1960
1961 if (!str2) {
1962 pv2 = "";
1963 cur2 = 0;
1964 }
463ee0b2
LW
1965 else
1966 pv2 = SvPV(str2, cur2);
79072805
LW
1967
1968 if (!cur1)
1969 return cur2 ? -1 : 0;
1970 if (!cur2)
1971 return 1;
1972
1973 if (cur1 < cur2) {
1974 /*SUPPRESS 560*/
1975 if (retval = memcmp(pv1, pv2, cur1))
1976 return retval < 0 ? -1 : 1;
1977 else
1978 return -1;
1979 }
1980 /*SUPPRESS 560*/
1981 else if (retval = memcmp(pv1, pv2, cur2))
1982 return retval < 0 ? -1 : 1;
1983 else if (cur1 == cur2)
1984 return 0;
1985 else
1986 return 1;
1987}
1988
1989char *
1990sv_gets(sv,fp,append)
1991register SV *sv;
1992register FILE *fp;
1993I32 append;
1994{
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) */
1999 I32 i;
2000 STRLEN bpx;
2001 I32 shortbuffered;
2002
ed6116ce
LW
2003 if (SvTHINKFIRST(sv)) {
2004 if (SvREADONLY(sv))
2005 croak(no_modify);
2006 if (SvROK(sv))
2007 sv_unref(sv);
2008 }
79072805
LW
2009 if (!SvUPGRADE(sv, SVt_PV))
2010 return;
2011 if (rspara) { /* have to do this both before and after */
2012 do { /* to make sure file boundaries work right */
2013 i = getc(fp);
2014 if (i != '\n') {
2015 ungetc(i,fp);
2016 break;
2017 }
2018 } while (i != EOF);
2019 }
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;
2027 }
2028 else {
2029 shortbuffered = 0;
2030 SvGROW(sv, append+cnt+2);/* (remembering cnt can be -1) */
2031 }
2032 }
2033 else
2034 shortbuffered = 0;
463ee0b2 2035 bp = SvPVX(sv) + append; /* move these two too to registers */
79072805
LW
2036 ptr = fp->_ptr;
2037 for (;;) {
2038 screamer:
93a17b20
LW
2039 if (cnt > 0) {
2040 while (--cnt >= 0) { /* this */ /* eat */
2041 if ((*bp++ = *ptr++) == newline) /* really */ /* dust */
2042 goto thats_all_folks; /* screams */ /* sed :-) */
2043 }
79072805
LW
2044 }
2045
2046 if (shortbuffered) { /* oh well, must extend */
2047 cnt = shortbuffered;
2048 shortbuffered = 0;
463ee0b2 2049 bpx = bp - SvPVX(sv); /* prepare for possible relocation */
79072805
LW
2050 SvCUR_set(sv, bpx);
2051 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
463ee0b2 2052 bp = SvPVX(sv) + bpx; /* reconstitute our pointer */
79072805
LW
2053 continue;
2054 }
2055
2056 fp->_cnt = cnt; /* deregisterize cnt and ptr */
2057 fp->_ptr = ptr;
2058 i = _filbuf(fp); /* get more characters */
2059 cnt = fp->_cnt;
2060 ptr = fp->_ptr; /* reregisterize cnt and ptr */
2061
463ee0b2 2062 bpx = bp - SvPVX(sv); /* prepare for possible relocation */
79072805
LW
2063 SvCUR_set(sv, bpx);
2064 SvGROW(sv, bpx + cnt + 2);
463ee0b2 2065 bp = SvPVX(sv) + bpx; /* reconstitute our pointer */
79072805
LW
2066
2067 if (i == newline) { /* all done for now? */
2068 *bp++ = i;
2069 goto thats_all_folks;
2070 }
2071 else if (i == EOF) /* all done for ever? */
2072 goto thats_really_all_folks;
2073 *bp++ = i; /* now go back to screaming loop */
2074 }
2075
2076thats_all_folks:
463ee0b2 2077 if (rslen > 1 && (bp - SvPVX(sv) < rslen || bcmp(bp - rslen, rs, rslen)))
79072805
LW
2078 goto screamer; /* go back to the fray */
2079thats_really_all_folks:
2080 if (shortbuffered)
2081 cnt += shortbuffered;
2082 fp->_cnt = cnt; /* put these back or we're in trouble */
2083 fp->_ptr = ptr;
2084 *bp = '\0';
463ee0b2 2085 SvCUR_set(sv, bp - SvPVX(sv)); /* set length */
79072805
LW
2086
2087#else /* !STDSTDIO */ /* The big, slow, and stupid way */
2088
2089 {
2090 char buf[8192];
2091 register char * bpe = buf + sizeof(buf) - 3;
2092
2093screamer:
2094 bp = buf;
2095 while ((i = getc(fp)) != EOF && (*bp++ = i) != newline && bp < bpe) ;
2096
2097 if (append)
2098 sv_catpvn(sv, buf, bp - buf);
2099 else
2100 sv_setpvn(sv, buf, bp - buf);
2101 if (i != EOF /* joy */
2102 &&
2103 (i != newline
2104 ||
2105 (rslen > 1
2106 &&
2107 (SvCUR(sv) < rslen
2108 ||
463ee0b2 2109 bcmp(SvPVX(sv) + SvCUR(sv) - rslen, rs, rslen)
79072805
LW
2110 )
2111 )
2112 )
2113 )
2114 {
2115 append = -1;
2116 goto screamer;
2117 }
2118 }
2119
2120#endif /* STDSTDIO */
2121
2122 if (rspara) {
2123 while (i != EOF) {
2124 i = getc(fp);
2125 if (i != '\n') {
2126 ungetc(i,fp);
2127 break;
2128 }
2129 }
2130 }
463ee0b2 2131 return SvCUR(sv) - append ? SvPVX(sv) : Nullch;
79072805
LW
2132}
2133
2134void
2135sv_inc(sv)
2136register SV *sv;
2137{
2138 register char *d;
463ee0b2 2139 int flags;
79072805
LW
2140
2141 if (!sv)
2142 return;
ed6116ce
LW
2143 if (SvTHINKFIRST(sv)) {
2144 if (SvREADONLY(sv))
2145 croak(no_modify);
2146 if (SvROK(sv))
2147 sv_unref(sv);
2148 }
463ee0b2 2149 if (SvMAGICAL(sv)) {
79072805 2150 mg_get(sv);
463ee0b2
LW
2151 flags = SvPRIVATE(sv);
2152 }
2153 else
2154 flags = SvFLAGS(sv);
2155 if (flags & SVf_IOK) {
2156 ++SvIVX(sv);
79072805
LW
2157 SvIOK_only(sv);
2158 return;
2159 }
463ee0b2
LW
2160 if (flags & SVf_NOK) {
2161 SvNVX(sv) += 1.0;
79072805
LW
2162 SvNOK_only(sv);
2163 return;
2164 }
463ee0b2 2165 if (!(flags & SVf_POK) || !*SvPVX(sv)) {
79072805
LW
2166 if (!SvUPGRADE(sv, SVt_NV))
2167 return;
463ee0b2 2168 SvNVX(sv) = 1.0;
79072805
LW
2169 SvNOK_only(sv);
2170 return;
2171 }
463ee0b2 2172 d = SvPVX(sv);
79072805
LW
2173 while (isALPHA(*d)) d++;
2174 while (isDIGIT(*d)) d++;
2175 if (*d) {
463ee0b2 2176 sv_setnv(sv,atof(SvPVX(sv)) + 1.0); /* punt */
79072805
LW
2177 return;
2178 }
2179 d--;
463ee0b2 2180 while (d >= SvPVX(sv)) {
79072805
LW
2181 if (isDIGIT(*d)) {
2182 if (++*d <= '9')
2183 return;
2184 *(d--) = '0';
2185 }
2186 else {
2187 ++*d;
2188 if (isALPHA(*d))
2189 return;
2190 *(d--) -= 'z' - 'a' + 1;
2191 }
2192 }
2193 /* oh,oh, the number grew */
2194 SvGROW(sv, SvCUR(sv) + 2);
2195 SvCUR(sv)++;
463ee0b2 2196 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
79072805
LW
2197 *d = d[-1];
2198 if (isDIGIT(d[1]))
2199 *d = '1';
2200 else
2201 *d = d[1];
2202}
2203
2204void
2205sv_dec(sv)
2206register SV *sv;
2207{
463ee0b2
LW
2208 int flags;
2209
79072805
LW
2210 if (!sv)
2211 return;
ed6116ce
LW
2212 if (SvTHINKFIRST(sv)) {
2213 if (SvREADONLY(sv))
2214 croak(no_modify);
2215 if (SvROK(sv))
2216 sv_unref(sv);
2217 }
463ee0b2 2218 if (SvMAGICAL(sv)) {
79072805 2219 mg_get(sv);
463ee0b2
LW
2220 flags = SvPRIVATE(sv);
2221 }
2222 else
2223 flags = SvFLAGS(sv);
2224 if (flags & SVf_IOK) {
2225 --SvIVX(sv);
79072805
LW
2226 SvIOK_only(sv);
2227 return;
2228 }
463ee0b2
LW
2229 if (flags & SVf_NOK) {
2230 SvNVX(sv) -= 1.0;
79072805
LW
2231 SvNOK_only(sv);
2232 return;
2233 }
463ee0b2 2234 if (!(flags & SVf_POK)) {
79072805
LW
2235 if (!SvUPGRADE(sv, SVt_NV))
2236 return;
463ee0b2 2237 SvNVX(sv) = -1.0;
79072805
LW
2238 SvNOK_only(sv);
2239 return;
2240 }
463ee0b2 2241 sv_setnv(sv,atof(SvPVX(sv)) - 1.0);
79072805
LW
2242}
2243
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. */
2248
2249SV *
2250sv_mortalcopy(oldstr)
2251SV *oldstr;
2252{
463ee0b2 2253 register SV *sv;
79072805 2254
463ee0b2
LW
2255 new_SV();
2256 Zero(sv, 1, SV);
2257 SvREFCNT(sv)++;
79072805
LW
2258 sv_setsv(sv,oldstr);
2259 if (++tmps_ix > tmps_max) {
2260 tmps_max = tmps_ix;
2261 if (!(tmps_max & 127)) {
2262 if (tmps_max)
2263 Renew(tmps_stack, tmps_max + 128, SV*);
2264 else
2265 New(702,tmps_stack, 128, SV*);
2266 }
2267 }
2268 tmps_stack[tmps_ix] = sv;
2269 if (SvPOK(sv))
2270 SvTEMP_on(sv);
2271 return sv;
2272}
2273
2274/* same thing without the copying */
2275
2276SV *
2277sv_2mortal(sv)
2278register SV *sv;
2279{
2280 if (!sv)
2281 return sv;
ed6116ce
LW
2282 if (SvTHINKFIRST(sv)) {
2283 if (SvREADONLY(sv))
2284 croak(no_modify);
2285 if (SvROK(sv))
2286 sv_unref(sv);
2287 }
79072805
LW
2288 if (++tmps_ix > tmps_max) {
2289 tmps_max = tmps_ix;
2290 if (!(tmps_max & 127)) {
2291 if (tmps_max)
2292 Renew(tmps_stack, tmps_max + 128, SV*);
2293 else
2294 New(704,tmps_stack, 128, SV*);
2295 }
2296 }
2297 tmps_stack[tmps_ix] = sv;
2298 if (SvPOK(sv))
2299 SvTEMP_on(sv);
2300 return sv;
2301}
2302
2303SV *
2304newSVpv(s,len)
2305char *s;
2306STRLEN len;
2307{
463ee0b2 2308 register SV *sv;
79072805 2309
463ee0b2
LW
2310 new_SV();
2311 Zero(sv, 1, SV);
2312 SvREFCNT(sv)++;
79072805
LW
2313 if (!len)
2314 len = strlen(s);
2315 sv_setpvn(sv,s,len);
2316 return sv;
2317}
2318
2319SV *
2320newSVnv(n)
2321double n;
2322{
463ee0b2 2323 register SV *sv;
79072805 2324
463ee0b2
LW
2325 new_SV();
2326 Zero(sv, 1, SV);
2327 SvREFCNT(sv)++;
79072805
LW
2328 sv_setnv(sv,n);
2329 return sv;
2330}
2331
2332SV *
2333newSViv(i)
2334I32 i;
2335{
463ee0b2 2336 register SV *sv;
79072805 2337
463ee0b2
LW
2338 new_SV();
2339 Zero(sv, 1, SV);
2340 SvREFCNT(sv)++;
79072805
LW
2341 sv_setiv(sv,i);
2342 return sv;
2343}
2344
2345/* make an exact duplicate of old */
2346
2347SV *
2348newSVsv(old)
2349register SV *old;
2350{
463ee0b2 2351 register SV *sv;
79072805
LW
2352
2353 if (!old)
2354 return Nullsv;
2355 if (SvTYPE(old) == 0xff) {
2356 warn("semi-panic: attempt to dup freed string");
2357 return Nullsv;
2358 }
463ee0b2
LW
2359 new_SV();
2360 Zero(sv, 1, SV);
2361 SvREFCNT(sv)++;
79072805
LW
2362 if (SvTEMP(old)) {
2363 SvTEMP_off(old);
463ee0b2 2364 sv_setsv(sv,old);
79072805
LW
2365 SvTEMP_on(old);
2366 }
2367 else
463ee0b2
LW
2368 sv_setsv(sv,old);
2369 return sv;
79072805
LW
2370}
2371
2372void
2373sv_reset(s,stash)
2374register char *s;
2375HV *stash;
2376{
2377 register HE *entry;
2378 register GV *gv;
2379 register SV *sv;
2380 register I32 i;
2381 register PMOP *pm;
2382 register I32 max;
463ee0b2 2383 char todo[256];
79072805
LW
2384
2385 if (!*s) { /* reset ?? searches */
2386 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
2387 pm->op_pmflags &= ~PMf_USED;
2388 }
2389 return;
2390 }
2391
2392 /* reset variables */
2393
2394 if (!HvARRAY(stash))
2395 return;
463ee0b2
LW
2396
2397 Zero(todo, 256, char);
79072805
LW
2398 while (*s) {
2399 i = *s;
2400 if (s[1] == '-') {
2401 s += 2;
2402 }
2403 max = *s++;
2404 for ( ; i <= max; i++) {
463ee0b2
LW
2405 todo[i] = 1;
2406 }
2407 for (i = 0; i <= HvMAX(stash); i++) {
79072805
LW
2408 for (entry = HvARRAY(stash)[i];
2409 entry;
2410 entry = entry->hent_next) {
463ee0b2
LW
2411 if (!todo[(U8)*entry->hent_key])
2412 continue;
79072805
LW
2413 gv = (GV*)entry->hent_val;
2414 sv = GvSV(gv);
2415 SvOK_off(sv);
2416 if (SvTYPE(sv) >= SVt_PV) {
2417 SvCUR_set(sv, 0);
463ee0b2
LW
2418 SvTAINT(sv);
2419 if (SvPVX(sv) != Nullch)
2420 *SvPVX(sv) = '\0';
79072805
LW
2421 }
2422 if (GvAV(gv)) {
2423 av_clear(GvAV(gv));
2424 }
2425 if (GvHV(gv)) {
463ee0b2 2426 hv_clear(GvHV(gv));
79072805
LW
2427 if (gv == envgv)
2428 environ[0] = Nullch;
2429 }
2430 }
2431 }
2432 }
2433}
2434
79072805
LW
2435CV *
2436sv_2cv(sv, st, gvp, lref)
2437SV *sv;
2438HV **st;
2439GV **gvp;
2440I32 lref;
2441{
2442 GV *gv;
2443 CV *cv;
2444
2445 if (!sv)
93a17b20 2446 return *gvp = Nullgv, Nullcv;
79072805 2447 switch (SvTYPE(sv)) {
ed6116ce
LW
2448 case SVt_RV:
2449 is_rv:
2450 cv = (CV*)SvRV(sv);
79072805 2451 if (SvTYPE(cv) != SVt_PVCV)
463ee0b2 2452 croak("Not a subroutine reference");
79072805
LW
2453 *gvp = Nullgv;
2454 *st = CvSTASH(cv);
2455 return cv;
2456 case SVt_PVCV:
2457 *st = CvSTASH(sv);
2458 *gvp = Nullgv;
2459 return (CV*)sv;
2460 case SVt_PVHV:
2461 case SVt_PVAV:
2462 *gvp = Nullgv;
2463 return Nullcv;
2464 default:
ed6116ce
LW
2465 if (SvROK(sv))
2466 goto is_rv;
79072805
LW
2467 if (isGV(sv))
2468 gv = (GV*)sv;
2469 else
463ee0b2 2470 gv = gv_fetchpv(SvPV(sv, na), lref);
79072805
LW
2471 *gvp = gv;
2472 if (!gv)
2473 return Nullcv;
2474 *st = GvESTASH(gv);
2475 return GvCV(gv);
2476 }
2477}
2478
2479#ifndef SvTRUE
2480I32
2481SvTRUE(sv)
2482register SV *sv;
2483{
2484 if (SvMAGICAL(sv))
2485 mg_get(sv);
2486 if (SvPOK(sv)) {
2487 register XPV* Xpv;
2488 if ((Xpv = (XPV*)SvANY(sv)) &&
2489 (*Xpv->xpv_pv > '0' ||
2490 Xpv->xpv_cur > 1 ||
2491 (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
2492 return 1;
2493 else
2494 return 0;
2495 }
2496 else {
2497 if (SvIOK(sv))
463ee0b2 2498 return SvIVX(sv) != 0;
79072805
LW
2499 else {
2500 if (SvNOK(sv))
463ee0b2 2501 return SvNVX(sv) != 0.0;
79072805 2502 else
463ee0b2 2503 return sv_2bool(sv);
79072805
LW
2504 }
2505 }
2506}
2507#endif /* SvTRUE */
2508
463ee0b2
LW
2509#ifndef SvNV
2510double SvNV(Sv)
79072805
LW
2511register SV *Sv;
2512{
79072805 2513 if (SvNOK(Sv))
463ee0b2 2514 return SvNVX(Sv);
79072805 2515 if (SvIOK(Sv))
463ee0b2 2516 return (double)SvIVX(Sv);
79072805
LW
2517 return sv_2nv(Sv);
2518}
463ee0b2 2519#endif /* SvNV */
79072805 2520
463ee0b2 2521#ifdef CRIPPLED_CC
79072805 2522char *
463ee0b2 2523sv_pvn(sv, lp)
79072805 2524SV *sv;
463ee0b2 2525STRLEN *lp;
79072805 2526{
463ee0b2
LW
2527 if (SvPOK(sv))
2528 return SvPVX(sv)
2529 return sv_2pv(sv, lp);
79072805
LW
2530}
2531#endif
2532
463ee0b2
LW
2533int
2534sv_isa(sv, name)
2535SV *sv;
2536char *name;
2537{
ed6116ce 2538 if (!SvROK(sv))
463ee0b2 2539 return 0;
ed6116ce
LW
2540 sv = (SV*)SvRV(sv);
2541 if (!SvOBJECT(sv))
463ee0b2
LW
2542 return 0;
2543
2544 return strEQ(HvNAME(SvSTASH(sv)), name);
2545}
2546
2547SV*
2548sv_setptrobj(rv, ptr, name)
2549SV *rv;
2550void *ptr;
2551char *name;
2552{
2553 HV *stash;
2554 SV *sv;
2555
2556 if (!ptr)
2557 return rv;
2558
2559 new_SV();
2560 Zero(sv, 1, SV);
2561 SvREFCNT(sv)++;
2562 sv_setnv(sv, (double)(unsigned long)ptr);
ed6116ce
LW
2563 sv_upgrade(rv, SVt_RV);
2564 SvRV(rv) = sv_ref(sv);
2565 SvROK_on(rv);
463ee0b2
LW
2566
2567 stash = fetch_stash(newSVpv(name,0), TRUE);
ed6116ce 2568 SvOBJECT_on(sv);
463ee0b2
LW
2569 SvUPGRADE(sv, SVt_PVMG);
2570 SvSTASH(sv) = stash;
2571
2572 return rv;
2573}
2574
ed6116ce
LW
2575void
2576sv_unref(sv)
2577SV* sv;
2578{
2579 sv_free(SvRV(sv));
2580 SvRV(sv) = 0;
2581 SvROK_off(sv);
2582 if (!SvREADONLY(sv))
2583 SvTHINKFIRST_off(sv);
2584}