• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

vermaseren / form / 9364948935

04 Jun 2024 09:49AM UTC coverage: 49.979% (-0.02%) from 49.999%
9364948935

Pull #526

github

web-flow
Merge 7062bd769 into 83e3d4185
Pull Request #526: RFC: better debugging

52 of 415 new or added lines in 46 files covered. (12.53%)

32 existing lines in 2 files now uncovered.

41391 of 82816 relevant lines covered (49.98%)

878690.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

48.83
/sources/wildcard.c
1
/** @file wildcard.c
2
 * 
3
 *  Contains the functions that deal with the wildcards.
4
 *        During the pattern matching there are two steps:
5
 *        1: check that a wildcard substitution is correct (if there was already
6
 *           an assignment for this variable, it is the same; it is part of the
7
 *           proper set; it is the proper type of variables, etc.)
8
 *        2: make the assignment
9
 *        In addition we have to be able to clear assignments.
10
 *        During execution we have to make the actual replacements (WildFill)
11
 */
12
/* #[ License : */
13
/*
14
 *   Copyright (C) 1984-2023 J.A.M. Vermaseren
15
 *   When using this file you are requested to refer to the publication
16
 *   J.A.M.Vermaseren "New features of FORM" math-ph/0010025
17
 *   This is considered a matter of courtesy as the development was paid
18
 *   for by FOM the Dutch physics granting agency and we would like to
19
 *   be able to track its scientific use to convince FOM of its value
20
 *   for the community.
21
 *
22
 *   This file is part of FORM.
23
 *
24
 *   FORM is free software: you can redistribute it and/or modify it under the
25
 *   terms of the GNU General Public License as published by the Free Software
26
 *   Foundation, either version 3 of the License, or (at your option) any later
27
 *   version.
28
 *
29
 *   FORM is distributed in the hope that it will be useful, but WITHOUT ANY
30
 *   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
31
 *   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
32
 *   details.
33
 *
34
 *   You should have received a copy of the GNU General Public License along
35
 *   with FORM.  If not, see <http://www.gnu.org/licenses/>.
36
 */
37
/* #] License : */ 
38
/*
39
          #[ Includes : wildcard.c
40
*/
41

42
#include "form3.h"
43

44
#define DEBUG(x)
45

46
/*
47
#define DEBUG(x) x
48

49
          #] Includes : 
50
         #[ Wildcards :
51
                 #[ WildFill :                        WORD WildFill(to,from,sub)
52

53
                Takes the term in from and puts it into to while
54
                making wildcard substitutions.
55
                The return value is the number of words put in to.
56
                The length as the first word of from is not copied.
57

58
                There are two possible algorithms:
59
                1:        For each element in `from': scan sub.
60
                2:        For each wildcard in sub replace elements in term.
61
                The original algorithm used 1:
62

63
*/
64

