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