61 WORD FindOnly(PHEAD WORD *term, WORD *pattern)
66 WORD *xstop, *ystop, *setp = AN.ForFindOnly;
68 WORD older[NORMSIZE], *q, newval1, newval2, newval3;
75 tstop = t - ABS(*t) + 1;
78 while ( t < tstop && *t > DOTPRODUCT ) t += t[1];
79 while ( m < mstop && *m > DOTPRODUCT ) m += m[1];
80 if ( m < mstop ) {
do {
89 if ( t < tstop )
while ( *t != SYMBOL ) {
94 if ( *m >= 2*MAXPOWER )
return(0);
95 if ( m[1] >= 2*MAXPOWER ) nt = m[1];
96 else if ( m[1] <= -2*MAXPOWER ) nt = -m[1];
99 if ( CheckWild(BHEAD nt,SYMTONUM,0,&newval3) )
return(0);
100 AddWild(BHEAD nt,SYMTONUM,0);
102 }
while ( m < ystop );
110 if ( *m == *t && t < xstop ) {
111 if ( m[1] == t[1] ) { m += 2; t += 2; }
112 else if ( m[1] >= 2*MAXPOWER ) {
117 else if ( m[1] <= -2*MAXPOWER ) {
120 OnlyL2: nq -= 2*MAXPOWER;
121 if ( CheckWild(BHEAD nq,SYMTONUM,nt,&newval3) )
return(0);
122 AddWild(BHEAD nq,SYMTONUM,nt);
127 *p++ = *t++; *p++ = *t++; n += 2;
130 else if ( *m >= 2*MAXPOWER ) {
131 while ( t < xstop ) { *p++ = *t++; *p++ = *t++; n += 2; }
135 if ( !CheckWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,*p,&newval1) ) {
136 if ( m[1] == p[1] ) {
137 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
140 else if ( m[1] >= 2*MAXPOWER && m[1] != *m ) {
141 if ( !CheckWild(BHEAD m[1]-2*MAXPOWER,SYMTONUM,p[1],&newval3) ) {
142 AddWild(BHEAD m[1]-2*MAXPOWER,SYMTONUM,p[1]);
143 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
147 else if ( m[1] <= -2*MAXPOWER && m[1] != -(*m) ) {
148 if ( !CheckWild(BHEAD -m[1]-2*MAXPOWER,SYMTONUM,-p[1],&newval3) ) {
149 AddWild(BHEAD -m[1]-2*MAXPOWER,SYMTONUM,-p[1]);
150 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
158 if ( nq <= 0 )
return(0);
162 while ( --nq >= 0 ) *p++ = *q++;
166 if ( t >= xstop || *m < *t ) {
167 if ( m[1] >= 2*MAXPOWER ) nt = m[1];
168 else if ( m[1] <= -2*MAXPOWER ) nt = -m[1];
171 if ( CheckWild(BHEAD nt,SYMTONUM,0,&newval3) )
return(0);
172 AddWild(BHEAD nt,SYMTONUM,0);
176 *p++ = *t++; *p++ = *t++; n += 2;
179 }
while ( m < ystop );
181 while ( t < xstop ) { *p++ = *t++; *p++ = *t++; n+= 2; }
186 while ( --nq >= 0 ) {
187 if ( Sets[*m].type != CSYMBOL ) { m++;
continue; }
188 t = SetElements + Sets[*m].first;
189 tstop = SetElements + Sets[*m].last;
190 while ( t < tstop ) {
191 if ( *t++ == *p )
return(0);
205 else if ( *m == DOTPRODUCT ) {
211 if ( *t < DOTPRODUCT )
goto OnlyZer2;
212 while ( *t > DOTPRODUCT ) {
214 if ( t >= tstop || *t < DOTPRODUCT ) {
217 if ( *m >= (AM.OffsetVector+WILDOFFSET)
218 || m[1] >= (AM.OffsetVector+WILDOFFSET) )
return(0);
219 if ( m[2] >= 2*MAXPOWER ) nq = m[2];
220 else if ( m[2] <= -2*MAXPOWER ) nq = -m[2];
223 if ( CheckWild(BHEAD nq,SYMTONUM,0,&newval3) )
return(0);
224 AddWild(BHEAD nq,SYMTONUM,0);
226 }
while ( m < ystop );
235 if ( *m == *t && m[1] == t[1] && t < xstop ) {
236 if ( t[2] != m[2] ) {
237 if ( m[2] >= 2*MAXPOWER ) {
241 else if ( m[2] <= -2*MAXPOWER ) {
247 if ( CheckWild(BHEAD nq,SYMTONUM,nt,&newval3) )
return(0);
248 AddWild(BHEAD nq,SYMTONUM,nt);
252 else if ( *m >= (AM.OffsetVector+WILDOFFSET) ) {
253 while ( t < xstop ) {
254 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
260 if ( *p != p[1] )
goto NextInDot;
262 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,*p,&newval1) &&
263 !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,p[1],&newval2) ) {
264 if ( p[2] == m[2] ) {
265 OnlyL9: AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval2);
266 AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
269 if ( m[2] >= 2*MAXPOWER ) {
270 if ( !CheckWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2],&newval3) ) {
271 AddWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,newval3);
275 else if ( m[2] <= -2*MAXPOWER ) {
276 if ( !CheckWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2],&newval3) ) {
277 AddWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2]);
282 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,p[1],&newval1) &&
283 !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,*p,&newval2) ) {
284 if ( p[2] == m[2] ) {
285 OnlyL10: AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
286 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval2);
289 if ( m[2] >= 2*MAXPOWER ) {
290 if ( !CheckWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2],&newval3) ) {
291 AddWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2]);
295 else if ( m[2] <= -2*MAXPOWER ) {
296 if ( !CheckWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2],&newval3) ) {
297 AddWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2]);
305 if ( nq <= 0 )
return(0);
309 while ( --nq >= 0 ) *p++ = *q++;
312 else if ( m[1] >= (AM.OffsetVector+WILDOFFSET) ) {
313 while ( *m >= *t && t < xstop ) {
314 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
319 if ( *m == *p && !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,p[1],&newval1) ) {
320 if ( p[2] == m[2] ) {
321 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
324 else if ( m[2] >= 2*MAXPOWER ) {
325 if ( !CheckWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2],&newval3) ) {
326 AddWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2]);
327 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
331 else if ( m[2] <= -2*MAXPOWER ) {
332 if ( !CheckWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2],&newval3) ) {
333 AddWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2]);
334 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
339 if ( *m == p[1] && !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,*p,&newval1) ) {
340 if ( p[2] == m[2] ) {
341 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
344 if ( m[2] >= 2*MAXPOWER ) {
345 if ( !CheckWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2],&newval3) ) {
346 AddWild(BHEAD m[2]-2*MAXPOWER,SYMTONUM,p[2]);
347 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
351 else if ( m[2] <= -2*MAXPOWER ) {
352 if ( !CheckWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2],&newval3) ) {
353 AddWild(BHEAD -m[2]-2*MAXPOWER,SYMTONUM,-p[2]);
354 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
361 if ( nq <= 0 )
return(0);
365 while ( --nq >= 0 ) *p++ = *q++;
369 if ( t >= xstop || *m < *t || ( *m == *t && m[1] < t[1] ) ) {
370 if ( m[2] > 2*MAXPOWER ) nt = m[2];
371 else if ( m[2] <= -2*MAXPOWER ) nt = -m[2];
374 if ( CheckWild(BHEAD nt,SYMTONUM,0,&newval3) )
return(0);
375 AddWild(BHEAD nt,SYMTONUM,0);
379 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
382 }
while ( m < ystop );
389 MLOCK(ErrorMessageLock);
390 MesPrint(
"Error in pattern(1)");
391 MUNLOCK(ErrorMessageLock);
395 }
while ( m < mstop ); }
419 WORD FindOnce(PHEAD WORD *term, WORD *pattern)
425 WORD n, nt, *p, nq, mt, ch;
426 WORD older[2*NORMSIZE], *q, newval1, newval2, newval3;
427 AN.UsedOtherFind = 0;
433 tstop = t - ABS(*t) + 1;
436 while ( t < tstop && *t > DOTPRODUCT ) t += t[1];
437 while ( m < mstop && *m > DOTPRODUCT ) m += m[1];
438 if ( m < mstop ) {
do {
442 if ( *m == SYMBOL ) {
447 if ( t < tstop )
while ( *t != SYMBOL ) {
452 if ( *m >= 2*MAXPOWER )
return(0);
453 if ( m[1] >= 2*MAXPOWER ) nt = m[1];
454 else if ( m[1] <= -2*MAXPOWER ) nt = -m[1];
457 if ( ( ch = CheckWild(BHEAD nt,SYMTONUM,0,&newval3) ) != 0 ) {
458 if ( ch > 1 )
return(0);
459 if ( AN.oldtype != SYMTONUM )
return(0);
460 if ( *AN.MaskPointer == 2 )
return(0);
462 AddWild(BHEAD nt,SYMTONUM,0);
464 }
while ( m < ystop );
472 if ( *m == *t && t < xstop ) {
475 if ( ( mt > 0 && mt <= nt ) ||
476 ( mt < 0 && mt >= nt ) ) { m += 2; t += 2; }
477 else if ( mt >= 2*MAXPOWER )
goto OnceL2;
478 else if ( mt <= -2*MAXPOWER ) {
481 OnceL2: mt -= 2*MAXPOWER;
482 if ( ( ch = CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) != 0 ) {
483 if ( ch > 1 )
return(0);
484 if ( AN.oldtype != SYMTONUM )
return(0);
485 if ( AN.oldvalue <= 0 ) {
486 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
488 if ( *AN.MaskPointer == 2 )
return(0);
489 if ( nt > 0 ) nt = 0;
492 if ( AN.oldvalue >= 0 ) {
493 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
495 if ( *AN.MaskPointer == 2 )
return(0);
496 if ( nt < 0 ) nt = 0;
500 AddWild(BHEAD mt,SYMTONUM,nt);
505 *p++ = *t++; *p++ = *t++; n += 2;
508 else if ( *m >= 2*MAXPOWER ) {
509 while ( t < xstop ) { *p++ = *t++; *p++ = *t++; n += 2; }
514 if ( !CheckWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,*p,&newval1) ) {
516 if ( ( mt > 0 && mt <= nt ) ||
517 ( mt < 0 && mt >= nt ) ) {
518 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
521 else if ( mt >= 2*MAXPOWER && mt != *m ) {
522 OnceL4a: mt -= 2*MAXPOWER;
523 if ( ( ch = CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) != 0 ) {
524 if ( ch > 1 )
return(0);
525 if ( AN.oldtype == SYMTONUM ) {
526 if ( AN.oldvalue >= 0 ) {
527 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
529 if ( *AN.MaskPointer == 2 )
return(0);
530 if ( nt < 0 ) nt = 0;
534 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
536 if ( *AN.MaskPointer == 2 )
return(0);
537 if ( nt > 0 ) nt = 0;
540 AddWild(BHEAD mt,SYMTONUM,nt);
541 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
546 AddWild(BHEAD mt,SYMTONUM,nt);
547 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
551 else if ( mt <= -2*MAXPOWER && mt != -(*m) ) {
560 if ( nq <= 0 )
return(0);
564 while ( --nq >= 0 ) *p++ = *q++;
568 if ( t >= xstop || *m < *t ) {
569 if ( m[1] >= 2*MAXPOWER ) nt = m[1];
570 else if ( m[1] <= -2*MAXPOWER ) nt = -m[1];
573 if ( ( ch = CheckWild(BHEAD nt,SYMTONUM,0,&newval3) ) != 0 ) {
574 if ( ch > 1 )
return(0);
575 if ( AN.oldtype != SYMTONUM )
return(0);
576 if ( *AN.MaskPointer == 2 )
return(0);
578 AddWild(BHEAD nt,SYMTONUM,0);
582 *p++ = *t++; *p++ = *t++; n += 2;
585 }
while ( m < ystop );
591 else if ( *m == DOTPRODUCT ) {
597 if ( *t < DOTPRODUCT )
goto OnceOp;
598 while ( *t > DOTPRODUCT ) {
600 if ( t >= tstop || *t < DOTPRODUCT ) {
603 if ( *m >= (AM.OffsetVector+WILDOFFSET)
604 || m[1] >= (AM.OffsetVector+WILDOFFSET) )
return(0);
605 if ( m[2] >= 2*MAXPOWER ) {
606 nq = m[2] - 2*MAXPOWER;
608 else if ( m[2] <= -2*MAXPOWER ) {
609 nq = -m[2] - 2*MAXPOWER;
612 if ( CheckWild(BHEAD nq,SYMTONUM,(WORD)0,&newval3) ) {
613 if ( AN.oldtype != SYMTONUM )
return(0);
614 if ( *AN.MaskPointer == 2 )
return(0);
616 AddWild(BHEAD nq,SYMTONUM,(WORD)0);
618 }
while ( m < ystop );
627 if ( *m == *t && m[1] == t[1] && t < xstop ) {
664 if ( ( mt > 0 && mt <= nt ) ||
665 ( mt < 0 && mt >= nt ) ) { m += 3; t += 3; }
666 else if ( mt >= 2*MAXPOWER )
goto OnceL7;
667 else if ( mt <= -2*MAXPOWER ) {
670 OnceL7: mt -= 2*MAXPOWER;
671 if ( CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) {
672 if ( AN.oldtype != SYMTONUM )
return(0);
673 if ( AN.oldvalue <= 0 ) {
674 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
676 if ( *AN.MaskPointer == 2 )
return(0);
677 if ( nt > 0 ) nt = 0;
680 if ( AN.oldvalue >= 0 ) {
681 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
683 if ( *AN.MaskPointer == 2 )
return(0);
684 if ( nt < 0 ) nt = 0;
688 AddWild(BHEAD mt,SYMTONUM,nt);
693 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
696 else if ( *m >= (AM.OffsetVector+WILDOFFSET) ) {
697 while ( t < xstop ) {
698 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
704 if ( *p != p[1] )
goto NextInDot;
706 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,*p,&newval1) &&
707 !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,p[1],&newval2) ) {
710 if ( ( mt > 0 && nt >= mt ) ||
711 ( mt < 0 && nt <= mt ) ) {
712 OnceL9: AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
713 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval2);
716 if ( mt >= 2*MAXPOWER ) {
717 OnceL9a: mt -= 2*MAXPOWER;
718 if ( CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) {
719 if ( AN.oldtype == SYMTONUM ) {
720 if ( AN.oldvalue >= 0 ) {
721 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
723 if ( *AN.MaskPointer == 2 )
return(0);
724 if ( nt < 0 ) nt = 0;
728 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
730 if ( *AN.MaskPointer == 2 )
return(0);
731 if ( nt > 0 ) nt = 0;
734 AddWild(BHEAD mt,SYMTONUM,nt);
739 AddWild(BHEAD mt,SYMTONUM,nt);
743 else if ( mt <= -2*MAXPOWER ) {
749 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,p[1],&newval1) &&
750 !CheckWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,*p,&newval2) ) {
753 if ( ( mt > 0 && nt >= mt ) ||
754 ( mt < 0 && nt <= mt ) ) {
755 OnceL10: AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
756 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval2);
759 if ( mt >= 2*MAXPOWER ) {
760 OnceL10a: mt -= 2*MAXPOWER;
761 if ( CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) {
762 if ( AN.oldtype == SYMTONUM ) {
763 if ( AN.oldvalue >= 0 ) {
764 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
766 if ( *AN.MaskPointer == 2 )
return(0);
767 if ( nt < 0 ) nt = 0;
771 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
773 if ( *AN.MaskPointer == 2 )
return(0);
774 if ( nt > 0 ) nt = 0;
777 AddWild(BHEAD mt,SYMTONUM,nt);
782 AddWild(BHEAD mt,SYMTONUM,nt);
786 else if ( mt <= -2*MAXPOWER ) {
795 if ( nq <= 0 )
return(0);
800 while ( --nq >= 0 ) *p++ = *q++;
804 else if ( m[1] >= (AM.OffsetVector+WILDOFFSET) ) {
805 while ( *m >= *t && t < xstop ) {
806 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
811 if ( *m == *p && !CheckWild(BHEAD m[1]-WILDOFFSET,
812 VECTOVEC,p[1],&newval1) ) {
815 if ( ( mt > 0 && nt >= mt ) ||
816 ( mt < 0 && nt <= mt ) ) {
817 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
820 else if ( mt >= 2*MAXPOWER ) {
821 OnceL7a: mt -= 2*MAXPOWER;
822 if ( CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) {
823 if ( AN.oldtype == SYMTONUM ) {
824 if ( AN.oldvalue >= 0 ) {
825 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
827 if ( *AN.MaskPointer == 2 )
return(0);
828 if ( nt < 0 ) nt = 0;
832 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
834 if ( *AN.MaskPointer == 2 )
return(0);
835 if ( nt > 0 ) nt = 0;
838 AddWild(BHEAD mt,SYMTONUM,nt);
839 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
844 AddWild(BHEAD mt,SYMTONUM,nt);
845 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
849 else if ( mt <= -2*MAXPOWER ) {
855 if ( *m == p[1] && !CheckWild(BHEAD m[1]-WILDOFFSET,
856 VECTOVEC,*p,&newval1) ) {
859 if ( ( mt > 0 && nt >= mt ) ||
860 ( mt < 0 && nt <= mt ) ) {
861 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
864 if ( mt >= 2*MAXPOWER ) {
865 OnceL8a: mt -= 2*MAXPOWER;
866 if ( CheckWild(BHEAD mt,SYMTONUM,nt,&newval3) ) {
867 if ( AN.oldtype == SYMTONUM ) {
868 if ( AN.oldvalue >= 0 ) {
869 if ( nt > AN.oldvalue ) nt = AN.oldvalue;
871 if ( *AN.MaskPointer == 2 )
return(0);
872 if ( nt < 0 ) nt = 0;
876 if ( nt < AN.oldvalue ) nt = AN.oldvalue;
878 if ( *AN.MaskPointer == 2 )
return(0);
879 if ( nt > 0 ) nt = 0;
882 AddWild(BHEAD mt,SYMTONUM,nt);
883 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
888 AddWild(BHEAD mt,SYMTONUM,nt);
889 AddWild(BHEAD m[1]-WILDOFFSET,VECTOVEC,newval1);
893 else if ( mt < -2*MAXPOWER ) {
901 if ( nq <= 0 )
return(0);
905 while ( --nq >= 0 ) *p++ = *q++;
909 if ( t >= xstop || *m < *t || ( *m == *t && m[1] < t[1] ) ) {
910 if ( m[2] >= 2*MAXPOWER ) nt = m[2];
911 else if ( m[2] <= -2*MAXPOWER ) nt = -m[2];
914 if ( CheckWild(BHEAD nt,SYMTONUM,0,&newval3) ) {
915 if ( AN.oldtype != SYMTONUM )
return(0);
916 if ( *AN.MaskPointer == 2 )
return(0);
918 AddWild(BHEAD nt,SYMTONUM,0);
922 *p++ = *t++; *p++ = *t++; *p++ = *t++; n += 3;
925 }
while ( m < ystop );
932 MLOCK(ErrorMessageLock);
933 MesPrint(
"Error in pattern(2)");
934 MUNLOCK(ErrorMessageLock);
938 }
while ( m < mstop ); }
954 WORD FindMulti(PHEAD WORD *term, WORD *pattern)
960 WORD mt, power, n, nq;
961 WORD older[2*NORMSIZE], *q, newval1;
962 AN.UsedOtherFind = 0;
968 tstop = t - ABS(*t) + 1;
971 while ( t < tstop && *t > DOTPRODUCT ) t += t[1];
972 while ( m < mstop && *m > DOTPRODUCT ) m += m[1];
974 if ( m < mstop ) {
do {
978 if ( *m == SYMBOL ) {
981 if ( t >= tstop )
return(0);
982 while ( *t != SYMBOL ) { t += t[1];
if ( t >= tstop )
return(0); }
988 if ( *m >= 2*MAXPOWER ) {
989 while ( t < xstop ) { *p++ = *t++; *p++ = *t++; n += 2; }
993 if ( !CheckWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,*p,&newval1) ) {
996 if ( power < 0 || mt < power ) power = mt;
997 AddWild(BHEAD *m-2*MAXPOWER,SYMTOSYM,newval1);
1004 if ( nq <= 0 )
return(0);
1008 while ( --nq >= 0 ) *p++ = *q++;
1011 else if ( t >= xstop )
return(0);
1012 else if ( *m == *t ) {
1013 if ( ( mt = t[1]/m[1] ) <= 0 )
return(0);
1014 if ( power < 0 || mt < power ) power = mt;
1018 else if ( *m < *t )
return(0);
1019 else { *p++ = *t++; *p++ = *t++; n += 2; }
1020 }
while ( m < ystop );
1026 else if ( *m == DOTPRODUCT ) {
1029 if ( t >= tstop )
return(0);
1030 while ( *t != DOTPRODUCT ) { t += t[1];
if ( t >= tstop )
return(0); }
1034 if ( t >= xstop )
return(0);
1036 if ( t[1] == m[1] ) {
1037 if ( ( mt = t[2]/m[2] ) <= 0 )
return(0);
1038 if ( power < 0 || mt < power ) power = mt;
1041 else if ( t[1] > m[1] )
return(0);
1043 else if ( *t > *m )
return(0);
1045 }
while ( m < ystop );
1052 MLOCK(ErrorMessageLock);
1053 MesPrint(
"Error in pattern(3)");
1054 MUNLOCK(ErrorMessageLock);
1057 }
while ( m < mstop ); }
1058 if ( power < 0 ) power = 0;
1070 WORD FindRest(PHEAD WORD *term, WORD *pattern)
1073 WORD *t, *m, *tt, wild, regular;
1074 WORD *tstop, *mstop;
1075 WORD *xstop, *ystop;
1077 WORD older[NORMSIZE], *q, newval1, newval2;
1079 AN.UsedOtherFind = 0;
1080 AN.findTerm = term; AN.findPattern = pattern;
1082 i = (m[-SUBEXPSIZE+1]-SUBEXPSIZE)/4;
1085 if ( m[0] == ARGTOARG ) ntwa++;
1091 tstop = t - ABS(*t) + 1;
1094 while ( t < tstop && *t > DOTPRODUCT ) t += t[1];
1101 while ( m < mstop && *m > DOTPRODUCT ) m += m[1];
1109 if ( *m >= FUNCTION ) {
1110 if ( *mstop > 5 && !MatchIsPossible(pattern,term) )
return(0);
1115 }
while ( m < mstop && *m >= FUNCTION );
1116 AT.WorkPointer += n;
1117 while ( t < tstop && *t == SUBEXPRESSION ) t += t[1];
1120 while ( t < tstop && ( *t >= FUNCTION || *t == SUBEXPRESSION ) ) {
1121 if ( *t != SUBEXPRESSION ) {
1123 if ( functions[*t-FUNCTION].commute ) tt = t + t[1];
1127 if ( nq < n )
return(0);
1130 AN.terfirstcomm = tt;
1132 AN.NumTotWildArgs = ntwa;
1133 if ( !ScanFunctions(BHEAD ystop,xstop,0) )
return(0);
1139 else if ( *m == VECTOR ) {
1140 while ( t < tstop && *t != VECTOR ) t += t[1];
1141 if ( t >= tstop )
return(0);
1149 if ( *m == *t && m[1] == t[1] && t < xstop ) {
1152 else if ( *m >= (AM.OffsetVector+WILDOFFSET) ) {
1155 do { *p++ = *t++; n++; }
while ( t < xstop );
1159 if ( ( m[1] < (AM.OffsetIndex+WILDOFFSET) )
1160 || ( m[1] >= (AM.OffsetIndex+2*WILDOFFSET) ) ) {
1162 if ( m[1] == p[1] ) {
1163 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,*p,&newval1) ) {
1164 RestL11: AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
1174 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,*p,&newval1) &&
1175 !CheckWild(BHEAD m[1]-WILDOFFSET,INDTOIND,p[1],&newval2) ) {
1176 AddWild(BHEAD m[1]-WILDOFFSET,INDTOIND,newval2);
1184 nq -= 2; q = p + 2; n -= 2;
1185 while ( --nq >= 0 ) *p++ = *q++;
1190 else if ( ( *m <= *t )
1191 && ( m[1] >= (AM.OffsetIndex + WILDOFFSET) )
1192 && ( m[1] < (AM.OffsetIndex + 2*WILDOFFSET) ) ) {
1193 if ( *m == *t && t < xstop ) {
1204 if ( !CheckWild(BHEAD m[1]-WILDOFFSET,INDTOIND,p[1],&newval1) ) {
1205 AddWild(BHEAD m[1]-WILDOFFSET,INDTOIND,newval1);
1213 nq -= 2; q = p + 2; n -= 2;
1214 while ( --nq >= 0 ) *p++ = *q++;
1220 if ( t >= xstop )
return(0);
1221 *p++ = *t++; *p++ = *t++; n += 2;
1223 }
while ( m < ystop );
1229 else if ( *m == INDEX ) {
1236 while ( *t != INDEX ) { t += t[1];
if ( t >= tstop )
return(0); }
1244 if ( *m == *t && t < xstop && m < ystop ) {
1247 else if ( ( *m >= (AM.OffsetIndex+WILDOFFSET) )
1248 && ( *m < (AM.OffsetIndex+2*WILDOFFSET) ) ) {
1249 while ( t < xstop ) {
1252 if ( !n )
return(0);
1256 if ( !CheckWild(BHEAD *m-WILDOFFSET,INDTOIND,*q,&newval1) ) {
1257 AddWild(BHEAD *m-WILDOFFSET,INDTOIND,newval1);
1263 if ( nq <= 0 )
return (0);
1267 while ( nq > 0 ) { *q++ = *p++; nq--; }
1271 else if ( ( *m >= (AM.OffsetVector+WILDOFFSET) )
1272 && ( *m < (AM.OffsetVector+2*WILDOFFSET) ) ) {
1273 while ( t < xstop ) {
1276 if ( !n )
return(0);
1280 if ( !CheckWild(BHEAD *m-WILDOFFSET,VECTOVEC,*q,&newval1) ) {
1281 AddWild(BHEAD *m-WILDOFFSET,VECTOVEC,newval1);
1287 if ( nq <= 0 )
return (0);
1291 while ( nq > 0 ) { *q++ = *p++; nq--; }
1296 if ( t >= xstop )
return(0);
1299 }
while ( m < ystop );
1309 else if ( *m == DELTA ) {
1310 while ( *t != DELTA ) { t += t[1];
if ( t >= tstop )
return(0); }
1318 if ( *t == *m && t[1] == m[1] && t < xstop ) {
1322 else if ( ( *m >= (AM.OffsetIndex+WILDOFFSET) )
1323 && ( *m < (AM.OffsetIndex+2*WILDOFFSET) )
1324 && ( m[1] >= (AM.OffsetIndex+WILDOFFSET) )
1325 && ( m[1] < (AM.OffsetIndex+2*WILDOFFSET) ) ) {
1326 while ( t < xstop ) {
1327 *p++ = *t++; *p++ = *t++; n += 2;
1329 if ( !n )
return(0);
1333 if ( !CheckWild(BHEAD *m-WILDOFFSET,INDTOIND,*q,&newval1) &&
1334 !CheckWild(BHEAD m[1]-WILDOFFSET,INDTOIND,q[1],&newval2) ) {
1335 AddWild(BHEAD *m-WILDOFFSET,INDTOIND,newval1);
1336 AddWild(BHEAD m[1]-WILDOFFSET,INDTOIND,newval2);
1339 if ( !CheckWild(BHEAD *m-WILDOFFSET,INDTOIND,q[1],&newval1) &&
1340 !CheckWild(BHEAD m[1]-WILDOFFSET,INDTOIND,*q,&newval2) ) {
1341 AddWild(BHEAD *m-WILDOFFSET,INDTOIND,newval1);
1342 AddWild(BHEAD m[1]-WILDOFFSET,INDTOIND,newval2);
1348 if ( nq <= 0 )
return(0);
1352 while ( nq > 0 ) { *q++ = *p++; nq--; }
1356 else if ( ( m[1] >= (AM.OffsetIndex+WILDOFFSET) )
1357 && ( m[1] < (AM.OffsetIndex+2*WILDOFFSET) ) ) {
1358 wild = m[1]; regular = *m;
1360 while ( ( regular == *t || regular == t[1] ) && t < xstop ) {
1361 *p++ = *t++; *p++ = *t++; n += 2;
1363 if ( !n )
return(0);
1367 if ( regular == *q && !CheckWild(BHEAD wild-WILDOFFSET,INDTOIND,q[1],&newval1) ) {
1368 AddWild(BHEAD wild-WILDOFFSET,INDTOIND,newval1);
1371 if ( regular == q[1] && !CheckWild(BHEAD wild-WILDOFFSET,INDTOIND,*q,&newval1) ) {
1372 AddWild(BHEAD wild-WILDOFFSET,INDTOIND,newval1);
1378 if ( nq <= 0 )
return(0);
1382 while ( nq > 0 ) { *q++ = *p++; nq--; }
1386 else if ( ( *m >= (AM.OffsetIndex+WILDOFFSET) )
1387 && ( *m < (AM.OffsetIndex+2*WILDOFFSET) ) ) {
1388 wild = *m; regular = m[1];
1392 if ( t >= tstop || *m < *t || ( *m == *t && m[1] < t[1] ) )
1394 *p++ = *t++; *p++ = *t++; n += 2;
1396 }
while ( m < ystop );
1402 MLOCK(ErrorMessageLock);
1403 MesPrint(
"Pattern not yet implemented");
1404 MUNLOCK(ErrorMessageLock);
1407 }
while ( m < mstop );