65
WORD WildFill(PHEAD WORD *to, WORD *from, WORD *sub)
5,312,355✔
66
{
67
        GETBIDENTITY
68
        WORD i, j, *s, *t, *m, len, dflag, odirt, adirt;
5,312,355✔
69
        WORD *r, *u, *v, *w, *z, *zst, *zz, *subs, *accu, na, dirty = 0, *tstop;
5,312,355✔
70
        WORD *temp = 0, *uu, *oldcpointer, sgn;
5,312,355✔
71
        WORD subcount, setflag, *setlist = 0, si;
5,312,355✔
72
        accu = oldcpointer = AR.CompressPointer;
5,312,355✔
73
        t = sub;
5,312,355✔
74
        t += sub[1];
5,312,355✔
75
        s = sub + SUBEXPSIZE;
5,312,355✔
76
        i = 0;
5,312,355✔
77
        while ( s < t && *s != FROMBRAC ) {
13,155,590✔
78
                i++; s += s[1];
7,843,234✔
79
        }
80
        if ( !i ) {                        /* No wildcards -> done quickly */
5,312,355✔
81
                j = i = *from;
×
82
                NCOPY(to,from,i);
×
83
                if ( dirty ) AN.WildDirt = dirty;
84
                return(j);
85
        }
86
        sgn = 0;
5,312,355✔
87
        subs = sub + SUBEXPSIZE;
5,312,355✔
88
        t = from;
5,312,355✔
89
        GETSTOP(t,r);
5,312,355✔
90
        t++;
5,312,355✔
91
        m = to + 1;
5,312,355✔
92
        if ( t < r ) do {
5,312,355✔
93
                uu = u = t + t[1];
7,067,256✔
94
                setflag = 0;
7,067,256✔
95
ReSwitch:
7,067,259✔
96
                switch ( *t ) {
7,067,259✔
97
                        case SYMBOL:
482,732✔
98
/*
99
                        #[ SYMBOLS :
100
*/
101
                                z = accu;
482,732✔
102
                                *m++ = *t++;
482,732✔
103
                                *m++ = *t++;
482,732✔
104
                                v = m;
482,732✔
105
                                while ( t < u ) {
482,732✔
106
                                        *m = *t;
551,880✔
107
                                        for ( si = 0; si < setflag; si += 2 ) {
551,880✔
108
                                                if ( t == temp + setlist[si] ) goto sspow;
×
109
                                        }
110
                                        s = subs;
111
                                        for ( j = 0; j < i; j++ ) {
1,842,040✔
112
                                                if ( *t == s[2] ) {
1,701,532✔
113
                                                        if ( *s == SYMTOSYM ) {
411,372✔
114
                                                                *m = s[3]; dirty = 1;
3,247✔
115
                                                                break;
3,247✔
116
                                                        }
117
                                                        else if ( *s == SYMTONUM ) {
408,125✔
118
                                                                dirty = 1;
358,399✔
119
                                                                zst = z;
358,399✔
120
                                                                *z++ = SNUMBER;
358,399✔
121
                                                                *z++ = 4;
358,399✔
122
                                                                *z++ = s[3];
358,399✔
123
                                                                w = z;
358,399✔
124
                                                                *z++ = *++t;
358,399✔
125
                                                                if ( ABS(*t) >= 2*MAXPOWER) {
358,399✔
126
DoPow:                                                        s = subs;
×
127
                                                                for ( j = 0; j < i; j++ ) {
105,640✔
128
                                                                        if ( ( *s == SYMTONUM ) &&
55,914✔
129
                                                                        ( ABS(*t) - 2*MAXPOWER ) == s[2] ) {
24✔
130
                                                                                dirty = 1;
×
131
                                                                                *w = s[3];
×
132
                                                                                if ( *t < 0 ) *w = -*w;
×
133
                                                                                break;
134
                                                                        }
135
                                                                        if ( ( *s == SYMTOSYM ) &&
55,914✔
136
                                                                        ( ABS(*t) - 2*MAXPOWER ) == s[2] ) {
3,104✔
137
                                                                                dirty = 1;
×
138
                                                                                zz = z;
139
                                                                                while ( --zz >= zst ) {
×
140
                                                                                        zz[1+FUNHEAD+ARGHEAD] = *zz;
×
141
                                                                                }
142
                                                                                w += 1+FUNHEAD+ARGHEAD;
×
143
                                                                                *zst = EXPONENT;
×
144
                                                                                zst[2] = DIRTYFLAG;
×
145
                                                                                zst[FUNHEAD+ARGHEAD] = WORDDIF(z,zst)+4;
×
146
                                                                                zst[1+FUNHEAD] = 1;
×
147
                                                                                zst[FUNHEAD] = WORDDIF(z,zst)+4+ARGHEAD;
×
148
                                                                                z += FUNHEAD+ARGHEAD+1;
×
149
                                                                                *w = 1;        /* exponent -> 1 */
×
150
                                                                                *z++ = 1;
×
151
                                                                                *z++ = 1;
×
152
                                                                                *z++ = 3;
×
153
                                                                                if ( *t > 0 ) {
×
154
                                                                                        *z++ = -SYMBOL;
×
155
                                                                                        *z++ = s[3];
×
156
                                                                                }
157
                                                                                else {
158
                                                                                        *z++ = ARGHEAD+8;
×
159
                                                                                        *z++ = 1;
×
160
                                                                                        *z++ = 8;
×
161
                                                                                        *z++ = SYMBOL;
×
162
                                                                                        *z++ = 4;
×
163
                                                                                        *z++ = s[3];
×
164
                                                                                        *z++ = 1;
×
165
                                                                                        *z++ = 1;
×
166
                                                                                        *z++ = 1;
×
167
                                                                                        *z++ = -3;
×
168
                                                                                }
169
                                                                                zst[1] = WORDDIF(z,zst);
×
170
                                                                                break;
×
171
                                                                        }
172
                                                                        if ( *s == SYMTOSUB &&
55,914✔
173
                                                                        ( ABS(*t) - 2*MAXPOWER ) == s[2] ) {
52,786✔
174
MakeExp:                                                                dirty = 1;
×
175
                                                                                zz = z;
×
176
                                                                                while ( --zz >= zst ) {
×
177
                                                                                        zz[1+FUNHEAD+ARGHEAD] = *zz;
×
178
                                                                                }
179
                                                                                w += 1+FUNHEAD+ARGHEAD;
×
180
                                                                                *zst = EXPONENT;
×
181
                                                                                zst[2] = DIRTYFLAG;
×
182
                                                                                zst[FUNHEAD+ARGHEAD] = WORDDIF(z,zst)+4;
×
183
                                                                                zst[1+FUNHEAD] = 1;
×
184
                                                                                zst[FUNHEAD] = WORDDIF(z,zst)+4+ARGHEAD;
×
185
                                                                                z += FUNHEAD+ARGHEAD+1;
×
186
                                                                                *w = 1;        /* exponent -> 1 */
×
187
                                                                                *z++ = 1;
×
188
                                                                                *z++ = 1;
×
189
                                                                                *z++ = 3;
×
190
                                                                                *z++ = 4+SUBEXPSIZE+ARGHEAD;
×
191
                                                                                *z++ = 1;
×
192
                                                                                *z++ = 4+SUBEXPSIZE;
×
193
                                                                                *z++ = SUBEXPRESSION;
×
194
                                                                                *z++ = SUBEXPSIZE;
×
195
                                                                                *z++ = s[3];
×
196
                                                                                *z++ = 1;
×
197
                                                                                *z++ = AT.ebufnum;
×
198
                                                                                FILLSUB(z)
199
                                                                                *z++ = 1;
×
200
                                                                                *z++ = 1;
×
201
                                                                                *z++ = *t > 0 ? 3: -3;
×
202
                                                                                zst[1] = WORDDIF(z,zst);
×
203
                                                                                break;
×
204
                                                                        }
205
                                                                        s += s[1];
55,914✔
206
                                                                }
207
                                                                }
208
                                                                if ( !*w ) z = w - 3;
408,125✔
209
                                                                t++;
408,125✔
210
                                                                goto Seven;
408,125✔
211
                                                        }
212
                                                        else if ( *s == SYMTOSUB ) {
49,726✔
213
                                                                dirty = 1;
49,726✔
214
                                                                zst = z;
49,726✔
215
                                                                *z++ = SUBEXPRESSION;
49,726✔
216
                                                                *z++ = SUBEXPSIZE;
49,726✔
217
                                                                *z++ = s[3];
49,726✔
218
                                                                w = z;
49,726✔
219
                                                                *z++ = *++t;
49,726✔
220
                                                                *z++ = AT.ebufnum;
49,726✔
221
                                                                FILLSUB(z)
222
                                                                goto DoPow;
49,726✔
223
                                                        }
224
                                                }
225
                                                s += s[1];
1,290,160✔
226
                                        }
227
sspow:
140,508✔
228
                                        s = subs;
143,755✔
229
                                        *++m = *++t;
143,755✔
230
                                        for ( si = 0; si < setflag; si += 2 ) {
143,755✔
231
                                                if ( t == temp + setlist[si] ) {
×
232
                                                        t++; m++;
×
233
                                                        goto Seven;
×
234
                                                }
235
                                        }
236
                                        for ( j = 0; j < i; j++ ) {
772,282✔
237
                                                if ( ( ABS(*t) - 2*MAXPOWER ) == s[2] ) {
631,855✔
238
                                                        if ( *s == SYMTONUM ) {
3,328✔
239
                                                                dirty = 1;
3,328✔
240
                                                                *m = s[3];
3,328✔
241
                                                                if ( *t < 0 ) *m = -*m;
3,328✔
242
                                                                break;
243
                                                        }
244
                                                        else if ( *s == SYMTOSYM ) {
×
245
                                                                dirty = 1;
×
246
                                                                *z++ = EXPONENT;
×
247
                                                                if ( *t < 0 ) *z++ = FUNHEAD+ARGHEAD+10;
×
248
                                                                else *z++ = 4+FUNHEAD;
×
249
                                                                *z++ = 0;
×
250
                                                                FILLFUN3(z)
251
                                                                *z++ = -SYMBOL;
×
252
                                                                *z++ = m[-1];
×
253
                                                                if ( *t < 0 ) {
×
254
                                                                        *z++ = ARGHEAD+8;
×
255
                                                                        *z++ = 0;
×
256
                                                                        *z++ = 8;
×
257
                                                                        *z++ = SYMBOL;
×
258
                                                                        *z++ = 4;
×
259
                                                                        *z++ = s[3];
×
260
                                                                        *z++ = 1;
×
261
                                                                        *z++ = 1;
×
262
                                                                        *z++ = 1;
×
263
                                                                        *z = -3;
×
264
                                                                }
265
                                                                else {
266
                                                                        *z++ = -SYMBOL;
×
267
                                                                        *z++ = s[3];
×
268
                                                                }
269
                                                                m -= 2;
×
270
                                                                break;
×
271
                                                        }
272
                                                        else if ( *s == SYMTOSUB ) {
×
273
                                                                zst = z;
×
274
                                                                *z++ = SYMBOL;
×
275
                                                                *z++ = 4;
×
276
                                                                *z++ = *--m;
×
277
                                                                w = z;
×
278
                                                                *z++ = *t;
×
279
                                                                goto MakeExp;
×
280
                                                        }
281
                                                }
282
                                                s += s[1];
628,527✔
283
                                        }
284
                                        t++;
143,755✔
285
                                        if ( *m ) m++;
143,755✔
286
                                        else m--;
3,208✔
287
Seven:;
1,034,612✔
288
                                }
289
                                j = WORDDIF(m,v);
482,732✔
290
                                if ( !j ) m -= 2;
482,732✔
291
                                else v[-1] = j + 2;
92,555✔
292
                                s = accu;
293
                                while ( s < z ) *m++ = *s++;
2,164,958✔
294
                                break;
295
/*
296
                        #] SYMBOLS : 
297
*/
298
                        case DOTPRODUCT:
16✔
299
/*
300
                        #[ DOTPRODUCTS :
301
*/
302
                                *m++ = *t++;
16✔
303
                                *m++ = *t++;
16✔
304
                                v = m;
16✔
305
                                z = accu;
16✔
306
                                while ( t < u ) {
16✔
307
                                        *m = *t;
40✔
308
                                        subcount = 0;
40✔
309
                                        for ( si = 0; si < setflag; si += 2 ) {
40✔
310
                                                if ( t == temp + setlist[si] ) goto ss2;
×
311
                                        }
312
                                        s = subs;
313
                                        for ( j = 0; j < i; j++ ) {
64✔
314
                                                if ( *t == s[2] ) {
40✔
315
                                                        if ( *s == VECTOVEC ) {
16✔
316
                                                                *m = s[3]; dirty = 1; break;
16✔
317
                                                        }
318
                                                        if ( *s == VECTOMIN ) {
×
319
                                                                *m = s[3]; dirty = 1; sgn += t[2]; break;
×
320
                                                        }
321
                                                        if ( *s == VECTOSUB ) {
×
322
                                                                *m = s[3]; dirty = 1; subcount = 1; break;
×
323
                                                        }
324
                                                }
325
                                                s += s[1];
24✔
326
                                        }
327
ss2:
24✔
328
                                        *++m = *++t;
40✔
329
                                        s = subs;
40✔
330
                                        for ( si = 0; si < setflag; si += 2 ) {
40✔
331
                                                if ( t == temp + setlist[si] ) goto ss3;
×
332
                                        }
333
                                        for ( j = 0; j < i; j++ ) {
56✔
334
                                                if ( *t == s[2] ) {
40✔
335
                                                        if ( *s == VECTOVEC ) {
24✔
336
                                                                *m = s[3]; dirty = 1; break;
24✔
337
                                                        }
338
                                                        if ( *s == VECTOMIN ) {
×
339
                                                                *m = s[3]; dirty = 1; sgn += t[1]; break;
×
340
                                                        }
341
                                                        if ( *s == VECTOSUB ) {
×
342
                                                                *m = s[3]; dirty = 1; subcount += 2; break;
×
343
                                                        }
344
                                                }
345
                                                s += s[1];
16✔
346
                                        }
347
ss3:                                *++m = *++t;
16✔
348
                                        if ( ( ABS(*t) - 2*MAXPOWER ) < 0 ) goto RegPow;
40✔
349
                                        s = subs;
350
                                        for ( j = 0; j < i; j++ ) {
×
351
                                                if ( ( ABS(*t) - 2*MAXPOWER ) == s[2] ) {
×
352
                                                        if ( *s == SYMTONUM ) {
×
353
                                                                *m = s[3];
×
354
                                                                if ( *t < 0 ) *m = -*m;
×
355
                                                                dirty = 1;
356
                                                                break;
357
                                                        }
358
                                                        if ( *s <= SYMTOSUB ) {
×
359
/*
360
                                Here we put together a power function with the proper
361
                                arguments. Note that a p?.q? resolves to a single power.
362
*/
363
                                                                m -= 2;
×
364
                                                                *z++ = EXPONENT;
×
365
                                                                w = z;
×
366
                                                                if ( subcount == 0 ) {
×
367
                                                                        *z++ = 17+FUNHEAD+2*ARGHEAD;
×
368
                                                                        *z++ = DIRTYFLAG;
×
369
                                                                        FILLFUN3(z)
370
                                                                        *z++ = 9+ARGHEAD;
×
371
                                                                        *z++ = 0;
×
372
                                                                        FILLARG(z)
373
                                                                        *z++ = 9;
×
374
                                                                        *z++ = DOTPRODUCT;
×
375
                                                                        *z++ = 5;
×
376
                                                                        *z++ = *m;
×
377
                                                                        *z++ = m[1];
×
378
                                                                        *z++ = 1;
×
379
                                                                        *z++ = 1;
×
380
                                                                        *z++ = 1;
×
381
                                                                        *z++ = 3;
×
382
                                                                        if ( *s == SYMTOSYM ) {
×
383
                                                                                *z++ = 8+ARGHEAD;
×
384
                                                                                *z++ = 0;
×
385
                                                                                FILLARG(z)
386
                                                                                *z++ = 8;
×
387
                                                                                *z++ = SYMBOL;
×
388
                                                                                *z++ = 4;
×
389
                                                                                *z++ = s[3];
×
390
                                                                                *z++ = 1;
×
391
                                                                        }
392
                                                                        else {
393
                                                                                *z++ = 4+SUBEXPSIZE+ARGHEAD;
×
394
                                                                                *z++ = 1;
×
395
                                                                                FILLARG(z)
396
                                                                                *z++ = 4+SUBEXPSIZE;
×
397
                                                                                *z++ = SUBEXPRESSION;
×
398
                                                                                *z++ = SUBEXPSIZE;
×
399
                                                                                *z++ = s[3];
×
400
                                                                                *z++ = 1;
×
401
                                                                                *z++ = AT.ebufnum;
×
402
                                                                                FILLSUB(z)
403
                                                                        }
404
                                                                        *z++ = 1; *z++ = 1;
×
405
                                                                        *z++ = ( s[2] > 0 ) ? 3: -3;
×
406
                                                                }
407
                                                                else if ( subcount == 3 ) {
×
408
                                                                        *z++ = 20+2*SUBEXPSIZE+FUNHEAD+2*ARGHEAD;
×
409
                                                                        *z++ = DIRTYFLAG;
×
410
                                                                        FILLFUN3(z)
411
                                                                        *z++ = 12+2*SUBEXPSIZE+ARGHEAD;
×
412
                                                                        *z++ = 1;
×
413
                                                                        *z++ = 12+2*SUBEXPSIZE;
×
414
                                                                        *z++ = SUBEXPRESSION;
×
415
                                                                        *z++ = 4+SUBEXPSIZE;
×
416
                                                                        *z++ = *m + 1;
×
417
                                                                        *z++ = 1;
×
418
                                                                        *z++ = AT.ebufnum;
×
419
                                                                        FILLSUB(z)
420
                                                                        *z++ = INDTOIND;
×
421
                                                                        *z++ = 4;
×
422
                                                                        *z++ = FUNNYVEC;
×
423
                                                                        *z++ = ++AR.CurDum;
×
424

425
                                                                        *z++ = SUBEXPRESSION;
×
426
                                                                        *z++ = 4+SUBEXPSIZE;
×
427
                                                                        *z++ = m[1] + 1;
×
428
                                                                        *z++ = 1;
×
429
                                                                        *z++ = AT.ebufnum;
×
430
                                                                        FILLSUB(z)
431
                                                                        *z++ = INDTOIND;
×
432
                                                                        *z++ = 4;
×
433
                                                                        *z++ = FUNNYVEC;
×
434
                                                                        *z++ = AR.CurDum;
×
435
                                                                        *z++ = 1; *z++ = 1; *z++ = 3;
×
436
                                                                }
437
                                                                else {
438
                                                                        if ( subcount == 2 ) {
×
439
                                                                                j = *m; *m = m[1]; m[1] = j;
×
440
                                                                        }
441
                                                                        *z++ = 16+SUBEXPSIZE+FUNHEAD+2*ARGHEAD;
×
442
                                                                        *z++ = DIRTYFLAG;
×
443
                                                                        FILLFUN3(z)
444
                                                                        *z++ = 8+SUBEXPSIZE+ARGHEAD;
×
445
                                                                        *z++ = 1;
×
446
                                                                        *z++ = 8+SUBEXPSIZE;
×
447
                                                                        *z++ = SUBEXPRESSION;
×
448
                                                                        *z++ = 4+SUBEXPSIZE;
×
449
                                                                        *z++ = *m + 1;
×
450
                                                                        *z++ = 1;
×
451
                                                                        *z++ = AT.ebufnum;
×
452
                                                                        FILLSUB(z)
453
                                                                        *z++ = INDTOIND;
×
454
                                                                        *z++ = 4;
×
455
                                                                        *z++ = FUNNYVEC;
×
456
                                                                        *z++ = m[1];
×
457
                                                                        *z++ = 1; *z++ = 1; *z++ = 3;
×
458
                                                                }
459
                                                                if ( *s == SYMTOSYM ) {
×
460
                                                                        if ( s[2] > 0 ) {
×
461
                                                                                *z++ = -SYMBOL;
×
462
                                                                                *z++ = s[3];
×
463
                                                                                t++;
×
464
                                                                                *w = z-w+1;
×
465
                                                                                goto NextDot;
×
466
                                                                        }
467
                                                                        *z++ = 8+ARGHEAD;
×
468
                                                                        *z++ = 0;
×
469
                                                                        *z++ = 8;
×
470
                                                                        *z++ = SYMBOL;
×
471
                                                                        *z++ = 4;
×
472
                                                                        *z++ = s[3];
×
473
                                                                        *z++ = 1;
×
474
                                                                }
475
                                                                else {
476
                                                                        *z++ = 4+SUBEXPSIZE+ARGHEAD;
×
477
                                                                        *z++ = 1;
×
478
                                                                        *z++ = 4+SUBEXPSIZE;
×
479
                                                                        *z++ = SUBEXPRESSION;
×
480
                                                                        *z++ = SUBEXPSIZE;
×
481
                                                                        *z++ = s[3];
×
482
                                                                        *z++ = 1;
×
483
                                                                        *z++ = AT.ebufnum;
×
484
                                                                        FILLSUB(z)
485
                                                                }
486
                                                                *z++ = 1; *z++ = 1;
×
487
                                                                *z++ = ( s[2] > 0 ) ? 3: -3;
×
488
                                                                t++;
×
489
                                                                *w = z-w+1;
×
490
                                                                goto NextDot;
×
491
                                                        }
492
                                                }
493
                                                s += s[1];
×
494
                                        }
495
RegPow:                                if ( *m ) m++;
40✔
496
                                        else { m -= 2; subcount = 0; }
×
497
                                        t++;
40✔
498
                                        if ( subcount ) {
40✔
499
                                                m -= 3;
×
500
                                                if ( subcount == 3 ) {
×
501
                                                        if ( m[2] < 0 ) {
×
502
                                                                j = (-m[2]) * (2*SUBEXPSIZE+8);
×
503
                                                                *z++ = DENOMINATOR;
×
504
                                                                *z++ = j + 8 + FUNHEAD + ARGHEAD;
×
505
                                                                *z++ = DIRTYFLAG;
×
506
                                                                FILLFUN3(z)
507
                                                                *z++ = j + 8 + ARGHEAD;
×
508
                                                                *z++ = 1;
×
509
                                                                *z++ = j + 8;
×
510
                                                                while ( m[2] < 0 ) {
×
511
                                                                        (m[2])++;
×
512
                                                                        *z++ = SUBEXPRESSION;
×
513
                                                                        *z++ = 4+SUBEXPSIZE;
×
514
                                                                        *z++ = *m + 1;
×
515
                                                                        *z++ = 1;
×
516
                                                                        *z++ = AT.ebufnum;
×
517
                                                                        FILLSUB(z)
518
                                                                        *z++ = INDTOIND;
×
519
                                                                        *z++ = 4;
×
520
                                                                        *z++ = FUNNYVEC;
×
521
                                                                        *z++ = ++AR.CurDum;
×
522
                                                                        *z++ = SUBEXPRESSION;
×
523
                                                                        *z++ = 8+SUBEXPSIZE;
×
524
                                                                        *z++ = m[1] + 1;
×
525
                                                                        *z++ = 1;
×
526
                                                                        *z++ = AT.ebufnum;
×
527
                                                                        FILLSUB(z)
528
                                                                        *z++ = INDTOIND;
×
529
                                                                        *z++ = 4;
×
530
                                                                        *z++ = FUNNYVEC;
×
531
                                                                        *z++ = AR.CurDum;
×
532
                                                                        *z++ = SYMTOSYM;        /* Needed to avoid */
×
533
                                                                        *z++ = 4;                        /* problems with   */
×
534
                                                                        *z++ = 1000;                /* conversion to   */
×
535
                                                                        *z++ = 1000;                /* square of subexp*/
×
536
                                                                }
537
                                                                *z++ = 1; *z++ = 1; *z++ = 3;
×
538
                                                        }
539
                                                        else {
540
                                                                while ( m[2] > 0 ) {
×
541
                                                                        (m[2])--;
×
542
                                                                        *z++ = SUBEXPRESSION;
×
543
                                                                        *z++ = 4+SUBEXPSIZE;
×
544
                                                                        *z++ = *m + 1;
×
545
                                                                        *z++ = 1;
×
546
                                                                        *z++ = AT.ebufnum;
×
547
                                                                        FILLSUB(z)
548
                                                                        *z++ = INDTOIND;
×
549
                                                                        *z++ = 4;
×
550
                                                                        *z++ = FUNNYVEC;
×
551
                                                                        *z++ = ++AR.CurDum;
×
552
                                                                        *z++ = SUBEXPRESSION;
×
553
                                                                        *z++ = 4+SUBEXPSIZE;
×
554
                                                                        *z++ = m[1] + 1;
×
555
                                                                        *z++ = 1;
×
556
                                                                        *z++ = AT.ebufnum;
×
557
                                                                        FILLSUB(z)
558
                                                                        *z++ = INDTOIND;
×
559
                                                                        *z++ = 4;
×
560
                                                                        *z++ = FUNNYVEC;
×
561
                                                                        *z++ = AR.CurDum;
×
562
                                                                }
563
                                                        }
564
                                                }
565
                                                else {
566
                                                        if ( subcount == 2 ) {
×
567
                                                                j = *m; *m = m[1]; m[1] = j;
×
568
                                                        }
569
                                                        if ( m[2] < 0 ) {
×
570
                                                                *z++ = DENOMINATOR;
×
571
                                                                *z++ = 8+SUBEXPSIZE+FUNHEAD+ARGHEAD;
×
572
                                                                *z++ = DIRTYFLAG;
×
573
                                                                FILLFUN3(z)
574
                                                                *z++ = 8+SUBEXPSIZE+ARGHEAD;
×
575
                                                                *z++ = 1;
×
576
                                                                *z++ = 8+SUBEXPSIZE;
×
577
                                                        }
578
                                                        *z++ = SUBEXPRESSION;
×
579
                                                        *z++ = 4+SUBEXPSIZE;
×
580
                                                        *z++ = *m + 1;
×
581
                                                        *z++ = ABS(m[2]);
×
582
                                                        *z++ = AT.ebufnum;
×
583
                                                        FILLSUB(z)
584
                                                        *z++ = INDTOIND;
×
585
                                                        *z++ = 4;
×
586
                                                        *z++ = FUNNYVEC;
×
587
                                                        *z++ = m[1];
×
588
                                                        if ( m[2] < 0 ) {
×
589
                                                                *z++ = 1; *z++ = 1; *z++ = 3;
×
590
                                                        }
591
                                                }
592
                                        }
593
NextDot:;
56✔
594
                                }
595
                                if ( m <= v ) m = v - 2;
16✔
596
                                else v[-1] = WORDDIF(m,v) + 2;
16✔
597
                                if ( z > accu ) {
16✔
598
                                        j = WORDDIF(z,accu);
×
599
                                        z = accu;
×
600
                                        NCOPY(m,z,j);
×
601
                                }
602
                                break;
603
/*
604
                        #] DOTPRODUCTS : 
605
*/
606
                        case SETSET:
12✔
607
/*
608
                        #[ SETS :
609
*/
610
                                temp = accu + (((AR.ComprTop - accu)>>1)&(-2));
12✔
611
                                if ( ResolveSet(BHEAD t,temp,sub) ) {
12✔
NEW
612
                                        TERMINATE(-1);
×
613
                                }
614
                                setlist = t + 2 + t[3];
12✔
615
                                setflag = t[1] - 2 - t[3];        /* Number of elements * 2 */
12✔
616
                                t = temp; u = t + t[1];
12✔
617
                                goto ReSwitch;
12✔
618
/*
619
                        #] SETS : 
620
*/
621
                        case VECTOR:
32✔
622
/*
623
                        #[ VECTORS :
624
*/
625
                                *m++ = *t++;
32✔
626
                                *m++ = *t++;
32✔
627
                                v = m;
32✔
628
                                z = accu;
32✔
629
                                while ( t < u ) {
96✔
630
                                        *m = *t;
64✔
631
                                        for ( si = 0; si < setflag; si += 2 ) {
64✔
632
                                                if ( t == temp + setlist[si] ) goto ss4;
×
633
                                        }
634
                                        s = subs;
635
                                        for ( j = 0; j < i; j++ ) {
96✔
636
                                                if ( *t == s[2] ) {
64✔
637
                                                        if ( *s == INDTOIND || *s == VECTOVEC ) {
32✔
638
                                                                *m = s[3]; dirty = 1; break;
32✔
639
                                                        }
640
                                                        if ( *s == VECTOMIN ) {
×
641
                                                                *m = s[3]; dirty = 1; sgn++; break;
×
642
                                                        }
643
                                                        else if ( *s == VECTOSUB ) {
×
644
                                                                *z++ = SUBEXPRESSION;
×
645
                                                                *z++ = 4+SUBEXPSIZE;
×
646
                                                                *z++ = s[3]+1;
×
647
                                                                *z++ = 1;
×
648
                                                                *z++ = AT.ebufnum;
×
649
                                                                FILLSUB(z)
650
                                                                *z++ = VECTOVEC;
×
651
                                                                *z++ = 4;
×
652
                                                                *z++ = FUNNYVEC;
×
653
                                                                *z++ = *++t;
×
654
                                                                m--;
×
655
                                                                s = subs;
×
656
                                                                for ( j = 0; j < i; j++ ) {
×
657
                                                                        if ( z[-1] == s[2] ) {
×
658
                                                                                if ( *s == INDTOIND || *s == VECTOVEC ) {
×
659
                                                                                        z[-1] = s[3];
×
660
                                                                                        break;
×
661
                                                                                }
662
                                                                                if ( *s == INDTOSUB || *s == VECTOSUB ) {
×
663
                                                                                        z[-1] = ++AR.CurDum;
×
664
                                                                                        *z++ = SUBEXPRESSION;
×
665
                                                                                        *z++ = 4+SUBEXPSIZE;
×
666
                                                                                        *z++ = s[3]+1;
×
667
                                                                                        *z++ = 1;
×
668
                                                                                        *z++ = AT.ebufnum;
×
669
                                                                                        FILLSUB(z)
670
                                                                                        if ( *s == INDTOSUB ) *z++ = INDTOIND;
×
671
                                                                                        else *z++ = VECTOSUB;
×
672
                                                                                        *z++ = 4;
×
673
                                                                                        *z++ = FUNNYVEC;
×
674
                                                                                        *z++ = AR.CurDum;
×
675
                                                                                        break;
×
676
                                                                                }
677
                                                                        }
678
                                                                        s += s[1];
×
679
                                                                }
680
                                                                dirty = 1;
681
                                                                break;
682
                                                        }
683
                                                        else if ( *s == INDTOSUB ) {
×
684
                                                                *z++ = SUBEXPRESSION;
×
685
                                                                *z++ = 4+SUBEXPSIZE;
×
686
                                                                *z++ = s[3]+1;
×
687
                                                                *z++ = 1;
×
688
                                                                *z++ = AT.ebufnum;
×
689
                                                                FILLSUB(z)
690
                                                                *z++ = INDTOIND;
×
691
                                                                *z++ = 4;
×
692
                                                                *z++ = FUNNYVEC;
×
693
                                                                m -= 2;
×
694
                                                                *z++ = m[1];
×
695
                                                                dirty = 1;
×
696
                                                                t++;
×
697
                                                                break;
×
698
                                                        }
699
                                                }
700
                                                s += s[1];
32✔
701
                                        }
702
ss4:                                m++; t++;
64✔
703
                                }
704
                                if ( m <= v ) m = v-2;
32✔
705
                                else v[-1] = WORDDIF(m,v)+2;
32✔
706
                                if ( z > accu ) {
32✔
707
                                        j = WORDDIF(z,accu); z = accu;
×
708
                                        NCOPY(m,z,j);
×
709
                                }
710
                                break;
711
/*
712
                        #] VECTORS : 
713
*/
714
                        case INDEX:
2,648✔
715
/*
716
                        #[ INDEX :
717
*/
718
                                *m++ = *t++;
2,648✔
719
                                *m++ = *t++;
2,648✔
720
                                v = m;
2,648✔
721
                                z = accu;
2,648✔
722
                                while ( t < u ) {
5,296✔
723
                                        *m = *t;
2,648✔
724
                                        for ( si = 0; si < setflag; si += 2 ) {
2,648✔
725
                                                if ( t == temp + setlist[si] ) goto ss5;
×
726
                                        }
727
                                        s = subs;
728
                                        for ( j = 0; j < i; j++ ) {
2,688✔
729
                                                if ( *t == s[2] ) {
2,648✔
730
                                                        if ( *s == INDTOIND || *s == VECTOVEC )
2,608✔
731
                                                                { *m = s[3]; dirty = 1; break; }
2,604✔
732
                                                        if ( *s == VECTOMIN )
4✔
733
                                                                { *m = s[3]; dirty = 1; sgn++; break; }
×
734
                                                        else if ( *s == VECTOSUB || *s == INDTOSUB ) {
4✔
735
                                                                *z++ = SUBEXPRESSION;
4✔
736
                                                                *z++ = SUBEXPSIZE;
4✔
737
                                                                *z++ = s[3];
4✔
738
                                                                *z++ = 1;
4✔
739
                                                                *z++ = AT.ebufnum;
4✔
740
                                                                FILLSUB(z)
741
                                                                m--;
4✔
742
                                                                dirty = 1;
4✔
743
                                                                break;
4✔
744
                                                        }
745
                                                }
746
                                                s += s[1];
40✔
747
                                        }
748
ss5:                                m++; t++;
2,648✔
749
                                }
750
                                if ( m <= v ) m = v-2;
2,648✔
751
                                else v[-1] = WORDDIF(m,v)+2;
2,644✔
752
                                if ( z > accu ) {
2,648✔
753
                                        j = WORDDIF(z,accu); z = accu;
4✔
754
                                        NCOPY(m,z,j);
24✔
755
                                }
756
                                break;
757
/*
758
                        #] INDEX : 
759
*/
760
                        case DELTA:
4,856✔
761
                        case LEVICIVITA:
762
                        case GAMMA:
763
/*
764
                        #[ SPECIALS :
765
*/
766
                                v = m;
4,856✔
767
                                *m++ = *t++;
4,856✔
768
                                *m++ = *t++;
4,856✔
769
#if FUNHEAD > 2
770
                                if ( t[-2] != DELTA ) *m++ = *t++;
4,856✔
771
#endif
772
Tensors:
636✔
773
                                COPYFUN3(m,t)
774
                                z = accu;
775
                                while ( t < u ) {
14,400✔
776
                                        *m = *t;
9,500✔
777
                                        for ( si = 0; si < setflag; si += 2 ) {
9,500✔
778
                                                if ( t == temp + setlist[si] ) goto ss6;
×
779
                                        }
780
                                        s = subs;
9,500✔
781
                                        if ( *m == FUNNYWILD ) {
9,500✔
782
                                                CBUF *C = cbuf+AT.ebufnum;
4,008✔
783
                                                t++;
4,008✔
784
                                                for ( j = 0; j < i; j++ ) {
4,104✔
785
                                                        if ( *s == ARGTOARG && *t == s[2] ) {
4,104✔
786
                                                                v[2] |= DIRTYFLAG;
4,008✔
787
                                                                if ( s[3] < 0 ) { /* empty */
4,008✔
788
                                                                        t++; break;
×
789
                                                                }
790
                                                                w = C->rhs[s[3]];
4,008✔
791
DEBUG(MesPrint("Thread %w(a): s[3] = %d, w=(%d,%d,%d,%d)",s[3],w[0],w[1],w[2],w[3]);)
792
                                                                j = *w++;
4,008✔
793
                                                                if ( j > 0 ) {
4,008✔
794
                                                                        NCOPY(m,w,j);
64✔
795
                                                                }
796
                                                                else {
797
                                                                        while ( *w ) {
27,776✔
798
                                                                                if ( *w == -INDEX || *w == -VECTOR
23,800✔
799
                                                                                || *w == -MINVECTOR
×
800
                                                                                || ( *w == -SNUMBER && w[1] >= 0
×
801
                                                                                && w[1] < AM.OffsetIndex ) ) {
×
802
                                                                                        if ( *w == -MINVECTOR ) sgn++;
23,800✔
803
                                                                                        w++;
23,800✔
804
                                                                                        *m++ = *w++;
23,800✔
805
                                                                                }
806
                                                                                else {
807
                                                                                        MLOCK(ErrorMessageLock);
×
808
DEBUG(MesPrint("Thread %w(aa): *w = %d",*w);)
809
                                                                                        MesPrint("Illegal substitution of argument field in tensor");
×
810
                                                                                        MUNLOCK(ErrorMessageLock);
×
811
                                                                                        SETERROR(-1)
×
812
                                                                                }
813
                                                                        }
814
                                                                }
815
                                                                t++;
4,008✔
816
                                                                break;
4,008✔
817
                                                        }
818
                                                        s += s[1];
96✔
819
                                                }
820
                                        }
821
                                        else {
822
                                                for ( j = 0; j < i; j++ ) {
9,576✔
823
                                                        if ( *t == s[2] ) {
5,672✔
824
                                                                if ( *s == INDTOIND || *s == VECTOVEC )
3,568✔
825
                                                                        { *m = s[3]; dirty = 1; break; }
1,588✔
826
                                                                if ( *s == VECTOMIN )
1,980✔
827
                                                                        { *m = s[3]; dirty = 1; sgn++; break; }
×
828
                                                                else if ( *s == VECTOSUB || *s == INDTOSUB ) {
1,980✔
829
                                                                        *m = ++AR.CurDum;
×
830
                                                                        *z++ = SUBEXPRESSION;
×
831
                                                                        *z++ = 4+SUBEXPSIZE;
×
832
                                                                        *z++ = s[3]+1;
×
833
                                                                        *z++ = 1;
×
834
                                                                        *z++ = AT.ebufnum;
×
835
                                                                        FILLSUB(z)
836
                                                                        *z++ = INDTOIND;
×
837
                                                                        *z++ = 4;
×
838
                                                                        *z++ = FUNNYVEC;
×
839
                                                                        *z++ = AR.CurDum;
×
840
                                                                        dirty = 1;
×
841
                                                                        break;
×
842
                                                                }
843
                                                        }
844
                                                        s += s[1];
4,084✔
845
                                                }
846
                                                if ( j < i && *v != DELTA ) v[2] |= DIRTYFLAG;
5,492✔
847
ss6:                                        m++; t++;
5,492✔
848
                                        }
849
                                }
850
                                v[1] = WORDDIF(m,v);
4,900✔
851
                                if ( z > accu ) {
4,900✔
852
                                        j = WORDDIF(z,accu); z = accu;
×
853
                                        NCOPY(m,z,j);
×
854
                                }
855
                                break;
856
/*
857
                        #] SPECIALS : 
858
*/
859
                        case SUBEXPRESSION:
183,923✔
860
/*
861
                        #[ SUBEXPRESSION :
862
*/
863
                                dirty = 1;
183,923✔
864
                                tstop = t + t[1];
183,923✔
865
                                *m++ = *t++;
183,923✔
866
                                *m++ = *t++;
183,923✔
867
                                *m++ = *t++;
183,923✔
868
                                *m++ = *t++;
183,923✔
869
                                if ( t[-1] >= 2*MAXPOWER || t[-1] <= -2*MAXPOWER ) {
183,923✔
870
                                        s = subs;
871
                                        for ( j = 0; j < i; j++ ) {
×
872
                                                if ( *s == SYMTONUM &&
×
873
                                                                ( ABS(t[-1]) - 2*MAXPOWER ) == s[2] ) {
×
874
                                                        m[-1] = s[3];
×
875
                                                        if ( t[-1] < 0 ) m[-1] = -m[-1];
×
876
                                                        break;
877
                                                }
878
                                                s += s[1];
×
879
                                        }
880
                                }
881
                                *m++ = *t++;
183,923✔
882
                                COPYSUB(m,t)
883
                                while ( t < tstop ) {
183,923✔
884
                                        for ( si = 0; si < setflag; si += 2 ) {
613,175✔
885
                                                if ( t == temp + setlist[si] - 2 ) goto ss7;
×
886
                                        }
887
                                        s = subs;
888
                                        for ( j = 0; j < i; j++ ) {
3,856,575✔
889
                                                if ( s[2] == t[2] ) {
3,622,255✔
890
                                                        if ( ( *s <= SYMTOSUB && *t <= SYMTOSUB )
1,502,615✔
891
                                                        || ( *s == *t && *s < FROMBRAC )
1,131,320✔
892
                                                        || ( *s == VECTOVEC && ( *t == VECTOSUB || *t == VECTOMIN ) )
1,123,760✔
893
                                                        || ( *s == VECTOSUB && ( *t == VECTOVEC || *t == VECTOMIN ) )
1,123,760✔
894
                                                        || ( *s == VECTOMIN && ( *t == VECTOSUB || *t == VECTOVEC ) )
1,123,760✔
895
                                                        || ( *s == INDTOIND && *t == INDTOSUB )
1,123,760✔
896
                                                        || ( *s == INDTOSUB && *t == INDTOIND ) ) {
1,123,760✔
897
                                                                WORD *vv = m;
378,855✔
898
/*                                                                *t = *s;  Wrong!!! Overwrites compiler buffer  */
899
                                j = t[1];
378,855✔
900
                                                                NCOPY(m,t,j);
1,894,275✔
901
                                                                vv[0] = s[0];
378,855✔
902
                                                                vv[3] = s[3];
378,855✔
903
                                                                goto sr7;
378,855✔
904
                                                        }
905
                                                }
906
                                                s += s[1];
3,243,400✔
907
                                        }
908
ss7:                                j = t[1];
234,320✔
909
                                        NCOPY(m,t,j);
1,171,600✔
910
sr7:;
797,098✔
911
                                }
912
                                break;
913
/*
914
                        #] SUBEXPRESSION : 
915
*/
916
                        case EXPRESSION:
30,000✔
917
/*
918
                        #[ EXPRESSION :
919
*/
920
                                dirty = 1;
30,000✔
921
                                tstop = t + t[1];
30,000✔
922
                                v = m;
30,000✔
923
                                *m++ = *t++;
30,000✔
924
                                *m++ = *t++;
30,000✔
925
                                *m++ = *t++;
30,000✔
926
                                *m++ = *t++;
30,000✔
927
                                s = subs;
30,000✔
928
                                for ( j = 0; j < i; j++ ) {
60,000✔
929
                                        if ( ( ABS(t[-1]) - 2*MAXPOWER ) == s[2] ) {
30,000✔
930
                                                if ( *s == SYMTONUM ) {
×
931
                                                        m[-1] = s[3];
×
932
                                                        if ( t[-1] < 0 ) m[-1] = -m[-1];
×
933
                                                        break;
934
                                                }
935
                                                else if ( *s <= SYMTOSUB ) {
×
936
                                                        MLOCK(ErrorMessageLock);
×
937
                                                        MesPrint("Wildcard power of expression should be a number");
×
938
                                                        MUNLOCK(ErrorMessageLock);
×
939
                                                        SETERROR(-1)
×
940
                                                }
941
                                        }
942
                                        s += s[1];
30,000✔
943
                                }
944
                                *m++ = *t++;
30,000✔
945
                                COPYSUB(m,t)
946
                                while ( t < tstop && *t != WILDCARDS ) {
60,000✔
947
                                        j = t[1];
×
948
                                        NCOPY(m,t,j);
30,000✔
949
                                }
950
                                if ( t < tstop && *t == WILDCARDS ) {
30,000✔
951
                                        *m++ = *t;
30,000✔
952
                                        s = sub;
30,000✔
953
                                        j = s[1];
30,000✔
954
                                        *m++ = j+2;
30,000✔
955
                                        NCOPY(m,s,j);
300,000✔
956
                                        t += t[1];
30,000✔
957
                                }
958
                                if ( t < tstop && *t == FROMBRAC ) {
30,000✔
959
                                        w = m;
30,000✔
960
                                        *m++ = *t;
30,000✔
961
                                        *m++ = t[1];
30,000✔
962
                                        if ( WildFill(BHEAD m,t+2,sub) < 0 ) {
30,000✔
963
                                                MLOCK(ErrorMessageLock);
×
964
                                                MesCall("WildFill");
×
965
                                                MUNLOCK(ErrorMessageLock);
×
966
                                                SETERROR(-1)
×
967
                                        }
968
                                        m += *m;
30,000✔
969
                                        w[1] = m - w;
30,000✔
970
                                        t += t[1];
30,000✔
971
                                }
972
                                while ( t < tstop ) {
30,000✔
973
                                        j = t[1];
×
974
                                        NCOPY(m,t,j);
30,000✔
975
                                }
976
                                v[1] = m-v;
30,000✔
977
                                break;
30,000✔
978
/*
979
                        #] EXPRESSION : 
980
*/
981
                        default:
6,363,049✔
982
/*
983
                        #[ FUNCTIONS :
984
*/
985
                                if ( *t >= FUNCTION ) {
6,363,049✔
986
                                        dflag = 0;
3,363,049✔
987
                                        na = 0;
3,363,049✔
988
                                        *m = *t;
3,363,049✔
989
                                        for ( si = 0; si < setflag; si += 2 ) {
3,363,052✔
990
                                                if ( t == temp + setlist[si] ) {
24✔
991
                                                        dflag = DIRTYFLAG;        goto ss8;
12✔
992
                                                }
993
                                        }
994
                                        s = subs;
995
                                        for ( j = 0; j < i; j++ ) {
7,027,312✔
996
                                                if ( *s == FUNTOFUN && *t == s[2] )
3,665,211✔
997
                                                        { *m = s[3]; dirty = 1; dflag = DIRTYFLAG; break; }
900✔
998
                                                s += s[1];
3,664,296✔
999
                                        }
1000
ss8:                                v = m;
3,362,131✔
1001
                                        if ( *t >= FUNCTION && functions[*t-FUNCTION].spec
3,363,049✔
1002
                                        >= TENSORFUNCTION ) {
1003
                                                if ( *m < FUNCTION || functions[*m-FUNCTION].spec
44✔
1004
                                                < TENSORFUNCTION ) {
1005
                                                        MLOCK(ErrorMessageLock);
×
1006
                                                        MesPrint("Illegal wildcarding of regular function to tensorfunction");
×
1007
                                                        MUNLOCK(ErrorMessageLock);
×
1008
                                                        SETERROR(-1)
×
1009
                                                }
1010
                                                m++; t++;
44✔
1011
                                                *m++ = *t++;
44✔
1012
                                                *m++ = *t++ | dflag;
44✔
1013
                                                goto Tensors;
44✔
1014
                                        }
1015
                                        m++; t++;
3,362,978✔
1016
                                        *m++ = *t++;
3,362,978✔
1017
                                        *m++ = *t++ | dflag;
3,362,978✔
1018
                                        COPYFUN3(m,t)
1019
                                        z = accu;
3,362,978✔
1020
                                        while ( t < u ) {                /* do an argument */
6,843,152✔
1021
                                                if ( *t < 0 ) {
3,480,174✔
1022
/*
1023
                        #[ Simple arguments :
1024
*/
1025
                                                        CBUF *C = cbuf+AT.ebufnum;
3,292,688✔
1026
                                                        for ( si = 0; si < setflag; si += 2 ) {
3,292,688✔
1027
                                                                if ( *t <= -FUNCTION ) {
12✔
1028
                                                                        if ( t == temp + setlist[si] ) {
×
1029
                                                                                v[2] |= DIRTYFLAG; goto ss10; }
×
1030
                                                                }
1031
                                                                else {
1032
                                                                        if ( t == temp + setlist[si]-1 ) {
12✔
1033
                                                                                v[2] |= DIRTYFLAG; goto ss9; }
12✔
1034
                                                                }
1035
                                                        }
1036
                                                        if ( *t == -ARGWILD ) {
3,292,685✔
1037
                                                                s = subs;
1038
                                                                for ( j = 0; j < i; j++ ) {
45,816✔
1039
                                                                        if ( *s == ARGTOARG && s[2] == t[1] ) break;
45,816✔
1040
                                                                        s += s[1];
27,808✔
1041
                                                                }
1042
                                                                v[2] |= DIRTYFLAG;
18,008✔
1043
                                                                w = C->rhs[s[3]];
18,008✔
1044
DEBUG(MesPrint("Thread %w(b): s[3] = %d, w=(%d,%d,%d,%d)",s[3],w[0],w[1],w[2],w[3]);)
1045
                                                                if ( *w == 0 ) {
18,008✔
1046
                                                                        w++;
18,004✔
1047
                                                                        while ( *w ) {
18,004✔
1048
                                                                                if ( *w > 0 ) j = *w;
405,724✔
1049
                                                                                else if ( *w <= -FUNCTION ) j = 1;
397,072✔
1050
                                                                                else j = 2;
396,992✔
1051
                                                                                NCOPY(m,w,j);
1,477,160✔
1052
                                                                        }
1053
                                                                }
1054
                                                                else {
1055
                                                                        j = *w++;
4✔
1056
                                                                        while ( --j >= 0 ) {
12✔
1057
                                                                                if ( *w < MINSPEC ) *m++ = -VECTOR;
8✔
1058
                                                                                else if ( *w >= 0 && *w < AM.OffsetIndex )
8✔
1059
                                                                                        *m++ = -SNUMBER;
×
1060
                                                                                else *m++ = -INDEX;
8✔
1061
                                                                                *m++ = *w++;
8✔
1062
                                                                        }
1063
                                                                }
1064
                                                                t += 2;
18,008✔
1065
                                                                dirty = 1;
18,008✔
1066
                                                                if ( ( *v == NUMARGSFUN || *v == NUMTERMSFUN )
18,008✔
1067
                                                                && t >= u && m == v + FUNHEAD ) {
20✔
1068
                                                                        m = v;
×
1069
                                                                        *m++ = SNUMBER; *m++ = 3; *m++ = 0;
×
1070
                                                                        break;
×
1071
                                                                }
1072
                                                        }
1073
                                                        else if ( *t <= -FUNCTION ) {
3,274,683✔
1074
                                                                *m = *t;
68✔
1075
                                                                s = subs;
68✔
1076
                                                                for ( j = 0; j < i; j++ ) {
232✔
1077
                                                                        if ( -*t == s[2] ) {
188✔
1078
                                                                                if ( *s == FUNTOFUN )
24✔
1079
                                                                                        { *m = -s[3]; dirty = 1; v[2] |= DIRTYFLAG; break; }
24✔
1080
                                                                        }
1081
                                                                        s += s[1];
164✔
1082
                                                                }
1083
                                                                m++; t++;
68✔
1084
                                                        }
1085
                                                        else if ( *t == -SYMBOL ) {
3,274,606✔
1086
                                                                *m++ = *t++;
239,703✔
1087
                                                                *m = *t;
239,703✔
1088
                                                                s = subs;
239,703✔
1089
                                                                for ( j = 0; j < i; j++ ) {
438,924✔
1090
                                                                        if ( *t == s[2] && *s <= SYMTOSUB ) {
436,311✔
1091
                                                                                dirty = 1; v[2] |= DIRTYFLAG;
237,090✔
1092
                                                                                if ( AR.PolyFunType == 2 && v[0] == AR.PolyFun )
237,090✔
1093
                                                                                        v[2] |= MUSTCLEANPRF;
17,888✔
1094
                                                                                if ( *s == SYMTOSYM ) *m = s[3];
237,090✔
1095
                                                                                else if ( *s == SYMTONUM ) {
222,330✔
1096
                                                                                        m[-1] = -SNUMBER;
207,330✔
1097
                                                                                        *m = s[3];
207,330✔
1098
                                                                                }
1099
                                                                                else if ( *s == SYMTOSUB ) {
15,000✔
1100
ToSub:                                                                                m--;
15,000✔
1101
                                                                                        w = C->rhs[s[3]];
15,000✔
1102
DEBUG(MesPrint("Thread %w(c): s[3] = %d, w=(%d,%d,%d,%d)",s[3],w[0],w[1],w[2],w[3]);)
1103
                                                                                        s = m;
15,000✔
1104
                                                                                        m += 2;
15,000✔
1105
                                                                                        while ( *w ) {
15,000✔
1106
                                                                                                j = *w;
1107
                                                                                                NCOPY(m,w,j);
346,636✔
1108
                                                                                        }
1109
                                                                                        *s = WORDDIF(m,s);
15,000✔
1110
                                                                                        s[1] = 0;
15,000✔
1111
                                                                                        *m = 0;
15,000✔
1112
                                                                                        if ( t[-1] == -MINVECTOR ) {
15,000✔
1113
                                                                                                w = s+2;
1114
                                                                                                while ( *w ) {
×
1115
                                                                                                        w += *w;
×
1116
                                                                                                        w[-1] = -w[-1];
×
1117
                                                                                                }
1118
                                                                                        }
1119
                                                                                        if ( ToFast(s,s) ) {
15,000✔
1120
                                                                                                if ( *s <= -FUNCTION ) m = s;
×
1121
                                                                                                else m = s + 1;
×
1122
                                                                                        }
1123
                                                                                        else m--;
15,000✔
1124
                                                                                }
1125
                                                                                break;
1126
                                                                        }
1127
                                                                        s += s[1];
199,221✔
1128
                                                                }
1129
                                                                m++; t++;
239,703✔
1130
                                                        }
1131
                                                        else if ( *t == -INDEX ) {
3,034,885✔
1132
                                                                *m++ = *t++;
2,313✔
1133
                                                                *m = *t;
2,313✔
1134
                                                                s = subs;
2,313✔
1135
                                                                for ( j = 0; j < i; j++ ) {
3,145✔
1136
                                                                        if ( *t == s[2] ) {
2,477✔
1137
                                                                                if ( *s == INDTOIND || *s == VECTOVEC ) {
1,645✔
1138
                                                                                        *m = s[3];
1,645✔
1139
                                                                                        if ( *m < MINSPEC ) m[-1] = -VECTOR;
1,645✔
1140
                                                                                        else if ( *m >= 0 && *m < AM.OffsetIndex )
1,645✔
1141
                                                                                                m[-1] = -SNUMBER;
1,560✔
1142
                                                                                        else m[-1] = -INDEX;
85✔
1143
                                                                                }
1144
                                                                                else if ( *s == VECTOSUB || *s == INDTOSUB ) {
×
1145
                                                                                        m[-1] = -INDEX;
×
1146
                                                                                        *m = ++AR.CurDum;
×
1147
                                                                                        *z++ = SUBEXPRESSION;
×
1148
                                                                                        *z++ = 4+SUBEXPSIZE;
×
1149
                                                                                        *z++ = s[3]+1;
×
1150
                                                                                        *z++ = 1;
×
1151
                                                                                        *z++ = AT.ebufnum;
×
1152
                                                                                        FILLSUB(z)
1153
                                                                                        *z++ = INDTOIND;
×
1154
                                                                                        *z++ = 4;
×
1155
                                                                                        *z++ = FUNNYVEC;
×
1156
                                                                                        *z++ = AR.CurDum;
×
1157
                                                                                }
1158
                                                                                v[2] |= DIRTYFLAG; dirty = 1;
1,645✔
1159
                                                                                break;
1,645✔
1160
                                                                        }
1161
                                                                        s += s[1];
832✔
1162
                                                                }
1163
                                                                m++; t++;
2,313✔
1164
                                                        }
1165
                                                        else if ( *t == -VECTOR || *t == -MINVECTOR ) {
3,032,596✔
1166
                                                                *m++ = *t++;
5,004✔
1167
                                                                *m = *t;
5,004✔
1168
                                                                s = subs;
5,004✔
1169
                                                                for ( j = 0; j < i; j++ ) {
6,096✔
1170
                                                                        if ( *t == s[2] ) {
5,980✔
1171
                                                                                if ( *s == VECTOVEC ) *m = s[3];
4,888✔
1172
                                                                                else if ( *s == VECTOMIN ) {
×
1173
                                                                                        *m = s[3];
×
1174
                                                                                        if ( t[-1] == -VECTOR )
×
1175
                                                                                                m[-1] = -MINVECTOR;
×
1176
                                                                                        else
1177
                                                                                                m[-1] = -VECTOR;
×
1178
                                                                                }
1179
                                                                                else if ( *s == VECTOSUB ) goto ToSub;
×
1180
                                                                                dirty = 1; v[2] |= DIRTYFLAG;
4,888✔
1181
                                                                                break;
4,888✔
1182
                                                                        }
1183
                                                                        s += s[1];
1,092✔
1184
                                                                }
1185
                                                                m++; t++;
5,004✔
1186
                                                        }
1187
                                                        else if ( *t == -SNUMBER ) {
3,027,595✔
1188
                                                                *m++ = *t++;
3,027,525✔
1189
                                                                *m = *t;
3,027,525✔
1190
                                                                s = subs;
3,027,525✔
1191
                                                                for ( j = 0; j < i; j++ ) {
6,066,917✔
1192
                                                                        if ( *t == s[2] && *s >= NUMTONUM && *s <= NUMTOSUB ) {
3,039,362✔
1193
                                                                                dirty = 1; v[2] |= DIRTYFLAG;
×
1194
                                                                                if ( *s == NUMTONUM ) *m = s[3];
×
1195
                                                                                else if ( *s == NUMTOSYM ) {
×
1196
                                                                                        m[-1] = -SYMBOL;
×
1197
                                                                                        *m = s[3];
×
1198
                                                                                }
1199
                                                                                else if ( *s == NUMTOIND ) {
×
1200
                                                                                        m[-1] = -INDEX;
×
1201
                                                                                        *m = s[3];
×
1202
                                                                                }
1203
                                                                                else if ( *s == NUMTOSUB ) goto ToSub;
×
1204
                                                                                break;
1205
                                                                        }
1206
                                                                        s += s[1];
3,039,362✔
1207
                                                                }
1208
                                                                m++; t++;
3,027,525✔
1209
                                                        }
1210
                                                        else {
1211
ss9:                                                        *m++ = *t++;
52✔
1212
ss10:                                                        *m++ = *t++;
52✔
1213
                                                        }
1214
                                                        na = WORDDIF(z,accu);
3,292,688✔
1215
/*
1216
                        #] Simple arguments : 
1217
*/
1218
                                                }
1219
                                                else {
1220
                                                        w = m;
187,483✔
1221
                                                        zz = t;
187,483✔
1222
                                                        NEXTARG(zz)
187,483✔
1223
                                                        odirt = AN.WildDirt; AN.WildDirt = 0;
187,483✔
1224
                                                        AR.CompressPointer = accu + na;
187,483✔
1225
                                                        for ( j = 0; j < ARGHEAD; j++ ) *m++ = *t++;
562,449✔
1226
                                                        j = 0;
436,778✔
1227
                                                        adirt = 0;
1228
                                                        while ( t < zz ) {        /* do a term */
436,778✔
1229
                                                                if ( ( len = WildFill(BHEAD m,t,sub) ) < 0 ) {
249,295✔
1230
                                                                        MLOCK(ErrorMessageLock);
×
1231
                                                                        MesCall("WildFill");
×
1232
                                                                        MUNLOCK(ErrorMessageLock);
×
1233
                                                                        SETERROR(-1)
×
1234
                                                                }
1235
                                                                if ( AN.WildDirt ) {
249,295✔
1236
                                                                        adirt = AN.WildDirt;
229,151✔
1237
                                                                        AN.WildDirt = 0;
229,151✔
1238
                                                                }
1239
                                                                m += len;
249,295✔
1240
                                                                t += *t;
249,295✔
1241
                                                        }
1242
                                                        *w = WORDDIF(m,w);        /* Fill parameter length */
187,483✔
1243
                                                        if ( adirt ) {
187,483✔
1244
                                                                dirty = w[1] = 1; v[2] |= DIRTYFLAG;
185,867✔
1245
                                                                if ( AR.PolyFunType == 2 && v[0] == AR.PolyFun )
185,867✔
1246
                                                                        v[2] |= MUSTCLEANPRF;
36,912✔
1247
                                                                AN.WildDirt = adirt;
185,867✔
1248
                                                        }
1249
                                                        else {
1250
                                                                AN.WildDirt = odirt;
1,616✔
1251
                                                        }
1252
                                                        if ( ToFast(w,w) ) {
187,483✔
1253
                                                                if ( *w <= -FUNCTION ) {
×
1254
                                                                        if ( *w == NUMARGSFUN || *w == NUMTERMSFUN ) {
×
1255
                                                                                *w = -SNUMBER; w[1] = 0; m = w + 2;
×
1256
                                                                        }
1257
                                                                        else m = w+1;
×
1258
                                                                }
1259
                                                                else m = w+2;
×
1260
                                                        }
1261
                                                        AR.CompressPointer = oldcpointer;
187,483✔
1262
                                                }
1263
                                        }
1264
                                        v[1] = WORDDIF(m,v);                /* Fill function length */
3,362,978✔
1265
                                        s = accu;
3,362,978✔
1266
                                        NCOPY(m,s,na);
3,362,978✔
1267
/*
1268
                    Now some code to speed up a few special cases
1269
*/
1270
                    if ( v[0] == EXPONENT ) {
3,362,978✔
1271
                        if ( v[1] == FUNHEAD+4 && v[FUNHEAD] == -SYMBOL &&
924✔
1272
                        v[FUNHEAD+2] == -SNUMBER && v[FUNHEAD+3] < MAXPOWER
840✔
1273
                        && v[FUNHEAD+3] > -MAXPOWER ) {
824✔
1274
                            v[0] = SYMBOL;
824✔
1275
                            v[1] = 4;
824✔
1276
                            v[2] = v[FUNHEAD+1];
824✔
1277
                            v[3] = v[FUNHEAD+3];
824✔
1278
                            m = v+4;
824✔
1279
                        }
1280
                                                else if ( v[1] == FUNHEAD+ARGHEAD+11
100✔
1281
                                                 && v[FUNHEAD] == ARGHEAD+9
×
1282
                                                 && v[FUNHEAD+ARGHEAD] == 9
×
1283
                                                 && v[FUNHEAD+ARGHEAD+1] == DOTPRODUCT
×
1284
                                                 && v[FUNHEAD+ARGHEAD+8] == 3
×
1285
                                                 && v[FUNHEAD+ARGHEAD+7] == 1
×
1286
                                                 && v[FUNHEAD+ARGHEAD+6] == 1
×
1287
                                                 && v[FUNHEAD+ARGHEAD+5] == 1
×
1288
                                 && v[FUNHEAD+ARGHEAD+9] == -SNUMBER
×
1289
                                                 && v[FUNHEAD+ARGHEAD+10] < MAXPOWER
×
1290
                                 && v[FUNHEAD+ARGHEAD+10] > -MAXPOWER ) {
×
1291
                                                        v[0] = DOTPRODUCT;
×
1292
                                                        v[1] = 5;
×
1293
                                                        v[2] = v[FUNHEAD+ARGHEAD+3];
×
1294
                                                        v[3] = v[FUNHEAD+ARGHEAD+4];
×
1295
                                                        v[4] = v[FUNHEAD+ARGHEAD+10];
×
1296
                                                        m = v+5;
×
1297
                                                }
1298
                    }
1299
                                }
1300
                                else { while ( t < u ) *m++ = *t++; }
12,000,000✔
1301
/*
1302
                        #] FUNCTIONS : 
1303
*/
1304
                }
1305
                t = uu;
7,067,256✔
1306
        } while ( t < r );
7,067,256✔
1307
        t = from;                        /* Copy coefficient */
5,312,355✔
1308
        t += *t;
5,312,355✔
1309
        if ( r < t ) do { *m++ = *r++; } while ( r < t );
16,058,940✔
1310
        if ( ( sgn & 1 ) != 0 ) m[-1] = -m[-1];
5,312,355✔
1311
        *to = WORDDIF(m,to);
5,312,355✔
1312
        if ( dirty ) AN.WildDirt = dirty;
5,312,355✔
1313
        return(*to);
5,312,355✔
1314
}
1315

