1 /* $Header: consarg.c,v 3.0 89/10/18 15:10:30 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 89/10/18 15:10:30 lwall
16 static int nothing_in_common();
17 static int arg_common();
18 static int spat_common();
21 make_split(stab,arg,limarg)
28 if (arg->arg_type != O_MATCH) {
29 Newz(201,spat,1,SPAT);
30 spat->spat_next = curstash->tbl_spatroot; /* link into spat list */
31 curstash->tbl_spatroot = spat;
33 spat->spat_runtime = arg;
34 arg = make_match(O_MATCH,stab2arg(A_STAB,defstab),spat);
39 if (limarg->arg_type == O_ITEM) {
40 Copy(limarg+1,arg+3,1,ARG);
41 limarg[1].arg_type = A_NULL;
45 arg[3].arg_type = A_EXPR;
46 arg[3].arg_ptr.arg_arg = limarg;
50 arg[3].arg_type = A_NULL;
51 arg->arg_type = O_SPLIT;
52 spat = arg[2].arg_ptr.arg_spat;
53 spat->spat_repl = stab2arg(A_STAB,aadd(stab));
54 if (spat->spat_short) { /* exact match can bypass regexec() */
55 if (!((spat->spat_flags & SPAT_SCANFIRST) &&
56 (spat->spat_flags & SPAT_ALL) )) {
57 str_free(spat->spat_short);
58 spat->spat_short = Nullstr;
65 mod_match(type,left,pat)
73 if ((pat->arg_type == O_MATCH ||
74 pat->arg_type == O_SUBST ||
75 pat->arg_type == O_TRANS ||
76 pat->arg_type == O_SPLIT
78 pat[1].arg_ptr.arg_stab == defstab ) {
79 switch (pat->arg_type) {
81 newarg = make_op(type == O_MATCH ? O_MATCH : O_NMATCH,
83 left,Nullarg,Nullarg);
86 newarg = l(make_op(type == O_MATCH ? O_SUBST : O_NSUBST,
88 left,Nullarg,Nullarg));
91 newarg = l(make_op(type == O_MATCH ? O_TRANS : O_NTRANS,
93 left,Nullarg,Nullarg));
96 newarg = make_op(type == O_MATCH ? O_SPLIT : O_SPLIT,
98 left,Nullarg,Nullarg);
101 if (pat->arg_len >= 2) {
102 newarg[2].arg_type = pat[2].arg_type;
103 newarg[2].arg_ptr = pat[2].arg_ptr;
104 newarg[2].arg_flags = pat[2].arg_flags;
105 if (pat->arg_len >= 3) {
106 newarg[3].arg_type = pat[3].arg_type;
107 newarg[3].arg_ptr = pat[3].arg_ptr;
108 newarg[3].arg_flags = pat[3].arg_flags;
114 Newz(202,spat,1,SPAT);
115 spat->spat_next = curstash->tbl_spatroot; /* link into spat list */
116 curstash->tbl_spatroot = spat;
118 spat->spat_runtime = pat;
119 newarg = make_op(type,2,left,Nullarg,Nullarg);
120 newarg[2].arg_type = A_SPAT | A_DONT;
121 newarg[2].arg_ptr.arg_spat = spat;
128 make_op(type,newlen,arg1,arg2,arg3)
138 extern ARG *arg4; /* should be normal arguments, really */
141 arg = op_new(newlen);
142 arg->arg_type = type;
143 doarg = opargs[type];
145 if (chld->arg_type == O_ITEM &&
146 (hoistable[chld[1].arg_type] || chld[1].arg_type == A_LVAL ||
147 (chld[1].arg_type == A_LEXPR &&
148 (chld[1].arg_ptr.arg_arg->arg_type == O_LIST ||
149 chld[1].arg_ptr.arg_arg->arg_type == O_ARRAY ||
150 chld[1].arg_ptr.arg_arg->arg_type == O_HASH ))))
152 arg[1].arg_type = chld[1].arg_type;
153 arg[1].arg_ptr = chld[1].arg_ptr;
154 arg[1].arg_flags |= chld[1].arg_flags;
155 arg[1].arg_len = chld[1].arg_len;
159 arg[1].arg_type = A_EXPR;
160 arg[1].arg_ptr.arg_arg = chld;
163 arg[1].arg_type |= A_DONT;
165 arg[1].arg_flags |= AF_ARYOK;
169 if (chld->arg_type == O_ITEM &&
170 (hoistable[chld[1].arg_type] ||
172 ((chld[1].arg_type == A_READ && !(arg[1].arg_type & A_DONT))
174 (chld[1].arg_type == A_INDREAD && !(arg[1].arg_type & A_DONT))
176 (chld[1].arg_type == A_GLOB && !(arg[1].arg_type & A_DONT))
178 arg[2].arg_type = chld[1].arg_type;
179 arg[2].arg_ptr = chld[1].arg_ptr;
180 arg[2].arg_len = chld[1].arg_len;
184 arg[2].arg_type = A_EXPR;
185 arg[2].arg_ptr.arg_arg = chld;
188 arg[2].arg_type |= A_DONT;
190 arg[2].arg_flags |= AF_ARYOK;
194 if (chld->arg_type == O_ITEM && hoistable[chld[1].arg_type]) {
195 arg[3].arg_type = chld[1].arg_type;
196 arg[3].arg_ptr = chld[1].arg_ptr;
197 arg[3].arg_len = chld[1].arg_len;
201 arg[3].arg_type = A_EXPR;
202 arg[3].arg_ptr.arg_arg = chld;
205 arg[3].arg_type |= A_DONT;
207 arg[3].arg_flags |= AF_ARYOK;
209 if (newlen >= 4 && (chld = arg4)) {
210 if (chld->arg_type == O_ITEM && hoistable[chld[1].arg_type]) {
211 arg[4].arg_type = chld[1].arg_type;
212 arg[4].arg_ptr = chld[1].arg_ptr;
213 arg[4].arg_len = chld[1].arg_len;
217 arg[4].arg_type = A_EXPR;
218 arg[4].arg_ptr.arg_arg = chld;
221 if (newlen >= 5 && (chld = arg5)) {
222 if (chld->arg_type == O_ITEM && hoistable[chld[1].arg_type]) {
223 arg[5].arg_type = chld[1].arg_type;
224 arg[5].arg_ptr = chld[1].arg_ptr;
225 arg[5].arg_len = chld[1].arg_len;
229 arg[5].arg_type = A_EXPR;
230 arg[5].arg_ptr.arg_arg = chld;
235 fprintf(stderr,"%lx <= make_op(%s",arg,opname[arg->arg_type]);
237 fprintf(stderr,",%s=%lx",
238 argname[arg[1].arg_type&A_MASK],arg[1].arg_ptr.arg_arg);
240 fprintf(stderr,",%s=%lx",
241 argname[arg[2].arg_type&A_MASK],arg[2].arg_ptr.arg_arg);
243 fprintf(stderr,",%s=%lx",
244 argname[arg[3].arg_type&A_MASK],arg[3].arg_ptr.arg_arg);
246 fprintf(stderr,",%s=%lx",
247 argname[arg[4].arg_type&A_MASK],arg[4].arg_ptr.arg_arg);
249 fprintf(stderr,",%s=%lx",
250 argname[arg[5].arg_type&A_MASK],arg[5].arg_ptr.arg_arg);
251 fprintf(stderr,")\n");
254 evalstatic(arg); /* see if we can consolidate anything */
265 double value; /* must not be register */
268 unsigned long tmplong;
270 double exp(), log(), sqrt(), modf();
272 double sin(), cos(), atan2(), pow();
274 if (!arg || !arg->arg_len)
277 if ((arg[1].arg_type == A_SINGLE || arg->arg_type == O_AELEM) &&
278 (arg->arg_len == 1 || arg[2].arg_type == A_SINGLE) ) {
280 s1 = arg[1].arg_ptr.arg_str;
281 if (arg->arg_len > 1)
282 s2 = arg[2].arg_ptr.arg_str;
285 switch (arg->arg_type) {
287 i = (int)str_gnum(s2);
288 if (i < 32767 && i >= 0) {
289 arg->arg_type = O_ITEM;
291 arg[1].arg_type = A_ARYSTAB; /* $abc[123] is hoistable now */
293 arg[1].arg_ptr = arg[1].arg_ptr; /* get stab pointer */
299 str = Nullstr; /* can't be evaluated yet */
306 i = (int)str_gnum(s2);
311 value = str_gnum(s1);
312 str_numset(str,value * str_gnum(s2));
315 value = str_gnum(s2);
317 yyerror("Illegal division by constant zero");
319 str_numset(str,str_gnum(s1) / value);
322 tmplong = (long)str_gnum(s2);
324 yyerror("Illegal modulus of constant zero");
327 tmp2 = (long)str_gnum(s1);
330 str_numset(str,(double)(tmp2 % tmplong));
332 str_numset(str,(double)(tmplong - (-tmp2 % tmplong)));
338 value = str_gnum(s1);
339 str_numset(str,value + str_gnum(s2));
342 value = str_gnum(s1);
343 str_numset(str,value - str_gnum(s2));
346 value = str_gnum(s1);
347 i = (int)str_gnum(s2);
349 str_numset(str,(double)(((long)value) << i));
353 value = str_gnum(s1);
354 i = (int)str_gnum(s2);
356 str_numset(str,(double)(((long)value) >> i));
360 value = str_gnum(s1);
361 str_numset(str,(value < str_gnum(s2)) ? 1.0 : 0.0);
364 value = str_gnum(s1);
365 str_numset(str,(value > str_gnum(s2)) ? 1.0 : 0.0);
368 value = str_gnum(s1);
369 str_numset(str,(value <= str_gnum(s2)) ? 1.0 : 0.0);
372 value = str_gnum(s1);
373 str_numset(str,(value >= str_gnum(s2)) ? 1.0 : 0.0);
377 if ((!s1->str_nok && !looks_like_number(s1)) ||
378 (!s2->str_nok && !looks_like_number(s2)) )
379 warn("Possible use of == on string value");
381 value = str_gnum(s1);
382 str_numset(str,(value == str_gnum(s2)) ? 1.0 : 0.0);
385 value = str_gnum(s1);
386 str_numset(str,(value != str_gnum(s2)) ? 1.0 : 0.0);
389 value = str_gnum(s1);
391 str_numset(str,(double)(((long)value) & ((long)str_gnum(s2))));
395 value = str_gnum(s1);
397 str_numset(str,(double)(((long)value) ^ ((long)str_gnum(s2))));
401 value = str_gnum(s1);
403 str_numset(str,(double)(((long)value) | ((long)str_gnum(s2))));
419 if ((arg[3].arg_type & A_MASK) != A_SINGLE) {
427 str_sset(str,arg[3].arg_ptr.arg_str);
428 str_free(arg[3].arg_ptr.arg_str);
432 str_numset(str,(double)(-str_gnum(s1)));
435 str_numset(str,(double)(!str_true(s1)));
439 str_numset(str,(double)(~(long)str_gnum(s1)));
443 str_numset(str,sin(str_gnum(s1)));
446 str_numset(str,cos(str_gnum(s1)));
449 value = str_gnum(s1);
450 str_numset(str,atan2(value, str_gnum(s2)));
453 value = str_gnum(s1);
454 str_numset(str,pow(value, str_gnum(s2)));
457 str_numset(str, (double)str_len(s1));
460 str_numset(str,(double)(str_cmp(s1,s2) < 0));
463 str_numset(str,(double)(str_cmp(s1,s2) > 0));
466 str_numset(str,(double)(str_cmp(s1,s2) <= 0));
469 str_numset(str,(double)(str_cmp(s1,s2) >= 0));
472 str_numset(str,(double)(str_eq(s1,s2)));
475 str_numset(str,(double)(!str_eq(s1,s2)));
480 str_set(str,crypt(tmps,str_get(s2)));
483 "The crypt() function is unimplemented due to excessive paranoia.");
487 str_numset(str,exp(str_gnum(s1)));
490 str_numset(str,log(str_gnum(s1)));
493 str_numset(str,sqrt(str_gnum(s1)));
496 value = str_gnum(s1);
498 (void)modf(value,&value);
500 (void)modf(-value,&value);
503 str_numset(str,value);
507 str_numset(str,(double)(*str_get(s1)));
515 str_numset(str,(double)(zapc));
521 arg->arg_type = O_ITEM; /* note arg1 type is already SINGLE */
524 arg[1].arg_ptr.arg_str = str;
539 i = arg[1].arg_type & A_MASK;
541 arg->arg_flags |= AF_COMMON; /* assume something in common */
542 /* which forces us to copy things */
545 arg[1].arg_type = A_LARYLEN;
548 if (i == A_ARYSTAB) {
549 arg[1].arg_type = A_LARYSTAB;
553 /* see if it's an array reference */
555 if (i == A_EXPR || i == A_LEXPR) {
556 arg1 = arg[1].arg_ptr.arg_arg;
558 if (arg1->arg_type == O_LIST || arg1->arg_type == O_ITEM) {
560 if (arg->arg_len > 1) {
562 arg2 = arg[2].arg_ptr.arg_arg;
563 if (nothing_in_common(arg1,arg2))
564 arg->arg_flags &= ~AF_COMMON;
565 if (arg->arg_type == O_ASSIGN) {
566 if (arg1->arg_flags & AF_LOCAL)
567 arg->arg_flags |= AF_LOCAL;
568 arg[1].arg_flags |= AF_ARYOK;
569 arg[2].arg_flags |= AF_ARYOK;
572 else if (arg->arg_type != O_CHOP)
573 arg->arg_type = O_ASSIGN; /* possible local(); */
574 for (i = arg1->arg_len; i >= 1; i--) {
575 switch (arg1[i].arg_type) {
576 case A_STAR: case A_LSTAR:
577 arg1[i].arg_type = A_LSTAR;
579 case A_STAB: case A_LVAL:
580 arg1[i].arg_type = A_LVAL;
582 case A_ARYLEN: case A_LARYLEN:
583 arg1[i].arg_type = A_LARYLEN;
585 case A_ARYSTAB: case A_LARYSTAB:
586 arg1[i].arg_type = A_LARYSTAB;
588 case A_EXPR: case A_LEXPR:
589 arg1[i].arg_type = A_LEXPR;
590 switch(arg1[i].arg_ptr.arg_arg->arg_type) {
591 case O_ARRAY: case O_LARRAY:
592 arg1[i].arg_ptr.arg_arg->arg_type = O_LARRAY;
595 case O_AELEM: case O_LAELEM:
596 arg1[i].arg_ptr.arg_arg->arg_type = O_LAELEM;
598 case O_HASH: case O_LHASH:
599 arg1[i].arg_ptr.arg_arg->arg_type = O_LHASH;
602 case O_HELEM: case O_LHELEM:
603 arg1[i].arg_ptr.arg_arg->arg_type = O_LHELEM;
605 case O_ASLICE: case O_LASLICE:
606 arg1[i].arg_ptr.arg_arg->arg_type = O_LASLICE;
608 case O_HSLICE: case O_LHSLICE:
609 arg1[i].arg_ptr.arg_arg->arg_type = O_LHSLICE;
617 (void)sprintf(tokenbuf, "Illegal item (%s) as lvalue",
618 argname[arg1[i].arg_type&A_MASK]);
622 if (arg->arg_len > 1) {
623 if (arg2->arg_type == O_SPLIT && !arg2[3].arg_type && !arghog) {
624 arg2[3].arg_type = A_SINGLE;
625 arg2[3].arg_ptr.arg_str =
626 str_nmake((double)arg1->arg_len + 1); /* limit split len*/
630 else if (arg1->arg_type == O_AELEM || arg1->arg_type == O_LAELEM)
631 arg1->arg_type = O_LAELEM;
632 else if (arg1->arg_type == O_ARRAY || arg1->arg_type == O_LARRAY) {
633 arg1->arg_type = O_LARRAY;
634 if (arg->arg_len > 1) {
636 arg2 = arg[2].arg_ptr.arg_arg;
637 if (arg2->arg_type == O_SPLIT) { /* use split's builtin =?*/
638 spat = arg2[2].arg_ptr.arg_spat;
639 if (spat->spat_repl[1].arg_ptr.arg_stab == defstab &&
640 nothing_in_common(arg1,spat->spat_repl)) {
641 spat->spat_repl[1].arg_ptr.arg_stab =
642 arg1[1].arg_ptr.arg_stab;
643 arg_free(arg1); /* recursive */
644 free_arg(arg); /* non-recursive */
645 return arg2; /* split has builtin assign */
648 else if (nothing_in_common(arg1,arg2))
649 arg->arg_flags &= ~AF_COMMON;
650 if (arg->arg_type == O_ASSIGN) {
651 arg[1].arg_flags |= AF_ARYOK;
652 arg[2].arg_flags |= AF_ARYOK;
656 else if (arg1->arg_type == O_HELEM || arg1->arg_type == O_LHELEM)
657 arg1->arg_type = O_LHELEM;
658 else if (arg1->arg_type == O_HASH || arg1->arg_type == O_LHASH) {
659 arg1->arg_type = O_LHASH;
660 if (arg->arg_len > 1) {
662 arg2 = arg[2].arg_ptr.arg_arg;
663 if (nothing_in_common(arg1,arg2))
664 arg->arg_flags &= ~AF_COMMON;
665 if (arg->arg_type == O_ASSIGN) {
666 arg[1].arg_flags |= AF_ARYOK;
667 arg[2].arg_flags |= AF_ARYOK;
671 else if (arg1->arg_type == O_ASLICE) {
672 arg1->arg_type = O_LASLICE;
673 if (arg->arg_type == O_ASSIGN) {
674 arg[1].arg_flags |= AF_ARYOK;
675 arg[2].arg_flags |= AF_ARYOK;
678 else if (arg1->arg_type == O_HSLICE) {
679 arg1->arg_type = O_LHSLICE;
680 if (arg->arg_type == O_ASSIGN) {
681 arg[1].arg_flags |= AF_ARYOK;
682 arg[2].arg_flags |= AF_ARYOK;
685 else if ((arg->arg_type == O_DEFINED || arg->arg_type == O_UNDEF) &&
686 (arg1->arg_type == (perldb ? O_DBSUBR : O_SUBR)) ) {
687 arg[1].arg_type |= A_DONT;
689 else if (arg1->arg_type == O_SUBSTR || arg1->arg_type == O_VEC) {
691 Renewc(arg1->arg_ptr.arg_str, 1, struct lstring, STR);
692 /* grow string struct to hold an lstring struct */
694 else if (arg1->arg_type == O_ASSIGN) {
695 if (arg->arg_type == O_CHOP)
696 arg[1].arg_flags &= ~AF_ARYOK; /* grandfather chop idiom */
699 (void)sprintf(tokenbuf,
700 "Illegal expression (%s) as lvalue",opname[arg1->arg_type]);
703 arg[1].arg_type = A_LEXPR | (arg[1].arg_type & A_DONT);
704 if (arg->arg_type == O_ASSIGN && (arg1[1].arg_flags & AF_ARYOK)) {
705 arg[1].arg_flags |= AF_ARYOK;
706 if (arg->arg_len > 1)
707 arg[2].arg_flags |= AF_ARYOK;
711 fprintf(stderr,"lval LEXPR\n");
715 if (i == A_STAR || i == A_LSTAR) {
716 arg[1].arg_type = A_LSTAR | (arg[1].arg_type & A_DONT);
720 /* not an array reference, should be a register name */
722 if (i != A_STAB && i != A_LVAL) {
723 (void)sprintf(tokenbuf,
724 "Illegal item (%s) as lvalue",argname[arg[1].arg_type&A_MASK]);
727 arg[1].arg_type = A_LVAL | (arg[1].arg_type & A_DONT);
730 fprintf(stderr,"lval LVAL\n");
740 if (type == O_DEFINED || type == O_UNDEF) {
741 if (arg->arg_type != O_ITEM)
743 if (arg->arg_type == O_ITEM) {
744 type = arg[1].arg_type & A_MASK;
745 if (type == A_EXPR || type == A_LEXPR)
746 arg[1].arg_type = A_LEXPR|A_DONT;
757 if (arg[i].arg_type != A_EXPR) { /* dehoist */
758 tmparg = make_op(O_ITEM,1,Nullarg,Nullarg,Nullarg);
760 arg[i].arg_ptr.arg_arg = tmparg;
761 arg[i].arg_type = A_EXPR;
766 addflags(i,flags,arg)
769 arg[i].arg_flags |= flags;
777 if (arg->arg_type == O_ARRAY || arg->arg_type == O_HASH)
778 return make_op(O_ITEM,1,arg,Nullarg,Nullarg);
782 /* maybe do a join on multiple array dimensions */
788 if (arg && arg->arg_type == O_COMMA) {
790 arg = make_op(O_JOIN, 2,
791 stab2arg(A_STAB,stabent(";",TRUE)),
804 register ARG *nxtnode;
810 arg->arg_type = O_LIST;
812 if (arg->arg_type != O_COMMA) {
813 if (arg->arg_type != O_ARRAY)
814 arg->arg_flags |= AF_LISTISH; /* see listish() below */
817 for (i = 2, node = arg; ; i++) {
818 if (node->arg_len < 2)
820 if (node[1].arg_type != A_EXPR)
822 node = node[1].arg_ptr.arg_arg;
823 if (node->arg_type != O_COMMA)
829 tmpstr = arg->arg_ptr.arg_str;
831 *arg = *node; /* copy everything except the STR */
833 (void)bcopy((char *)node, (char *)arg, sizeof(ARG));
835 arg->arg_ptr.arg_str = tmpstr;
840 (void)bcopy((char *)(node+2), (char *)(arg+j), sizeof(ARG));
842 arg[j].arg_flags |= AF_ARYOK;
843 --j; /* Bug in Xenix compiler */
848 (void)bcopy((char *)(node+1), (char *)(arg+1), sizeof(ARG));
853 nxtnode = node[1].arg_ptr.arg_arg;
858 arg[1].arg_flags |= AF_ARYOK;
859 arg[2].arg_flags |= AF_ARYOK;
860 arg->arg_type = O_LIST;
865 /* turn a single item into a list */
871 if (arg->arg_flags & AF_LISTISH)
872 arg = make_op(O_LIST,1,arg,Nullarg,Nullarg);
877 maybelistish(optype, arg)
881 if (optype == O_PRTF ||
882 (arg->arg_type == O_ASLICE || arg->arg_type == O_HSLICE ||
883 arg->arg_type == O_F_OR_R) )
888 /* mark list of local variables */
894 arg->arg_flags |= AF_LOCAL;
904 arg[2].arg_ptr.arg_hash = curstash;
905 arg[2].arg_type = A_NULL;
913 if (arg->arg_type == O_CONCAT && arg[2].arg_type == A_READ) {
914 arg->arg_type = O_RCAT;
915 arg[2].arg_type = arg[2].arg_ptr.arg_arg[1].arg_type;
916 arg[2].arg_ptr = arg[2].arg_ptr.arg_arg[1].arg_ptr;
917 free_arg(arg[2].arg_ptr.arg_arg);
930 arg->arg_type = O_ITEM;
931 arg[1].arg_type = atype;
932 arg[1].arg_ptr.arg_stab = stab;
943 arg->arg_type = O_ITEM;
944 arg[1].arg_type = A_SINGLE;
945 arg[1].arg_ptr.arg_str = str_make(cval,0);
956 Newz(203,arg, numargs + 1, ARG);
957 arg->arg_ptr.arg_str = Str_new(21,0);
958 arg->arg_len = numargs;
966 str_free(arg->arg_ptr.arg_str);
971 make_match(type,expr,spat)
978 arg = make_op(type,2,expr,Nullarg,Nullarg);
980 arg[2].arg_type = A_SPAT|A_DONT;
981 arg[2].arg_ptr.arg_spat = spat;
984 fprintf(stderr,"make_match SPAT=%lx\n",(long)spat);
987 if (type == O_SUBST || type == O_NSUBST) {
988 if (arg[1].arg_type != A_STAB) {
989 yyerror("Illegal lvalue");
991 arg[1].arg_type = A_LVAL;
1003 arg->arg_type = O_ITEM;
1004 arg[1].arg_type = A_CMD;
1005 arg[1].arg_ptr.arg_cmd = cmd;
1009 /* Check two expressions to see if there is any identifier in common */
1012 nothing_in_common(arg1,arg2)
1016 static int thisexpr = 0; /* I don't care if this wraps */
1019 if (arg_common(arg1,thisexpr,1))
1020 return 0; /* hit eval or do {} */
1021 if (arg_common(arg2,thisexpr,0))
1022 return 0; /* hit identifier again */
1026 /* Recursively descend an expression and mark any identifier or check
1027 * it to see if it was marked already.
1031 arg_common(arg,exprnum,marking)
1040 for (i = arg->arg_len; i >= 1; i--) {
1041 switch (arg[i].arg_type & A_MASK) {
1046 if (arg_common(arg[i].arg_ptr.arg_arg,exprnum,marking))
1050 return 1; /* assume hanky panky */
1058 stab_lastexpr(arg[i].arg_ptr.arg_stab) = exprnum;
1059 else if (stab_lastexpr(arg[i].arg_ptr.arg_stab) == exprnum)
1065 register char *s = arg[i].arg_ptr.arg_str->str_ptr;
1066 register char *send = s + arg[i].arg_ptr.arg_str->str_cur;
1067 register STAB *stab;
1070 if (*s == '$' && s[1]) {
1071 s = scanreg(s,send,tokenbuf);
1072 stab = stabent(tokenbuf,TRUE);
1074 stab_lastexpr(stab) = exprnum;
1075 else if (stab_lastexpr(stab) == exprnum)
1079 else if (*s == '\\' && s[1])
1086 if (spat_common(arg[i].arg_ptr.arg_spat,exprnum,marking))
1097 switch (arg->arg_type) {
1100 if ((arg[1].arg_type & A_MASK) == A_STAB)
1101 (void)aadd(arg[1].arg_ptr.arg_stab);
1105 if ((arg[1].arg_type & A_MASK) == A_STAB)
1106 (void)hadd(arg[1].arg_ptr.arg_stab);
1117 spat_common(spat,exprnum,marking)
1118 register SPAT *spat;
1122 if (spat->spat_runtime)
1123 if (arg_common(spat->spat_runtime,exprnum,marking))
1125 if (spat->spat_repl) {
1126 if (arg_common(spat->spat_repl,exprnum,marking))