1 /* $RCSfile: hash.c,v $$Revision: 4.1 $$Date: 92/08/07 18:21:48 $
3 * Copyright (c) 1993, Larry Wall
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.
19 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
20 MGVTBL* vtbl = mg->mg_virtual;
26 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
37 U32 savemagic = SvMAGICAL(sv);
40 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
42 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
43 MGVTBL* vtbl = mg->mg_virtual;
44 if (vtbl && vtbl->svt_get)
45 (*vtbl->svt_get)(sv, mg);
48 SvFLAGS(sv) |= savemagic;
49 assert(SvGMAGICAL(sv));
50 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
61 U32 savemagic = SvMAGICAL(sv);
65 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
66 MGVTBL* vtbl = mg->mg_virtual;
67 nextmg = mg->mg_moremagic; /* it may delete itself */
68 if (vtbl && vtbl->svt_set)
69 (*vtbl->svt_set)(sv, mg);
73 SvFLAGS(sv) |= savemagic;
75 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
89 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
90 MGVTBL* vtbl = mg->mg_virtual;
91 if (vtbl && vtbl->svt_len) {
92 U32 savemagic = SvMAGICAL(sv);
95 SvFLAGS(sv) |= (SvFLAGS(sv)&(SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
97 len = (*vtbl->svt_len)(sv, mg);
99 SvFLAGS(sv) |= savemagic;
101 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
116 U32 savemagic = SvMAGICAL(sv);
119 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
121 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
122 MGVTBL* vtbl = mg->mg_virtual;
123 if (vtbl && vtbl->svt_clear)
124 (*vtbl->svt_clear)(sv, mg);
127 SvFLAGS(sv) |= savemagic;
129 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
140 mg_find(SV *sv, char type)
141 #endif /* STANDARD_C */
144 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
145 if (mg->mg_type == type)
152 mg_copy(sv, nsv, key, klen)
160 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
161 if (isUPPER(mg->mg_type)) {
162 sv_magic(nsv, mg->mg_obj, tolower(mg->mg_type), key, klen);
175 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
176 MGVTBL* vtbl = mg->mg_virtual;
177 moremagic = mg->mg_moremagic;
178 if (vtbl && vtbl->svt_free)
179 (*vtbl->svt_free)(sv, mg);
180 if (mg->mg_ptr && mg->mg_type != 'g')
181 Safefree(mg->mg_ptr);
182 if (mg->mg_flags & MGf_REFCOUNTED)
183 SvREFCNT_dec(mg->mg_obj);
190 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
203 switch (*mg->mg_ptr) {
204 case '1': case '2': case '3': case '4':
205 case '5': case '6': case '7': case '8': case '9': case '&':
207 paren = atoi(mg->mg_ptr);
209 if (curpm->op_pmregexp &&
210 paren <= curpm->op_pmregexp->nparens &&
211 (s = curpm->op_pmregexp->startp[paren]) ) {
212 i = curpm->op_pmregexp->endp[paren] - s;
224 paren = curpm->op_pmregexp->lastparen;
230 if (curpm->op_pmregexp &&
231 (s = curpm->op_pmregexp->subbeg) ) {
232 i = curpm->op_pmregexp->startp[0] - s;
244 if (curpm->op_pmregexp &&
245 (s = curpm->op_pmregexp->endp[0]) ) {
246 return (STRLEN) (curpm->op_pmregexp->subend - s);
253 return (STRLEN)ofslen;
255 return (STRLEN)orslen;
258 if (!SvPOK(sv) && SvNIOK(sv))
274 switch (*mg->mg_ptr) {
275 case '\004': /* ^D */
276 sv_setiv(sv,(I32)(debug & 32767));
278 case '\006': /* ^F */
279 sv_setiv(sv,(I32)maxsysfd);
283 sv_setpv(sv, inplace);
285 sv_setsv(sv,&sv_undef);
287 case '\020': /* ^P */
288 sv_setiv(sv,(I32)perldb);
290 case '\024': /* ^T */
291 sv_setiv(sv,(I32)basetime);
293 case '\027': /* ^W */
294 sv_setiv(sv,(I32)dowarn);
296 case '1': case '2': case '3': case '4':
297 case '5': case '6': case '7': case '8': case '9': case '&':
299 paren = atoi(GvENAME(mg->mg_obj));
301 if (curpm->op_pmregexp &&
302 paren <= curpm->op_pmregexp->nparens &&
303 (s = curpm->op_pmregexp->startp[paren]) ) {
304 i = curpm->op_pmregexp->endp[paren] - s;
308 sv_setsv(sv,&sv_undef);
311 sv_setsv(sv,&sv_undef);
316 paren = curpm->op_pmregexp->lastparen;
322 if (curpm->op_pmregexp &&
323 (s = curpm->op_pmregexp->subbeg) ) {
324 i = curpm->op_pmregexp->startp[0] - s;
336 if (curpm->op_pmregexp &&
337 (s = curpm->op_pmregexp->endp[0]) ) {
338 sv_setpvn(sv,s, curpm->op_pmregexp->subend - s);
346 if (last_in_gv && GvIO(last_in_gv)) {
347 sv_setiv(sv,(I32)IoLINES(GvIO(last_in_gv)));
352 sv_setiv(sv,(I32)statusvalue);
355 s = IoTOP_NAME(GvIO(defoutgv));
359 sv_setpv(sv,GvENAME(defoutgv));
364 s = IoFMT_NAME(GvIO(defoutgv));
366 s = GvENAME(defoutgv);
371 sv_setiv(sv,(I32)IoPAGE_LEN(GvIO(defoutgv)));
374 sv_setiv(sv,(I32)IoLINES_LEFT(GvIO(defoutgv)));
377 sv_setiv(sv,(I32)IoPAGE(GvIO(defoutgv)));
385 sv_setiv(sv,(I32)arybase);
389 GvIO(defoutgv) = newIO();
390 sv_setiv(sv, (IoFLAGS(GvIO(defoutgv)) & IOf_FLUSH) != 0 );
393 sv_setpvn(sv,ofs,ofslen);
396 sv_setpvn(sv,ors,orslen);
402 sv_setnv(sv,(double)errno);
403 sv_setpv(sv, errno ? Strerror(errno) : "");
404 SvNOK_on(sv); /* what a wonderful hack! */
407 sv_setiv(sv,(I32)uid);
410 sv_setiv(sv,(I32)euid);
414 (void)sprintf(s,"%d",(int)gid);
418 (void)sprintf(s,"%d",(int)egid);
426 GROUPSTYPE gary[NGROUPS];
428 i = getgroups(NGROUPS,gary);
430 (void)sprintf(s," %ld", (long)gary[i]);
445 magic_getuvar(sv, mg)
449 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
451 if (uf && uf->uf_val)
452 (*uf->uf_val)(uf->uf_index, sv);
464 my_setenv(mg->mg_ptr,s);
465 /* And you'll never guess what the dog had */
466 /* in its mouth... */
468 if (s && strEQ(mg->mg_ptr,"PATH")) {
469 char *strend = SvEND(sv);
472 s = cpytill(tokenbuf,s,strend,':',&i);
475 || (stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
484 magic_clearenv(sv,mg)
488 my_setenv(mg->mg_ptr,Nullch);
500 i = whichsig(mg->mg_ptr); /* ...no, a brick */
501 if (!i && (dowarn || strEQ(mg->mg_ptr,"ALARM")))
502 warn("No such signal: SIG%s", mg->mg_ptr);
503 if (strEQ(s,"IGNORE"))
505 (void)signal(i,SIG_IGN);
509 else if (strEQ(s,"DEFAULT") || !*s)
510 (void)signal(i,SIG_DFL);
512 (void)signal(i,sighandler);
513 if (!strchr(s,':') && !strchr(s,'\'')) {
514 sprintf(tokenbuf, "main::%s",s);
515 sv_setpv(sv,tokenbuf);
536 HV* stash = SvSTASH(SvRV(rv));
537 GV* gv = gv_fetchmethod(stash, "fetch");
541 if (!gv || !GvCV(gv)) {
542 croak("No fetch method for magical variable in package \"%s\"",
545 Zero(&myop, 1, BINOP);
546 myop.op_last = (OP *) &myop;
547 myop.op_next = Nullop;
548 myop.op_flags = OPf_STACKED;
560 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
561 else if (mg->mg_len >= 0)
562 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
565 if (op = pp_entersubr())
582 HV* stash = SvSTASH(SvRV(rv));
583 GV* gv = gv_fetchmethod(stash, "store");
587 if (!gv || !GvCV(gv)) {
588 croak("No store method for magical variable in package \"%s\"",
591 Zero(&myop, 1, BINOP);
592 myop.op_last = (OP *) &myop;
593 myop.op_next = Nullop;
594 myop.op_flags = OPf_STACKED;
606 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
607 else if (mg->mg_len >= 0)
608 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
612 if (op = pp_entersubr())
624 magic_clearpack(sv,mg)
629 HV* stash = SvSTASH(SvRV(rv));
630 GV* gv = gv_fetchmethod(stash, "delete");
634 if (!gv || !GvCV(gv)) {
635 croak("No delete method for magical variable in package \"%s\"",
638 Zero(&myop, 1, BINOP);
639 myop.op_last = (OP *) &myop;
640 myop.op_next = Nullop;
641 myop.op_flags = OPf_STACKED;
653 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
655 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
658 if (op = pp_entersubr())
670 magic_nextpack(sv,mg,key)
676 HV* stash = SvSTASH(SvRV(rv));
677 GV* gv = gv_fetchmethod(stash, SvOK(key) ? "nextkey" : "firstkey");
681 if (!gv || !GvCV(gv)) {
682 croak("No fetch method for magical variable in package \"%s\"",
685 Zero(&myop, 1, BINOP);
686 myop.op_last = (OP *) &myop;
687 myop.op_next = Nullop;
688 myop.op_flags = OPf_STACKED;
703 if (op = pp_entersubr())
715 magic_setdbline(sv,mg)
726 svp = av_fetch(GvAV(gv),atoi(mg->mg_ptr), FALSE);
727 if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
730 warn("Can't break at that line\n");
735 magic_getarylen(sv,mg)
739 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + arybase);
744 magic_setarylen(sv,mg)
748 av_fill((AV*)mg->mg_obj, (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) - arybase);
757 gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
772 if (*s == '*' && s[1])
774 gv = gv_fetchpv(s,TRUE, SVt_PVGV);
779 GvGP(sv) = gp_ref(GvGP(gv));
790 magic_setsubstr(sv,mg)
795 char *tmps = SvPV(sv,len);
796 sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
801 magic_gettaint(sv,mg)
810 magic_settaint(sv,mg)
824 do_vecset(sv); /* XXX slurp this routine */
829 magic_setmglob(sv,mg)
853 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
855 if (uf && uf->uf_set)
856 (*uf->uf_set)(uf->uf_index, sv);
868 switch (*mg->mg_ptr) {
869 case '\004': /* ^D */
870 debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
873 case '\006': /* ^F */
874 maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
880 inplace = savestr(SvPV(sv,na));
884 case '\020': /* ^P */
885 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
894 case '\024': /* ^T */
895 basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
897 case '\027': /* ^W */
898 dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
902 save_sptr((SV**)&last_in_gv);
904 IoLINES(GvIO(last_in_gv)) = (long)SvIV(sv);
907 Safefree(IoTOP_NAME(GvIO(defoutgv)));
908 IoTOP_NAME(GvIO(defoutgv)) = s = savestr(SvPV(sv,na));
909 IoTOP_GV(GvIO(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
912 Safefree(IoFMT_NAME(GvIO(defoutgv)));
913 IoFMT_NAME(GvIO(defoutgv)) = s = savestr(SvPV(sv,na));
914 IoFMT_GV(GvIO(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
917 IoPAGE_LEN(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
920 IoLINES_LEFT(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
921 if (IoLINES_LEFT(GvIO(defoutgv)) < 0L)
922 IoLINES_LEFT(GvIO(defoutgv)) = 0L;
925 IoPAGE(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
929 GvIO(defoutgv) = newIO();
930 IoFLAGS(GvIO(defoutgv)) &= ~IOf_FLUSH;
931 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
932 IoFLAGS(GvIO(defoutgv)) |= IOf_FLUSH;
936 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
937 multiline = (i != 0);
941 nrs = rs = SvPV(sv,rslen);
943 if (rspara = !rslen) {
947 nrschar = rschar = rs[rslen - 1];
950 nrschar = rschar = 0777; /* fake a non-existent char */
957 ors = savestr(SvPV(sv,orslen));
962 ofs = savestr(SvPV(sv, ofslen));
967 ofmt = savestr(SvPV(sv,na));
970 arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
973 statusvalue = U_S(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
976 errno = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); /* will anyone ever use this? */
979 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
981 delaymagic |= DM_RUID;
982 break; /* don't do magic till later */
985 (void)setruid((Uid_t)uid);
988 (void)setreuid((Uid_t)uid, (Uid_t)-1);
990 (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
992 if (uid == euid) /* special case $< = $> */
995 croak("setruid() not implemented");
999 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1000 tainting |= (euid != uid || egid != gid);
1003 euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1005 delaymagic |= DM_EUID;
1006 break; /* don't do magic till later */
1009 (void)seteuid((Uid_t)euid);
1012 (void)setreuid((Uid_t)-1, (Uid_t)euid);
1014 #ifdef HAS_SETRESUID
1015 (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
1017 if (euid == uid) /* special case $> = $< */
1020 croak("seteuid() not implemented");
1024 euid = (I32)geteuid();
1025 tainting |= (euid != uid || egid != gid);
1028 gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1030 delaymagic |= DM_RGID;
1031 break; /* don't do magic till later */
1034 (void)setrgid((Gid_t)gid);
1037 (void)setregid((Gid_t)gid, (Gid_t)-1);
1039 #ifdef HAS_SETRESGID
1040 (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
1042 if (gid == egid) /* special case $( = $) */
1045 croak("setrgid() not implemented");
1049 gid = (I32)getgid();
1050 tainting |= (euid != uid || egid != gid);
1053 egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1055 delaymagic |= DM_EGID;
1056 break; /* don't do magic till later */
1059 (void)setegid((Gid_t)egid);
1062 (void)setregid((Gid_t)-1, (Gid_t)egid);
1064 #ifdef HAS_SETRESGID
1065 (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
1067 if (egid == gid) /* special case $) = $( */
1070 croak("setegid() not implemented");
1074 egid = (I32)getegid();
1075 tainting |= (euid != uid || egid != gid);
1078 chopset = SvPV(sv,na);
1084 /* See if all the arguments are contiguous in memory */
1085 for (i = 1; i < origargc; i++) {
1086 if (origargv[i] == s + 1)
1087 s += strlen(++s); /* this one is ok too */
1089 if (origenviron[0] == s + 1) { /* can grab env area too? */
1090 my_setenv("NoNeSuCh", Nullch);
1091 /* force copy of environment */
1092 for (i = 0; origenviron[i]; i++)
1093 if (origenviron[i] == s + 1)
1096 origalen = s - origargv[0];
1100 if (i >= origalen) {
1104 Copy(s, origargv[0], i, char);
1107 Copy(s, origargv[0], i, char);
1110 while (++i < origalen)
1113 for (i = 1; i < origargc; i++)
1114 origargv[i] = Nullch;
1125 register char **sigv;
1127 for (sigv = sig_name+1; *sigv; sigv++)
1128 if (strEQ(sig,*sigv))
1129 return sigv - sig_name;
1131 if (strEQ(sig,"CHLD"))
1135 if (strEQ(sig,"CLD"))
1153 I32 gimme = G_SCALAR;
1155 #ifdef OS2 /* or anybody else who requires SIG_ACK */
1156 signal(sig, SIG_ACK);
1160 SvPVx(*hv_fetch(GvHVn(siggv),sig_name[sig],strlen(sig_name[sig]),
1161 TRUE), na), TRUE, SVt_PVCV);
1163 if (!cv && *sig_name[sig] == 'C' && instr(sig_name[sig],"LD")) {
1164 if (sig_name[sig][1] == 'H')
1165 gv = gv_fetchpv(SvPVx(*hv_fetch(GvHVn(siggv),"CLD",3,TRUE), na),
1168 gv = gv_fetchpv(SvPVx(*hv_fetch(GvHVn(siggv),"CHLD",4,TRUE), na),
1170 cv = GvCV(gv); /* gag */
1174 warn("SIG%s handler \"%s\" not defined.\n",
1175 sig_name[sig], GvENAME(gv) );
1180 SWITCHSTACK(stack, signalstack);
1182 sv = sv_newmortal();
1183 sv_setpv(sv,sig_name[sig]);
1191 PUSHBLOCK(cx, CXt_SUB, sp);
1193 cx->blk_sub.savearray = GvAV(defgv);
1194 cx->blk_sub.argarray = av_fake(items, sp);
1195 SAVEFREESV(cx->blk_sub.argarray);
1196 GvAV(defgv) = cx->blk_sub.argarray;
1198 if (CvDEPTH(cv) >= 2) {
1199 if (CvDEPTH(cv) == 100 && dowarn)
1200 warn("Deep recursion on subroutine \"%s\"",GvENAME(gv));
1204 run(); /* Does the LEAVE for us. */
1206 SWITCHSTACK(signalstack, oldstack);