1316
/*
1317
                 #] WildFill : 
1318
                 #[ ResolveSet :                        WORD ResolveSet(from,to,subs)
1319

1320
                The set syntax is:
1321
                SET,length,subterm,where,whichmember[,where,whichmember]
1322

1323
                setlength is 2*n+1 with n the number of set substitutions.
1324
                length = setlength + subtermlength + 2
1325

1326
                At `where' is the number of the set and `whichmember' is the
1327
                number of the element. This is still a symbol/dollar and we
1328
                have to find the substitution in the wildcards.
1329
                The output is the subterm in which the setelements have been
1330
                substituted. This is ready for further wildcard substitutions.
1331
*/
1332

1333
WORD ResolveSet(PHEAD WORD *from, WORD *to, WORD *subs)
12✔
1334
{
1335
        GETBIDENTITY
1336
        WORD *m, *s, *w, j, i, ii, i3, flag, num;
12✔
1337
        DOLLARS d = 0;
12✔
1338
#ifdef WITHPTHREADS
1339
        int nummodopt, dtype = -1;
6✔
1340
#endif
1341
        m = to;                                                /* pointer in output */
12✔
1342
        s = from + 2;
12✔
1343
        w = s + s[1];
12✔
1344
        while ( s < w ) *m++ = *s++;
72✔
1345
        j = (from[1] - WORDDIF(w,from) ) >> 1;
12✔
1346
        m = subs + subs[1];
12✔
1347
        subs += SUBEXPSIZE;
12✔
1348
        s = subs;
12✔
1349
        i = 0;
12✔
1350
        while ( s < m ) { i++; s += s[1]; }
48✔
1351
        m = to;
12✔
1352
        if ( *m >= FUNCTION && functions[*m-FUNCTION].spec
12✔
1353
        >= TENSORFUNCTION ) flag = 0;
12✔
1354
        else flag = 1;
12✔
1355
        while ( --j >= 0 ) {
36✔
1356
                if ( w[1] >= 0 ) {
24✔
1357
                        s = subs;
1358
                        for ( ii = 0; ii < i; ii++ ) {
72✔
1359
                                if ( *s == SYMTONUM && s[2] == w[1] ) { num = s[3]; goto GotOne; }
72✔
1360
                                s += s[1];
48✔
1361
                        }
1362
                        MLOCK(ErrorMessageLock);
×
1363
                        MesPrint(" Unresolved setelement during substitution");
×
1364
                        MUNLOCK(ErrorMessageLock);
×
1365
                        return(-1);
×
1366
                }
1367
                else {        /* Dollar ! */
1368
                        d = Dollars - w[1];
×
1369
#ifdef WITHPTHREADS
1370
                        if ( AS.MultiThreaded ) {
1371
                                for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
1372
                                        if ( -w[1] == ModOptdollars[nummodopt].number ) break;
1373
                                }
1374
                                if ( nummodopt < NumModOptdollars ) {
1375
                                        dtype = ModOptdollars[nummodopt].type;
1376
                                        if ( dtype == MODLOCAL ) {
1377
                                                d = ModOptdollars[nummodopt].dstruct+AT.identity;
1378
                                        }
1379
                                        else {
1380
                                                LOCK(d->pthreadslockread);
1381
                                        }
1382
                                }
1383
                        }
1384
#endif
1385
                        if ( d->type == DOLNUMBER || d->type == DOLTERMS ) {
×
1386
                                if ( d->where[0] == 4 && d->where[3] == 3 && d->where[2] == 1
×
1387
                                && d->where[1] > 0 && d->where[4] == 0 ) {
×
1388
                                        num = d->where[1]; goto GotOne;
×
1389
                                }
1390
                        }
1391
                        else if ( d->type == DOLINDEX ) {
×
1392
                                if ( d->index > 0 && d->index < AM.OffsetIndex ) {
×
1393
                                        num = d->index; goto GotOne;
×
1394
                                }
1395
                        }
1396
                        else if ( d->type == DOLARGUMENT ) {
×
1397
                                if ( d->where[0] == -SNUMBER && d->where[1] > 0 ) {
×
1398
                                        num = d->where[1]; goto GotOne;
×
1399
                                }
1400
                        }
1401
                        else if ( d->type == DOLWILDARGS ) {
×
1402
                                if ( d->where[0] == 1 && 
×
1403
                                d->where[1] > 0 && d->where[1] < AM.OffsetIndex ) {
×
1404
                                        num = d->where[1]; goto GotOne;
×
1405
                                }
1406
                                if ( d->where[0] == 0 && d->where[1] < 0 && d->where[3] == 0 ) {
×
1407
                                        if ( ( d->where[1] == -SNUMBER && d->where[2] > 0 )
×
1408
                                        || ( d->where[1] == -INDEX && d->where[2] > 0
×
1409
                                        && d->where[2] < AM.OffsetIndex ) ) {
×
1410
                                                num = d->where[2]; goto GotOne;
×
1411
                                        }
1412
                                }
1413
                        }
1414
#ifdef WITHPTHREADS
1415
                        if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
1416
#endif
1417
                        MLOCK(ErrorMessageLock);
×
1418
                        MesPrint("Unusable type of variable $%s in set substitution",
×
1419
                                AC.dollarnames->namebuffer+d->name);
×
1420
                        MUNLOCK(ErrorMessageLock);
×
1421
                        return(-1);
×
1422
                }
1423
GotOne:;
24✔
1424
#ifdef WITHPTHREADS
1425
                if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
12✔
1426
#endif
1427
                ii = m[*w];
24✔
1428
                if ( ii >= 2*MAXPOWER ) i3 = ii - 2*MAXPOWER;
24✔
1429
                else if ( ii <= -2*MAXPOWER ) i3 = -ii - 2*MAXPOWER;
24✔
1430
                else i3 = ( ii >= 0 ) ? ii: -ii - 1;
24✔
1431

1432
                if ( num > ( Sets[i3].last - Sets[i3].first ) || num <= 0 ) {
24✔
1433
                        MLOCK(ErrorMessageLock);
×
1434
                        MesPrint("Array bound check during set substitution");
×
1435
                        MesPrint("    value is %d",num);
×
1436
                        MUNLOCK(ErrorMessageLock);
×
1437
                        return(-1);
×
1438
                }
1439
                m[*w] = (SetElements+Sets[i3].first)[num-1];
24✔
1440
                if ( Sets[i3].type == CSYMBOL && m[*w] > MAXPOWER ) {
24✔
1441
                        if ( ii >= 2*MAXPOWER ) m[*w] -= 2*MAXPOWER;
×
1442
                        else if ( ii <= -2*MAXPOWER ) m[*w] = -(m[*w] - 2*MAXPOWER);
×
1443
                        else {
1444
                                m[*w] -= MAXPOWER;
×
1445
                                if ( m[*w] < MAXPOWER ) m[*w] -= 2*MAXPOWER;
×
1446
                                if ( flag ) MakeDirty(m,m+*w,1);
×
1447
                        }
1448
                }
1449
                else if ( Sets[i3].type == CSYMBOL ) {
24✔
1450
                        if ( ii >= 2*MAXPOWER ) m[*w] += 2*MAXPOWER;
12✔
1451
                        else if ( ii <= -2*MAXPOWER ) m[*w] = -m[*w] - 2*MAXPOWER;
12✔
1452
                        else if ( ii < 0 ) m[*w] = - m[*w];
12✔
1453
                }
1454
                else if ( ii < 0 ) m[*w] = - m[*w];
12✔
1455
                w += 2;
24✔
1456
        }
