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