Re: valgrind as a leak hound?
[p5sagit/p5-mst-13.2.git] / mg.c
1 /*    mg.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * "Sam sat on the ground and put his head in his hands.  'I wish I had never
13  * come here, and I don't want to see no more magic,' he said, and fell silent."
14  */
15
16 /*
17 =head1 Magical Functions
18 */
19
20 #include "EXTERN.h"
21 #define PERL_IN_MG_C
22 #include "perl.h"
23
24 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
25 #  ifndef NGROUPS
26 #    define NGROUPS 32
27 #  endif
28 #  ifdef I_GRP
29 #    include <grp.h>
30 #  endif
31 #endif
32
33 #ifdef __hpux
34 #  include <sys/pstat.h>
35 #endif
36
37 Signal_t Perl_csighandler(int sig);
38
39 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
40 #if !defined(HAS_SIGACTION) && defined(VMS)
41 #  define  FAKE_PERSISTENT_SIGNAL_HANDLERS
42 #endif
43 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
44 #if defined(KILL_BY_SIGPRC)
45 #  define  FAKE_DEFAULT_SIGNAL_HANDLERS
46 #endif
47
48 static void restore_magic(pTHX_ void *p);
49 static void unwind_handler_stack(pTHX_ void *p);
50
51 /*
52  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
53  */
54
55 struct magic_state {
56     SV* mgs_sv;
57     U32 mgs_flags;
58     I32 mgs_ss_ix;
59 };
60 /* MGS is typedef'ed to struct magic_state in perl.h */
61
62 STATIC void
63 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
64 {
65     MGS* mgs;
66     assert(SvMAGICAL(sv));
67 #ifdef PERL_COPY_ON_WRITE
68     /* Turning READONLY off for a copy-on-write scalar is a bad idea.  */
69     if (SvIsCOW(sv))
70       sv_force_normal(sv);
71 #endif
72
73     SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix));
74
75     mgs = SSPTR(mgs_ix, MGS*);
76     mgs->mgs_sv = sv;
77     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
78     mgs->mgs_ss_ix = PL_savestack_ix;   /* points after the saved destructor */
79
80     SvMAGICAL_off(sv);
81     SvREADONLY_off(sv);
82     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
83 }
84
85 /*
86 =for apidoc mg_magical
87
88 Turns on the magical status of an SV.  See C<sv_magic>.
89
90 =cut
91 */
92
93 void
94 Perl_mg_magical(pTHX_ SV *sv)
95 {
96     MAGIC* mg;
97     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
98         MGVTBL* vtbl = mg->mg_virtual;
99         if (vtbl) {
100             if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
101                 SvGMAGICAL_on(sv);
102             if (vtbl->svt_set)
103                 SvSMAGICAL_on(sv);
104             if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
105                 SvRMAGICAL_on(sv);
106         }
107     }
108 }
109
110 /*
111 =for apidoc mg_get
112
113 Do magic after a value is retrieved from the SV.  See C<sv_magic>.
114
115 =cut
116 */
117
118 int
119 Perl_mg_get(pTHX_ SV *sv)
120 {
121     int new = 0;
122     MAGIC *newmg, *head, *cur, *mg;
123     I32 mgs_ix = SSNEW(sizeof(MGS));
124
125     save_magic(mgs_ix, sv);
126
127     /* We must call svt_get(sv, mg) for each valid entry in the linked
128        list of magic. svt_get() may delete the current entry, add new
129        magic to the head of the list, or upgrade the SV. AMS 20010810 */
130
131     newmg = cur = head = mg = SvMAGIC(sv);
132     while (mg) {
133         MGVTBL *vtbl = mg->mg_virtual;
134
135         if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
136             CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
137
138             /* guard against sv having been freed */
139             if (SvTYPE(sv) == SVTYPEMASK) {
140                 Perl_croak(aTHX_ "Tied variable freed while still in use");
141             }
142             /* guard against magic having been deleted - eg FETCH calling
143              * untie */
144             if (!SvMAGIC(sv))
145                 break;
146
147             /* Don't restore the flags for this entry if it was deleted. */
148             if (mg->mg_flags & MGf_GSKIP)
149                 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
150         }
151
152         mg = mg->mg_moremagic;
153
154         if (new) {
155             /* Have we finished with the new entries we saw? Start again
156                where we left off (unless there are more new entries). */
157             if (mg == head) {
158                 new  = 0;
159                 mg   = cur;
160                 head = newmg;
161             }
162         }
163
164         /* Were any new entries added? */
165         if (!new && (newmg = SvMAGIC(sv)) != head) {
166             new = 1;
167             cur = mg;
168             mg  = newmg;
169         }
170     }
171
172     restore_magic(aTHX_ INT2PTR(void *, (IV)mgs_ix));
173     return 0;
174 }
175
176 /*
177 =for apidoc mg_set
178
179 Do magic after a value is assigned to the SV.  See C<sv_magic>.
180
181 =cut
182 */
183
184 int
185 Perl_mg_set(pTHX_ SV *sv)
186 {
187     I32 mgs_ix;
188     MAGIC* mg;
189     MAGIC* nextmg;
190
191     mgs_ix = SSNEW(sizeof(MGS));
192     save_magic(mgs_ix, sv);
193
194     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
195         MGVTBL* vtbl = mg->mg_virtual;
196         nextmg = mg->mg_moremagic;      /* it may delete itself */
197         if (mg->mg_flags & MGf_GSKIP) {
198             mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
199             (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
200         }
201         if (vtbl && vtbl->svt_set)
202             CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
203     }
204
205     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
206     return 0;
207 }
208
209 /*
210 =for apidoc mg_length
211
212 Report on the SV's length.  See C<sv_magic>.
213
214 =cut
215 */
216
217 U32
218 Perl_mg_length(pTHX_ SV *sv)
219 {
220     MAGIC* mg;
221     STRLEN len;
222
223     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
224         MGVTBL* vtbl = mg->mg_virtual;
225         if (vtbl && vtbl->svt_len) {
226             I32 mgs_ix;
227
228             mgs_ix = SSNEW(sizeof(MGS));
229             save_magic(mgs_ix, sv);
230             /* omit MGf_GSKIP -- not changed here */
231             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
232             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
233             return len;
234         }
235     }
236
237     if (DO_UTF8(sv))
238     {
239         U8 *s = (U8*)SvPV(sv, len);
240         len = Perl_utf8_length(aTHX_ s, s + len);
241     }
242     else
243         (void)SvPV(sv, len);
244     return len;
245 }
246
247 I32
248 Perl_mg_size(pTHX_ SV *sv)
249 {
250     MAGIC* mg;
251     I32 len;
252
253     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
254         MGVTBL* vtbl = mg->mg_virtual;
255         if (vtbl && vtbl->svt_len) {
256             I32 mgs_ix;
257
258             mgs_ix = SSNEW(sizeof(MGS));
259             save_magic(mgs_ix, sv);
260             /* omit MGf_GSKIP -- not changed here */
261             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
262             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
263             return len;
264         }
265     }
266
267     switch(SvTYPE(sv)) {
268         case SVt_PVAV:
269             len = AvFILLp((AV *) sv); /* Fallback to non-tied array */
270             return len;
271         case SVt_PVHV:
272             /* FIXME */
273         default:
274             Perl_croak(aTHX_ "Size magic not implemented");
275             break;
276     }
277     return 0;
278 }
279
280 /*
281 =for apidoc mg_clear
282
283 Clear something magical that the SV represents.  See C<sv_magic>.
284
285 =cut
286 */
287
288 int
289 Perl_mg_clear(pTHX_ SV *sv)
290 {
291     I32 mgs_ix;
292     MAGIC* mg;
293
294     mgs_ix = SSNEW(sizeof(MGS));
295     save_magic(mgs_ix, sv);
296
297     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
298         MGVTBL* vtbl = mg->mg_virtual;
299         /* omit GSKIP -- never set here */
300
301         if (vtbl && vtbl->svt_clear)
302             CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
303     }
304
305     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
306     return 0;
307 }
308
309 /*
310 =for apidoc mg_find
311
312 Finds the magic pointer for type matching the SV.  See C<sv_magic>.
313
314 =cut
315 */
316
317 MAGIC*
318 Perl_mg_find(pTHX_ SV *sv, int type)
319 {
320     MAGIC* mg;
321     if (!sv)
322         return 0;
323     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
324         if (mg->mg_type == type)
325             return mg;
326     }
327     return 0;
328 }
329
330 /*
331 =for apidoc mg_copy
332
333 Copies the magic from one SV to another.  See C<sv_magic>.
334
335 =cut
336 */
337
338 int
339 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
340 {
341     int count = 0;
342     MAGIC* mg;
343     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
344         MGVTBL* vtbl = mg->mg_virtual;
345         if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
346             count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
347         }
348         else if (isUPPER(mg->mg_type)) {
349             sv_magic(nsv,
350                      mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
351                      (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
352                                                         ? sv : mg->mg_obj,
353                      toLOWER(mg->mg_type), key, klen);
354             count++;
355         }
356     }
357     return count;
358 }
359
360 /*
361 =for apidoc mg_free
362
363 Free any magic storage used by the SV.  See C<sv_magic>.
364
365 =cut
366 */
367
368 int
369 Perl_mg_free(pTHX_ SV *sv)
370 {
371     MAGIC* mg;
372     MAGIC* moremagic;
373     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
374         MGVTBL* vtbl = mg->mg_virtual;
375         moremagic = mg->mg_moremagic;
376         if (vtbl && vtbl->svt_free)
377             CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
378         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
379             if (mg->mg_len > 0)
380                 Safefree(mg->mg_ptr);
381             else if (mg->mg_len == HEf_SVKEY)
382                 SvREFCNT_dec((SV*)mg->mg_ptr);
383         }
384         if (mg->mg_flags & MGf_REFCOUNTED)
385             SvREFCNT_dec(mg->mg_obj);
386         Safefree(mg);
387     }
388     SvMAGIC(sv) = 0;
389     return 0;
390 }
391
392
393 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
394 #include <signal.h>
395 #endif
396
397 U32
398 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
399 {
400     register REGEXP *rx;
401
402     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
403         if (mg->mg_obj)         /* @+ */
404             return rx->nparens;
405         else                    /* @- */
406             return rx->lastparen;
407     }
408
409     return (U32)-1;
410 }
411
412 int
413 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
414 {
415     register I32 paren;
416     register I32 s;
417     register I32 i;
418     register REGEXP *rx;
419     I32 t;
420
421     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
422         paren = mg->mg_len;
423         if (paren < 0)
424             return 0;
425         if (paren <= (I32)rx->nparens &&
426             (s = rx->startp[paren]) != -1 &&
427             (t = rx->endp[paren]) != -1)
428             {
429                 if (mg->mg_obj)         /* @+ */
430                     i = t;
431                 else                    /* @- */
432                     i = s;
433
434                 if (i > 0 && RX_MATCH_UTF8(rx)) {
435                     char *b = rx->subbeg;
436                     if (b)
437                         i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
438                 }
439
440                 sv_setiv(sv, i);
441             }
442     }
443     return 0;
444 }
445
446 int
447 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
448 {
449     Perl_croak(aTHX_ PL_no_modify);
450     /* NOT REACHED */
451     return 0;
452 }
453
454 U32
455 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
456 {
457     register I32 paren;
458     register I32 i;
459     register REGEXP *rx;
460     I32 s1, t1;
461
462     switch (*mg->mg_ptr) {
463     case '1': case '2': case '3': case '4':
464     case '5': case '6': case '7': case '8': case '9': case '&':
465         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
466
467             paren = atoi(mg->mg_ptr); /* $& is in [0] */
468           getparen:
469             if (paren <= (I32)rx->nparens &&
470                 (s1 = rx->startp[paren]) != -1 &&
471                 (t1 = rx->endp[paren]) != -1)
472             {
473                 i = t1 - s1;
474               getlen:
475                 if (i > 0 && RX_MATCH_UTF8(rx)) {
476                     char *s    = rx->subbeg + s1;
477                     char *send = rx->subbeg + t1;
478
479                     i = t1 - s1;
480                     if (is_utf8_string((U8*)s, i))
481                         i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
482                 }
483                 if (i < 0)
484                     Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
485                 return i;
486             }
487             else {
488                 if (ckWARN(WARN_UNINITIALIZED))
489                     report_uninit();
490             }
491         }
492         else {
493             if (ckWARN(WARN_UNINITIALIZED))
494                 report_uninit();
495         }
496         return 0;
497     case '+':
498         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
499             paren = rx->lastparen;
500             if (paren)
501                 goto getparen;
502         }
503         return 0;
504     case '\016': /* ^N */
505         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
506             paren = rx->lastcloseparen;
507             if (paren)
508                 goto getparen;
509         }
510         return 0;
511     case '`':
512         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
513             if (rx->startp[0] != -1) {
514                 i = rx->startp[0];
515                 if (i > 0) {
516                     s1 = 0;
517                     t1 = i;
518                     goto getlen;
519                 }
520             }
521         }
522         return 0;
523     case '\'':
524         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
525             if (rx->endp[0] != -1) {
526                 i = rx->sublen - rx->endp[0];
527                 if (i > 0) {
528                     s1 = rx->endp[0];
529                     t1 = rx->sublen;
530                     goto getlen;
531                 }
532             }
533         }
534         return 0;
535     }
536     magic_get(sv,mg);
537     if (!SvPOK(sv) && SvNIOK(sv)) {
538         STRLEN n_a;
539         sv_2pv(sv, &n_a);
540     }
541     if (SvPOK(sv))
542         return SvCUR(sv);
543     return 0;
544 }
545
546 int
547 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
548 {
549     register I32 paren;
550     register char *s = NULL;
551     register I32 i;
552     register REGEXP *rx;
553
554     switch (*mg->mg_ptr) {
555     case '\001':                /* ^A */
556         sv_setsv(sv, PL_bodytarget);
557         break;
558     case '\003':                /* ^C */
559         sv_setiv(sv, (IV)PL_minus_c);
560         break;
561
562     case '\004':                /* ^D */
563         sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
564 #if defined(YYDEBUG) && defined(DEBUGGING)
565         PL_yydebug = DEBUG_p_TEST;
566 #endif
567         break;
568     case '\005':  /* ^E */
569          if (*(mg->mg_ptr+1) == '\0') {
570 #ifdef MACOS_TRADITIONAL
571              {
572                   char msg[256];
573
574                   sv_setnv(sv,(double)gMacPerl_OSErr);
575                   sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
576              }
577 #else
578 #ifdef VMS
579              {
580 #                 include <descrip.h>
581 #                 include <starlet.h>
582                   char msg[255];
583                   $DESCRIPTOR(msgdsc,msg);
584                   sv_setnv(sv,(NV) vaxc$errno);
585                   if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
586                        sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
587                   else
588                        sv_setpv(sv,"");
589              }
590 #else
591 #ifdef OS2
592              if (!(_emx_env & 0x200)) { /* Under DOS */
593                   sv_setnv(sv, (NV)errno);
594                   sv_setpv(sv, errno ? Strerror(errno) : "");
595              } else {
596                   if (errno != errno_isOS2) {
597                        int tmp = _syserrno();
598                        if (tmp) /* 2nd call to _syserrno() makes it 0 */
599                             Perl_rc = tmp;
600                   }
601                   sv_setnv(sv, (NV)Perl_rc);
602                   sv_setpv(sv, os2error(Perl_rc));
603              }
604 #else
605 #ifdef WIN32
606              {
607                   DWORD dwErr = GetLastError();
608                   sv_setnv(sv, (NV)dwErr);
609                   if (dwErr)
610                   {
611                        PerlProc_GetOSError(sv, dwErr);
612                   }
613                   else
614                        sv_setpv(sv, "");
615                   SetLastError(dwErr);
616              }
617 #else
618              sv_setnv(sv, (NV)errno);
619              sv_setpv(sv, errno ? Strerror(errno) : "");
620 #endif
621 #endif
622 #endif
623 #endif
624              SvNOK_on(sv);      /* what a wonderful hack! */
625          }
626          else if (strEQ(mg->mg_ptr+1, "NCODING"))
627               sv_setsv(sv, PL_encoding);
628          break;
629     case '\006':                /* ^F */
630         sv_setiv(sv, (IV)PL_maxsysfd);
631         break;
632     case '\010':                /* ^H */
633         sv_setiv(sv, (IV)PL_hints);
634         break;
635     case '\011':                /* ^I */ /* NOT \t in EBCDIC */
636         if (PL_inplace)
637             sv_setpv(sv, PL_inplace);
638         else
639             sv_setsv(sv, &PL_sv_undef);
640         break;
641     case '\017':                /* ^O & ^OPEN */
642         if (*(mg->mg_ptr+1) == '\0')
643             sv_setpv(sv, PL_osname);
644         else if (strEQ(mg->mg_ptr, "\017PEN")) {
645             if (!PL_compiling.cop_io)
646                 sv_setsv(sv, &PL_sv_undef);
647             else {
648                 sv_setsv(sv, PL_compiling.cop_io);
649             }
650         }
651         break;
652     case '\020':                /* ^P */
653         sv_setiv(sv, (IV)PL_perldb);
654         break;
655     case '\023':                /* ^S */
656         if (*(mg->mg_ptr+1) == '\0') {
657             if (PL_lex_state != LEX_NOTPARSING)
658                 (void)SvOK_off(sv);
659             else if (PL_in_eval)
660                 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
661             else
662                 sv_setiv(sv, 0);
663         }
664         break;
665     case '\024':                /* ^T */
666         if (*(mg->mg_ptr+1) == '\0') {
667 #ifdef BIG_TIME
668             sv_setnv(sv, PL_basetime);
669 #else
670             sv_setiv(sv, (IV)PL_basetime);
671 #endif
672         }
673         else if (strEQ(mg->mg_ptr, "\024AINT"))
674             sv_setiv(sv, PL_tainting
675                     ? (PL_taint_warn || PL_unsafe ? -1 : 1)
676                     : 0);
677         break;
678     case '\025':                /* $^UNICODE */
679         if (strEQ(mg->mg_ptr, "\025NICODE"))
680             sv_setuv(sv, (UV) PL_unicode);
681         break;
682     case '\027':                /* ^W  & $^WARNING_BITS */
683         if (*(mg->mg_ptr+1) == '\0')
684             sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
685         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
686             if (PL_compiling.cop_warnings == pWARN_NONE ||
687                 PL_compiling.cop_warnings == pWARN_STD)
688             {
689                 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
690             }
691             else if (PL_compiling.cop_warnings == pWARN_ALL) {
692                 /* Get the bit mask for $warnings::Bits{all}, because
693                  * it could have been extended by warnings::register */
694                 SV **bits_all;
695                 HV *bits=get_hv("warnings::Bits", FALSE);
696                 if (bits && (bits_all=hv_fetch(bits, "all", 3, FALSE))) {
697                     sv_setsv(sv, *bits_all);
698                 }
699                 else {
700                     sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
701                 }
702             }
703             else {
704                 sv_setsv(sv, PL_compiling.cop_warnings);
705             }
706             SvPOK_only(sv);
707         }
708         break;
709     case '1': case '2': case '3': case '4':
710     case '5': case '6': case '7': case '8': case '9': case '&':
711         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
712             I32 s1, t1;
713
714             /*
715              * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
716              * XXX Does the new way break anything?
717              */
718             paren = atoi(mg->mg_ptr); /* $& is in [0] */
719           getparen:
720             if (paren <= (I32)rx->nparens &&
721                 (s1 = rx->startp[paren]) != -1 &&
722                 (t1 = rx->endp[paren]) != -1)
723             {
724                 i = t1 - s1;
725                 s = rx->subbeg + s1;
726                 if (!rx->subbeg)
727                     break;
728
729               getrx:
730                 if (i >= 0) {
731                     sv_setpvn(sv, s, i);
732                     if (RX_MATCH_UTF8(rx) && is_utf8_string((U8*)s, i))
733                         SvUTF8_on(sv);
734                     else
735                         SvUTF8_off(sv);
736                     if (PL_tainting) {
737                         if (RX_MATCH_TAINTED(rx)) {
738                             MAGIC* mg = SvMAGIC(sv);
739                             MAGIC* mgt;
740                             PL_tainted = 1;
741                             SvMAGIC(sv) = mg->mg_moremagic;
742                             SvTAINT(sv);
743                             if ((mgt = SvMAGIC(sv))) {
744                                 mg->mg_moremagic = mgt;
745                                 SvMAGIC(sv) = mg;
746                             }
747                         } else
748                             SvTAINTED_off(sv);
749                     }
750                     break;
751                 }
752             }
753         }
754         sv_setsv(sv,&PL_sv_undef);
755         break;
756     case '+':
757         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
758             paren = rx->lastparen;
759             if (paren)
760                 goto getparen;
761         }
762         sv_setsv(sv,&PL_sv_undef);
763         break;
764     case '\016':                /* ^N */
765         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
766             paren = rx->lastcloseparen;
767             if (paren)
768                 goto getparen;
769         }
770         sv_setsv(sv,&PL_sv_undef);
771         break;
772     case '`':
773         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
774             if ((s = rx->subbeg) && rx->startp[0] != -1) {
775                 i = rx->startp[0];
776                 goto getrx;
777             }
778         }
779         sv_setsv(sv,&PL_sv_undef);
780         break;
781     case '\'':
782         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
783             if (rx->subbeg && rx->endp[0] != -1) {
784                 s = rx->subbeg + rx->endp[0];
785                 i = rx->sublen - rx->endp[0];
786                 goto getrx;
787             }
788         }
789         sv_setsv(sv,&PL_sv_undef);
790         break;
791     case '.':
792 #ifndef lint
793         if (GvIO(PL_last_in_gv)) {
794             sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
795         }
796 #endif
797         break;
798     case '?':
799         {
800             sv_setiv(sv, (IV)STATUS_CURRENT);
801 #ifdef COMPLEX_STATUS
802             LvTARGOFF(sv) = PL_statusvalue;
803             LvTARGLEN(sv) = PL_statusvalue_vms;
804 #endif
805         }
806         break;
807     case '^':
808         if (GvIOp(PL_defoutgv))
809             s = IoTOP_NAME(GvIOp(PL_defoutgv));
810         if (s)
811             sv_setpv(sv,s);
812         else {
813             sv_setpv(sv,GvENAME(PL_defoutgv));
814             sv_catpv(sv,"_TOP");
815         }
816         break;
817     case '~':
818         if (GvIOp(PL_defoutgv))
819             s = IoFMT_NAME(GvIOp(PL_defoutgv));
820         if (!s)
821             s = GvENAME(PL_defoutgv);
822         sv_setpv(sv,s);
823         break;
824 #ifndef lint
825     case '=':
826         if (GvIOp(PL_defoutgv))
827             sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
828         break;
829     case '-':
830         if (GvIOp(PL_defoutgv))
831             sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
832         break;
833     case '%':
834         if (GvIOp(PL_defoutgv))
835             sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
836         break;
837 #endif
838     case ':':
839         break;
840     case '/':
841         break;
842     case '[':
843         WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
844         break;
845     case '|':
846         if (GvIOp(PL_defoutgv))
847             sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
848         break;
849     case ',':
850         break;
851     case '\\':
852         if (PL_ors_sv)
853             sv_copypv(sv, PL_ors_sv);
854         break;
855     case '#':
856         sv_setpv(sv,PL_ofmt);
857         break;
858     case '!':
859 #ifdef VMS
860         sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
861         sv_setpv(sv, errno ? Strerror(errno) : "");
862 #else
863         {
864         int saveerrno = errno;
865         sv_setnv(sv, (NV)errno);
866 #ifdef OS2
867         if (errno == errno_isOS2 || errno == errno_isOS2_set)
868             sv_setpv(sv, os2error(Perl_rc));
869         else
870 #endif
871         sv_setpv(sv, errno ? Strerror(errno) : "");
872         errno = saveerrno;
873         }
874 #endif
875         SvNOK_on(sv);   /* what a wonderful hack! */
876         break;
877     case '<':
878         sv_setiv(sv, (IV)PL_uid);
879         break;
880     case '>':
881         sv_setiv(sv, (IV)PL_euid);
882         break;
883     case '(':
884         sv_setiv(sv, (IV)PL_gid);
885 #ifdef HAS_GETGROUPS
886         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
887 #endif
888         goto add_groups;
889     case ')':
890         sv_setiv(sv, (IV)PL_egid);
891 #ifdef HAS_GETGROUPS
892         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
893 #endif
894       add_groups:
895 #ifdef HAS_GETGROUPS
896         {
897             Groups_t gary[NGROUPS];
898             i = getgroups(NGROUPS,gary);
899             while (--i >= 0)
900                 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
901         }
902 #endif
903         (void)SvIOK_on(sv);     /* what a wonderful hack! */
904         break;
905 #ifndef MACOS_TRADITIONAL
906     case '0':
907         break;
908 #endif
909     }
910     return 0;
911 }
912
913 int
914 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
915 {
916     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
917
918     if (uf && uf->uf_val)
919         (*uf->uf_val)(aTHX_ uf->uf_index, sv);
920     return 0;
921 }
922
923 int
924 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
925 {
926     register char *s;
927     char *ptr;
928     STRLEN len, klen;
929
930     s = SvPV(sv,len);
931     ptr = MgPV(mg,klen);
932     my_setenv(ptr, s);
933
934 #ifdef DYNAMIC_ENV_FETCH
935      /* We just undefd an environment var.  Is a replacement */
936      /* waiting in the wings? */
937     if (!len) {
938         SV **valp;
939         if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
940             s = SvPV(*valp, len);
941     }
942 #endif
943
944 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
945                             /* And you'll never guess what the dog had */
946                             /*   in its mouth... */
947     if (PL_tainting) {
948         MgTAINTEDDIR_off(mg);
949 #ifdef VMS
950         if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
951             char pathbuf[256], eltbuf[256], *cp, *elt = s;
952             Stat_t sbuf;
953             int i = 0, j = 0;
954
955             do {          /* DCL$PATH may be a search list */
956                 while (1) {   /* as may dev portion of any element */
957                     if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
958                         if ( *(cp+1) == '.' || *(cp+1) == '-' ||
959                              cando_by_name(S_IWUSR,0,elt) ) {
960                             MgTAINTEDDIR_on(mg);
961                             return 0;
962                         }
963                     }
964                     if ((cp = strchr(elt, ':')) != Nullch)
965                         *cp = '\0';
966                     if (my_trnlnm(elt, eltbuf, j++))
967                         elt = eltbuf;
968                     else
969                         break;
970                 }
971                 j = 0;
972             } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
973         }
974 #endif /* VMS */
975         if (s && klen == 4 && strEQ(ptr,"PATH")) {
976             char *strend = s + len;
977
978             while (s < strend) {
979                 char tmpbuf[256];
980                 Stat_t st;
981                 I32 i;
982                 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
983                              s, strend, ':', &i);
984                 s++;
985                 if (i >= sizeof tmpbuf   /* too long -- assume the worst */
986                       || *tmpbuf != '/'
987                       || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
988                     MgTAINTEDDIR_on(mg);
989                     return 0;
990                 }
991             }
992         }
993     }
994 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
995
996     return 0;
997 }
998
999 int
1000 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
1001 {
1002     STRLEN n_a;
1003     my_setenv(MgPV(mg,n_a),Nullch);
1004     return 0;
1005 }
1006
1007 int
1008 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
1009 {
1010 #if defined(VMS)
1011     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1012 #else
1013     if (PL_localizing) {
1014         HE* entry;
1015         STRLEN n_a;
1016         magic_clear_all_env(sv,mg);
1017         hv_iterinit((HV*)sv);
1018         while ((entry = hv_iternext((HV*)sv))) {
1019             I32 keylen;
1020             my_setenv(hv_iterkey(entry, &keylen),
1021                       SvPV(hv_iterval((HV*)sv, entry), n_a));
1022         }
1023     }
1024 #endif
1025     return 0;
1026 }
1027
1028 int
1029 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
1030 {
1031 #ifndef PERL_MICRO
1032 #if defined(VMS) || defined(EPOC)
1033     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
1034 #else
1035 #  if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
1036     PerlEnv_clearenv();
1037 #  else
1038 #    ifdef USE_ENVIRON_ARRAY
1039 #      if defined(USE_ITHREADS)
1040     /* only the parent thread can clobber the process environment */
1041     if (PL_curinterp == aTHX)
1042 #      endif
1043     {
1044 #      ifndef PERL_USE_SAFE_PUTENV
1045     I32 i;
1046
1047     if (environ == PL_origenviron)
1048         environ = (char**)safesysmalloc(sizeof(char*));
1049     else
1050         for (i = 0; environ[i]; i++)
1051             safesysfree(environ[i]);
1052 #      endif /* PERL_USE_SAFE_PUTENV */
1053
1054     environ[0] = Nullch;
1055     }
1056 #    endif /* USE_ENVIRON_ARRAY */
1057 #   endif /* PERL_IMPLICIT_SYS || WIN32 */
1058 #endif /* VMS || EPOC */
1059 #endif /* !PERL_MICRO */
1060     return 0;
1061 }
1062
1063 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1064 static int sig_handlers_initted = 0;
1065 #endif
1066 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1067 static int sig_ignoring[SIG_SIZE];      /* which signals we are ignoring */
1068 #endif
1069 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1070 static int sig_defaulting[SIG_SIZE];
1071 #endif
1072
1073 #ifndef PERL_MICRO
1074 #ifdef HAS_SIGPROCMASK
1075 static void
1076 restore_sigmask(pTHX_ SV *save_sv)
1077 {
1078     sigset_t *ossetp = (sigset_t *) SvPV_nolen( save_sv );
1079     (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1080 }
1081 #endif
1082 int
1083 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1084 {
1085     I32 i;
1086     STRLEN n_a;
1087     /* Are we fetching a signal entry? */
1088     i = whichsig(MgPV(mg,n_a));
1089     if (i > 0) {
1090         if(PL_psig_ptr[i])
1091             sv_setsv(sv,PL_psig_ptr[i]);
1092         else {
1093             Sighandler_t sigstate;
1094             sigstate = rsignal_state(i);
1095 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1096             if (sig_handlers_initted && sig_ignoring[i]) sigstate = SIG_IGN;
1097 #endif
1098 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1099             if (sig_handlers_initted && sig_defaulting[i]) sigstate = SIG_DFL;
1100 #endif
1101             /* cache state so we don't fetch it again */
1102             if(sigstate == SIG_IGN)
1103                 sv_setpv(sv,"IGNORE");
1104             else
1105                 sv_setsv(sv,&PL_sv_undef);
1106             PL_psig_ptr[i] = SvREFCNT_inc(sv);
1107             SvTEMP_off(sv);
1108         }
1109     }
1110     return 0;
1111 }
1112 int
1113 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1114 {
1115     /* XXX Some of this code was copied from Perl_magic_setsig. A little
1116      * refactoring might be in order.
1117      */
1118     register char *s;
1119     STRLEN n_a;
1120     SV* to_dec;
1121     s = MgPV(mg,n_a);
1122     if (*s == '_') {
1123         SV** svp;
1124         if (strEQ(s,"__DIE__"))
1125             svp = &PL_diehook;
1126         else if (strEQ(s,"__WARN__"))
1127             svp = &PL_warnhook;
1128         else
1129             Perl_croak(aTHX_ "No such hook: %s", s);
1130         if (*svp) {
1131             to_dec = *svp;
1132             *svp = 0;
1133             SvREFCNT_dec(to_dec);
1134         }
1135     }
1136     else {
1137         I32 i;
1138         /* Are we clearing a signal entry? */
1139         i = whichsig(s);
1140         if (i > 0) {
1141 #ifdef HAS_SIGPROCMASK
1142             sigset_t set, save;
1143             SV* save_sv;
1144             /* Avoid having the signal arrive at a bad time, if possible. */
1145             sigemptyset(&set);
1146             sigaddset(&set,i);
1147             sigprocmask(SIG_BLOCK, &set, &save);
1148             ENTER;
1149             save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1150             SAVEFREESV(save_sv);
1151             SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1152 #endif
1153             PERL_ASYNC_CHECK();
1154 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1155             if (!sig_handlers_initted) Perl_csighandler_init();
1156 #endif
1157 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1158             sig_defaulting[i] = 1;
1159             (void)rsignal(i, PL_csighandlerp);
1160 #else
1161             (void)rsignal(i, SIG_DFL);
1162 #endif
1163             if(PL_psig_name[i]) {
1164                 SvREFCNT_dec(PL_psig_name[i]);
1165                 PL_psig_name[i]=0;
1166             }
1167             if(PL_psig_ptr[i]) {
1168                 to_dec=PL_psig_ptr[i];
1169                 PL_psig_ptr[i]=0;
1170                 LEAVE;
1171                 SvREFCNT_dec(to_dec);
1172             }
1173             else
1174                 LEAVE;
1175         }
1176     }
1177     return 0;
1178 }
1179
1180 void
1181 Perl_raise_signal(pTHX_ int sig)
1182 {
1183     /* Set a flag to say this signal is pending */
1184     PL_psig_pend[sig]++;
1185     /* And one to say _a_ signal is pending */
1186     PL_sig_pending = 1;
1187 }
1188
1189 Signal_t
1190 Perl_csighandler(int sig)
1191 {
1192 #ifdef PERL_GET_SIG_CONTEXT
1193     dTHXa(PERL_GET_SIG_CONTEXT);
1194 #else
1195     dTHX;
1196 #endif
1197 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1198     (void) rsignal(sig, PL_csighandlerp);
1199     if (sig_ignoring[sig]) return;
1200 #endif
1201 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1202     if (sig_defaulting[sig])
1203 #ifdef KILL_BY_SIGPRC
1204             exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1205 #else
1206             exit(1);
1207 #endif
1208 #endif
1209    if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
1210         /* Call the perl level handler now--
1211          * with risk we may be in malloc() etc. */
1212         (*PL_sighandlerp)(sig);
1213    else
1214         Perl_raise_signal(aTHX_ sig);
1215 }
1216
1217 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1218 void
1219 Perl_csighandler_init(void)
1220 {
1221     int sig;
1222     if (sig_handlers_initted) return;
1223
1224     for (sig = 1; sig < SIG_SIZE; sig++) {
1225 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1226         dTHX;
1227         sig_defaulting[sig] = 1;
1228         (void) rsignal(sig, PL_csighandlerp);
1229 #endif
1230 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1231         sig_ignoring[sig] = 0;
1232 #endif
1233     }
1234     sig_handlers_initted = 1;
1235 }
1236 #endif
1237
1238 void
1239 Perl_despatch_signals(pTHX)
1240 {
1241     int sig;
1242     PL_sig_pending = 0;
1243     for (sig = 1; sig < SIG_SIZE; sig++) {
1244         if (PL_psig_pend[sig]) {
1245             PERL_BLOCKSIG_ADD(set, sig);
1246             PL_psig_pend[sig] = 0;
1247             PERL_BLOCKSIG_BLOCK(set);
1248             (*PL_sighandlerp)(sig);
1249             PERL_BLOCKSIG_UNBLOCK(set);
1250         }
1251     }
1252 }
1253
1254 int
1255 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1256 {
1257     register char *s;
1258     I32 i;
1259     SV** svp = 0;
1260     /* Need to be careful with SvREFCNT_dec(), because that can have side
1261      * effects (due to closures). We must make sure that the new disposition
1262      * is in place before it is called.
1263      */
1264     SV* to_dec = 0;
1265     STRLEN len;
1266 #ifdef HAS_SIGPROCMASK
1267     sigset_t set, save;
1268     SV* save_sv;
1269 #endif
1270
1271     s = MgPV(mg,len);
1272     if (*s == '_') {
1273         if (strEQ(s,"__DIE__"))
1274             svp = &PL_diehook;
1275         else if (strEQ(s,"__WARN__"))
1276             svp = &PL_warnhook;
1277         else
1278             Perl_croak(aTHX_ "No such hook: %s", s);
1279         i = 0;
1280         if (*svp) {
1281             to_dec = *svp;
1282             *svp = 0;
1283         }
1284     }
1285     else {
1286         i = whichsig(s);        /* ...no, a brick */
1287         if (i < 0) {
1288             if (ckWARN(WARN_SIGNAL))
1289                 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1290             return 0;
1291         }
1292 #ifdef HAS_SIGPROCMASK
1293         /* Avoid having the signal arrive at a bad time, if possible. */
1294         sigemptyset(&set);
1295         sigaddset(&set,i);
1296         sigprocmask(SIG_BLOCK, &set, &save);
1297         ENTER;
1298         save_sv = newSVpv((char *)(&save), sizeof(sigset_t));
1299         SAVEFREESV(save_sv);
1300         SAVEDESTRUCTOR_X(restore_sigmask, save_sv);
1301 #endif
1302         PERL_ASYNC_CHECK();
1303 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1304         if (!sig_handlers_initted) Perl_csighandler_init();
1305 #endif
1306 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1307         sig_ignoring[i] = 0;
1308 #endif
1309 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1310         sig_defaulting[i] = 0;
1311 #endif
1312         SvREFCNT_dec(PL_psig_name[i]);
1313         to_dec = PL_psig_ptr[i];
1314         PL_psig_ptr[i] = SvREFCNT_inc(sv);
1315         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1316         PL_psig_name[i] = newSVpvn(s, len);
1317         SvREADONLY_on(PL_psig_name[i]);
1318     }
1319     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1320         if (i) {
1321             (void)rsignal(i, PL_csighandlerp);
1322 #ifdef HAS_SIGPROCMASK
1323             LEAVE;
1324 #endif
1325         }
1326         else
1327             *svp = SvREFCNT_inc(sv);
1328         if(to_dec)
1329             SvREFCNT_dec(to_dec);
1330         return 0;
1331     }
1332     s = SvPV_force(sv,len);
1333     if (strEQ(s,"IGNORE")) {
1334         if (i) {
1335 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1336             sig_ignoring[i] = 1;
1337             (void)rsignal(i, PL_csighandlerp);
1338 #else
1339             (void)rsignal(i, SIG_IGN);
1340 #endif
1341         }
1342     }
1343     else if (strEQ(s,"DEFAULT") || !*s) {
1344         if (i)
1345 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1346           {
1347             sig_defaulting[i] = 1;
1348             (void)rsignal(i, PL_csighandlerp);
1349           }
1350 #else
1351             (void)rsignal(i, SIG_DFL);
1352 #endif
1353     }
1354     else {
1355         /*
1356          * We should warn if HINT_STRICT_REFS, but without
1357          * access to a known hint bit in a known OP, we can't
1358          * tell whether HINT_STRICT_REFS is in force or not.
1359          */
1360         if (!strchr(s,':') && !strchr(s,'\''))
1361             sv_insert(sv, 0, 0, "main::", 6);
1362         if (i)
1363             (void)rsignal(i, PL_csighandlerp);
1364         else
1365             *svp = SvREFCNT_inc(sv);
1366     }
1367 #ifdef HAS_SIGPROCMASK
1368     if(i)
1369         LEAVE;
1370 #endif
1371     if(to_dec)
1372         SvREFCNT_dec(to_dec);
1373     return 0;
1374 }
1375 #endif /* !PERL_MICRO */
1376
1377 int
1378 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1379 {
1380     PL_sub_generation++;
1381     return 0;
1382 }
1383
1384 int
1385 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1386 {
1387     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1388     PL_amagic_generation++;
1389
1390     return 0;
1391 }
1392
1393 int
1394 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1395 {
1396     HV *hv = (HV*)LvTARG(sv);
1397     I32 i = 0;
1398
1399     if (hv) {
1400          (void) hv_iterinit(hv);
1401          if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1402              i = HvKEYS(hv);
1403          else {
1404              while (hv_iternext(hv))
1405                  i++;
1406          }
1407     }
1408
1409     sv_setiv(sv, (IV)i);
1410     return 0;
1411 }
1412
1413 int
1414 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1415 {
1416     if (LvTARG(sv)) {
1417         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1418     }
1419     return 0;
1420 }
1421
1422 /* caller is responsible for stack switching/cleanup */
1423 STATIC int
1424 S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
1425 {
1426     dSP;
1427
1428     PUSHMARK(SP);
1429     EXTEND(SP, n);
1430     PUSHs(SvTIED_obj(sv, mg));
1431     if (n > 1) {
1432         if (mg->mg_ptr) {
1433             if (mg->mg_len >= 0)
1434                 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1435             else if (mg->mg_len == HEf_SVKEY)
1436                 PUSHs((SV*)mg->mg_ptr);
1437         }
1438         else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1439             PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1440         }
1441     }
1442     if (n > 2) {
1443         PUSHs(val);
1444     }
1445     PUTBACK;
1446
1447     return call_method(meth, flags);
1448 }
1449
1450 STATIC int
1451 S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
1452 {
1453     dSP;
1454
1455     ENTER;
1456     SAVETMPS;
1457     PUSHSTACKi(PERLSI_MAGIC);
1458
1459     if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1460         sv_setsv(sv, *PL_stack_sp--);
1461     }
1462
1463     POPSTACK;
1464     FREETMPS;
1465     LEAVE;
1466     return 0;
1467 }
1468
1469 int
1470 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1471 {
1472     if (mg->mg_ptr)
1473         mg->mg_flags |= MGf_GSKIP;
1474     magic_methpack(sv,mg,"FETCH");
1475     return 0;
1476 }
1477
1478 int
1479 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1480 {
1481     dSP;
1482     ENTER;
1483     PUSHSTACKi(PERLSI_MAGIC);
1484     magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1485     POPSTACK;
1486     LEAVE;
1487     return 0;
1488 }
1489
1490 int
1491 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1492 {
1493     return magic_methpack(sv,mg,"DELETE");
1494 }
1495
1496
1497 U32
1498 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1499 {
1500     dSP;
1501     U32 retval = 0;
1502
1503     ENTER;
1504     SAVETMPS;
1505     PUSHSTACKi(PERLSI_MAGIC);
1506     if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1507         sv = *PL_stack_sp--;
1508         retval = (U32) SvIV(sv)-1;
1509     }
1510     POPSTACK;
1511     FREETMPS;
1512     LEAVE;
1513     return retval;
1514 }
1515
1516 int
1517 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1518 {
1519     dSP;
1520
1521     ENTER;
1522     PUSHSTACKi(PERLSI_MAGIC);
1523     PUSHMARK(SP);
1524     XPUSHs(SvTIED_obj(sv, mg));
1525     PUTBACK;
1526     call_method("CLEAR", G_SCALAR|G_DISCARD);
1527     POPSTACK;
1528     LEAVE;
1529     return 0;
1530 }
1531
1532 int
1533 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1534 {
1535     dSP;
1536     const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1537
1538     ENTER;
1539     SAVETMPS;
1540     PUSHSTACKi(PERLSI_MAGIC);
1541     PUSHMARK(SP);
1542     EXTEND(SP, 2);
1543     PUSHs(SvTIED_obj(sv, mg));
1544     if (SvOK(key))
1545         PUSHs(key);
1546     PUTBACK;
1547
1548     if (call_method(meth, G_SCALAR))
1549         sv_setsv(key, *PL_stack_sp--);
1550
1551     POPSTACK;
1552     FREETMPS;
1553     LEAVE;
1554     return 0;
1555 }
1556
1557 int
1558 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1559 {
1560     return magic_methpack(sv,mg,"EXISTS");
1561 }
1562
1563 int
1564 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1565 {
1566     OP *o;
1567     I32 i;
1568     GV* gv;
1569     SV** svp;
1570     STRLEN n_a;
1571
1572     gv = PL_DBline;
1573     i = SvTRUE(sv);
1574     svp = av_fetch(GvAV(gv),
1575                      atoi(MgPV(mg,n_a)), FALSE);
1576     if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp)))) {
1577         /* set or clear breakpoint in the relevant control op */
1578         if (i)
1579             o->op_flags |= OPf_SPECIAL;
1580         else
1581             o->op_flags &= ~OPf_SPECIAL;
1582     }
1583     return 0;
1584 }
1585
1586 int
1587 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1588 {
1589     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1590     return 0;
1591 }
1592
1593 int
1594 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1595 {
1596     av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1597     return 0;
1598 }
1599
1600 int
1601 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1602 {
1603     SV* lsv = LvTARG(sv);
1604
1605     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1606         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1607         if (mg && mg->mg_len >= 0) {
1608             I32 i = mg->mg_len;
1609             if (DO_UTF8(lsv))
1610                 sv_pos_b2u(lsv, &i);
1611             sv_setiv(sv, i + PL_curcop->cop_arybase);
1612             return 0;
1613         }
1614     }
1615     (void)SvOK_off(sv);
1616     return 0;
1617 }
1618
1619 int
1620 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1621 {
1622     SV* lsv = LvTARG(sv);
1623     SSize_t pos;
1624     STRLEN len;
1625     STRLEN ulen = 0;
1626
1627     mg = 0;
1628
1629     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1630         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1631     if (!mg) {
1632         if (!SvOK(sv))
1633             return 0;
1634         sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1635         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1636     }
1637     else if (!SvOK(sv)) {
1638         mg->mg_len = -1;
1639         return 0;
1640     }
1641     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1642
1643     pos = SvIV(sv) - PL_curcop->cop_arybase;
1644
1645     if (DO_UTF8(lsv)) {
1646         ulen = sv_len_utf8(lsv);
1647         if (ulen)
1648             len = ulen;
1649     }
1650
1651     if (pos < 0) {
1652         pos += len;
1653         if (pos < 0)
1654             pos = 0;
1655     }
1656     else if (pos > (SSize_t)len)
1657         pos = len;
1658
1659     if (ulen) {
1660         I32 p = pos;
1661         sv_pos_u2b(lsv, &p, 0);
1662         pos = p;
1663     }
1664
1665     mg->mg_len = pos;
1666     mg->mg_flags &= ~MGf_MINMATCH;
1667
1668     return 0;
1669 }
1670
1671 int
1672 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1673 {
1674     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1675         SvFAKE_off(sv);
1676         gv_efullname3(sv,((GV*)sv), "*");
1677         SvFAKE_on(sv);
1678     }
1679     else
1680         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1681     return 0;
1682 }
1683
1684 int
1685 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1686 {
1687     register char *s;
1688     GV* gv;
1689     STRLEN n_a;
1690
1691     if (!SvOK(sv))
1692         return 0;
1693     s = SvPV(sv, n_a);
1694     if (*s == '*' && s[1])
1695         s++;
1696     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1697     if (sv == (SV*)gv)
1698         return 0;
1699     if (GvGP(sv))
1700         gp_free((GV*)sv);
1701     GvGP(sv) = gp_ref(GvGP(gv));
1702     return 0;
1703 }
1704
1705 int
1706 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1707 {
1708     STRLEN len;
1709     SV *lsv = LvTARG(sv);
1710     char *tmps = SvPV(lsv,len);
1711     I32 offs = LvTARGOFF(sv);
1712     I32 rem = LvTARGLEN(sv);
1713
1714     if (SvUTF8(lsv))
1715         sv_pos_u2b(lsv, &offs, &rem);
1716     if (offs > (I32)len)
1717         offs = len;
1718     if (rem + offs > (I32)len)
1719         rem = len - offs;
1720     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1721     if (SvUTF8(lsv))
1722         SvUTF8_on(sv);
1723     return 0;
1724 }
1725
1726 int
1727 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1728 {
1729     STRLEN len;
1730     char *tmps = SvPV(sv, len);
1731     SV *lsv = LvTARG(sv);
1732     I32 lvoff = LvTARGOFF(sv);
1733     I32 lvlen = LvTARGLEN(sv);
1734
1735     if (DO_UTF8(sv)) {
1736         sv_utf8_upgrade(lsv);
1737         sv_pos_u2b(lsv, &lvoff, &lvlen);
1738         sv_insert(lsv, lvoff, lvlen, tmps, len);
1739         SvUTF8_on(lsv);
1740     }
1741     else if (lsv && SvUTF8(lsv)) {
1742         sv_pos_u2b(lsv, &lvoff, &lvlen);
1743         tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1744         sv_insert(lsv, lvoff, lvlen, tmps, len);
1745         Safefree(tmps);
1746     }
1747     else
1748         sv_insert(lsv, lvoff, lvlen, tmps, len);
1749
1750     return 0;
1751 }
1752
1753 int
1754 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1755 {
1756     TAINT_IF((mg->mg_len & 1) ||
1757              ((mg->mg_len & 2) && mg->mg_obj == sv));   /* kludge */
1758     return 0;
1759 }
1760
1761 int
1762 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1763 {
1764     if (PL_localizing) {
1765         if (PL_localizing == 1)
1766             mg->mg_len <<= 1;
1767         else
1768             mg->mg_len >>= 1;
1769     }
1770     else if (PL_tainted)
1771         mg->mg_len |= 1;
1772     else
1773         mg->mg_len &= ~1;
1774     return 0;
1775 }
1776
1777 int
1778 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1779 {
1780     SV *lsv = LvTARG(sv);
1781
1782     if (!lsv) {
1783         (void)SvOK_off(sv);
1784         return 0;
1785     }
1786
1787     sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1788     return 0;
1789 }
1790
1791 int
1792 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1793 {
1794     do_vecset(sv);      /* XXX slurp this routine */
1795     return 0;
1796 }
1797
1798 int
1799 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1800 {
1801     SV *targ = Nullsv;
1802     if (LvTARGLEN(sv)) {
1803         if (mg->mg_obj) {
1804             SV *ahv = LvTARG(sv);
1805             HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1806             if (he)
1807                 targ = HeVAL(he);
1808         }
1809         else {
1810             AV* av = (AV*)LvTARG(sv);
1811             if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1812                 targ = AvARRAY(av)[LvTARGOFF(sv)];
1813         }
1814         if (targ && targ != &PL_sv_undef) {
1815             /* somebody else defined it for us */
1816             SvREFCNT_dec(LvTARG(sv));
1817             LvTARG(sv) = SvREFCNT_inc(targ);
1818             LvTARGLEN(sv) = 0;
1819             SvREFCNT_dec(mg->mg_obj);
1820             mg->mg_obj = Nullsv;
1821             mg->mg_flags &= ~MGf_REFCOUNTED;
1822         }
1823     }
1824     else
1825         targ = LvTARG(sv);
1826     sv_setsv(sv, targ ? targ : &PL_sv_undef);
1827     return 0;
1828 }
1829
1830 int
1831 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1832 {
1833     if (LvTARGLEN(sv))
1834         vivify_defelem(sv);
1835     if (LvTARG(sv)) {
1836         sv_setsv(LvTARG(sv), sv);
1837         SvSETMAGIC(LvTARG(sv));
1838     }
1839     return 0;
1840 }
1841
1842 void
1843 Perl_vivify_defelem(pTHX_ SV *sv)
1844 {
1845     MAGIC *mg;
1846     SV *value = Nullsv;
1847
1848     if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1849         return;
1850     if (mg->mg_obj) {
1851         SV *ahv = LvTARG(sv);
1852         STRLEN n_a;
1853         HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1854         if (he)
1855             value = HeVAL(he);
1856         if (!value || value == &PL_sv_undef)
1857             Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1858     }
1859     else {
1860         AV* av = (AV*)LvTARG(sv);
1861         if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1862             LvTARG(sv) = Nullsv;        /* array can't be extended */
1863         else {
1864             SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1865             if (!svp || (value = *svp) == &PL_sv_undef)
1866                 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1867         }
1868     }
1869     (void)SvREFCNT_inc(value);
1870     SvREFCNT_dec(LvTARG(sv));
1871     LvTARG(sv) = value;
1872     LvTARGLEN(sv) = 0;
1873     SvREFCNT_dec(mg->mg_obj);
1874     mg->mg_obj = Nullsv;
1875     mg->mg_flags &= ~MGf_REFCOUNTED;
1876 }
1877
1878 int
1879 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1880 {
1881     AV *av = (AV*)mg->mg_obj;
1882     SV **svp = AvARRAY(av);
1883     I32 i = AvFILLp(av);
1884     while (i >= 0) {
1885         if (svp[i] && svp[i] != &PL_sv_undef) {
1886             if (!SvWEAKREF(svp[i]))
1887                 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1888             /* XXX Should we check that it hasn't changed? */
1889             SvRV(svp[i]) = 0;
1890             (void)SvOK_off(svp[i]);
1891             SvWEAKREF_off(svp[i]);
1892             svp[i] = &PL_sv_undef;
1893         }
1894         i--;
1895     }
1896     SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
1897     return 0;
1898 }
1899
1900 int
1901 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1902 {
1903     mg->mg_len = -1;
1904     SvSCREAM_off(sv);
1905     return 0;
1906 }
1907
1908 int
1909 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
1910 {
1911     sv_unmagic(sv, PERL_MAGIC_bm);
1912     SvVALID_off(sv);
1913     return 0;
1914 }
1915
1916 int
1917 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
1918 {
1919     sv_unmagic(sv, PERL_MAGIC_fm);
1920     SvCOMPILED_off(sv);
1921     return 0;
1922 }
1923
1924 int
1925 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
1926 {
1927     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1928
1929     if (uf && uf->uf_set)
1930         (*uf->uf_set)(aTHX_ uf->uf_index, sv);
1931     return 0;
1932 }
1933
1934 int
1935 Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg)
1936 {
1937     sv_unmagic(sv, PERL_MAGIC_qr);
1938     return 0;
1939 }
1940
1941 int
1942 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
1943 {
1944     regexp *re = (regexp *)mg->mg_obj;
1945     ReREFCNT_dec(re);
1946     return 0;
1947 }
1948
1949 #ifdef USE_LOCALE_COLLATE
1950 int
1951 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
1952 {
1953     /*
1954      * RenE<eacute> Descartes said "I think not."
1955      * and vanished with a faint plop.
1956      */
1957     if (mg->mg_ptr) {
1958         Safefree(mg->mg_ptr);
1959         mg->mg_ptr = NULL;
1960         mg->mg_len = -1;
1961     }
1962     return 0;
1963 }
1964 #endif /* USE_LOCALE_COLLATE */
1965
1966 /* Just clear the UTF-8 cache data. */
1967 int
1968 Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg)
1969 {
1970     Safefree(mg->mg_ptr);       /* The mg_ptr holds the pos cache. */
1971     mg->mg_ptr = 0;
1972     mg->mg_len = -1;            /* The mg_len holds the len cache. */
1973     return 0;
1974 }
1975
1976 int
1977 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
1978 {
1979     register char *s;
1980     I32 i;
1981     STRLEN len;
1982     switch (*mg->mg_ptr) {
1983     case '\001':        /* ^A */
1984         sv_setsv(PL_bodytarget, sv);
1985         break;
1986     case '\003':        /* ^C */
1987         PL_minus_c = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1988         break;
1989
1990     case '\004':        /* ^D */
1991 #ifdef DEBUGGING
1992         s = SvPV_nolen(sv);
1993         PL_debug = get_debug_opts(&s) | DEBUG_TOP_FLAG;
1994         DEBUG_x(dump_all());
1995 #else
1996         PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
1997 #endif
1998         break;
1999     case '\005':  /* ^E */
2000         if (*(mg->mg_ptr+1) == '\0') {
2001 #ifdef MACOS_TRADITIONAL
2002             gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2003 #else
2004 #  ifdef VMS
2005             set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2006 #  else
2007 #    ifdef WIN32
2008             SetLastError( SvIV(sv) );
2009 #    else
2010 #      ifdef OS2
2011             os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2012 #      else
2013             /* will anyone ever use this? */
2014             SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
2015 #      endif
2016 #    endif
2017 #  endif
2018 #endif
2019         }
2020         else if (strEQ(mg->mg_ptr+1, "NCODING")) {
2021             if (PL_encoding)
2022                 SvREFCNT_dec(PL_encoding);
2023             if (SvOK(sv) || SvGMAGICAL(sv)) {
2024                 PL_encoding = newSVsv(sv);
2025             }
2026             else {
2027                 PL_encoding = Nullsv;
2028             }
2029         }
2030         break;
2031     case '\006':        /* ^F */
2032         PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2033         break;
2034     case '\010':        /* ^H */
2035         PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2036         break;
2037     case '\011':        /* ^I */ /* NOT \t in EBCDIC */
2038         if (PL_inplace)
2039             Safefree(PL_inplace);
2040         if (SvOK(sv))
2041             PL_inplace = savepv(SvPV(sv,len));
2042         else
2043             PL_inplace = Nullch;
2044         break;
2045     case '\017':        /* ^O */
2046         if (*(mg->mg_ptr+1) == '\0') {
2047             if (PL_osname)
2048                 Safefree(PL_osname);
2049             if (SvOK(sv))
2050                 PL_osname = savepv(SvPV(sv,len));
2051             else
2052                 PL_osname = Nullch;
2053         }
2054         else if (strEQ(mg->mg_ptr, "\017PEN")) {
2055             if (!PL_compiling.cop_io)
2056                 PL_compiling.cop_io = newSVsv(sv);
2057             else
2058                 sv_setsv(PL_compiling.cop_io,sv);
2059         }
2060         break;
2061     case '\020':        /* ^P */
2062         PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2063         if (PL_perldb && !PL_DBsingle)
2064             init_debugger();
2065         break;
2066     case '\024':        /* ^T */
2067 #ifdef BIG_TIME
2068         PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
2069 #else
2070         PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2071 #endif
2072         break;
2073     case '\027':        /* ^W & $^WARNING_BITS */
2074         if (*(mg->mg_ptr+1) == '\0') {
2075             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2076                 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2077                 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
2078                                 | (i ? G_WARN_ON : G_WARN_OFF) ;
2079             }
2080         }
2081         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
2082             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
2083                 if (!SvPOK(sv) && PL_localizing) {
2084                     sv_setpvn(sv, WARN_NONEstring, WARNsize);
2085                     PL_compiling.cop_warnings = pWARN_NONE;
2086                     break;
2087                 }
2088                 {
2089                     STRLEN len, i;
2090                     int accumulate = 0 ;
2091                     int any_fatals = 0 ;
2092                     char * ptr = (char*)SvPV(sv, len) ;
2093                     for (i = 0 ; i < len ; ++i) {
2094                         accumulate |= ptr[i] ;
2095                         any_fatals |= (ptr[i] & 0xAA) ;
2096                     }
2097                     if (!accumulate)
2098                         PL_compiling.cop_warnings = pWARN_NONE;
2099                     else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
2100                         PL_compiling.cop_warnings = pWARN_ALL;
2101                         PL_dowarn |= G_WARN_ONCE ;
2102                     }
2103                     else {
2104                         if (specialWARN(PL_compiling.cop_warnings))
2105                             PL_compiling.cop_warnings = newSVsv(sv) ;
2106                         else
2107                             sv_setsv(PL_compiling.cop_warnings, sv);
2108                         if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
2109                             PL_dowarn |= G_WARN_ONCE ;
2110                     }
2111
2112                 }
2113             }
2114         }
2115         break;
2116     case '.':
2117         if (PL_localizing) {
2118             if (PL_localizing == 1)
2119                 SAVESPTR(PL_last_in_gv);
2120         }
2121         else if (SvOK(sv) && GvIO(PL_last_in_gv))
2122             IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
2123         break;
2124     case '^':
2125         Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
2126         IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
2127         IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2128         break;
2129     case '~':
2130         Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
2131         IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
2132         IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
2133         break;
2134     case '=':
2135         IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2136         break;
2137     case '-':
2138         IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2139         if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
2140             IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
2141         break;
2142     case '%':
2143         IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2144         break;
2145     case '|':
2146         {
2147             IO *io = GvIOp(PL_defoutgv);
2148             if(!io)
2149               break;
2150             if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
2151                 IoFLAGS(io) &= ~IOf_FLUSH;
2152             else {
2153                 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2154                     PerlIO *ofp = IoOFP(io);
2155                     if (ofp)
2156                         (void)PerlIO_flush(ofp);
2157                     IoFLAGS(io) |= IOf_FLUSH;
2158                 }
2159             }
2160         }
2161         break;
2162     case '/':
2163         SvREFCNT_dec(PL_rs);
2164         PL_rs = newSVsv(sv);
2165         break;
2166     case '\\':
2167         if (PL_ors_sv)
2168             SvREFCNT_dec(PL_ors_sv);
2169         if (SvOK(sv) || SvGMAGICAL(sv)) {
2170             PL_ors_sv = newSVsv(sv);
2171         }
2172         else {
2173             PL_ors_sv = Nullsv;
2174         }
2175         break;
2176     case ',':
2177         if (PL_ofs_sv)
2178             SvREFCNT_dec(PL_ofs_sv);
2179         if (SvOK(sv) || SvGMAGICAL(sv)) {
2180             PL_ofs_sv = newSVsv(sv);
2181         }
2182         else {
2183             PL_ofs_sv = Nullsv;
2184         }
2185         break;
2186     case '#':
2187         if (PL_ofmt)
2188             Safefree(PL_ofmt);
2189         PL_ofmt = savepv(SvPV(sv,len));
2190         break;
2191     case '[':
2192         PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2193         break;
2194     case '?':
2195 #ifdef COMPLEX_STATUS
2196         if (PL_localizing == 2) {
2197             PL_statusvalue = LvTARGOFF(sv);
2198             PL_statusvalue_vms = LvTARGLEN(sv);
2199         }
2200         else
2201 #endif
2202 #ifdef VMSISH_STATUS
2203         if (VMSISH_STATUS)
2204             STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2205         else
2206 #endif
2207             STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2208         break;
2209     case '!':
2210         {
2211 #ifdef VMS
2212 #   define PERL_VMS_BANG vaxc$errno
2213 #else
2214 #   define PERL_VMS_BANG 0
2215 #endif
2216         SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2217                  (SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
2218         }
2219         break;
2220     case '<':
2221         PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2222         if (PL_delaymagic) {
2223             PL_delaymagic |= DM_RUID;
2224             break;                              /* don't do magic till later */
2225         }
2226 #ifdef HAS_SETRUID
2227         (void)setruid((Uid_t)PL_uid);
2228 #else
2229 #ifdef HAS_SETREUID
2230         (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2231 #else
2232 #ifdef HAS_SETRESUID
2233       (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2234 #else
2235         if (PL_uid == PL_euid)          /* special case $< = $> */
2236             (void)PerlProc_setuid(PL_uid);
2237         else {
2238             PL_uid = PerlProc_getuid();
2239             Perl_croak(aTHX_ "setruid() not implemented");
2240         }
2241 #endif
2242 #endif
2243 #endif
2244         PL_uid = PerlProc_getuid();
2245         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2246         break;
2247     case '>':
2248         PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2249         if (PL_delaymagic) {
2250             PL_delaymagic |= DM_EUID;
2251             break;                              /* don't do magic till later */
2252         }
2253 #ifdef HAS_SETEUID
2254         (void)seteuid((Uid_t)PL_euid);
2255 #else
2256 #ifdef HAS_SETREUID
2257         (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2258 #else
2259 #ifdef HAS_SETRESUID
2260         (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2261 #else
2262         if (PL_euid == PL_uid)          /* special case $> = $< */
2263             PerlProc_setuid(PL_euid);
2264         else {
2265             PL_euid = PerlProc_geteuid();
2266             Perl_croak(aTHX_ "seteuid() not implemented");
2267         }
2268 #endif
2269 #endif
2270 #endif
2271         PL_euid = PerlProc_geteuid();
2272         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2273         break;
2274     case '(':
2275         PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2276         if (PL_delaymagic) {
2277             PL_delaymagic |= DM_RGID;
2278             break;                              /* don't do magic till later */
2279         }
2280 #ifdef HAS_SETRGID
2281         (void)setrgid((Gid_t)PL_gid);
2282 #else
2283 #ifdef HAS_SETREGID
2284         (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2285 #else
2286 #ifdef HAS_SETRESGID
2287       (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2288 #else
2289         if (PL_gid == PL_egid)                  /* special case $( = $) */
2290             (void)PerlProc_setgid(PL_gid);
2291         else {
2292             PL_gid = PerlProc_getgid();
2293             Perl_croak(aTHX_ "setrgid() not implemented");
2294         }
2295 #endif
2296 #endif
2297 #endif
2298         PL_gid = PerlProc_getgid();
2299         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2300         break;
2301     case ')':
2302 #ifdef HAS_SETGROUPS
2303         {
2304             char *p = SvPV(sv, len);
2305             Groups_t gary[NGROUPS];
2306
2307             while (isSPACE(*p))
2308                 ++p;
2309             PL_egid = Atol(p);
2310             for (i = 0; i < NGROUPS; ++i) {
2311                 while (*p && !isSPACE(*p))
2312                     ++p;
2313                 while (isSPACE(*p))
2314                     ++p;
2315                 if (!*p)
2316                     break;
2317                 gary[i] = Atol(p);
2318             }
2319             if (i)
2320                 (void)setgroups(i, gary);
2321         }
2322 #else  /* HAS_SETGROUPS */
2323         PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2324 #endif /* HAS_SETGROUPS */
2325         if (PL_delaymagic) {
2326             PL_delaymagic |= DM_EGID;
2327             break;                              /* don't do magic till later */
2328         }
2329 #ifdef HAS_SETEGID
2330         (void)setegid((Gid_t)PL_egid);
2331 #else
2332 #ifdef HAS_SETREGID
2333         (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2334 #else
2335 #ifdef HAS_SETRESGID
2336         (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2337 #else
2338         if (PL_egid == PL_gid)                  /* special case $) = $( */
2339             (void)PerlProc_setgid(PL_egid);
2340         else {
2341             PL_egid = PerlProc_getegid();
2342             Perl_croak(aTHX_ "setegid() not implemented");
2343         }
2344 #endif
2345 #endif
2346 #endif
2347         PL_egid = PerlProc_getegid();
2348         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2349         break;
2350     case ':':
2351         PL_chopset = SvPV_force(sv,len);
2352         break;
2353 #ifndef MACOS_TRADITIONAL
2354     case '0':
2355         LOCK_DOLLARZERO_MUTEX;
2356 #ifdef HAS_SETPROCTITLE
2357         /* The BSDs don't show the argv[] in ps(1) output, they
2358          * show a string from the process struct and provide
2359          * the setproctitle() routine to manipulate that. */
2360         {
2361             s = SvPV(sv, len);
2362 #   if __FreeBSD_version > 410001
2363             /* The leading "-" removes the "perl: " prefix,
2364              * but not the "(perl) suffix from the ps(1)
2365              * output, because that's what ps(1) shows if the
2366              * argv[] is modified. */
2367             setproctitle("-%s", s);
2368 #   else        /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2369             /* This doesn't really work if you assume that
2370              * $0 = 'foobar'; will wipe out 'perl' from the $0
2371              * because in ps(1) output the result will be like
2372              * sprintf("perl: %s (perl)", s)
2373              * I guess this is a security feature:
2374              * one (a user process) cannot get rid of the original name.
2375              * --jhi */
2376             setproctitle("%s", s);
2377 #   endif
2378         }
2379 #endif
2380 #if defined(__hpux) && defined(PSTAT_SETCMD)
2381         {
2382              union pstun un;
2383              s = SvPV(sv, len);
2384              un.pst_command = s;
2385              pstat(PSTAT_SETCMD, un, len, 0, 0);
2386         }
2387 #endif
2388         /* PL_origalen is set in perl_parse(). */
2389         s = SvPV_force(sv,len);
2390         if (len >= (STRLEN)PL_origalen) {
2391             /* Longer than original, will be truncated. */
2392             Copy(s, PL_origargv[0], PL_origalen, char);
2393             PL_origargv[0][PL_origalen - 1] = 0;
2394         }
2395         else {
2396             /* Shorter than original, will be padded. */
2397             Copy(s, PL_origargv[0], len, char);
2398             PL_origargv[0][len] = 0;
2399             memset(PL_origargv[0] + len + 1,
2400                    /* Is the space counterintuitive?  Yes.
2401                     * (You were expecting \0?)  
2402                     * Does it work?  Seems to.  (In Linux 2.4.20 at least.)
2403                     * --jhi */
2404                    (int)' ',
2405                    PL_origalen - len - 1);
2406             for (i = 1; i < PL_origargc; i++)
2407                  PL_origargv[i] = 0;
2408         }
2409         UNLOCK_DOLLARZERO_MUTEX;
2410         break;
2411 #endif
2412     }
2413     return 0;
2414 }
2415
2416 I32
2417 Perl_whichsig(pTHX_ char *sig)
2418 {
2419     register char **sigv;
2420
2421     for (sigv = PL_sig_name; *sigv; sigv++)
2422         if (strEQ(sig,*sigv))
2423             return PL_sig_num[sigv - PL_sig_name];
2424 #ifdef SIGCLD
2425     if (strEQ(sig,"CHLD"))
2426         return SIGCLD;
2427 #endif
2428 #ifdef SIGCHLD
2429     if (strEQ(sig,"CLD"))
2430         return SIGCHLD;
2431 #endif
2432     return -1;
2433 }
2434
2435 #if !defined(PERL_IMPLICIT_CONTEXT)
2436 static SV* sig_sv;
2437 #endif
2438
2439 Signal_t
2440 Perl_sighandler(int sig)
2441 {
2442 #ifdef PERL_GET_SIG_CONTEXT
2443     dTHXa(PERL_GET_SIG_CONTEXT);
2444 #else
2445     dTHX;
2446 #endif
2447     dSP;
2448     GV *gv = Nullgv;
2449     HV *st;
2450     SV *sv = Nullsv, *tSv = PL_Sv;
2451     CV *cv = Nullcv;
2452     OP *myop = PL_op;
2453     U32 flags = 0;
2454     XPV *tXpv = PL_Xpv;
2455
2456     if (PL_savestack_ix + 15 <= PL_savestack_max)
2457         flags |= 1;
2458     if (PL_markstack_ptr < PL_markstack_max - 2)
2459         flags |= 4;
2460     if (PL_retstack_ix < PL_retstack_max - 2)
2461         flags |= 8;
2462     if (PL_scopestack_ix < PL_scopestack_max - 3)
2463         flags |= 16;
2464
2465     if (!PL_psig_ptr[sig]) {
2466                 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2467                                  PL_sig_name[sig]);
2468                 exit(sig);
2469         }
2470
2471     /* Max number of items pushed there is 3*n or 4. We cannot fix
2472        infinity, so we fix 4 (in fact 5): */
2473     if (flags & 1) {
2474         PL_savestack_ix += 5;           /* Protect save in progress. */
2475         SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2476     }
2477     if (flags & 4)
2478         PL_markstack_ptr++;             /* Protect mark. */
2479     if (flags & 8) {
2480         PL_retstack_ix++;
2481         PL_retstack[PL_retstack_ix] = NULL;
2482     }
2483     if (flags & 16)
2484         PL_scopestack_ix += 1;
2485     /* sv_2cv is too complicated, try a simpler variant first: */
2486     if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2487         || SvTYPE(cv) != SVt_PVCV)
2488         cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2489
2490     if (!cv || !CvROOT(cv)) {
2491         if (ckWARN(WARN_SIGNAL))
2492             Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2493                 PL_sig_name[sig], (gv ? GvENAME(gv)
2494                                 : ((cv && CvGV(cv))
2495                                    ? GvENAME(CvGV(cv))
2496                                    : "__ANON__")));
2497         goto cleanup;
2498     }
2499
2500     if(PL_psig_name[sig]) {
2501         sv = SvREFCNT_inc(PL_psig_name[sig]);
2502         flags |= 64;
2503 #if !defined(PERL_IMPLICIT_CONTEXT)
2504         sig_sv = sv;
2505 #endif
2506     } else {
2507         sv = sv_newmortal();
2508         sv_setpv(sv,PL_sig_name[sig]);
2509     }
2510
2511     PUSHSTACKi(PERLSI_SIGNAL);
2512     PUSHMARK(SP);
2513     PUSHs(sv);
2514     PUTBACK;
2515
2516     call_sv((SV*)cv, G_DISCARD|G_EVAL);
2517
2518     POPSTACK;
2519     if (SvTRUE(ERRSV)) {
2520 #ifndef PERL_MICRO
2521 #ifdef HAS_SIGPROCMASK
2522         /* Handler "died", for example to get out of a restart-able read().
2523          * Before we re-do that on its behalf re-enable the signal which was
2524          * blocked by the system when we entered.
2525          */
2526         sigset_t set;
2527         sigemptyset(&set);
2528         sigaddset(&set,sig);
2529         sigprocmask(SIG_UNBLOCK, &set, NULL);
2530 #else
2531         /* Not clear if this will work */
2532         (void)rsignal(sig, SIG_IGN);
2533         (void)rsignal(sig, PL_csighandlerp);
2534 #endif
2535 #endif /* !PERL_MICRO */
2536         Perl_die(aTHX_ Nullformat);
2537     }
2538 cleanup:
2539     if (flags & 1)
2540         PL_savestack_ix -= 8; /* Unprotect save in progress. */
2541     if (flags & 4)
2542         PL_markstack_ptr--;
2543     if (flags & 8)
2544         PL_retstack_ix--;
2545     if (flags & 16)
2546         PL_scopestack_ix -= 1;
2547     if (flags & 64)
2548         SvREFCNT_dec(sv);
2549     PL_op = myop;                       /* Apparently not needed... */
2550
2551     PL_Sv = tSv;                        /* Restore global temporaries. */
2552     PL_Xpv = tXpv;
2553     return;
2554 }
2555
2556
2557 static void
2558 restore_magic(pTHX_ void *p)
2559 {
2560     MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2561     SV* sv = mgs->mgs_sv;
2562
2563     if (!sv)
2564         return;
2565
2566     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2567     {
2568         if (mgs->mgs_flags)
2569             SvFLAGS(sv) |= mgs->mgs_flags;
2570         else
2571             mg_magical(sv);
2572         if (SvGMAGICAL(sv))
2573             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2574     }
2575
2576     mgs->mgs_sv = NULL;  /* mark the MGS structure as restored */
2577
2578     /* If we're still on top of the stack, pop us off.  (That condition
2579      * will be satisfied if restore_magic was called explicitly, but *not*
2580      * if it's being called via leave_scope.)
2581      * The reason for doing this is that otherwise, things like sv_2cv()
2582      * may leave alloc gunk on the savestack, and some code
2583      * (e.g. sighandler) doesn't expect that...
2584      */
2585     if (PL_savestack_ix == mgs->mgs_ss_ix)
2586     {
2587         I32 popval = SSPOPINT;
2588         assert(popval == SAVEt_DESTRUCTOR_X);
2589         PL_savestack_ix -= 2;
2590         popval = SSPOPINT;
2591         assert(popval == SAVEt_ALLOC);
2592         popval = SSPOPINT;
2593         PL_savestack_ix -= popval;
2594     }
2595
2596 }
2597
2598 static void
2599 unwind_handler_stack(pTHX_ void *p)
2600 {
2601     U32 flags = *(U32*)p;
2602
2603     if (flags & 1)
2604         PL_savestack_ix -= 5; /* Unprotect save in progress. */
2605     /* cxstack_ix-- Not needed, die already unwound it. */
2606 #if !defined(PERL_IMPLICIT_CONTEXT)
2607     if (flags & 64)
2608         SvREFCNT_dec(sig_sv);
2609 #endif
2610 }
2611
2612