1457
        m = to;
12✔
1458
        if ( *m >= FUNCTION && functions[*m-FUNCTION].spec
12✔
1459
        >= TENSORFUNCTION ) {
1460
                w = from + 2 + from[3];
×
1461
                if ( *w == 0 ) {        /* We had function -> tensor */
×
1462
                        m = from + 2 + FUNHEAD; s = to + FUNHEAD;
×
1463
                        while ( m < w ) {
×
1464
                                if ( *m == -INDEX || *m == -VECTOR ) {}
×
1465
                                else if ( *m == -ARGWILD ) { *s++ = FUNNYWILD; }
×
1466
                                else {
1467
                                        MLOCK(ErrorMessageLock);
×
1468
                                        MesPrint("Illegal argument in tensor after set substitution");
×
1469
                                        MUNLOCK(ErrorMessageLock);
×
1470
                                        SETERROR(-1)
×
1471
                                }
1472
                                *s++ = m[1];
×
1473
                                m += 2;
×
1474
                        }
1475
                        to[1] = WORDDIF(s,to);
×
1476
                }
1477
        }
1478
        return(0);
1479
}
1480

1481
/*
1482
                 #] ResolveSet : 
1483
                 #[ ClearWild :                        VOID ClearWild()
1484

1485
        Clears the current wildcard settings and makes them ready for
1486
        CheckWild and AddWild.
1487

1488
*/
1489

