Support '%i' format and 'h' modifier in s?printf
[p5sagit/p5-mst-13.2.git] / mg.c
1 /*    mg.c
2  *
3  *    Copyright (c) 1991-1994, 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 #include "EXTERN.h"
16 #include "perl.h"
17
18 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
19 #ifdef I_UNISTD
20 # include <unistd.h>
21 #endif
22
23 #ifdef HAS_GETGROUPS
24 #  ifndef NGROUPS
25 #    define NGROUPS 32
26 #  endif
27 #endif
28
29 /*
30  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
31  */
32
33 struct magic_state {
34     SV* mgs_sv;
35     U32 mgs_flags;
36 };
37 typedef struct magic_state MGS;
38
39 static void restore_magic _((void *p));
40
41 static void
42 save_magic(mgs, sv)
43 MGS* mgs;
44 SV* sv;
45 {
46     assert(SvMAGICAL(sv));
47
48     mgs->mgs_sv = sv;
49     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
50     SAVEDESTRUCTOR(restore_magic, mgs);
51
52     SvMAGICAL_off(sv);
53     SvREADONLY_off(sv);
54     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
55 }
56
57 static void
58 restore_magic(p)
59 void* p;
60 {
61     MGS* mgs = (MGS*)p;
62     SV* sv = mgs->mgs_sv;
63
64     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
65     {
66         if (mgs->mgs_flags)
67             SvFLAGS(sv) |= mgs->mgs_flags;
68         else
69             mg_magical(sv);
70         if (SvGMAGICAL(sv))
71             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
72     }
73 }
74
75
76 void
77 mg_magical(sv)
78 SV* sv;
79 {
80     MAGIC* mg;
81     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
82         MGVTBL* vtbl = mg->mg_virtual;
83         if (vtbl) {
84             if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
85                 SvGMAGICAL_on(sv);
86             if (vtbl->svt_set)
87                 SvSMAGICAL_on(sv);
88             if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
89                 SvRMAGICAL_on(sv);
90         }
91     }
92 }
93
94 int
95 mg_get(sv)
96 SV* sv;
97 {
98     MGS mgs;
99     MAGIC* mg;
100     MAGIC** mgp;
101     int mgp_valid = 0;
102
103     ENTER;
104     save_magic(&mgs, sv);
105
106     mgp = &SvMAGIC(sv);
107     while ((mg = *mgp) != 0) {
108         MGVTBL* vtbl = mg->mg_virtual;
109         if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
110             (*vtbl->svt_get)(sv, mg);
111             /* Ignore this magic if it's been deleted */
112             if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
113                   (mg->mg_flags & MGf_GSKIP))
114                 mgs.mgs_flags = 0;
115         }
116         /* Advance to next magic (complicated by possible deletion) */
117         if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
118             mgp = &mg->mg_moremagic;
119             mgp_valid = 1;
120         }
121         else
122             mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
123     }
124
125     LEAVE;
126     return 0;
127 }
128
129 int
130 mg_set(sv)
131 SV* sv;
132 {
133     MGS mgs;
134     MAGIC* mg;
135     MAGIC* nextmg;
136
137     ENTER;
138     save_magic(&mgs, sv);
139
140     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
141         MGVTBL* vtbl = mg->mg_virtual;
142         nextmg = mg->mg_moremagic;      /* it may delete itself */
143         if (mg->mg_flags & MGf_GSKIP) {
144             mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
145             mgs.mgs_flags = 0;
146         }
147         if (vtbl && vtbl->svt_set)
148             (*vtbl->svt_set)(sv, mg);
149     }
150
151     LEAVE;
152     return 0;
153 }
154
155 U32
156 mg_len(sv)
157 SV* sv;
158 {
159     MAGIC* mg;
160     char *junk;
161     STRLEN len;
162
163     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
164         MGVTBL* vtbl = mg->mg_virtual;
165         if (vtbl && vtbl->svt_len) {
166             MGS mgs;
167
168             ENTER;
169             save_magic(&mgs, sv);
170             /* omit MGf_GSKIP -- not changed here */
171             len = (*vtbl->svt_len)(sv, mg);
172             LEAVE;
173             return len;
174         }
175     }
176
177     junk = SvPV(sv, len);
178     return len;
179 }
180
181 int
182 mg_clear(sv)
183 SV* sv;
184 {
185     MGS mgs;
186     MAGIC* mg;
187
188     ENTER;
189     save_magic(&mgs, sv);
190
191     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
192         MGVTBL* vtbl = mg->mg_virtual;
193         /* omit GSKIP -- never set here */
194         
195         if (vtbl && vtbl->svt_clear)
196             (*vtbl->svt_clear)(sv, mg);
197     }
198
199     LEAVE;
200     return 0;
201 }
202
203 MAGIC*
204 mg_find(sv, type)
205 SV* sv;
206 int type;
207 {
208     MAGIC* mg;
209     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
210         if (mg->mg_type == type)
211             return mg;
212     }
213     return 0;
214 }
215
216 int
217 mg_copy(sv, nsv, key, klen)
218 SV* sv;
219 SV* nsv;
220 char *key;
221 I32 klen;
222 {
223     int count = 0;
224     MAGIC* mg;
225     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
226         if (isUPPER(mg->mg_type)) {
227             sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen);
228             count++;
229         }
230     }
231     return count;
232 }
233
234 int
235 mg_free(sv)
236 SV* sv;
237 {
238     MAGIC* mg;
239     MAGIC* moremagic;
240     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
241         MGVTBL* vtbl = mg->mg_virtual;
242         moremagic = mg->mg_moremagic;
243         if (vtbl && vtbl->svt_free)
244             (*vtbl->svt_free)(sv, mg);
245         if (mg->mg_ptr && mg->mg_type != 'g')
246             if (mg->mg_len >= 0)
247                 Safefree(mg->mg_ptr);
248             else if (mg->mg_len == HEf_SVKEY)
249                 SvREFCNT_dec((SV*)mg->mg_ptr);
250         if (mg->mg_flags & MGf_REFCOUNTED)
251             SvREFCNT_dec(mg->mg_obj);
252         Safefree(mg);
253     }
254     SvMAGIC(sv) = 0;
255     return 0;
256 }
257
258 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
259 #include <signal.h>
260 #endif
261
262 U32
263 magic_len(sv, mg)
264 SV *sv;
265 MAGIC *mg;
266 {
267     register I32 paren;
268     register char *s;
269     register I32 i;
270     register REGEXP *rx;
271     char *t;
272
273     switch (*mg->mg_ptr) {
274     case '1': case '2': case '3': case '4':
275     case '5': case '6': case '7': case '8': case '9': case '&':
276         if (curpm && (rx = curpm->op_pmregexp)) {
277             paren = atoi(mg->mg_ptr);
278           getparen:
279             if (paren <= rx->nparens &&
280                 (s = rx->startp[paren]) &&
281                 (t = rx->endp[paren]))
282             {
283                 i = t - s;
284                 if (i >= 0)
285                     return i;
286             }
287         }
288         return 0;
289         break;
290     case '+':
291         if (curpm && (rx = curpm->op_pmregexp)) {
292             paren = rx->lastparen;
293             if (paren)
294                 goto getparen;
295         }
296         return 0;
297         break;
298     case '`':
299         if (curpm && (rx = curpm->op_pmregexp)) {
300             if ((s = rx->subbeg) && rx->startp[0]) {
301                 i = rx->startp[0] - s;
302                 if (i >= 0)
303                     return i;
304             }
305         }
306         return 0;
307     case '\'':
308         if (curpm && (rx = curpm->op_pmregexp)) {
309             if (rx->subend && (s = rx->endp[0])) {
310                 i = rx->subend - s;
311                 if (i >= 0)
312                     return 0;
313             }
314         }
315         return 0;
316     case ',':
317         return (STRLEN)ofslen;
318     case '\\':
319         return (STRLEN)orslen;
320     }
321     magic_get(sv,mg);
322     if (!SvPOK(sv) && SvNIOK(sv))
323         sv_2pv(sv, &na);
324     if (SvPOK(sv))
325         return SvCUR(sv);
326     return 0;
327 }
328
329 int
330 magic_get(sv, mg)
331 SV *sv;
332 MAGIC *mg;
333 {
334     register I32 paren;
335     register char *s;
336     register I32 i;
337     register REGEXP *rx;
338     char *t;
339
340     switch (*mg->mg_ptr) {
341     case '\001':                /* ^A */
342         sv_setsv(sv, bodytarget);
343         break;
344     case '\004':                /* ^D */
345         sv_setiv(sv, (IV)(debug & 32767));
346         break;
347     case '\005':  /* ^E */
348 #ifdef VMS
349         {
350 #           include <descrip.h>
351 #           include <starlet.h>
352             char msg[255];
353             $DESCRIPTOR(msgdsc,msg);
354             sv_setnv(sv,(double) vaxc$errno);
355             if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
356                 sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
357             else
358                 sv_setpv(sv,"");
359         }
360 #else
361 #ifdef OS2
362         sv_setnv(sv, (double)Perl_rc);
363         sv_setpv(sv, os2error(Perl_rc));
364 #else
365         sv_setnv(sv, (double)errno);
366         sv_setpv(sv, errno ? Strerror(errno) : "");
367 #endif
368 #endif
369         SvNOK_on(sv);   /* what a wonderful hack! */
370         break;
371     case '\006':                /* ^F */
372         sv_setiv(sv, (IV)maxsysfd);
373         break;
374     case '\010':                /* ^H */
375         sv_setiv(sv, (IV)hints);
376         break;
377     case '\t':                  /* ^I */
378         if (inplace)
379             sv_setpv(sv, inplace);
380         else
381             sv_setsv(sv, &sv_undef);
382         break;
383     case '\017':                /* ^O */
384         sv_setpv(sv, osname);
385         break;
386     case '\020':                /* ^P */
387         sv_setiv(sv, (IV)perldb);
388         break;
389     case '\023':                /* ^S */
390         if (STATUS_NATIVE == -1)
391             sv_setiv(sv, (IV)-1);
392         else
393             sv_setuv(sv, (UV)STATUS_NATIVE);
394         break;
395     case '\024':                /* ^T */
396 #ifdef BIG_TIME
397         sv_setnv(sv, basetime);
398 #else
399         sv_setiv(sv, (IV)basetime);
400 #endif
401         break;
402     case '\027':                /* ^W */
403         sv_setiv(sv, (IV)dowarn);
404         break;
405     case '1': case '2': case '3': case '4':
406     case '5': case '6': case '7': case '8': case '9': case '&':
407         if (curpm && (rx = curpm->op_pmregexp)) {
408             paren = atoi(GvENAME((GV*)mg->mg_obj));
409           getparen:
410             if (paren <= rx->nparens &&
411                 (s = rx->startp[paren]) &&
412                 (t = rx->endp[paren]))
413             {
414                 i = t - s;
415               getrx:
416                 if (i >= 0) {
417                     bool was_tainted;
418                     if (tainting) {
419                         was_tainted = tainted;
420                         tainted = FALSE;
421                     }
422                     sv_setpvn(sv,s,i);
423                     if (tainting)
424                         tainted = was_tainted || rx->exec_tainted;
425                     break;
426                 }
427             }
428         }
429         sv_setsv(sv,&sv_undef);
430         break;
431     case '+':
432         if (curpm && (rx = curpm->op_pmregexp)) {
433             paren = rx->lastparen;
434             if (paren)
435                 goto getparen;
436         }
437         sv_setsv(sv,&sv_undef);
438         break;
439     case '`':
440         if (curpm && (rx = curpm->op_pmregexp)) {
441             if ((s = rx->subbeg) && rx->startp[0]) {
442                 i = rx->startp[0] - s;
443                 goto getrx;
444             }
445         }
446         sv_setsv(sv,&sv_undef);
447         break;
448     case '\'':
449         if (curpm && (rx = curpm->op_pmregexp)) {
450             if (rx->subend && (s = rx->endp[0])) {
451                 i = rx->subend - s;
452                 goto getrx;
453             }
454         }
455         sv_setsv(sv,&sv_undef);
456         break;
457     case '.':
458 #ifndef lint
459         if (GvIO(last_in_gv)) {
460             sv_setiv(sv, (IV)IoLINES(GvIO(last_in_gv)));
461         }
462 #endif
463         break;
464     case '?':
465         if (STATUS_POSIX == -1)
466             sv_setiv(sv, (IV)-1);
467         else
468             sv_setuv(sv, (UV)STATUS_POSIX);
469         break;
470     case '^':
471         s = IoTOP_NAME(GvIOp(defoutgv));
472         if (s)
473             sv_setpv(sv,s);
474         else {
475             sv_setpv(sv,GvENAME(defoutgv));
476             sv_catpv(sv,"_TOP");
477         }
478         break;
479     case '~':
480         s = IoFMT_NAME(GvIOp(defoutgv));
481         if (!s)
482             s = GvENAME(defoutgv);
483         sv_setpv(sv,s);
484         break;
485 #ifndef lint
486     case '=':
487         sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(defoutgv)));
488         break;
489     case '-':
490         sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(defoutgv)));
491         break;
492     case '%':
493         sv_setiv(sv, (IV)IoPAGE(GvIOp(defoutgv)));
494         break;
495 #endif
496     case ':':
497         break;
498     case '/':
499         break;
500     case '[':
501         sv_setiv(sv, (IV)curcop->cop_arybase);
502         break;
503     case '|':
504         sv_setiv(sv, (IV)(IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 );
505         break;
506     case ',':
507         sv_setpvn(sv,ofs,ofslen);
508         break;
509     case '\\':
510         sv_setpvn(sv,ors,orslen);
511         break;
512     case '#':
513         sv_setpv(sv,ofmt);
514         break;
515     case '!':
516 #ifdef VMS
517         sv_setnv(sv, (double)((errno == EVMSERR) ? vaxc$errno : errno));
518         sv_setpv(sv, errno ? Strerror(errno) : "");
519 #else
520         {
521         int saveerrno = errno;
522         sv_setnv(sv, (double)errno);
523 #ifdef OS2
524         if (errno == errno_isOS2) sv_setpv(sv, os2error(Perl_rc));
525         else
526 #endif
527         sv_setpv(sv, errno ? Strerror(errno) : "");
528         errno = saveerrno;
529         }
530 #endif
531         SvNOK_on(sv);   /* what a wonderful hack! */
532         break;
533     case '<':
534         sv_setiv(sv, (IV)uid);
535         break;
536     case '>':
537         sv_setiv(sv, (IV)euid);
538         break;
539     case '(':
540         sv_setiv(sv, (IV)gid);
541         s = buf;
542         (void)sprintf(s,"%d",(int)gid);
543         goto add_groups;
544     case ')':
545         sv_setiv(sv, (IV)egid);
546         s = buf;
547         (void)sprintf(s,"%d",(int)egid);
548       add_groups:
549         while (*s) s++;
550 #ifdef HAS_GETGROUPS
551         {
552             Groups_t gary[NGROUPS];
553
554             i = getgroups(NGROUPS,gary);
555             while (--i >= 0) {
556                 (void)sprintf(s," %d", (int)gary[i]);
557                 while (*s) s++;
558             }
559         }
560 #endif
561         sv_setpv(sv,buf);
562         SvIOK_on(sv);   /* what a wonderful hack! */
563         break;
564     case '*':
565         break;
566     case '0':
567         break;
568     }
569     return 0;
570 }
571
572 int
573 magic_getuvar(sv, mg)
574 SV *sv;
575 MAGIC *mg;
576 {
577     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
578
579     if (uf && uf->uf_val)
580         (*uf->uf_val)(uf->uf_index, sv);
581     return 0;
582 }
583
584 int
585 magic_setenv(sv,mg)
586 SV* sv;
587 MAGIC* mg;
588 {
589     register char *s;
590     char *ptr;
591     STRLEN len;
592     I32 i;
593     s = SvPV(sv,len);
594     ptr = MgPV(mg);
595     my_setenv(ptr, s);
596 #ifdef DYNAMIC_ENV_FETCH
597      /* We just undefd an environment var.  Is a replacement */
598      /* waiting in the wings? */
599     if (!len) {
600         HE *envhe;
601         SV *keysv;
602         if (mg->mg_len == HEf_SVKEY) keysv = (SV *)mg->mg_ptr;
603         else keysv = newSVpv(mg->mg_ptr,mg->mg_len);
604         if (envhe = hv_fetch_ent(GvHVn(envgv),keysv,FALSE,0))
605             s = SvPV(HeVAL(envhe),len);
606         if (mg->mg_len != HEf_SVKEY) SvREFCNT_dec(keysv);
607     }
608 #endif
609                             /* And you'll never guess what the dog had */
610                             /*   in its mouth... */
611     if (tainting) {
612         if (s && strEQ(ptr,"PATH")) {
613             char *strend = s + len;
614
615             while (s < strend) {
616                 s = cpytill(tokenbuf,s,strend,':',&i);
617                 s++;
618                 if (*tokenbuf != '/'
619                   || (Stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
620                     MgTAINTEDDIR_on(mg);
621             }
622         }
623     }
624     return 0;
625 }
626
627 int
628 magic_clearenv(sv,mg)
629 SV* sv;
630 MAGIC* mg;
631 {
632     my_setenv(MgPV(mg),Nullch);
633     return 0;
634 }
635
636 int
637 magic_getsig(sv,mg)
638 SV* sv;
639 MAGIC* mg;
640 {
641     I32 i;
642     /* Are we fetching a signal entry? */
643     i = whichsig(MgPV(mg));
644     if (i) {
645         if(psig_ptr[i])
646             sv_setsv(sv,psig_ptr[i]);
647         else {
648             Sighandler_t sigstate = rsignal_state(i);
649
650             /* cache state so we don't fetch it again */
651             if(sigstate == SIG_IGN)
652                 sv_setpv(sv,"IGNORE");
653             else
654                 sv_setsv(sv,&sv_undef);
655             psig_ptr[i] = SvREFCNT_inc(sv);
656             SvTEMP_off(sv);
657         }
658     }
659     return 0;
660 }
661 int
662 magic_clearsig(sv,mg)
663 SV* sv;
664 MAGIC* mg;
665 {
666     I32 i;
667     /* Are we clearing a signal entry? */
668     i = whichsig(MgPV(mg));
669     if (i) {
670         if(psig_ptr[i]) {
671             SvREFCNT_dec(psig_ptr[i]);
672             psig_ptr[i]=0;
673         }
674         if(psig_name[i]) {
675             SvREFCNT_dec(psig_name[i]);
676             psig_name[i]=0;
677         }
678     }
679     return 0;
680 }
681
682 int
683 magic_setsig(sv,mg)
684 SV* sv;
685 MAGIC* mg;
686 {
687     register char *s;
688     I32 i;
689     SV** svp;
690
691     s = MgPV(mg);
692     if (*s == '_') {
693         if (strEQ(s,"__DIE__"))
694             svp = &diehook;
695         else if (strEQ(s,"__WARN__"))
696             svp = &warnhook;
697         else if (strEQ(s,"__PARSE__"))
698             svp = &parsehook;
699         else
700             croak("No such hook: %s", s);
701         i = 0;
702         if (*svp) {
703             SvREFCNT_dec(*svp);
704             *svp = 0;
705         }
706     }
707     else {
708         i = whichsig(s);        /* ...no, a brick */
709         if (!i) {
710             if (dowarn || strEQ(s,"ALARM"))
711                 warn("No such signal: SIG%s", s);
712             return 0;
713         }
714         if(psig_ptr[i])
715             SvREFCNT_dec(psig_ptr[i]);
716         psig_ptr[i] = SvREFCNT_inc(sv);
717         if(psig_name[i])
718             SvREFCNT_dec(psig_name[i]);
719         psig_name[i] = newSVpv(s,strlen(s));
720         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
721         SvREADONLY_on(psig_name[i]);
722     }
723     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
724         if (i)
725             (void)rsignal(i, sighandler);
726         else
727             *svp = SvREFCNT_inc(sv);
728         return 0;
729     }
730     s = SvPV_force(sv,na);
731     if (strEQ(s,"IGNORE")) {
732         if (i)
733             (void)rsignal(i, SIG_IGN);
734         else
735             *svp = 0;
736     }
737     else if (strEQ(s,"DEFAULT") || !*s) {
738         if (i)
739             (void)rsignal(i, SIG_DFL);
740         else
741             *svp = 0;
742     }
743     else {
744         if(hints & HINT_STRICT_REFS)
745                 die(no_symref,s,"a subroutine");
746         if (!strchr(s,':') && !strchr(s,'\'')) {
747             sprintf(tokenbuf, "main::%s",s);
748             sv_setpv(sv,tokenbuf);
749         }
750         if (i)
751             (void)rsignal(i, sighandler);
752         else
753             *svp = SvREFCNT_inc(sv);
754     }
755     return 0;
756 }
757
758 int
759 magic_setisa(sv,mg)
760 SV* sv;
761 MAGIC* mg;
762 {
763     sub_generation++;
764     return 0;
765 }
766
767 #ifdef OVERLOAD
768
769 int
770 magic_setamagic(sv,mg)
771 SV* sv;
772 MAGIC* mg;
773 {
774     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
775     amagic_generation++;
776
777     return 0;
778 }
779 #endif /* OVERLOAD */
780
781 int
782 magic_setnkeys(sv,mg)
783 SV* sv;
784 MAGIC* mg;
785 {
786     if (LvTARG(sv)) {
787         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
788         LvTARG(sv) = Nullsv;    /* Don't allow a ref to reassign this. */
789     }
790     return 0;
791 }
792
793 static int
794 magic_methpack(sv,mg,meth)
795 SV* sv;
796 MAGIC* mg;
797 char *meth;
798 {
799     dSP;
800
801     ENTER;
802     SAVETMPS;
803     PUSHMARK(sp);
804     EXTEND(sp, 2);
805     PUSHs(mg->mg_obj);
806     if (mg->mg_ptr) {
807         if (mg->mg_len >= 0)
808             PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
809         else if (mg->mg_len == HEf_SVKEY)
810             PUSHs((SV*)mg->mg_ptr);
811     }
812     else if (mg->mg_type == 'p')
813         PUSHs(sv_2mortal(newSViv(mg->mg_len)));
814     PUTBACK;
815
816     if (perl_call_method(meth, G_SCALAR))
817         sv_setsv(sv, *stack_sp--);
818
819     FREETMPS;
820     LEAVE;
821     return 0;
822 }
823
824 int
825 magic_getpack(sv,mg)
826 SV* sv;
827 MAGIC* mg;
828 {
829     magic_methpack(sv,mg,"FETCH");
830     if (mg->mg_ptr)
831         mg->mg_flags |= MGf_GSKIP;
832     return 0;
833 }
834
835 int
836 magic_setpack(sv,mg)
837 SV* sv;
838 MAGIC* mg;
839 {
840     dSP;
841
842     PUSHMARK(sp);
843     EXTEND(sp, 3);
844     PUSHs(mg->mg_obj);
845     if (mg->mg_ptr) {
846         if (mg->mg_len >= 0)
847             PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
848         else if (mg->mg_len == HEf_SVKEY)
849             PUSHs((SV*)mg->mg_ptr);
850     }
851     else if (mg->mg_type == 'p')
852         PUSHs(sv_2mortal(newSViv(mg->mg_len)));
853     PUSHs(sv);
854     PUTBACK;
855
856     perl_call_method("STORE", G_SCALAR|G_DISCARD);
857
858     return 0;
859 }
860
861 int
862 magic_clearpack(sv,mg)
863 SV* sv;
864 MAGIC* mg;
865 {
866     return magic_methpack(sv,mg,"DELETE");
867 }
868
869 int magic_wipepack(sv,mg)
870 SV* sv;
871 MAGIC* mg;
872 {
873     dSP;
874
875     PUSHMARK(sp);
876     XPUSHs(mg->mg_obj);
877     PUTBACK;
878
879     perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
880
881     return 0;
882 }
883
884 int
885 magic_nextpack(sv,mg,key)
886 SV* sv;
887 MAGIC* mg;
888 SV* key;
889 {
890     dSP;
891     char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
892
893     ENTER;
894     SAVETMPS;
895     PUSHMARK(sp);
896     EXTEND(sp, 2);
897     PUSHs(mg->mg_obj);
898     if (SvOK(key))
899         PUSHs(key);
900     PUTBACK;
901
902     if (perl_call_method(meth, G_SCALAR))
903         sv_setsv(key, *stack_sp--);
904
905     FREETMPS;
906     LEAVE;
907     return 0;
908 }
909
910 int
911 magic_existspack(sv,mg)
912 SV* sv;
913 MAGIC* mg;
914 {
915     return magic_methpack(sv,mg,"EXISTS");
916
917
918 int
919 magic_setdbline(sv,mg)
920 SV* sv;
921 MAGIC* mg;
922 {
923     OP *o;
924     I32 i;
925     GV* gv;
926     SV** svp;
927
928     gv = DBline;
929     i = SvTRUE(sv);
930     svp = av_fetch(GvAV(gv),
931                      atoi(MgPV(mg)), FALSE);
932     if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
933         o->op_private = i;
934     else
935         warn("Can't break at that line\n");
936     return 0;
937 }
938
939 int
940 magic_getarylen(sv,mg)
941 SV* sv;
942 MAGIC* mg;
943 {
944     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase);
945     return 0;
946 }
947
948 int
949 magic_setarylen(sv,mg)
950 SV* sv;
951 MAGIC* mg;
952 {
953     av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase);
954     return 0;
955 }
956
957 int
958 magic_getpos(sv,mg)
959 SV* sv;
960 MAGIC* mg;
961 {
962     SV* lsv = LvTARG(sv);
963     
964     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
965         mg = mg_find(lsv, 'g');
966         if (mg && mg->mg_len >= 0) {
967             sv_setiv(sv, mg->mg_len + curcop->cop_arybase);
968             return 0;
969         }
970     }
971     (void)SvOK_off(sv);
972     return 0;
973 }
974
975 int
976 magic_setpos(sv,mg)
977 SV* sv;
978 MAGIC* mg;
979 {
980     SV* lsv = LvTARG(sv);
981     SSize_t pos;
982     STRLEN len;
983
984     mg = 0;
985     
986     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
987         mg = mg_find(lsv, 'g');
988     if (!mg) {
989         if (!SvOK(sv))
990             return 0;
991         sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
992         mg = mg_find(lsv, 'g');
993     }
994     else if (!SvOK(sv)) {
995         mg->mg_len = -1;
996         return 0;
997     }
998     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
999
1000     pos = SvIV(sv) - curcop->cop_arybase;
1001     if (pos < 0) {
1002         pos += len;
1003         if (pos < 0)
1004             pos = 0;
1005     }
1006     else if (pos > len)
1007         pos = len;
1008     mg->mg_len = pos;
1009     mg->mg_flags &= ~MGf_MINMATCH;
1010
1011     return 0;
1012 }
1013
1014 int
1015 magic_getglob(sv,mg)
1016 SV* sv;
1017 MAGIC* mg;
1018 {
1019     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1020         SvFAKE_off(sv);
1021         gv_efullname3(sv,((GV*)sv), "*");
1022         SvFAKE_on(sv);
1023     }
1024     else
1025         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1026     return 0;
1027 }
1028
1029 int
1030 magic_setglob(sv,mg)
1031 SV* sv;
1032 MAGIC* mg;
1033 {
1034     register char *s;
1035     GV* gv;
1036
1037     if (!SvOK(sv))
1038         return 0;
1039     s = SvPV(sv, na);
1040     if (*s == '*' && s[1])
1041         s++;
1042     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1043     if (sv == (SV*)gv)
1044         return 0;
1045     if (GvGP(sv))
1046         gp_free((GV*)sv);
1047     GvGP(sv) = gp_ref(GvGP(gv));
1048     return 0;
1049 }
1050
1051 int
1052 magic_setsubstr(sv,mg)
1053 SV* sv;
1054 MAGIC* mg;
1055 {
1056     STRLEN len;
1057     char *tmps = SvPV(sv,len);
1058     sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
1059     return 0;
1060 }
1061
1062 int
1063 magic_gettaint(sv,mg)
1064 SV* sv;
1065 MAGIC* mg;
1066 {
1067     TAINT_IF((mg->mg_len & 1) ||
1068              (mg->mg_len & 2) && mg->mg_obj == sv);     /* kludge */
1069     return 0;
1070 }
1071
1072 int
1073 magic_settaint(sv,mg)
1074 SV* sv;
1075 MAGIC* mg;
1076 {
1077     if (localizing) {
1078         if (localizing == 1)
1079             mg->mg_len <<= 1;
1080         else
1081             mg->mg_len >>= 1;
1082     }
1083     else if (tainted)
1084         mg->mg_len |= 1;
1085     else
1086         mg->mg_len &= ~1;
1087     return 0;
1088 }
1089
1090 int
1091 magic_setvec(sv,mg)
1092 SV* sv;
1093 MAGIC* mg;
1094 {
1095     do_vecset(sv);      /* XXX slurp this routine */
1096     return 0;
1097 }
1098
1099 int
1100 magic_getitervar(sv,mg)
1101 SV* sv;
1102 MAGIC* mg;
1103 {
1104     SV *targ = Nullsv;
1105     if (LvTARGLEN(sv)) {
1106         AV* av = (AV*)LvTARG(sv);
1107         if (LvTARGOFF(sv) <= AvFILL(av))
1108             targ = AvARRAY(av)[LvTARGOFF(sv)];
1109     }
1110     else
1111         targ = LvTARG(sv);
1112     sv_setsv(sv, targ ? targ : &sv_undef);
1113     return 0;
1114 }
1115
1116 int
1117 magic_setitervar(sv,mg)
1118 SV* sv;
1119 MAGIC* mg;
1120 {
1121     if (LvTARGLEN(sv))
1122         vivify_itervar(sv);
1123     if (LvTARG(sv))
1124         sv_setsv(LvTARG(sv), sv);
1125     return 0;
1126 }
1127
1128 int
1129 magic_freeitervar(sv,mg)
1130 SV* sv;
1131 MAGIC* mg;
1132 {
1133     SvREFCNT_dec(LvTARG(sv));
1134     return 0;
1135 }
1136
1137 void
1138 vivify_itervar(sv)
1139 SV* sv;
1140 {
1141     AV* av;
1142
1143     if (!LvTARGLEN(sv))
1144         return;
1145     av = (AV*)LvTARG(sv);
1146     if (LvTARGOFF(sv) <= AvFILL(av)) {
1147         SV** svp = AvARRAY(av) + LvTARGOFF(sv);
1148         LvTARG(sv) = newSVsv(*svp);
1149         SvREFCNT_dec(*svp);
1150         *svp = SvREFCNT_inc(LvTARG(sv));
1151     }
1152     else
1153         LvTARG(sv) = Nullsv;
1154     SvREFCNT_dec(av);
1155     LvTARGLEN(sv) = 0;
1156 }
1157
1158 int
1159 magic_setmglob(sv,mg)
1160 SV* sv;
1161 MAGIC* mg;
1162 {
1163     mg->mg_len = -1;
1164     SvSCREAM_off(sv);
1165     return 0;
1166 }
1167
1168 int
1169 magic_setbm(sv,mg)
1170 SV* sv;
1171 MAGIC* mg;
1172 {
1173     sv_unmagic(sv, 'B');
1174     SvVALID_off(sv);
1175     return 0;
1176 }
1177
1178 int
1179 magic_setfm(sv,mg)
1180 SV* sv;
1181 MAGIC* mg;
1182 {
1183     sv_unmagic(sv, 'f');
1184     SvCOMPILED_off(sv);
1185     return 0;
1186 }
1187
1188 int
1189 magic_setuvar(sv,mg)
1190 SV* sv;
1191 MAGIC* mg;
1192 {
1193     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1194
1195     if (uf && uf->uf_set)
1196         (*uf->uf_set)(uf->uf_index, sv);
1197     return 0;
1198 }
1199
1200 #ifdef USE_LOCALE_COLLATE
1201 int
1202 magic_setcollxfrm(sv,mg)
1203 SV* sv;
1204 MAGIC* mg;
1205 {
1206     /*
1207      * RenĂ© Descartes said "I think not."
1208      * and vanished with a faint plop.
1209      */
1210     if (mg->mg_ptr) {
1211         Safefree(mg->mg_ptr);
1212         mg->mg_ptr = NULL;
1213         mg->mg_len = -1;
1214     }
1215     return 0;
1216 }
1217 #endif /* USE_LOCALE_COLLATE */
1218
1219 int
1220 magic_set(sv,mg)
1221 SV* sv;
1222 MAGIC* mg;
1223 {
1224     register char *s;
1225     I32 i;
1226     STRLEN len;
1227     switch (*mg->mg_ptr) {
1228     case '\001':        /* ^A */
1229         sv_setsv(bodytarget, sv);
1230         break;
1231     case '\004':        /* ^D */
1232         debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
1233         DEBUG_x(dump_all());
1234         break;
1235     case '\005':  /* ^E */
1236 #ifdef VMS
1237         set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1238 #else
1239         /* will anyone ever use this? */
1240         SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
1241 #endif
1242         break;
1243     case '\006':        /* ^F */
1244         maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1245         break;
1246     case '\010':        /* ^H */
1247         hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1248         break;
1249     case '\t':  /* ^I */
1250         if (inplace)
1251             Safefree(inplace);
1252         if (SvOK(sv))
1253             inplace = savepv(SvPV(sv,na));
1254         else
1255             inplace = Nullch;
1256         break;
1257     case '\017':        /* ^O */
1258         if (osname)
1259             Safefree(osname);
1260         if (SvOK(sv))
1261             osname = savepv(SvPV(sv,na));
1262         else
1263             osname = Nullch;
1264         break;
1265     case '\020':        /* ^P */
1266         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1267         if (i != perldb) {
1268             if (perldb)
1269                 oldlastpm = curpm;
1270             else
1271                 curpm = oldlastpm;
1272         }
1273         perldb = i;
1274         break;
1275     case '\023':        /* ^S */
1276         STATUS_NATIVE_SET(SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv));
1277         break;
1278     case '\024':        /* ^T */
1279 #ifdef BIG_TIME
1280         basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1281 #else
1282         basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1283 #endif
1284         break;
1285     case '\027':        /* ^W */
1286         dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1287         break;
1288     case '.':
1289         if (localizing) {
1290             if (localizing == 1)
1291                 save_sptr((SV**)&last_in_gv);
1292         }
1293         else if (SvOK(sv) && GvIO(last_in_gv))
1294             IoLINES(GvIOp(last_in_gv)) = (long)SvIV(sv);
1295         break;
1296     case '^':
1297         Safefree(IoTOP_NAME(GvIOp(defoutgv)));
1298         IoTOP_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1299         IoTOP_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1300         break;
1301     case '~':
1302         Safefree(IoFMT_NAME(GvIOp(defoutgv)));
1303         IoFMT_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
1304         IoFMT_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1305         break;
1306     case '=':
1307         IoPAGE_LEN(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1308         break;
1309     case '-':
1310         IoLINES_LEFT(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1311         if (IoLINES_LEFT(GvIOp(defoutgv)) < 0L)
1312             IoLINES_LEFT(GvIOp(defoutgv)) = 0L;
1313         break;
1314     case '%':
1315         IoPAGE(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1316         break;
1317     case '|':
1318         IoFLAGS(GvIOp(defoutgv)) &= ~IOf_FLUSH;
1319         if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
1320             IoFLAGS(GvIOp(defoutgv)) |= IOf_FLUSH;
1321         }
1322         break;
1323     case '*':
1324         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1325         multiline = (i != 0);
1326         break;
1327     case '/':
1328         SvREFCNT_dec(nrs);
1329         nrs = newSVsv(sv);
1330         SvREFCNT_dec(rs);
1331         rs = SvREFCNT_inc(nrs);
1332         break;
1333     case '\\':
1334         if (ors)
1335             Safefree(ors);
1336         if (SvOK(sv) || SvGMAGICAL(sv))
1337             ors = savepv(SvPV(sv,orslen));
1338         else {
1339             ors = Nullch;
1340             orslen = 0;
1341         }
1342         break;
1343     case ',':
1344         if (ofs)
1345             Safefree(ofs);
1346         ofs = savepv(SvPV(sv, ofslen));
1347         break;
1348     case '#':
1349         if (ofmt)
1350             Safefree(ofmt);
1351         ofmt = savepv(SvPV(sv,na));
1352         break;
1353     case '[':
1354         compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1355         break;
1356     case '?':
1357         STATUS_POSIX_SET(SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv));
1358         break;
1359     case '!':
1360         SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),
1361                  (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
1362         break;
1363     case '<':
1364         uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1365         if (delaymagic) {
1366             delaymagic |= DM_RUID;
1367             break;                              /* don't do magic till later */
1368         }
1369 #ifdef HAS_SETRUID
1370         (void)setruid((Uid_t)uid);
1371 #else
1372 #ifdef HAS_SETREUID
1373         (void)setreuid((Uid_t)uid, (Uid_t)-1);
1374 #else
1375 #ifdef HAS_SETRESUID
1376       (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
1377 #else
1378         if (uid == euid)                /* special case $< = $> */
1379             (void)setuid(uid);
1380         else {
1381             uid = (I32)getuid();
1382             croak("setruid() not implemented");
1383         }
1384 #endif
1385 #endif
1386 #endif
1387         uid = (I32)getuid();
1388         tainting |= (uid && (euid != uid || egid != gid));
1389         break;
1390     case '>':
1391         euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1392         if (delaymagic) {
1393             delaymagic |= DM_EUID;
1394             break;                              /* don't do magic till later */
1395         }
1396 #ifdef HAS_SETEUID
1397         (void)seteuid((Uid_t)euid);
1398 #else
1399 #ifdef HAS_SETREUID
1400         (void)setreuid((Uid_t)-1, (Uid_t)euid);
1401 #else
1402 #ifdef HAS_SETRESUID
1403         (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
1404 #else
1405         if (euid == uid)                /* special case $> = $< */
1406             setuid(euid);
1407         else {
1408             euid = (I32)geteuid();
1409             croak("seteuid() not implemented");
1410         }
1411 #endif
1412 #endif
1413 #endif
1414         euid = (I32)geteuid();
1415         tainting |= (uid && (euid != uid || egid != gid));
1416         break;
1417     case '(':
1418         gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1419         if (delaymagic) {
1420             delaymagic |= DM_RGID;
1421             break;                              /* don't do magic till later */
1422         }
1423 #ifdef HAS_SETRGID
1424         (void)setrgid((Gid_t)gid);
1425 #else
1426 #ifdef HAS_SETREGID
1427         (void)setregid((Gid_t)gid, (Gid_t)-1);
1428 #else
1429 #ifdef HAS_SETRESGID
1430       (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
1431 #else
1432         if (gid == egid)                        /* special case $( = $) */
1433             (void)setgid(gid);
1434         else {
1435             gid = (I32)getgid();
1436             croak("setrgid() not implemented");
1437         }
1438 #endif
1439 #endif
1440 #endif
1441         gid = (I32)getgid();
1442         tainting |= (uid && (euid != uid || egid != gid));
1443         break;
1444     case ')':
1445         egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1446         if (delaymagic) {
1447             delaymagic |= DM_EGID;
1448             break;                              /* don't do magic till later */
1449         }
1450 #ifdef HAS_SETEGID
1451         (void)setegid((Gid_t)egid);
1452 #else
1453 #ifdef HAS_SETREGID
1454         (void)setregid((Gid_t)-1, (Gid_t)egid);
1455 #else
1456 #ifdef HAS_SETRESGID
1457         (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
1458 #else
1459         if (egid == gid)                        /* special case $) = $( */
1460             (void)setgid(egid);
1461         else {
1462             egid = (I32)getegid();
1463             croak("setegid() not implemented");
1464         }
1465 #endif
1466 #endif
1467 #endif
1468         egid = (I32)getegid();
1469         tainting |= (uid && (euid != uid || egid != gid));
1470         break;
1471     case ':':
1472         chopset = SvPV_force(sv,na);
1473         break;
1474     case '0':
1475         if (!origalen) {
1476             s = origargv[0];
1477             s += strlen(s);
1478             /* See if all the arguments are contiguous in memory */
1479             for (i = 1; i < origargc; i++) {
1480                 if (origargv[i] == s + 1)
1481                     s += strlen(++s);   /* this one is ok too */
1482             }
1483             /* can grab env area too? */
1484             if (origenviron && origenviron[0] == s + 1) {
1485                 my_setenv("NoNeSuCh", Nullch);
1486                                             /* force copy of environment */
1487                 for (i = 0; origenviron[i]; i++)
1488                     if (origenviron[i] == s + 1)
1489                         s += strlen(++s);
1490             }
1491             origalen = s - origargv[0];
1492         }
1493         s = SvPV_force(sv,len);
1494         i = len;
1495         if (i >= origalen) {
1496             i = origalen;
1497             SvCUR_set(sv, i);
1498             *SvEND(sv) = '\0';
1499             Copy(s, origargv[0], i, char);
1500         }
1501         else {
1502             Copy(s, origargv[0], i, char);
1503             s = origargv[0]+i;
1504             *s++ = '\0';
1505             while (++i < origalen)
1506                 *s++ = ' ';
1507             s = origargv[0]+i;
1508             for (i = 1; i < origargc; i++)
1509                 origargv[i] = Nullch;
1510         }
1511         break;
1512     }
1513     return 0;
1514 }
1515
1516 I32
1517 whichsig(sig)
1518 char *sig;
1519 {
1520     register char **sigv;
1521
1522     for (sigv = sig_name+1; *sigv; sigv++)
1523         if (strEQ(sig,*sigv))
1524             return sig_num[sigv - sig_name];
1525 #ifdef SIGCLD
1526     if (strEQ(sig,"CHLD"))
1527         return SIGCLD;
1528 #endif
1529 #ifdef SIGCHLD
1530     if (strEQ(sig,"CLD"))
1531         return SIGCHLD;
1532 #endif
1533     return 0;
1534 }
1535
1536 Signal_t
1537 sighandler(sig)
1538 int sig;
1539 {
1540     dSP;
1541     GV *gv;
1542     HV *st;
1543     SV *sv;
1544     CV *cv;
1545     AV *oldstack;
1546     
1547     if(!psig_ptr[sig])
1548         die("Signal SIG%s received, but no signal handler set.\n",
1549         sig_name[sig]);
1550
1551     cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
1552     if (!cv || !CvROOT(cv)) {
1553         if (dowarn)
1554             warn("SIG%s handler \"%s\" not defined.\n",
1555                 sig_name[sig], GvENAME(gv) );
1556         return;
1557     }
1558
1559     oldstack = curstack;
1560     if (curstack != signalstack)
1561         AvFILL(signalstack) = 0;
1562     SWITCHSTACK(curstack, signalstack);
1563
1564     if(psig_name[sig])
1565         sv = SvREFCNT_inc(psig_name[sig]);
1566     else {
1567         sv = sv_newmortal();
1568         sv_setpv(sv,sig_name[sig]);
1569     }
1570     PUSHMARK(sp);
1571     PUSHs(sv);
1572     PUTBACK;
1573
1574     perl_call_sv((SV*)cv, G_DISCARD);
1575
1576     SWITCHSTACK(signalstack, oldstack);
1577
1578     return;
1579 }