1 /* $Header: cmd.c,v 3.0.1.7 90/03/27 15:32:37 lwall Locked $
3 * Copyright (c) 1989, Larry Wall
5 * You may distribute under the terms of the GNU General Public License
6 * as specified in the README file that comes with the perl 3.0 kit.
9 * Revision 3.0.1.7 90/03/27 15:32:37 lwall
10 * patch16: non-terminal blocks should never have arrays requested of them
12 * Revision 3.0.1.6 90/03/12 16:21:09 lwall
13 * patch13: fixed some backwards VOLATILE declarations
14 * patch13: while (s/x//) {} still caused some anomolies
15 * patch13: greater-than test of numeric switch structures did less-than action
17 * Revision 3.0.1.5 90/02/28 16:38:31 lwall
18 * patch9: volatilized some more variables for super-optimizing compilers
19 * patch9: nested foreach loops didn't reset inner loop on next to outer loop
20 * patch9: returned values were read from obsolete stack
21 * patch9: added sanity check on longjmp() return value
22 * patch9: substitutions that almost always succeed can corrupt label stack
23 * patch9: subs which return by both mechanisms can clobber local return data
25 * Revision 3.0.1.4 89/12/21 19:17:41 lwall
26 * patch7: arranged for certain registers to be restored after longjmp()
27 * patch7: made nested or recursive foreach work right
29 * Revision 3.0.1.3 89/11/17 15:04:36 lwall
30 * patch5: nested foreach on same array didn't work
32 * Revision 3.0.1.2 89/11/11 04:08:56 lwall
33 * patch2: non-BSD machines required two ^D's for <>
34 * patch2: grow_dlevel() not inside #ifdef DEBUGGING
36 * Revision 3.0.1.1 89/10/26 23:04:21 lwall
37 * patch1: heuristically disabled optimization could cause core dump
39 * Revision 3.0 89/10/18 15:09:02 lwall
55 /* do longjmps() clobber register variables? */
57 #if defined(cray) || defined(__STDC__)
61 /* This is the main command loop. We try to spend as much time in this loop
62 * as possible, so lots of optimizations do their activities in here. This
63 * means things get a little sloppy.
67 cmd_exec(cmdparm,gimme,sp)
68 CMD *VOLATILE cmdparm;
72 register CMD *cmd = cmdparm;
73 SPAT *VOLATILE oldspat;
74 VOLATILE int firstsave = savestack->ary_fill;
76 VOLATILE int aryoptsave;
78 VOLATILE int olddlevel;
79 VOLATILE int entdlevel;
81 register STR *retstr = &str_undef;
83 register int cmdflags;
85 register char *go_to = goto_targ;
86 register int newsp = -2;
87 register STR **st = stack->ary_array;
100 tainted = 0; /* Each statement is presumed innocent */
102 if (cmd == Nullcmd) {
103 if (gimme == G_ARRAY && newsp > -2)
110 cmdflags = cmd->c_flags; /* hopefully load register */
112 if (cmd->c_label && strEQ(go_to,cmd->c_label))
113 goto_targ = go_to = Nullch; /* here at last */
115 switch (cmd->c_type) {
118 oldsave = savestack->ary_fill;
124 if (cmd->ucmd.ccmd.cc_true) {
127 debname[dlevel] = 't';
128 debdelim[dlevel] = '_';
129 if (++dlevel >= dlmax)
133 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
134 st = stack->ary_array; /* possibly reallocated */
140 if (savestack->ary_fill > oldsave)
141 restorelist(oldsave);
145 cmd = cmd->ucmd.ccmd.cc_alt;
146 goto tail_recursion_entry;
149 oldsave = savestack->ary_fill;
155 if (cmd->ucmd.ccmd.cc_true) {
158 debname[dlevel] = 'e';
159 debdelim[dlevel] = '_';
160 if (++dlevel >= dlmax)
164 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
165 st = stack->ary_array; /* possibly reallocated */
171 if (savestack->ary_fill > oldsave)
172 restorelist(oldsave);
179 if (!(cmdflags & CF_ONCE)) {
181 if (++loop_ptr >= loop_max) {
183 Renew(loop_stack, loop_max, struct loop);
185 loop_stack[loop_ptr].loop_label = cmd->c_label;
186 loop_stack[loop_ptr].loop_sp = sp;
189 deb("(Pushing label #%d %s)\n",
190 loop_ptr, cmd->c_label ? cmd->c_label : "");
197 if (match = setjmp(loop_stack[loop_ptr].loop_env)) {
198 st = stack->ary_array; /* possibly reallocated */
201 cmdflags = cmd->c_flags|CF_ONCE;
203 if (savestack->ary_fill > oldsave)
204 restorelist(oldsave);
207 fatal("longjmp returned bad value (%d)",match);
208 case O_LAST: /* not done unless go_to found */
215 newsp = sp + lastsize;
223 case O_NEXT: /* not done unless go_to found */
230 case O_REDO: /* not done unless go_to found */
240 oldsave = savestack->ary_fill;
244 if (cmd->ucmd.ccmd.cc_true) {
247 debname[dlevel] = 't';
248 debdelim[dlevel] = '_';
249 if (++dlevel >= dlmax)
253 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
254 st = stack->ary_array; /* possibly reallocated */
264 if (cmd->ucmd.ccmd.cc_alt) {
267 debname[dlevel] = 'a';
268 debdelim[dlevel] = '_';
269 if (++dlevel >= dlmax)
273 newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme && (cmdflags & CF_TERM),sp);
274 st = stack->ary_array; /* possibly reallocated */
283 if (cmd && cmd->c_head == cmd)
284 /* reached end of while loop */
285 return sp; /* targ isn't in this block */
286 if (cmdflags & CF_ONCE) {
289 tmps = loop_stack[loop_ptr].loop_label;
290 deb("(Popping label #%d %s)\n",loop_ptr,
296 goto tail_recursion_entry;
302 /* Set line number so run-time errors can be located */
309 deb("%s (%lx) r%lx t%lx a%lx n%lx cs%lx\n",
310 cmdname[cmd->c_type],cmd,cmd->c_expr,
311 cmd->ucmd.ccmd.cc_true,cmd->ucmd.ccmd.cc_alt,cmd->c_next,
314 debname[dlevel] = cmdname[cmd->c_type][0];
315 debdelim[dlevel] = '!';
316 if (++dlevel >= dlmax)
321 /* Here is some common optimization */
323 if (cmdflags & CF_COND) {
324 switch (cmdflags & CF_OPTIMIZE) {
327 retstr = cmd->c_short;
330 if (cmdflags & CF_NESURE)
334 retstr = cmd->c_short;
337 if (cmdflags & CF_EQSURE)
342 retstr = STAB_STR(cmd->c_stab);
344 match = str_true(retstr); /* => retstr = retstr, c2 should fix */
345 if (cmdflags & (match ? CF_EQSURE : CF_NESURE))
349 case CFT_ANCHOR: /* /^pat/ optimization */
351 if (*cmd->c_short->str_ptr && !(cmdflags & CF_EQSURE))
352 goto scanner; /* just unanchor it */
354 break; /* must evaluate */
357 case CFT_STROP: /* string op optimization */
358 retstr = STAB_STR(cmd->c_stab);
361 if (*cmd->c_short->str_ptr == *str_get(retstr) &&
362 bcmp(cmd->c_short->str_ptr, str_get(retstr),
363 cmd->c_slen) == 0 ) {
364 if (cmdflags & CF_EQSURE) {
365 if (sawampersand && (cmdflags & CF_OPTIMIZE) != CFT_STROP) {
368 str_nset(stab_val(leftstab),"",0);
370 str_sset(stab_val(amperstab),cmd->c_short);
372 str_nset(stab_val(rightstab),
373 retstr->str_ptr + cmd->c_slen,
374 retstr->str_cur - cmd->c_slen);
376 match = !(cmdflags & CF_FIRSTNEG);
381 else if (cmdflags & CF_NESURE) {
382 match = cmdflags & CF_FIRSTNEG;
388 char *zap1, *zap2, zap1c, zap2c;
391 zap1 = cmd->c_short->str_ptr;
392 zap2 = str_get(retstr);
395 zaplen = cmd->c_slen;
396 if ((zap1c == zap2c) && (bcmp(zap1, zap2, zaplen) == 0)) {
397 if (cmdflags & CF_EQSURE) {
399 (cmdflags & CF_OPTIMIZE) != CFT_STROP) {
402 str_nset(stab_val(leftstab),"",0);
404 str_sset(stab_val(amperstab),cmd->c_short);
406 str_nset(stab_val(rightstab),
407 retstr->str_ptr + cmd->c_slen,
408 retstr->str_cur - cmd->c_slen);
410 match = !(cmdflags & CF_FIRSTNEG);
415 else if (cmdflags & CF_NESURE) {
416 match = cmdflags & CF_FIRSTNEG;
422 break; /* must evaluate */
424 case CFT_SCAN: /* non-anchored search */
426 retstr = STAB_STR(cmd->c_stab);
428 if (retstr->str_pok & SP_STUDIED)
429 if (screamfirst[cmd->c_short->str_rare] >= 0)
430 tmps = screaminstr(retstr, cmd->c_short);
434 tmps = str_get(retstr); /* make sure it's pok */
436 tmps = fbminstr((unsigned char*)tmps,
437 (unsigned char*)tmps + retstr->str_cur, cmd->c_short);
441 if (cmdflags & CF_EQSURE) {
442 ++cmd->c_short->str_u.str_useful;
446 str_nset(stab_val(leftstab),retstr->str_ptr,
447 tmps - retstr->str_ptr);
449 str_sset(stab_val(amperstab),cmd->c_short);
451 str_nset(stab_val(rightstab),
452 tmps + cmd->c_short->str_cur,
453 retstr->str_cur - (tmps - retstr->str_ptr) -
454 cmd->c_short->str_cur);
456 match = !(cmdflags & CF_FIRSTNEG);
464 if (cmdflags & CF_NESURE) {
465 ++cmd->c_short->str_u.str_useful;
466 match = cmdflags & CF_FIRSTNEG;
471 if (--cmd->c_short->str_u.str_useful < 0) {
472 cmdflags &= ~CF_OPTIMIZE;
473 cmdflags |= CFT_EVAL; /* never try this optimization again */
474 cmd->c_flags = (cmdflags & ~CF_ONCE);
476 break; /* must evaluate */
478 case CFT_NUMOP: /* numeric op optimization */
479 retstr = STAB_STR(cmd->c_stab);
481 switch (cmd->c_slen) {
484 if ((!retstr->str_nok && !looks_like_number(retstr)))
485 warn("Possible use of == on string value");
487 match = (str_gnum(retstr) == cmd->c_short->str_u.str_nval);
490 match = (str_gnum(retstr) != cmd->c_short->str_u.str_nval);
493 match = (str_gnum(retstr) < cmd->c_short->str_u.str_nval);
496 match = (str_gnum(retstr) <= cmd->c_short->str_u.str_nval);
499 match = (str_gnum(retstr) > cmd->c_short->str_u.str_nval);
502 match = (str_gnum(retstr) >= cmd->c_short->str_u.str_nval);
506 if (cmdflags & CF_EQSURE) {
511 else if (cmdflags & CF_NESURE) {
515 break; /* must evaluate */
517 case CFT_INDGETS: /* while (<$foo>) */
518 last_in_stab = stabent(str_get(STAB_STR(cmd->c_stab)),TRUE);
519 if (!stab_io(last_in_stab))
520 stab_io(last_in_stab) = stio_new();
522 case CFT_GETS: /* really a while (<file>) */
523 last_in_stab = cmd->c_stab;
525 fp = stab_io(last_in_stab)->ifp;
526 retstr = stab_val(defstab);
529 if (fp && str_gets(retstr, fp, 0)) {
530 if (*retstr->str_ptr == '0' && retstr->str_cur == 1)
534 stab_io(last_in_stab)->lines++;
536 else if (stab_io(last_in_stab)->flags & IOF_ARGV) {
538 goto doeval; /* first time through */
539 fp = nextargv(last_in_stab);
542 (void)do_close(last_in_stab,FALSE);
543 stab_io(last_in_stab)->flags |= IOF_START;
555 while (tmps_max > tmps_base) /* clean up after last eval */
556 str_free(tmps_list[tmps_max--]);
557 newsp = eval(cmd->c_expr,gimme && (cmdflags & CF_TERM),sp);
558 st = stack->ary_array; /* possibly reallocated */
560 match = str_true(retstr);
561 if (cmd->c_expr->arg_type == O_FLIP) /* undid itself? */
562 cmdflags = copyopt(cmd,cmd->c_expr[3].arg_ptr.arg_cmd);
565 retstr = stab_val(cmd->c_stab);
567 match = (retstr->str_cur != 0);
568 tmps = str_get(retstr);
569 tmps += retstr->str_cur - match;
570 str_nset(&str_chop,tmps,match);
573 retstr->str_cur = tmps - retstr->str_ptr;
577 match = cmd->c_short->str_u.str_useful; /* just to get register */
579 if (match < 0) { /* first time through here? */
580 ar = stab_array(cmd->c_expr[1].arg_ptr.arg_stab);
581 aryoptsave = savestack->ary_fill;
582 savesptr(&stab_val(cmd->c_stab));
583 savelong(&cmd->c_short->str_u.str_useful);
586 ar = stab_xarray(cmd->c_expr[1].arg_ptr.arg_stab);
587 if (cmd->c_type != C_WHILE && savestack->ary_fill > firstsave)
588 restorelist(firstsave);
591 if (match >= ar->ary_fill) { /* we're in LAST, probably */
593 cmd->c_short->str_u.str_useful = -1; /* actually redundant */
598 retstr = stab_val(cmd->c_stab) = ar->ary_array[match];
599 cmd->c_short->str_u.str_useful = match;
606 /* we have tried to make this normal case as abnormal as possible */
609 if (gimme == G_ARRAY) {
610 lastretstr = Nullstr;
612 lastsize = newsp - sp;
616 while (tmps_max > tmps_base) /* clean up after last eval */
617 str_free(tmps_list[tmps_max--]);
618 newsp = eval(cmd->c_expr,gimme && (cmdflags & CF_TERM),sp);
619 st = stack->ary_array; /* possibly reallocated */
621 if (newsp > sp && retstr)
622 match = str_true(retstr);
627 /* if flipflop was true, flop it */
630 if (match && cmdflags & CF_FLIP) {
631 while (tmps_max > tmps_base) /* clean up after last eval */
632 str_free(tmps_list[tmps_max--]);
633 if (cmd->c_expr->arg_type == O_FLOP) { /* currently toggled? */
634 newsp = eval(cmd->c_expr,G_SCALAR,sp);/*let eval undo it*/
635 cmdflags = copyopt(cmd,cmd->c_expr[3].arg_ptr.arg_cmd);
638 newsp = eval(cmd->c_expr,G_SCALAR,sp);/* let eval do it */
639 if (cmd->c_expr->arg_type == O_FLOP) /* still toggled? */
640 cmdflags = copyopt(cmd,cmd->c_expr[4].arg_ptr.arg_cmd);
643 else if (cmdflags & CF_FLIP) {
644 if (cmd->c_expr->arg_type == O_FLOP) { /* currently toggled? */
645 match = TRUE; /* force on */
649 /* at this point, match says whether our expression was true */
652 if (cmdflags & CF_INVERT)
658 tainted = 0; /* modifier doesn't affect regular expression */
661 /* now to do the actual command, if any */
663 switch (cmd->c_type) {
665 fatal("panic: cmd_exec");
666 case C_EXPR: /* evaluated for side effects */
667 if (cmd->ucmd.acmd.ac_expr) { /* more to do? */
668 if (gimme == G_ARRAY) {
669 lastretstr = Nullstr;
671 lastsize = newsp - sp;
675 while (tmps_max > tmps_base) /* clean up after last eval */
676 str_free(tmps_list[tmps_max--]);
677 newsp = eval(cmd->ucmd.acmd.ac_expr,gimme && (cmdflags&CF_TERM),sp);
678 st = stack->ary_array; /* possibly reallocated */
683 match = (int)str_gnum(STAB_STR(cmd->c_stab));
686 match = *(str_get(STAB_STR(cmd->c_stab))) & 255;
688 match -= cmd->ucmd.scmd.sc_offset;
691 else if (match > cmd->ucmd.scmd.sc_max)
692 match = cmd->ucmd.scmd.sc_max;
693 cmd = cmd->ucmd.scmd.sc_next[match];
694 goto tail_recursion_entry;
696 cmd = cmd->ucmd.ccmd.cc_alt;
697 goto tail_recursion_entry;
699 fatal("panic: ELSIF");
702 oldsave = savestack->ary_fill;
708 if (cmd->ucmd.ccmd.cc_true) {
711 debname[dlevel] = 't';
712 debdelim[dlevel] = '_';
713 if (++dlevel >= dlmax)
717 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
718 st = stack->ary_array; /* possibly reallocated */
722 if (savestack->ary_fill > oldsave)
723 restorelist(oldsave);
727 cmd = cmd->ucmd.ccmd.cc_alt;
728 goto tail_recursion_entry;
731 oldsave = savestack->ary_fill;
737 if (cmd->ucmd.ccmd.cc_true) {
740 debname[dlevel] = 'e';
741 debdelim[dlevel] = '_';
742 if (++dlevel >= dlmax)
746 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
747 st = stack->ary_array; /* possibly reallocated */
751 if (savestack->ary_fill > oldsave)
752 restorelist(oldsave);
759 if (!(cmdflags & CF_ONCE)) { /* first time through here? */
761 if (++loop_ptr >= loop_max) {
763 Renew(loop_stack, loop_max, struct loop);
765 loop_stack[loop_ptr].loop_label = cmd->c_label;
766 loop_stack[loop_ptr].loop_sp = sp;
769 deb("(Pushing label #%d %s)\n",
770 loop_ptr, cmd->c_label ? cmd->c_label : "");
777 if (match = setjmp(loop_stack[loop_ptr].loop_env)) {
778 st = stack->ary_array; /* possibly reallocated */
781 cmdflags = cmd->c_flags|CF_ONCE;
784 if (savestack->ary_fill > oldsave)
785 restorelist(oldsave);
788 fatal("longjmp returned bad value (%d)",match);
795 newsp = sp + lastsize;
818 oldsave = savestack->ary_fill;
823 if (cmd->ucmd.ccmd.cc_true) {
826 debname[dlevel] = 't';
827 debdelim[dlevel] = '_';
828 if (++dlevel >= dlmax)
832 newsp = cmd_exec(cmd->ucmd.ccmd.cc_true,gimme && (cmdflags & CF_TERM),sp);
833 st = stack->ary_array; /* possibly reallocated */
836 /* actually, this spot is rarely reached anymore since the above
837 * cmd_exec() returns through longjmp(). Hooray for structure.
843 if (cmd->ucmd.ccmd.cc_alt) {
846 debname[dlevel] = 'a';
847 debdelim[dlevel] = '_';
848 if (++dlevel >= dlmax)
852 newsp = cmd_exec(cmd->ucmd.ccmd.cc_alt,gimme && (cmdflags & CF_TERM),sp);
853 st = stack->ary_array; /* possibly reallocated */
858 if (savestack->ary_fill > oldsave) {
859 if (cmdflags & CF_TERM) {
860 for (match = sp + 1; match <= newsp; match++)
861 st[match] = str_static(st[match]);
864 restorelist(oldsave);
867 dlevel = olddlevel - 1;
869 if (cmd->c_type != C_BLOCK)
870 goto until_loop; /* go back and evaluate conditional again */
872 if (cmdflags & CF_LOOP) {
873 cmdflags |= CF_COND; /* now test the condition */
880 if (cmdflags & CF_ONCE) {
883 tmps = loop_stack[loop_ptr].loop_label;
884 deb("(Popping label #%d %s)\n",loop_ptr, tmps ? tmps : "");
888 if ((cmdflags & CF_OPTIMIZE) == CFT_ARRAY &&
889 savestack->ary_fill > aryoptsave)
890 restorelist(aryoptsave);
893 goto tail_recursion_entry;
899 deb(pat,a1,a2,a3,a4,a5,a6,a7,a8)
904 fprintf(stderr,"%-4ld",(long)line);
905 for (i=0; i<dlevel; i++)
906 fprintf(stderr,"%c%c ",debname[i],debdelim[i]);
907 fprintf(stderr,pat,a1,a2,a3,a4,a5,a6,a7,a8);
919 fprintf(stderr,"%-4ld",(long)line);
920 for (i=0; i<dlevel; i++)
921 fprintf(stderr,"%c%c ",debname[i],debdelim[i]);
923 pat = va_arg(args, char *);
924 (void) vfprintf(stderr,pat,args);
934 cmd->c_flags &= CF_ONCE|CF_COND|CF_LOOP;
935 cmd->c_flags |= which->c_flags;
936 cmd->c_short = which->c_short;
937 cmd->c_slen = which->c_slen;
938 cmd->c_stab = which->c_stab;
949 str->str_state = SS_SARY;
950 str->str_u.str_stab = stab;
952 Safefree(str->str_ptr);
955 str->str_ptr = (char*)stab_array(stab);
956 (void)apush(savestack,str); /* save array ptr */
957 stab_xarray(stab) = Null(ARRAY*);
958 return stab_xarray(aadd(stab));
968 str->str_state = SS_SHASH;
969 str->str_u.str_stab = stab;
971 Safefree(str->str_ptr);
974 str->str_ptr = (char*)stab_hash(stab);
975 (void)apush(savestack,str); /* save hash ptr */
976 stab_xhash(stab) = Null(HASH*);
977 return stab_xhash(hadd(stab));
986 (void)apush(savestack,item); /* remember the pointer */
989 (void)apush(savestack,str); /* remember the value */
999 str->str_state = SS_SINT;
1000 str->str_u.str_useful = (long)*intp; /* remember value */
1002 Safefree(str->str_ptr);
1005 str->str_ptr = (char*)intp; /* remember pointer */
1006 (void)apush(savestack,str);
1015 str = Str_new(14,0);
1016 str->str_state = SS_SLONG;
1017 str->str_u.str_useful = *longp; /* remember value */
1019 Safefree(str->str_ptr);
1022 str->str_ptr = (char*)longp; /* remember pointer */
1023 (void)apush(savestack,str);
1032 str = Str_new(15,0);
1033 str->str_state = SS_SSTRP;
1034 str->str_magic = *sptr; /* remember value */
1036 Safefree(str->str_ptr);
1039 str->str_ptr = (char*)sptr; /* remember pointer */
1040 (void)apush(savestack,str);
1049 str = Str_new(16,0);
1050 str->str_state = SS_SNSTAB;
1051 str->str_magic = (STR*)stab; /* remember which stab to free */
1052 (void)apush(savestack,str);
1061 str = Str_new(17,0);
1062 str->str_state = SS_SHPTR;
1063 str->str_u.str_hash = *hptr; /* remember value */
1065 Safefree(str->str_ptr);
1068 str->str_ptr = (char*)hptr; /* remember pointer */
1069 (void)apush(savestack,str);
1073 savelist(sarg,maxsarg)
1074 register STR **sarg;
1080 for (i = 1; i <= maxsarg; i++) {
1081 (void)apush(savestack,sarg[i]); /* remember the pointer */
1082 str = Str_new(18,0);
1083 str_sset(str,sarg[i]);
1084 (void)apush(savestack,str); /* remember the value */
1085 sarg[i]->str_u.str_useful = -1;
1094 register STR *value;
1095 register STAB *stab;
1098 fatal("panic: corrupt saved stack index");
1099 while (savestack->ary_fill > base) {
1100 value = apop(savestack);
1101 switch (value->str_state) {
1102 case SS_NORM: /* normal string */
1104 str = apop(savestack);
1105 str_replace(str,value);
1108 case SS_SARY: /* array reference */
1109 stab = value->str_u.str_stab;
1110 afree(stab_xarray(stab));
1111 stab_xarray(stab) = (ARRAY*)value->str_ptr;
1112 value->str_ptr = Nullch;
1115 case SS_SHASH: /* hash reference */
1116 stab = value->str_u.str_stab;
1117 (void)hfree(stab_xhash(stab));
1118 stab_xhash(stab) = (HASH*)value->str_ptr;
1119 value->str_ptr = Nullch;
1122 case SS_SINT: /* int reference */
1123 *((int*)value->str_ptr) = (int)value->str_u.str_useful;
1124 value->str_ptr = Nullch;
1127 case SS_SLONG: /* long reference */
1128 *((long*)value->str_ptr) = value->str_u.str_useful;
1129 value->str_ptr = Nullch;
1132 case SS_SSTRP: /* STR* reference */
1133 *((STR**)value->str_ptr) = value->str_magic;
1134 value->str_magic = Nullstr;
1135 value->str_ptr = Nullch;
1138 case SS_SHPTR: /* HASH* reference */
1139 *((HASH**)value->str_ptr) = value->str_u.str_hash;
1140 value->str_ptr = Nullch;
1144 stab = (STAB*)value->str_magic;
1145 value->str_magic = Nullstr;
1146 (void)stab_clear(stab);
1150 fatal("panic: restorelist inconsistency");
1160 Renew(debname, dlmax, char);
1161 Renew(debdelim, dlmax, char);