1490
VOID ClearWild(PHEAD0)
1,799,521✔
1491
{
1492
        GETBIDENTITY
1493
        WORD n, nn, *w;
1,799,521✔
1494
        n = (AN.WildValue[-SUBEXPSIZE+1]-SUBEXPSIZE)/4;                /* Number of wildcards */
1,799,521✔
1495
        AN.NumWild = nn = n;
1,799,521✔
1496
        if ( n > 0 ) {
1,799,521✔
1497
                w = AT.WildMask;
1,663,505✔
1498
                do { *w++ = 0; } while ( --n > 0 );
2,097,909✔
1499
                w = AN.WildValue;
1,663,505✔
1500
                do {
2,097,909✔
1501
                        if ( *w == SYMTONUM ) *w = SYMTOSYM;
2,097,909✔
1502
                        w += w[1];
2,097,909✔
1503
                } while ( --nn > 0 );
2,097,909✔
1504
        }
1505
}
1,799,521✔
1506

1507
/*
1508
                 #] ClearWild : 
1509
                 #[ AddWild :                        WORD AddWild(oldnumber,type,newnumber)
1510

1511
                 Adds a wildcard assignment.
1512
                Extra parameter in AN.argaddress;
1513

1514
*/
1515

1516
WORD AddWild(PHEAD WORD oldnumber, WORD type, WORD newnumber)
12,721,790✔
1517
{
1518
        GETBIDENTITY
1519
        WORD *w, *m, n, k, i = -1;
12,721,790✔
1520
        CBUF *C = cbuf+AT.ebufnum;
12,721,790✔
1521
        WORD eattensor = type & EATTENSOR;
12,721,790✔
1522
        type = type & ~EATTENSOR;
12,721,790✔
1523
DEBUG(WORD *mm;)
1524
        AN.WildReserve = 0;
12,721,790✔
1525
        m = AT.WildMask;
12,721,790✔
1526
        w = AN.WildValue;
12,721,790✔
1527
        n = AN.NumWild;
12,721,790✔
1528
        if ( n <= 0 ) { return(-1); }
12,721,790✔
1529
        if ( type <= SYMTOSUB ) {
12,721,790✔
1530
                do {
1,573,520✔
1531
                        if ( w[2] == oldnumber && *w <= SYMTOSUB ) {
1,573,520✔
1532
                                if ( n > 1 && w[4] == SETTONUM ) i = w[7];
1,351,516✔
1533
                                *w = type;
1,351,516✔
1534
                                if ( *m != 2 ) *m = 1;
1,351,516✔
1535
                                if ( type != SYMTOSUB ) {
1,351,516✔
1536
                                        if ( type == SYMTONUM ) AN.MaskPointer = m;
333,529✔
1537
                                        w[3] = newnumber;
333,529✔
1538
                                        goto FlipOn;
333,529✔
1539
                                }
1540
                                m = AddRHS(AT.ebufnum,1);
1,017,987✔
1541
                                w[3] = C->numrhs;
1,017,987✔
1542
                                w = AN.argaddress;
1,017,987✔
1543
DEBUG(mm = m;)
1544
                                n = *w - ARGHEAD;
1,017,987✔
1545
                                w += ARGHEAD;
1,017,987✔
1546
                                while ( (m + n + 10) > C->Top ) m = DoubleCbuffer(AT.ebufnum,m,4);
1,018,032✔
1547
                                while ( --n >= 0 ) *m++ = *w++;
13,651,520✔
1548
                                *m++ = 0;
1,017,987✔
1549
                                C->rhs[C->numrhs+1] = m;
1,017,987✔
1550
DEBUG(MesPrint("Thread %w(d): m=(%d,%d,%d,%d)(%d)",mm[0],mm[1],mm[2],mm[3],C->numrhs);)
1551
                                C->Pointer = m;
1,017,987✔
1552
                                goto FlipOn;
1,017,987✔
1553
                        }
1554
                        m++; w += w[1];
222,004✔
1555
                } while ( --n > 0 );
222,004✔
1556
        }
1557
        else if ( type == ARGTOARG ) {
11,370,270✔
1558
                do {
18,938,310✔
1559
                        if ( w[2] == oldnumber && *w == ARGTOARG ) {
18,938,310✔
1560
                                *m = 1;
7,579,920✔
1561
                                m = AddRHS(AT.ebufnum,1);
7,579,920✔
1562
                                w[3] = C->numrhs;
7,579,920✔
1563
                                w = AN.argaddress;
7,579,920✔
1564
DEBUG(mm=m;)
1565
                                if ( eattensor ) {
7,579,920✔
1566
                                        n = newnumber;
100✔
1567
                                        *m++ = n;
100✔
1568
                                        w = AN.argaddress;
100✔
1569
                                }
1570
                                else {
1571
                                        while ( --newnumber >= 0 ) { NEXTARG(w) }
210,387,000✔
1572
                                        n = WORDDIF(w,AN.argaddress);
7,579,840✔
1573
                                        w = AN.argaddress;
7,579,840✔
1574
                                        *m++ = 0;
7,579,840✔
1575
                                }
1576
                                while ( (m + n + 10) > C->Top ) m = DoubleCbuffer(AT.ebufnum,m,5);
7,580,000✔
1577
DEBUG(if ( mm != m-1 ) MesPrint("Thread %w(e): Alarm!"); mm = m-1;)
1578
                                while ( --n >= 0 ) *m++ = *w++;
413,351,000✔
1579
                                *m++ = 0;
7,579,920✔
1580
                                C->rhs[C->numrhs+1] = m;
7,579,920✔
1581
                                C->Pointer = m;
7,579,920✔
1582
DEBUG(MesPrint("Thread %w(e): w=(%d,%d,%d,%d)(%d)",mm[0],mm[1],mm[2],mm[3],C->numrhs);)
1583
                                return(0);
7,579,920✔
1584
                        }
1585
                        m++; w += w[1];
11,358,390✔
1586
                } while ( --n > 0 );
11,358,390✔
1587
        }
1588
        else if ( type == ARLTOARL ) {
3,790,344✔
1589
                do {
×
1590
                        if ( w[2] == oldnumber && *w == ARGTOARG ) {
×
1591
                                WORD **a;
×
1592
                                *m = 1;
×
1593
                                m = AddRHS(AT.ebufnum,1);
×
1594
                                w[3] = C->numrhs;
×
1595
DEBUG(mm=m;)
1596
                                a = (WORD **)(AN.argaddress); n = 0; k = newnumber;
×
1597
                                while ( --newnumber >= 0 ) {
×
1598
                                        w = *a++;
×
1599
                                        if ( *w > 0 ) n += *w;
×
1600
                                        else if ( *w <= -FUNCTION ) n++;
×
1601
                                        else n += 2;
×
1602
                                }
1603
                                *m++ = 0;
×
1604
                                while ( (m + n + 10) > C->Top ) m = DoubleCbuffer(AT.ebufnum,m,6);
×
1605
DEBUG(if ( mm != m-1 ) MesPrint("Thread %w(f): Alarm!"); mm = m-1;)
1606
                                a = (WORD **)(AN.argaddress);
×
1607
                                while ( --k >= 0 ) {
×
1608
                                        w = *a++;
×
1609
                                        if ( *w > 0 ) { n = *w; NCOPY(m,w,n); }
×
1610
                                        else if ( *w <= -FUNCTION ) *m++ = *w++;
×
1611
                                        else { *m++ = *w++; *m++ = *w++; }
×
1612
                                }
1613
                                *m++ = 0;
×
1614
                                C->rhs[C->numrhs+1] = m;
×
1615
DEBUG(MesPrint("Thread %w(f): w=(%d,%d,%d,%d)(%d)",mm[0],mm[1],mm[2],mm[3],C->numrhs);)
1616
                                C->Pointer = m;
×
1617
                                return(0);
×
1618
                        }
1619
                        m++; w += w[1];
×
1620
                } while ( --n > 0 );
×
1621
        }
1622
        else if ( type == VECTOSUB || type == INDTOSUB ) {
3,790,344✔
1623
                WORD *ss, *sstop, *tt, *ttstop, j, *v1, *v2 = 0;
×
1624
                do {
×
1625
                        if ( w[2] == oldnumber && ( *w == type ||
×
1626
                        ( type == VECTOSUB && ( *w == VECTOVEC || *w == VECTOMIN ) )
×
1627
                        || ( type == INDTOSUB && *w == INDTOIND ) ) ) {
×
1628
                                if ( n > 1 && w[4] == SETTONUM ) i = w[7];
×
1629
                                *w = type;
×
1630
                                *m = 1;
×
1631
                                m = AddRHS(AT.ebufnum,1);
×
1632
                                w[3] = C->numrhs;
×
1633
                                w = AN.argaddress;
×
1634
                                n = *w - ARGHEAD;
×
1635
                                w += ARGHEAD;
×
1636
                                while ( (m + n + 10) > C->Top ) m = DoubleCbuffer(AT.ebufnum,m,7);
×
1637
                                while ( --n >= 0 ) *m++ = *w++;
×
1638
                                *m++ = 0;
×
1639
                                C->rhs[C->numrhs+1] = m;
×
1640
                                C->Pointer = m;
×
1641
                                m = AddRHS(AT.ebufnum,1);
×
1642
                                w = AN.argaddress;
×
1643
                                n = *w - ARGHEAD;
×
1644
                                w += ARGHEAD;
×
1645
                                while ( (m + n + 10) > C->Top ) m = DoubleCbuffer(AT.ebufnum,m,8);
×
1646
                                sstop = w + n;
×
1647
                                while ( w < sstop ) {                        /* Run over terms */
×
1648
                                        tt = w + *w; ttstop = tt - ABS(tt[-1]);
×
1649
                                        ss = m; m++; w++;
×
1650
                                        while ( w < ttstop ) {                /* Subterms */
×
1651
                                                if ( *w != INDEX ) {
×
1652
                                                        j = w[1];
×
1653
                                                        NCOPY(m,w,j);
×
1654
                                                }
1655
                                                else {
1656
                                                        v1 = m;
×
1657
                                                        *m++ = *w++;
×
1658
                                                        *m++ = j = *w++;
×
1659
                                                        j -= 2;
×
1660
                                                        while ( --j >= 0 ) {
×
1661
                                                                if ( *w >= MINSPEC ) *m++ = *w++;
×
1662
                                                                else v2 = w++;
×
1663
                                                        }
1664
                                                        j = WORDDIF(m,v1);
×
1665
                                                        if ( j != v1[1] ) {
×
1666
                                                                if ( j <= 2 ) m -= 2;
×
1667
                                                                else v1[1] = j;
×
1668
                                                                *m++ = VECTOR;
×
1669
                                                                *m++ = 4;
×
1670
                                                                *m++ = *v2;
×
1671
                                                                *m++ = FUNNYVEC;
×
1672
                                                        }
1673
                                                }
1674
                                        }
1675
                                        while ( w < tt ) *m++ = *w++;
×
1676
                                        *ss = WORDDIF(m,ss);
×
1677
                                }
1678
                                *m++ = 0;
×
1679
                                C->rhs[C->numrhs+1] = m;
×
1680
                                C->Pointer = m;
×
1681
                                if ( m > C->Top ) {
×
1682
                                        MLOCK(ErrorMessageLock);
×
1683
                                        MesPrint("Internal problems with extra compiler buffer");
×
1684
                                        MUNLOCK(ErrorMessageLock);
×
NEW
1685
                                        TERMINATE(-1);
×
1686
                                }
1687
                                goto FlipOn;
×
1688
                        }
1689
                        m++; w += w[1];
×
1690
                } while ( --n > 0 );
×
1691
        }
1692
        else {
1693
                do {
3,795,032✔
1694
                        if ( w[2] == oldnumber && ( *w == type || ( type == VECTOVEC
3,795,032✔
1695
                        && ( *w == VECTOMIN || *w == VECTOSUB ) ) || ( type == VECTOMIN
12✔
1696
                        && ( *w == VECTOVEC || *w == VECTOSUB ) )
12✔
1697
                        || ( type == INDTOIND && *w == INDTOSUB ) ) ) {
×
1698
                                if ( n > 1 && w[4] == SETTONUM ) i = w[7];
3,790,344✔
1699
                                *w = type;
3,790,344✔
1700
                                w[3] = newnumber;
3,790,344✔
1701
                                *m = 1;
3,790,344✔
1702
                                goto FlipOn;
3,790,344✔
1703
                        }
1704
                        m++; w += w[1];
4,688✔
1705
                } while ( --n > 0 );
4,688✔
1706
        }
1707
        MLOCK(ErrorMessageLock);
×
1708
        MesPrint("Bug in AddWild.");
×
1709
        MUNLOCK(ErrorMessageLock);
×
1710
        return(-1);
1711
FlipOn:
5,141,870✔
1712
        if ( i >= 0 ) {
5,141,870✔
1713
                m = AT.WildMask;
12✔
1714
                w = AN.WildValue;
12✔
1715
                n = AN.NumWild;
12✔
1716
                while ( --n >= 0 ) {
36✔
1717
                        if ( w[2] == i && *w == SYMTONUM ) {
36✔
1718
                                *m = 2;
12✔
1719
                                return(0);
12✔
1720
                        }
1721
                        m++; w += w[1];
24✔
1722
                }
1723
                MLOCK(ErrorMessageLock);
×
1724
                MesPrint(" Bug in AddWild with passing set[i]");
×
1725
                MUNLOCK(ErrorMessageLock);
×
1726
/*
1727
                For the moment we want to crash here. That is easier with debugging.
1728
*/
1729
#ifdef WITHPTHREADS
1730
                { WORD *s = 0;
1731
                        *s++ = 1;
1732
                }
1733
#endif
NEW
1734
                TERMINATE(-1);
×
1735
        }
1736
        return(0);
1737
}
1738

1739
/*
1740
                 #] AddWild : 
1741
                 #[ CheckWild :                        WORD CheckWild(oldnumber,type,newnumber,newval)
1742

1743
                 Tests whether a wildcard assignment is allowed.
1744
                 A return value of zero means that it is allowed (nihil obstat).
1745
                 If the variable has been assigned already its existing
1746
                 assignment is returned in AN.oldvalue and AN.oldtype, which are
1747
                 global variables.
1748

1749
                Note the special problem with name?set[i]. Here we have to pass
1750
                an extra assignment. This cannot be done via globals as we
1751
                call CheckWild sometimes twice before calling AddWild.
1752
                Trick: Check the assignment of the number and if OK put it
1753
                in place, but don't alter the used flag (if needed).
1754
                Then AddWild can alter the used flag but the value is there.
1755
                As long as this trick is `hanging' we turn on the flag:
1756
                `AN.WildReserve' which is either turned off by AddWild or by
1757
                a failing call to CheckWild.
1758

1759
                With ARGTOARG the tensors give the number of arguments
1760
                or-ed with EATTENSOR which is at least 8192.
1761
*/
1762

1763
WORD CheckWild(PHEAD WORD oldnumber, WORD type, WORD newnumber, WORD *newval)
16,533,360✔
1764
{
1765
        GETBIDENTITY
1766
        WORD *w, *m, *s, n, old2, inset;
16,533,360✔
1767
        WORD n2, oldval, dirty, i, j, notflag = 0, retblock = 0;
16,533,360✔
1768
        CBUF *C = cbuf+AT.ebufnum;
16,533,360✔
1769
        WORD eattensor = type & EATTENSOR;
16,533,360✔
1770
        type = type & ~EATTENSOR;
16,533,360✔
1771
        m = AT.WildMask;
16,533,360✔
1772
        w = AN.WildValue;
16,533,360✔
1773
        n = AN.NumWild;
16,533,360✔
1774
        if ( n <= 0 ) { AN.oldtype = -1; AN.WildReserve = 0; return(-1); }
16,533,360✔
1775
        switch ( type ) {
16,533,360✔
1776
                case SYMTONUM :
341,342✔
1777
                        *newval = newnumber;
341,342✔
1778
                        do {
662,290✔
1779
                                if ( w[2] == oldnumber && *w <= SYMTOSUB ) {
662,290✔
1780
                                        old2 = *w;
341,342✔
1781
                                        if ( !*m ) goto TestSet;
341,342✔
1782
                                        AN.MaskPointer = m;
136✔
1783
                                        if ( *w == SYMTONUM  && w[3] == newnumber ) {
136✔
1784
                                                return(0);
1785
                                        }
1786
                                        AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
136✔
1787
                                }
1788
                                m++; w += w[1];
320,948✔
1789
                        } while ( --n > 0 );
320,948✔
1790
                        break;
1791
                case SYMTOSYM :
23,987✔
1792
                        *newval = newnumber;
23,987✔
1793
                        do {
24,447✔
1794
                                if ( w[2] == oldnumber && *w <= SYMTOSUB ) {
24,447✔
1795
                                        old2 = *w;
23,987✔
1796
                                        if ( *w == SYMTOSYM ) {
23,987✔
1797
                                                if ( !*m ) goto TestSet;
23,987✔
1798
                                                if ( newnumber >= 0 && (w+4) < AN.WildStop
72✔
1799
                                                && ( w[4] == FROMSET || w[4] == SETTONUM )
72✔
1800
                                                && w[7] >= 0 ) goto TestSet;
×
1801
                                                if ( w[3] == newnumber ) return(0);
72✔
1802
                                        }
1803
                                        else {
1804
                                                if ( !*m ) goto TestSet;
×
1805
                                        }
1806
                                        goto NoM;
12✔
1807
                                }
1808
                                m++; w += w[1];
460✔
1809
                        } while ( --n > 0 );
460✔
1810
                        break;
1811
                case SYMTOSUB :
1,021,043✔
1812
/*
1813
                        Now newval contains the pointer to the argument.
1814
*/
1815
                        {
1816
/*
1817
                                Search for vector or index nature. If so: reject.
1818
*/
1819
                                WORD *ss, *sstop, *tt, *ttstop;
1,021,043✔
1820
                                ss = newval;
1,021,043✔
1821
                                sstop = ss + *ss;
1,021,043✔
1822
                                ss += ARGHEAD;
1,021,043✔
1823
                                while ( ss < sstop ) {
3,085,178✔
1824
                                        tt = ss + *ss;
2,064,135✔
1825
                                        ttstop = tt - ABS(tt[-1]);
2,064,135✔
1826
                                        ss++;
2,064,135✔
1827
                                        while ( ss < ttstop ) {
3,126,518✔
1828
                                                if ( *ss == INDEX ) goto NoMatch;
1,062,383✔
1829
                                                ss += ss[1];
1,062,383✔
1830
                                        }
1831
                                        ss = tt;
1832
                                }
1833
                        }
1834
                        do {
1,028,567✔
1835
                                if ( w[2] == oldnumber && *w <= SYMTOSUB ) {
1,028,567✔
1836
                                        old2 = *w;
1,021,043✔
1837
                                        if ( *w == SYMTONUM || *w == SYMTOSYM ) {
1,021,043✔
1838
                                                if ( !*m ) {
38,435✔
1839
                                                        s = w + w[1];
38,435✔
1840
                                                        if ( s >= AN.WildStop || *s != SETTONUM )
38,435✔
1841
                                                                        goto TestSet;
38,435✔
1842
                                                }
1843
                                        }
1844
                                        else if ( *w == SYMTOSUB ) {
982,608✔
1845
                                                if ( !*m ) {
982,608✔
1846
                                                        s = w + w[1];
982,608✔
1847
                                                        if ( s >= AN.WildStop || *s != SETTONUM )
982,608✔
1848
                                                                        goto TestSet;
982,608✔
1849
                                                }
1850
                                                n = *newval - 2;
×
1851
                                                newval += 2;
×
1852
                                                m = C->rhs[w[3]];
×
1853
                                                if ( (C->rhs[w[3]+1] - m - 1) == n ) {
×
1854
                                                        while ( n > 0 ) {
×
1855
                                                                if ( *m != *newval ) {
×
1856
                                                                        m++; newval++; break;
×
1857
                                                                }
1858
                                                                m++; newval++;
×
1859
                                                                n--;
×
1860
                                                        }
1861
                                                        if ( n <= 0 ) return(0);
×
1862
                                                }
1863
                                        }
1864
                                        AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
×
1865
                                }
1866
                                m++; w += w[1];
7,524✔
1867
                        } while ( --n > 0 );
7,524✔
1868
                        break;
1869
                case ARGTOARG :
11,358,390✔
1870
                        do {
18,938,310✔
1871
                                if ( w[2] == oldnumber && *w == ARGTOARG ) {
18,938,310✔
1872
                                        if ( !*m ) return(0);                /* nihil obstat */
7,579,920✔
1873
                                        m = C->rhs[w[3]];
84✔
1874
                                        if ( eattensor ) {
84✔
1875
                                                n = newnumber;
4✔
1876
                                                if ( *m != 0 ) {
4✔
1877
                                                        if ( n == *m ) {
4✔
1878
                                                                m++;
4✔
1879
                                                                while ( --n >= 0 ) {
12✔
1880
                                                                        if ( *m != *newval ) {
8✔
1881
                                                                                m++; newval++; break;
4✔
1882
                                                                        }
1883
                                                                        m++; newval++;
8✔
1884
                                                                }
1885
                                                                if ( n < 0 ) return(0);
4✔
1886
                                                        }
1887
                                                }
1888
                                                else {
1889
                                                        m++;
×
1890
                                                        while ( --n >= 0 ) {
×
1891
                                                                if ( *newval != m[1] || ( *m != -INDEX
×
1892
                                                                && *m != -VECTOR && *m != -SNUMBER ) ) break;
×
1893
                                                                m += 2;
×
1894
                                                                newval++;
×
1895
                                                        }
1896
                                                        if ( n < 0 && *m == 0 ) return(0);
×
1897
                                                }
1898
                                        }
1899
                                        else {
1900
                                                i = newnumber;
80✔
1901
                                                if ( *m != 0 ) {        /* Tensor field */
80✔
1902
                                                        if ( *m == i ) {
×
1903
                                                                m++;
×
1904
                                                                while ( --i >= 0 ) {
×
1905
                                                                        if ( *m != newval[1]
×
1906
                                                                        || ( *newval != -VECTOR
×
1907
                                                                          && *newval != -INDEX
×
1908
                                                                          && *newval != -SNUMBER ) ) break;
×
1909
                                                                        newval += 2;
×
1910
                                                                        m++;
×
1911
                                                                }
1912
                                                                if ( i < 0 ) return(0);
×
1913
                                                        }
1914
                                                }
1915
                                                else {
1916
                                                        m++;
80✔
1917
                                                        s = newval;
80✔
1918
                                                        while ( --i >= 0 ) { NEXTARG(s) }
4,080✔
1919
                                                        n = WORDDIF(s,newval);
80✔
1920
                                                        while ( --n >= 0 ) {
8,080✔
1921
                                                                if ( *m != *newval ) {
8,000✔
1922
                                                                        m++; newval++; break;
×
1923
                                                                }
1924
                                                                m++; newval++;
8,000✔
1925
                                                        }
1926
                                                        if ( n < 0 && *m == 0 ) return(0);
80✔
1927
                                                }
1928
                                        }
1929
                                        AN.oldtype = *w; AN.oldvalue = w[3]; goto NoMatch;
×
1930
                                }
1931
                                m++; w += w[1];
11,358,390✔
1932
                        } while ( --n > 0 );
11,358,390✔
1933
                        break;
1934
                case ARLTOARL :
×
1935
                        do {
×
1936
                                if ( w[2] == oldnumber && *w == ARGTOARG ) {
×
1937
                                        WORD **a;
×
1938
                                        if ( !*m ) return(0);                /* nihil obstat */
×
1939
                                        m = C->rhs[w[3]];
×
1940
                                        i = newnumber;
×
1941
                                        a = (WORD **)newval;
×
1942
                                        if ( *m != 0 ) {        /* Tensor field */
×
1943
                                                if ( *m == i ) {
×
1944
                                                        m++;
×
1945
                                                        while ( --i >= 0 ) {
×
1946
                                                                s = *a++;
×
1947
                                                                if ( *m != s[1]
×
1948
                                                                || ( *s != -VECTOR
×
1949
                                                                  && *s != -INDEX
×
1950
                                                                  && *s != -SNUMBER ) ) break;
×
1951
                                                                m++;
×
1952
                                                        }
1953
                                                        if ( i < 0 ) return(0);
×
1954
                                                }
1955
                                        }
1956
                                        else {
1957
                                                m++;
×
1958
                                                while ( --i >= 0 ) {
×
1959
                                                        s = *a++;
×
1960
                                                        if ( *s > 0 ) {
×
1961
                                                                n = *s;
1962
                                                                while ( --n >= 0 ) {
×
1963
                                                                        if ( *s != *m ) {
×
1964
                                                                                s++; m++; break;
×
1965
                                                                        }
1966
                                                                        s++; m++;
×
1967
                                                                }
1968
                                                                if ( n >= 0 ) break;
×
1969
                                                        }
1970
                                                        else if ( *s <= -FUNCTION ) {
×
1971
                                                                if ( *s != *m ) {
×
1972
                                                                        s++; m++; break;
×
1973
                                                                }
1974
                                                                s++; m++;
×
1975
                                                        }
1976
                                                        else {
1977
                                                                if ( *s != *m ) {
×
1978
                                                                        s++; m++; break;
×
1979
                                                                }
1980
                                                                s++; m++;
×
1981
                                                                if ( *s != *m ) {
×
1982
                                                                        s++; m++; break;
×
1983
                                                                }
1984
                                                                s++; m++;
×
1985
                                                        }
1986
                                                }
1987
                                                if ( i < 0 && *m == 0 ) return(0);
×
1988
                                        }
1989
                                        AN.oldtype = *w; AN.oldvalue = w[3]; goto NoMatch;
×
1990
                                }
1991
                                m++; w += w[1];
×
1992
                        } while ( --n > 0 );
×
1993
                        break;
1994
                case VECTOSUB :
×
1995
                case INDTOSUB :
1996
/*
1997
                        Now newval contains the pointer to the argument(s).
1998
*/
1999
                        {
2000
/*
2001
                                Search for vector or index nature. If not so: reject.
2002
*/
2003
                                WORD *ss, *sstop, *tt, *ttstop, count, jt;
×
2004
                                ss = newval;
×
2005
                                sstop = ss + *ss;
×
2006
                                ss += ARGHEAD;
×
2007
                                while ( ss < sstop ) {
×
2008
                                        tt = ss + *ss;
×
2009
                                        ttstop = tt - ABS(tt[-1]);
×
2010
                                        ss++;
×
2011
                                        count = 0;
×
2012
                                        while ( ss < ttstop ) {
×
2013
                                                if ( *ss == INDEX ) {
×
2014
                                                        jt = ss[1] - 2; ss += 2;
×
2015
                                                        while ( --jt >= 0 ) {
×
2016
                                                                if ( *ss < MINSPEC ) count++;
×
2017
                                                                ss++;
×
2018
                                                        }
2019
                                                }
2020
                                                else ss += ss[1];
×
2021
                                        }
2022
                                        if ( count != 1 ) goto NoMatch;
×
2023
                                        ss = tt;
2024
                                }
2025
                        }
2026
                        do {
×
2027
                                if ( w[2] == oldnumber ) {
×
2028
                                        old2 = *w;
×
2029
                                        if ( ( type == VECTOSUB && ( *w == VECTOVEC || *w == VECTOMIN ) )
×
2030
                                        || ( type == INDTOSUB && *w == INDTOIND ) ) {
×
2031
                                                if ( !*m ) goto TestSet;
×
2032
                                                AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
×
2033
                                        }
2034
                                        else if ( *w == type ) {
×
2035
                                                if ( !*m ) goto TestSet;
×
2036
                                                if ( type != INDTOIND && type != INDTOSUB ) {        /* Prevent double index */
×
2037
                                                        n = *newval - 2;
×
2038
                                                        newval += 2;
×
2039
                                                        m = C->rhs[w[3]];
×
2040
                                                        if ( (C->rhs[w[3]+1] - m - 1) == n ) {
×
2041
                                                                while ( n > 0 ) {
×
2042
                                                                        if ( *m != *newval ) {
×
2043
                                                                                m++; newval++; break;
×
2044
                                                                        }
2045
                                                                        m++; newval++;
×
2046
                                                                        n--;
×
2047
                                                                }
2048
                                                                if ( n <= 0 ) return(0);
×
2049
                                                        }
2050
                                                }
2051
                                                AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
×
2052
                                        }
2053
                                }
2054
                                m++; w += w[1];
×
2055
                        } while ( --n > 0 );
×
2056
                        break;
2057
                default :
7,567,040✔
2058
                        *newval = newnumber;
7,567,040✔
2059
                        do {
7,571,520✔
2060
                                if ( w[2] == oldnumber ) {
7,571,520✔
2061
                                        if ( *w == type ) {
7,567,040✔
2062
                                                old2 = *w;
7,567,000✔
2063
                                                if ( !*m ) goto TestSet;
7,567,000✔
2064
                                                if ( newnumber >= 0 && (w+4) < AN.WildStop &&
3,780,908✔
2065
                                                        ( w[4] == FROMSET || w[4] == SETTONUM )
432✔
2066
                                                        && w[7] >= 0 ) goto TestSet;
×
2067
                                                if ( newnumber < 0 && *w == VECTOVEC
3,780,908✔
2068
                                                        && (w+4) < AN.WildStop && ( w[4] == FROMSET
3,780,476✔
2069
                                                        || w[4] == SETTONUM ) && w[7] >= 0 ) goto TestSet;
3,780,100✔
2070
/*
2071
                                                The next statement kills multiple indices -> vector
2072
*/
2073
                                                if ( *w == INDTOIND && w[3] < 0 ) goto NoMatch;
3,780,908✔
2074
                                                if ( w[3] == newnumber ) {
3,780,908✔
2075
                                                        if ( *w != FUNTOFUN || newnumber < FUNCTION
5,064✔
2076
                                                        || functions[newnumber-FUNCTION].spec ==
188✔
2077
                                                        functions[oldnumber-FUNCTION].spec )
188✔
2078
                                                                return(0);
2079
                                                }
2080
                                                AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
3,775,844✔
2081
                                        }
2082
                                        else if ( ( type == VECTOVEC &&
28✔
2083
                                                        ( *w == VECTOSUB || *w == VECTOMIN ) )
×
2084
                                               || ( type == INDTOIND && *w == INDTOSUB ) ) {
28✔
2085
                                                if ( *m ) goto NoMatch;
×
2086
                                                old2 = *w;
×
2087
                                                goto TestSet;
×
2088
                                        }
2089
                                        else if ( type == VECTOMIN &&
28✔
2090
                                                        ( *w == VECTOSUB || *w == VECTOVEC ) ) {
28✔
2091
                                                if ( *m ) goto NoMatch;
28✔
2092
                                                old2 = *w;
28✔
2093
                                                goto TestSet;
28✔
2094
                                        }
2095
                                }
2096
                                m++; w += w[1];
4,476✔
2097
                                if ( n > 1 && ( *w == FROMSET
4,476✔
2098
                                || *w == SETTONUM ) ) { n--; m++; w += w[1]; }
4,476✔
2099
                        } while ( --n > 0 );
4,476✔
2100
                        break;
2101
        }
2102
        AN.oldtype = -1;
×
2103
        AN.oldvalue = -1;
×
2104
        AN.WildReserve = 0;
×
2105
        MLOCK(ErrorMessageLock);
×
2106
        MesPrint("Inconsistency in Wildcard prototype.");
×
2107
        MUNLOCK(ErrorMessageLock);
×
2108
        return(-1);
2109
NoMatch:
3,810,800✔
2110
        AN.WildReserve = 0;
3,810,800✔
2111
        return(1+retblock);
3,810,800✔
2112
/*
2113
        Here we test the compatibility with a set specification.
2114
*/ 
2115
TestSet:
5,172,310✔
2116
        dirty = *m;
5,172,310✔
2117
        oldval = w[3];
5,172,310✔
2118
        w += w[1];
5,172,310✔
2119
        if ( w < AN.WildStop && ( *w == FROMSET || *w == SETTONUM ) ) {
5,172,310✔
2120
                WORD k;
109,400✔
2121
                s = w;                                                        
109,400✔
2122
                j = w[2]; n2 = w[3];
109,400✔
2123
/*
2124
                        if SETTONUM:  x?j[n2]
2125
                        if FROMSET:   x?j?n2    or x?j and n2 = -WOLDOFFSET.
2126
*/
2127
                if ( j > WILDOFFSET ) {
109,400✔
2128
                        j -= 2*WILDOFFSET;
280✔
2129
                        notflag = 1;
280✔
2130
/*
2131
                ???????
2132
*/
2133
                        AN.oldtype = -1;
280✔
2134
                        AN.oldvalue = -1;
280✔
2135
                }
2136
                if ( j < AM.NumFixedSets ) {        /* special set */
109,400✔
2137
                        retblock = 1;
108,056✔
2138
                        switch ( j ) {
108,056✔
2139
                                case POS_:
94,088✔
2140
                                        if ( type != SYMTONUM ||
94,088✔
2141
                                        newnumber <= 0 ) goto NoMnot;
94,088✔
2142
                                        break;
2143
                                case POS0_:
104✔
2144
                                        if ( type != SYMTONUM ||
104✔
2145
                                        newnumber < 0 ) goto NoMnot;
104✔
2146
                                        break;
2147
                                case NEG_:
1,308✔
2148
                                        if ( type != SYMTONUM ||
1,308✔
2149
                                        newnumber >= 0 ) goto NoMnot;
1,308✔
2150
                                        break;
2151
                                case NEG0_:
4,428✔
2152
                                        if ( type != SYMTONUM ||
4,428✔
2153
                                        newnumber > 0 ) goto NoMnot;
4,428✔
2154
                                        break;
2155
                                case EVEN_:
×
2156
                                        if ( type != SYMTONUM ||
×
2157
                                        ( newnumber & 1 ) != 0 ) goto NoMnot;
×
2158
                                        break;
2159
                                case ODD_:
×
2160
                                        if ( type != SYMTONUM ||
×
2161
                                        ( newnumber & 1 ) == 0 ) goto NoMnot;
×
2162
                                        break;
2163
                                case Z_:
128✔
2164
                                        if ( type != SYMTONUM ) goto NoMnot;
128✔
2165
                                        break;
2166
                                case SYMBOL_:
×
2167
                                        if ( type != SYMTOSYM ) goto NoMnot;
×
2168
                                        break;
2169
                                case FIXED_:
×
2170
                                        if ( type != INDTOIND ||
×
2171
                                        newnumber >= AM.OffsetIndex ||
×
2172
                                        newnumber < 0 ) goto NoMnot;
×
2173
                                        break;
2174
                                case INDEX_:
×
2175
                                        if ( type != INDTOIND ||
×
2176
                                        newnumber < 0 ) goto NoMnot;
×
2177
                                        break;
2178
                                case Q_:
7,984✔
2179
                                        if ( type == SYMTONUM ) break;
7,984✔
2180
                                        if ( type == SYMTOSUB ) {
7,804✔
2181
                                                WORD *ss, *sstop;
3,052✔
2182
                                                ss = newval;
3,052✔
2183
                                                sstop = ss + *ss;
3,052✔
2184
                                                ss += ARGHEAD;
3,052✔
2185
                                                if ( ss >= sstop ) break;
3,052✔
2186
                                                if ( ss + *ss < sstop ) goto NoMnot;
3,052✔
2187
                                                if ( ABS(sstop[-1]) == ss[0]-1 ) break;
×
2188
                                        }
2189
                                        goto NoMnot;
4,752✔
2190
                                case DUMMYINDEX_:
×
2191
                                        if ( type != INDTOIND ||
×
2192
                                        newnumber < AM.IndDum || newnumber >= AM.IndDum+MAXDUMMIES ) goto NoMnot;
×
2193
                                        break;
2194
                                case VECTOR_:
16✔
2195
                                        if ( type != VECTOVEC ) goto NoMnot;
16✔
2196
                                        break;
2197
                                default:
×
2198
                                        goto NoMnot;
×
2199
                        }
2200
Mnot:
180✔
2201
                        if ( notflag ) goto NoM;
74,364✔
2202
                        return(0);
2203
NoMnot:
34,572✔
2204
                        if ( !notflag ) goto NoM;
34,572✔
2205
                        return(0);
2206
                }
2207
                else if ( Sets[j].type == CRANGE ) {
1,344✔
2208
                        if ( ( type == SYMTONUM )
880✔
2209
                        || ( type == INDTOIND && ( newnumber > 0
×
2210
                         && newnumber <= AM.OffsetIndex ) ) ) {
×
2211
                                if ( Sets[j].first < MAXPOWER ) {
880✔
2212
                                        if ( newnumber >= Sets[j].first ) goto NoMnot;
×
2213
                                }
2214
                                else if ( Sets[j].first < 3*MAXPOWER ) {
880✔
2215
                                        if ( newnumber+2*MAXPOWER > Sets[j].first ) goto NoMnot;
×
2216
                                }
2217
                                if ( Sets[j].last > -MAXPOWER ) {
880✔
2218
                                        if ( newnumber <= Sets[j].last ) goto NoMnot;
880✔
2219
                                }
2220
                                else if ( Sets[j].last > -3*MAXPOWER ) {
×
2221
                                        if ( newnumber-2*MAXPOWER < Sets[j].last ) goto NoMnot;
×
2222
                                }
2223
                                goto Mnot;
356✔
2224
                        }
2225
                        goto NoMnot;
×
2226
                }
2227
/*
2228
                Now we have to determine which set element
2229
*/
2230
                w = SetElements + Sets[j].first;
464✔
2231
                m = SetElements + Sets[j].last;
464✔
2232
                if ( ( Sets[j].flags & ORDEREDSET ) == ORDEREDSET ) {
464✔
2233
/*
2234
                        We search first and ask questions later
2235
*/
2236
                        i = BinarySearch(w,Sets[j].last-Sets[j].first,newnumber);
×
2237
                        if ( i < 0 ) {        /* no matter what, it is not in the set. */
×
2238
                                goto NoMnot;
×
2239
                        }
2240
                        else {
2241
/*
2242
                                We can set the proper parameters now to make only the
2243
                                checks for the given set element.
2244
                                After that we jump into the appropriate loop.
2245
*/
2246
                                w = m = SetElements + i;
×
2247
                                i++;
×
2248
                                if ( Sets[j].type == -1 || Sets[j].type == CNUMBER ) {
×
2249
                                        goto insideloop1;
×
2250
                                }
2251
                                else {
2252
                                        goto insideloop2;
×
2253
                                }
2254
                        }
2255
                }
2256
                i = 1;
464✔
2257
                if ( Sets[j].type == -1 || Sets[j].type == CNUMBER ) {
464✔
2258
                  do {
104✔
2259
                        insideloop1:
84✔
2260
                        if ( notflag ) {
104✔
2261
                                switch ( type ) {
104✔
2262
                                        case SYMTOSYM:
×
2263
                                                if ( Sets[j].type == CNUMBER ) {}
×
2264
                                                else {
2265
                                                        if ( *w == newnumber ) goto NoMatch;
×
2266
                                                }
2267
                                                break;
2268
                                        case SYMTONUM:
104✔
2269
                                        case INDTOIND:
2270
                                                if ( *w == newnumber ) goto NoMatch;
104✔
2271
                                                break;
2272
                                        default:
2273
                                                break;
2274
                                }
2275
                        }
2276
                        else if ( type != SYMTONUM && type != INDTOIND
×
2277
                        && type != SYMTOSYM ) goto NoMatch;
×
2278
                        else if ( type == SYMTOSYM && Sets[j].type == CNUMBER ) goto NoMatch;
×
2279
                        else if ( *w == newnumber ) {
×
2280
                                if ( *s == SETTONUM ) {
×
2281
                                        if ( n2 == oldnumber && type
×
2282
                                        <= SYMTOSUB ) goto NoMatch;
×
2283
                                        m = AT.WildMask;
×
2284
                                        w = AN.WildValue;
×
2285
                                        n = AN.NumWild;
×
2286
                                        while ( --n >= 0 ) {
×
2287
                                                if ( w[2] == n2 && *w <= SYMTOSUB ) {
×
2288
                                                        if ( !*m ) {
×
2289
                                                                *w = SYMTONUM;
×
2290
                                                                w[3] = i;
×
2291
                                                                AN.WildReserve = 1;
×
2292
                                                                return(0);
×
2293
                                                        }
2294
                                                        if ( *w != SYMTONUM )
×
2295
                                                                goto NoMatch;
×
2296
                                                        if ( w[3] == i ) return(0);
×
2297
                                                        i = w[3];
×
2298
                                                        j = (SetElements + Sets[j].first)[i];
×
2299
                                                        if ( j == n2 ) return(0);
×
2300
                                                        goto NoMatch;
×
2301
                                                }
2302
                                                m++; w += w[1];
×
2303
                                        }
2304
                                }
2305
                                else if ( n2 >= 0 ) {
×
2306
                                        *newval = *(w - Sets[j].first + Sets[n2].first);
×
2307
                                        if ( *newval > MAXPOWER ) *newval -= 2*MAXPOWER;
×
2308
                                        if ( dirty && *newval != oldval ) {
×
2309
                                                *newval = oldval; goto NoMatch;
×
2310
                                        }
2311
                                }
2312
                                return(0);
×
2313
                        }
2314
                        i++;
104✔
2315
                  } while ( ++w < m );
104✔
2316
                }
2317
                else {
2318
                  do {
1,764✔
2319
                        insideloop2:
380✔
2320
                        inset = *w;
1,764✔
2321
                        if ( notflag ) {
1,764✔
2322
                        switch ( type ) {
476✔
2323
                                case SYMTONUM:
460✔
2324
                                case SYMTOSYM:
2325
                                        if ( ( type == SYMTOSYM && *w == newnumber ) 
460✔
2326
                                        || ( type == SYMTONUM && *w-2*MAXPOWER == newnumber ) ) {
460✔
2327
                                                goto NoMatch;
144✔
2328
                                        }
2329
                                        /* fall through */
2330
                                case SYMTOSUB:
2331
                                        if ( *w < 0 ) {
316✔
2332
                                                WORD *mm = AT.WildMask, *mmm, *part;
8✔
2333
                                                WORD *ww = AN.WildValue;
8✔
2334
                                                WORD nn = AN.NumWild;
8✔
2335
                                                k = -*w;
8✔
2336
                                                while ( --nn >= 0 ) {
32✔
2337
                                                        if ( *mm && ww[2] == k && ww[0] == type ) {
28✔
2338
                                                                if ( type != SYMTOSUB ) {
4✔
2339
                                                                        if ( ww[3] == newnumber ) goto NoMatch;
4✔
2340
                                                                }
2341
                                                                else {
2342
                                                                        mmm = C->rhs[ww[3]];
×
2343
                                                                        nn = *newval-2;
×
2344
                                                                        part = newval+2;
×
2345
                                                                        if ( (C->rhs[ww[3]+1]-mmm-1) == nn ) {
×
2346
                                                                                while ( --nn >= 0 ) {
×
2347
                                                                                        if ( *mmm != *part ) {
×
2348
                                                                                                mmm++; part++; break;
×
2349
                                                                                        }
2350
                                                                                        mmm++; part++;
×
2351
                                                                                }
2352
                                                                                if ( nn < 0 ) goto NoMatch;
×
2353
                                                                        }
2354
                                                                }
2355
                                                                break;
2356
                                                        }
2357
                                                        mm++; ww += ww[1];
24✔
2358
                                                }
2359
                                        }
2360
                                        break;
2361
                                case VECTOMIN:
16✔
2362
                                        if ( type == VECTOMIN ) {
16✔
2363
                                                if ( inset >= AM.OffsetVector ) { i++; continue; }
16✔
2364
                                                inset += WILDMASK;
8✔
2365
                                        }
2366
                                        /* fall through */
2367
                                case VECTOVEC:
2368
                                        if ( inset == newnumber ) goto NoMatch;
8✔
2369
                                        /* fall through */
2370
                                case VECTOSUB:
2371
                                        if ( inset - WILDOFFSET >= AM.OffsetVector ) {
×
2372
                                                WORD *mm = AT.WildMask, *mmm, *part;
×
2373
                                                WORD *ww = AN.WildValue;
×
2374
                                                WORD nn = AN.NumWild;
×
2375
                                                k = inset - WILDOFFSET;
×
2376
                                                while ( --nn >= 0 ) {
×
2377
                                                        if ( *mm && ww[2] == k && ww[0] == type ) {
×
2378
                                                                if ( type == VECTOVEC ) {
×
2379
                                                                        if ( ww[3] == newnumber ) goto NoMatch;
×
2380
                                                                }
2381
                                                                else {
2382
                                                                        mmm = C->rhs[ww[3]];
×
2383
                                                                        nn = *newval-2;
×
2384
                                                                        part = newval+2;
×
2385
                                                                        if ( (C->rhs[ww[3]+1]-mmm-1) == nn ) {
×
2386
                                                                                while ( --nn >= 0 ) {
×
2387
                                                                                        if ( *mmm != *part ) {
×
2388
                                                                                                mmm++; part++; break;
×
2389
                                                                                        }
2390
                                                                                        mmm++; part++;
×
2391
                                                                                }
2392
                                                                                if ( nn < 0 ) goto NoMatch;
×
2393
                                                                        }
2394
                                                                }
2395
                                                                break;
2396
                                                        }
2397
                                                        mm++; ww += ww[1];
×
2398
                                                }
2399
                                        }
2400
                                        break;
2401
                                case INDTOIND:
×
2402
                                        if ( *w == newnumber ) goto NoMatch;
×
2403
                                        /* fall through */
2404
                                case INDTOSUB:
2405
                                        if ( *w - (WORD)WILDMASK >= AM.OffsetIndex ) {
×
2406
                                                WORD *mm = AT.WildMask, *mmm, *part;
×
2407
                                                WORD *ww = AN.WildValue;
×
2408
                                                WORD nn = AN.NumWild;
×
2409
                                                k = *w - WILDMASK;
×
2410
                                                while ( --nn >= 0 ) {
×
2411
                                                        if ( *mm && ww[2] == k && ww[0] == type ) {
×
2412
                                                                if ( type == INDTOIND ) {
×
2413
                                                                        if ( ww[3] == newnumber ) goto NoMatch;
×
2414
                                                                }
2415
                                                                else {
2416
                                                                        mmm = C->rhs[ww[3]];
×
2417
                                                                        nn = *newval-2;
×
2418
                                                                        part = newval+2;
×
2419
                                                                        if ( (C->rhs[ww[3]+1]-mmm-1) == nn ) {
×
2420
                                                                                while ( --nn >= 0 ) {
×
2421
                                                                                        if ( *mmm != *part ) {
×
2422
                                                                                                mmm++; part++; break;
×
2423
                                                                                        }
2424
                                                                                        mmm++; part++;
×
2425
                                                                                }
2426
                                                                                if ( nn < 0 ) goto NoMatch;
×
2427
                                                                        }
2428
                                                                }
2429
                                                                break;
2430
                                                        }
2431
                                                        mm++; ww += ww[1];
×
2432
                                                }
2433
                                        }
2434
                                        break;
2435
                                case FUNTOFUN:
×
2436
                                        if ( *w == newnumber ) goto NoMatch;
×
2437
                                        if ( ( type == FUNTOFUN &&
×
2438
                                        ( k = *w - WILDMASK ) > FUNCTION ) ) {
×
2439
                                                WORD *mm = AT.WildMask;
×
2440
                                                WORD *ww = AN.WildValue;
×
2441
                                                WORD nn = AN.NumWild;
×
2442
                                                while ( --nn >= 0 ) {
×
2443
                                                        if ( *mm && ww[2] == k && ww[0] == type ) {
×
2444
                                                                if ( ww[3] == newnumber ) goto NoMatch;
×
2445
                                                                break;
2446
                                                        }
2447
                                                        mm++; ww += ww[1];
×
2448
                                                }
2449
                                        }
2450
                                default:
2451
                                        break;
2452
                        }
2453
                        }
2454
                        else {
2455
                          if ( type == VECTOMIN ) {
1,288✔
2456
                                if ( inset >= AM.OffsetVector ) { i++; continue; }
12✔
2457
                                inset += WILDMASK;
8✔
2458
                          }
2459
                          if ( ( inset == newnumber && type != SYMTONUM ) ||
1,284✔
2460
                          ( type == SYMTONUM && inset-2*MAXPOWER == newnumber ) ) {
×
2461
                                if ( *s == SETTONUM ) {
100✔
2462
                                        if ( n2 == oldnumber && type
12✔
2463
                                        <= SYMTOSUB ) goto NoMatch;
12✔
2464
                                        m = AT.WildMask;
12✔
2465
                                        w = AN.WildValue;
12✔
2466
                                        n = AN.NumWild;
12✔
2467
                                        while ( --n >= 0 ) {
36✔
2468
                                                if ( w[2] == n2 && *w <= SYMTOSUB ) {
36✔
2469
                                                        if ( !*m ) {
12✔
2470
                                                                *w = SYMTONUM;
12✔
2471
                                                                w[3] = i;
12✔
2472
                                                                AN.WildReserve = 1;
12✔
2473
                                                                return(0);
12✔
2474
                                                        }
2475
                                                        if ( *w != SYMTONUM )
×
2476
                                                                goto NoMatch;
×
2477
                                                        if ( w[3] == i ) return(0);
×
2478
                                                        i = w[3];
×
2479
                                                        j = (SetElements + Sets[j].first)[i];
×
2480
                                                        if ( j == n2 ) return(0);
×
2481
                                                        goto NoMatch;
×
2482
                                                }
2483
                                                m++; w += w[1];
24✔
2484
                                        }
2485
                                }
2486
                                else if ( n2 >= 0 ) {
88✔
2487
                                        *newval = *(w - Sets[j].first + Sets[n2].first);
×
2488
                                        if ( *newval > MAXPOWER ) *newval -= 2*MAXPOWER;
×
2489
                                        if ( dirty && *newval != oldval ) {
×
2490
                                                *newval = oldval; goto NoMatch;
×
2491
                                        }
2492
                                }
2493
                                return(0);
88✔
2494
                          }
2495
                        }
2496
                        i++;
1,500✔
2497
                  } while ( ++w < m );
1,512✔
2498
                }
2499
                if ( notflag ) return(0);
212✔
2500
                AN.oldtype = old2; AN.oldvalue = oldval; goto NoMatch;
84✔
2501
        }
2502
        else { return(0); }
2503

2504
NoM:
34,584✔
2505
        AN.oldtype = old2; AN.oldvalue = w[3]; goto NoMatch;
34,584✔
2506
}
2507

2508
/*
2509
                 #] CheckWild : 
2510
         #] Wildcards :
2511
          #[ DenToFunction :
2512

2513
        Renames the denominator function into a function with the given number.
2514
        For the syntax see   Denominators,function;
2515
*/
2516

2517
int DenToFunction(WORD *term, WORD numfun)
96✔
2518
{
2519
        int action = 0;
96✔
2520
        WORD *t, *tstop, *tnext, *arg, *argstop, *targ;
96✔
2521
        t = term+1;
96✔
2522
        tstop = term + *term; tstop -= ABS(tstop[-1]);
96✔
2523
        while ( t < tstop ) {
152✔
2524
                if ( *t == DENOMINATOR ) {
56✔
2525
                        *t = numfun; t[2] |= DIRTYFLAG; action = 1;
40✔
2526
                }
2527
                tnext = t + t[1];
56✔
2528
                if ( *t >= FUNCTION && functions[*t-FUNCTION].spec <= 0 ) {
56✔
2529
                        arg = t + FUNHEAD;
40✔
2530
                        while ( arg < tnext ) {
80✔
2531
                                if ( *arg > 0 ) {
40✔
2532
                                        targ = arg + ARGHEAD; argstop = arg + *arg;
40✔
2533
                                        while ( targ < argstop ) {
120✔
2534
                                                if ( DenToFunction(targ,numfun) ) {
80✔
2535
                                                        arg[1] |= DIRTYFLAG; t[2] |= DIRTYFLAG; action = 1;
24✔
2536
                                                }
2537
                                                targ += *targ;
80✔
2538
                                        }
2539
                                        arg = argstop;
2540
                                }
2541
                                else if ( *arg <= -FUNCTION ) arg++;
×
2542
                                else arg += 2;
×
2543
                        }
2544
                }
2545
                t = tnext;
2546
        }
2547
        return(action);
96✔
2548
}
2549

2550
/*
2551
          #] DenToFunction : 
2552
*/
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc