• 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

56.51
/sources/sch.c
1
/** @file sch.c
2
 * 
3
 *  Contains the functions that deal with the writing of expressions/terms
4
 *        in a textual representation. (Dutch schrijven = to write)
5
 */
6
/* #[ License : */
7
/*
8
 *   Copyright (C) 1984-2023 J.A.M. Vermaseren
9
 *   When using this file you are requested to refer to the publication
10
 *   J.A.M.Vermaseren "New features of FORM" math-ph/0010025
11
 *   This is considered a matter of courtesy as the development was paid
12
 *   for by FOM the Dutch physics granting agency and we would like to
13
 *   be able to track its scientific use to convince FOM of its value
14
 *   for the community.
15
 *
16
 *   This file is part of FORM.
17
 *
18
 *   FORM is free software: you can redistribute it and/or modify it under the
19
 *   terms of the GNU General Public License as published by the Free Software
20
 *   Foundation, either version 3 of the License, or (at your option) any later
21
 *   version.
22
 *
23
 *   FORM is distributed in the hope that it will be useful, but WITHOUT ANY
24
 *   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
25
 *   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
26
 *   details.
27
 *
28
 *   You should have received a copy of the GNU General Public License along
29
 *   with FORM.  If not, see <http://www.gnu.org/licenses/>.
30
 */
31
/* #] License : */ 
32
/*
33
          #[ Includes : sch.c
34
*/
35

36
#include "form3.h"
37

38
#ifdef ANSI
39
#include <stdarg.h>
40
#else
41
#ifdef mBSD
42
#include <varargs.h>
43
#else
44
#ifdef VMS
45
#include <varargs.h>
46
#else
47
typedef UBYTE *va_list;
48
#define va_dcl int va_alist;
49
#define va_start(list) list = (UBYTE *) &va_alist
50
#define va_end(list)
51
#define va_arg(list,mode) (((mode *)(list += sizeof(mode)))[-1])
52
#endif
53
#endif
54
#endif
55

56
static int startinline = 0;
57
static char fcontchar = '&';
58
static int noextralinefeed = 0;
59
static int lowestlevel = 1;
60

61
/*
62
          #] Includes : 
63
         #[ schryf-Utilities :
64
                 #[ StrCopy :                        UBYTE *StrCopy(from,to)
65
*/
66

67
UBYTE *StrCopy(UBYTE *from, UBYTE *to)
53,306✔
68
{
69
        while( ( *to++ = *from++ ) != 0 );
163,027✔
70
        return(to-1);
53,306✔
71
}
72

73
/*
74
                 #] StrCopy : 
75
                 #[ AddToLine :                        VOID AddToLine(s)
76

77
        Puts the characters of s in the outputline. If the line becomes
78
        filled it is written.
79

80
*/
81

82
VOID AddToLine(UBYTE *s)
2,688✔
83
{
84
        UBYTE *Out;
2,688✔
85
        LONG num;
2,688✔
86
        int i;
2,688✔
87
        if ( AO.OutInBuffer ) { AddToDollarBuffer(s); return; }
2,688✔
88
        Out = AO.OutFill;
2,688✔
89
        while ( *s ) {
15,768✔
90
                if ( Out >= AO.OutStop ) {
13,080✔
91
                        if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
×
92
                                *Out++ = fcontchar;
×
93
                        }
94
#ifdef WITHRETURN
95
                        *Out++ = CARRIAGERETURN;
96
#endif
97
                        *Out++ = LINEFEED;
×
98
                        AO.FortFirst = 0;
×
99
                        num = Out - AO.OutputLine;
×
100
 
101
                        if ( AC.LogHandle >= 0 ) {
×
102
                                if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline
×
103
                                                                ,num-startinline) != (num-startinline) ) {
×
104
/*
105
                                        We cannot write to an otherwise open log file.
106
                                        The disk could be full of course.
107
*/
108
#ifdef DEBUGGER
109
                                        if ( BUG.logfileflag == 0 ) {
110
                                                fprintf(stderr,"Panic: Cannot write to log file! Disk full?\n");
111
                                                BUG.logfileflag = 1;
112
                                        }
113
                                        BUG.eflag = 1; BUG.printflag = 1;
114
#else
NEW
115
                                        TERMINATE(-1);
×
116
#endif
117
                                }
118
                        }
119

120
                        if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
×
121
#ifdef WITHRETURN
122
                                if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
123
                                        AO.OutputLine[num-2] = LINEFEED;
124
                                        num--;
125
                                }
126
#endif
127
                                if ( WriteFile(AM.StdOut,AO.OutputLine+startinline
×
128
                                                ,num-startinline) != (num-startinline) ) {
×
129
#ifdef DEBUGGER
130
                                        if ( BUG.stdoutflag == 0 ) {
131
                                                fprintf(stderr,"Panic: Cannot write to standard output!\n");
132
                                                BUG.stdoutflag = 1;
133
                                        }
134
                                        BUG.eflag = 1; BUG.printflag = 1;
135
#else
NEW
136
                                        TERMINATE(-1);
×
137
#endif
138
                                }
139
                        }
140
                        /* thomasr 23/04/09: A continuation line has been started.
141
                         * In Fortran90 we do not want a space after the initial
142
                         * '&' character otherwise we might end up with something
143
                         * like:
144
                         *    ...  2.&
145
                         *  & 0 ...
146
                         */
147
                        startinline = 0;
×
148
                        for ( i = 0; i < AO.OutSkip; i++ ) AO.OutputLine[i] = ' ';
×
149
                        Out = AO.OutputLine + AO.OutSkip;
×
150
                        if ( ( AC.OutputMode == FORTRANMODE
×
151
                         || AC.OutputMode == PFORTRANMODE ) && AO.OutSkip == 7 ) {
×
152
                                /* thomasr 23/04/09: fix leading blank in fortran90 mode */
153
                                if(AC.IsFortran90 == ISFORTRAN90) {
×
154
                                        Out[-1] = fcontchar;
×
155
                                }
156
                                else {
157
                                        Out[-2] = fcontchar;
×
158
                                        Out[-1] = ' ';
×
159
                                }
160
                        }
161
                        if ( AO.IsBracket ) { *Out++ = ' ';
×
162
                                if ( AC.OutputSpaces == NORMALFORMAT ) {
×
163
                                         *Out++ = ' '; *Out++ = ' '; }
×
164
                        }
165
                        *Out = '\0';
×
166
                        if ( AC.OutputMode == FORTRANMODE
×
167
                         || ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
×
168
                         || AC.OutputMode == PFORTRANMODE )
×
169
                                AO.InFbrack++;
×
170
                }
171
                *Out++ = *s++;
13,080✔
172
        }
173
        *Out = '\0';
2,688✔
174
        AO.OutFill = Out;
2,688✔
175
}
176

177
/*
178
                 #] AddToLine : 
179
                 #[ FiniLine :                        VOID FiniLine()
180
*/
181

182
VOID FiniLine(VOID)
12,575✔
183
{
184
        UBYTE *Out;
12,575✔
185
        WORD i;
12,575✔
186
        LONG num;
12,575✔
187
        if ( AO.OutInBuffer ) return;
12,575✔
188
        Out = AO.OutFill;
12,575✔
189
        while ( Out > AO.OutputLine ) {
20,718✔
190
                if ( Out[-1] == ' ' ) Out--;
17,072✔
191
                else break;
192
        }
193
        i = (WORD)(Out-AO.OutputLine);
12,575✔
194
        if ( noextralinefeed == 0 ) {
12,575✔
195
                if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90
12,519✔
196
                        && Out > AO.OutputLine ) {
197
/*
198
                        *Out++ = fcontchar;
199
*/
200
                }
12,519✔
201
#ifdef WITHRETURN
202
                *Out++ = CARRIAGERETURN;
203
#endif
204
                *Out++ = LINEFEED;
12,519✔
205
                AO.FortFirst = 0;
12,519✔
206
        }
207
        num = Out - AO.OutputLine;
12,575✔
208
 
209
        if ( AC.LogHandle >= 0 ) {
12,575✔
210
                if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline
440✔
211
                                ,num-startinline) != (num-startinline) ) {
440✔
212
#ifdef DEBUGGER
213
                        if ( BUG.logfileflag == 0 ) {
214
                                fprintf(stderr,"Panic: Cannot write to log file! Disk full?\n");
215
                                BUG.logfileflag = 1;
216
                        }
217
                        BUG.eflag = 1; BUG.printflag = 1;
218
#else
NEW
219
                        TERMINATE(-1);
×
220
#endif
221
                }
222
        }
223

224
        if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
12,575✔
225
#ifdef WITHRETURN
226
                if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
227
                        AO.OutputLine[num-2] = LINEFEED;
228
                        num--;
229
                }
230
#endif
231
                if ( WriteFile(AM.StdOut,AO.OutputLine+startinline,
12,135✔
232
                                num-startinline) != (num-startinline) ) {
12,135✔
233
#ifdef DEBUGGER
234
                        if ( BUG.stdoutflag == 0 ) {
235
                                fprintf(stderr,"Panic: Cannot write to standard output!\n");
236
                                BUG.stdoutflag = 1;
237
                        }
238
                        BUG.eflag = 1; BUG.printflag = 1;
239
#else
NEW
240
                        TERMINATE(-1);
×
241
#endif
242
                }
243
        }
244
        startinline = 0;
12,575✔
245
        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
12,575✔
246
                 || ( AC.OutputMode == CMODE && AO.FactorMode == 0 ) ) AO.InFbrack++;
12,575✔
247
        Out = AO.OutputLine;
12,575✔
248
        AO.OutStop = Out + AC.LineLength;
12,575✔
249
        i = AO.OutSkip;
12,575✔
250
        while ( --i >= 0 ) *Out++ = ' ';
61,228✔
251
        if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
12,575✔
252
         && AO.OutSkip == 7 ) {
300✔
253
                Out[-2] = fcontchar;
128✔
254
                Out[-1] = ' ';
128✔
255
        }
256
        AO.OutFill = Out;
12,575✔
257
}
258

259
/*
260
                 #] FiniLine : 
261
                 #[ IniLine :                        VOID IniLine(extrablank)
262

263
        Initializes the output line for the type of output
264

265
*/
266

267
VOID IniLine(WORD extrablank)
5,472✔
268
{
269
        UBYTE *Out;
5,472✔
270
        Out = AO.OutputLine;
5,472✔
271
        AO.OutStop = Out + AC.LineLength;
5,472✔
272
        *Out++ = ' ';
5,472✔
273
        *Out++ = ' ';
5,472✔
274
        *Out++ = ' ';
5,472✔
275
        *Out++ = ' ';
5,472✔
276
        *Out++ = ' ';
5,472✔
277
        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
5,472✔
278
                *Out++ = fcontchar;
68✔
279
                AO.OutSkip = 7;
68✔
280
        }
281
        else
282
                AO.OutSkip = 6;
5,404✔
283
        *Out++ = ' ';
5,472✔
284
        while ( extrablank > 0 ) {
5,472✔
285
                *Out++ = ' ';
×
286
                extrablank--;
×
287
        }
288
        AO.OutFill = Out;
5,472✔
289
}
5,472✔
290

291
/*
292
                 #] IniLine : 
293
                 #[ LongToLine :                        VOID LongToLine(a,na)
294

295
        Puts a Long integer in the output line. If it is only a single
296
        word long it is put in the line as a single token.
297
        The sign of a is ignored.
298

299
*/
300

301
static UBYTE *LLscratch = 0;
302

303
VOID LongToLine(UWORD *a, WORD na)
12,233✔
304
{
305
        UBYTE *OutScratch;
12,233✔
306
        if ( LLscratch == 0 ) {
12,233✔
307
                LLscratch = (UBYTE *)Malloc1(4*(AM.MaxTal*sizeof(WORD)+2)*sizeof(UBYTE),"LongToLine");
596✔
308
        }
309
        OutScratch = LLscratch;
12,233✔
310
        if ( na < 0 ) na = -na;
12,233✔
311
        if ( na > 1 ) {
12,233✔
312
                PrtLong(a,na,OutScratch);
1,839✔
313
                if ( AO.NoSpacesInNumbers || AC.OutputMode == REDUCEMODE ) {
1,839✔
314
                        AO.BlockSpaces = 1;
×
315
                        TokenToLine(OutScratch);
×
316
                        AO.BlockSpaces = 0;
×
317
                }
318
                else {
319
                        TokenToLine(OutScratch);
1,839✔
320
                }
321
        }
322
        else if ( !na ) TokenToLine((UBYTE *)"0");
10,394✔
323
        else TalToLine(*a);
10,394✔
324
}
12,233✔
325

326
/*
327
                 #] LongToLine : 
328
                 #[ RatToLine :                        VOID RatToLine(a,na)
329

330
        Puts a rational number in the output line. The sign is ignored.
331

332
*/
333

334
static UBYTE *RLscratch = 0;
335
static UWORD *RLscratE = 0;
336

337
VOID RatToLine(UWORD *a, WORD na)
11,577✔
338
{
339
        GETIDENTITY
5,880✔
340
        WORD adenom, anumer;
11,577✔
341
        if ( na < 0 ) na = -na;
11,577✔
342
        if ( AC.OutNumberType == RATIONALMODE ) {
11,577✔
343
/*
344
                We need some special provisions for the various Fortran modes.
345
                In PFORTRAN we use
346
                                one     if denom = numerator = 1
347
                                integer     if denom = 1
348
                                (one/integer) if numerator = 1
349
                                ((one*integer)/integer) in the general case
350
*/
351
                if ( AC.OutputMode == PFORTRANMODE ) {
11,577✔
352
                  UnPack(a,na,&adenom,&anumer);
×
353
                  if ( na == 1 && a[0] == 1 && a[1] == 1 ) {
×
354
                        AddToLine((UBYTE *)"one");
×
355
                        return;
×
356
                  }
357
                  if ( adenom == 1 && a[na] == 1 ) {
×
358
                        LongToLine(a,anumer);
×
359
                        if ( anumer > 1 ) {
×
360
                                if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
×
361
                                else { AddToLine((UBYTE *)".D0"); }
×
362
                        }
363
                  }
364
                  else if ( anumer == 1 && a[0] == 1 ) {
×
365
                        a += na;
×
366
                        AddToLine((UBYTE *)"(one/");
×
367
                        LongToLine(a,adenom);
×
368
                        if ( adenom > 1 ) {
×
369
                                if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
×
370
                                else { AddToLine((UBYTE *)".D0"); }
×
371
                        }
372
                        AddToLine((UBYTE *)")");
×
373
                  }
374
                  else {
375
                        if ( anumer > 1 || adenom > 1 ) {
×
376
                                LongToLine(a,anumer);
×
377
                                if ( anumer > 1 ) {
×
378
                                        if (  ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
×
379
                                        else { AddToLine((UBYTE *)".D0"); }
×
380
                                }
381
                                a += na;
×
382
                                AddToLine((UBYTE *)"/");
×
383
                                LongToLine(a,adenom);
×
384
                                if ( adenom > 1 ) {
×
385
                                        if (  ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
×
386
                                        else { AddToLine((UBYTE *)".D0"); }
×
387
                                }
388
                        }
389
                        else {
390
                                AddToLine((UBYTE *)"((one*");
×
391
                                LongToLine(a,anumer);
×
392
                                a += na;
×
393
                                AddToLine((UBYTE *)")/");
×
394
                                LongToLine(a,adenom);
×
395
                                AddToLine((UBYTE *)")");
×
396
                        }
397
                  }
398
                }
399
                else {
400
                  UnPack(a,na,&adenom,&anumer);
11,577✔
401
                  LongToLine(a,anumer);
11,577✔
402
                  a += na;
11,577✔
403
                  if ( anumer && !( adenom == 1 && *a == 1 ) ) {
11,577✔
404
                        if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
560✔
405
                                if ( AC.Fortran90Kind ) {
8✔
406
                                        AddToLine(AC.Fortran90Kind);
8✔
407
                                        AddToLine((UBYTE *)"/");
8✔
408
                                }
409
                                else {
410
                                        AddToLine((UBYTE *)"./");
×
411
                                }
412
                        }
413
                        else if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == CMODE ) {
552✔
414
                                if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0/"); }
52✔
415
                                else if ( ( AO.DoubleFlag & 1 ) == 1 ) { AddToLine((UBYTE *)".D0/"); }
36✔
416
                                else { AddToLine((UBYTE *)"./"); }
8✔
417
                        }
418
                        else AddToLine((UBYTE *)"/");
500✔
419
                        LongToLine(a,adenom);
560✔
420
                        if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
560✔
421
                                if ( AC.Fortran90Kind ) {
8✔
422
                                        AddToLine(AC.Fortran90Kind);
8✔
423
                                }
424
                                else {
425
                                        AddToLine((UBYTE *)".");
×
426
                                }
427
                        }
428
                        else if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == CMODE ) {
552✔
429
                                if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
52✔
430
                                else if ( ( AO.DoubleFlag & 1 ) == 1 ) { AddToLine((UBYTE *)".D0"); }
36✔
431
                                else { AddToLine((UBYTE *)"."); }
8✔
432
                        }
433
                  }
434
                  else if ( ( anumer > 1 || ( AO.DoubleFlag & 4 ) == 4 ) && ( AC.OutputMode == FORTRANMODE
11,017✔
435
                  || AC.OutputMode == CMODE ) ) {
1,687✔
436
                        if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
704✔
437
                                if ( AC.Fortran90Kind ) {
×
438
                                        AddToLine(AC.Fortran90Kind);
×
439
                                }
440
                                else {
441
                                        AddToLine((UBYTE *)".");
×
442
                                }
443
                        }
444
                        else if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
704✔
445
                        else if ( ( AO.DoubleFlag & 1 ) == 1 ) { AddToLine((UBYTE *)".D0"); }
700✔
446
                        else { AddToLine((UBYTE *)"."); }
696✔
447
                  }
448
                  else if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
10,313✔
449
                                if ( AC.Fortran90Kind ) {
4✔
450
                                        AddToLine(AC.Fortran90Kind);
4✔
451
                                }
452
                                else {
453
                                        AddToLine((UBYTE *)".");
×
454
                                }
455
                  }
456
                  else if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == CMODE )
10,309✔
457
                  && AO.DoubleFlag ) {
3,316✔
458
                        if ( anumer == 1 && adenom == 1 && a[0] == 1 &&
8✔
459
                                 ( AO.DoubleFlag & 4 ) == 0 ) {}
8✔
460
                        else if ( ( AO.DoubleFlag & 2 ) == 2 ) { AddToLine((UBYTE *)".Q0"); }
×
461
                        else if ( ( AO.DoubleFlag & 1 ) == 1 ) { AddToLine((UBYTE *)".D0"); }
×
462
                  }
463
                }
464
        }
465
        else {
466
/*
467
                This is the float mode
468
*/
469
                UBYTE *OutScratch;
×
470
                WORD exponent = 0, i, ndig, newl;
×
471
                UWORD *c, *den, b = 10, dig[10];
×
472
                UBYTE *o, *out, cc;
×
473
/*
474
                First we have to adjust the numerator and denominator
475
*/
476
                if ( RLscratch == 0 ) {
×
477
                        RLscratch = (UBYTE *)Malloc1(4*(AM.MaxTal+2)*sizeof(UBYTE),"RatToLine");
×
478
                        RLscratE = (UWORD *)Malloc1(2*(AM.MaxTal+2)*sizeof(UWORD),"RatToLine");
×
479
                }
480
                out = OutScratch = RLscratch;
×
481
                c = RLscratE; for ( i = 0; i < 2*na; i++ ) c[i] = a[i];
×
482
                UnPack(c,na,&adenom,&anumer);
×
483
                while ( BigLong(c,anumer,c+na,adenom) >= 0 ) {
×
484
                        Divvy(BHEAD c,&na,&b,1);
×
485
                        UnPack(c,na,&adenom,&anumer);
×
486
                        exponent++;
×
487
                }                
488
                while ( BigLong(c,anumer,c+na,adenom) < 0 ) {
×
489
                        Mully(BHEAD c,&na,&b,1);
×
490
                        UnPack(c,na,&adenom,&anumer);
×
491
                        exponent--;
×
492
                }                
493
/*
494
                Now division will give a number between 1 and 9
495
*/
496
                den = c + na; i = 1;
×
497
                DivLong(c,anumer,den,adenom,dig,&ndig,c,&newl);
×
498
                *out++ = (UBYTE)(dig[0]+'0'); *out++ = '.';
×
499
                while ( newl && i < AC.OutNumberType ) {
×
500
                        Pack(c,&newl,den,adenom);
×
501
                        Mully(BHEAD c,&newl,&b,1);
×
502
                        na = newl;
×
503
                        UnPack(c,na,&adenom,&anumer);
×
504
                        den = c + na;
×
505
                        DivLong(c,anumer,den,adenom,dig,&ndig,c,&newl);
×
506
                        if ( ndig == 0 ) *out++ = '0';
×
507
                        else *out++ = (UBYTE)(dig[0]+'0');
×
508
                        i++;
×
509
                }
510
                *out++ = 'E';
×
511
                if ( exponent < 0 ) { exponent = -exponent; *out++ = '-'; }
×
512
                else { *out++ = '+'; }
×
513
                o = out;
×
514
                do {
×
515
                        *out++ = (UBYTE)((exponent % 10)+'0');
×
516
                        exponent /= 10;
×
517
                } while ( exponent );
×
518
                *out = 0; out--;
×
519
                while ( o < out ) { cc = *o; *o = *out; *out = cc; o++; out--; }
×
520
                TokenToLine(OutScratch);
×
521
        }
522
}
523

524
/*
525
                 #] RatToLine : 
526
                 #[ TalToLine :                        VOID TalToLine(x)
527

528
        Writes the unsigned number x to the output as a single token.
529
        Par indicates the number of leading blanks in the line.
530
        This parameter is needed here for the WriteLists routine.
531

532
*/
533

534
VOID TalToLine(UWORD x)
44,348✔
535
{
536
        UBYTE t[BITSINWORD/3+1];
44,348✔
537
        UBYTE *s;
44,348✔
538
        WORD i = 0, j;
44,348✔
539
        s = t;
44,348✔
540
        do { *s++ = (UBYTE)((x % 10)+'0'); i++; } while ( ( x /= 10 ) != 0 );
64,703✔
541
        *s-- = '\0';
44,348✔
542
        j = ( i - 1 ) >> 1;
44,348✔
543
        while ( j >= 0 ) {
90,295✔
544
                i = t[j]; t[j] = s[-j]; s[-j] = (UBYTE)i; j--;
45,947✔
545
        }
546
        TokenToLine(t);
44,348✔
547
}
44,348✔
548

549
/*
550
                 #] TalToLine : 
551
                 #[ TokenToLine :                VOID TokenToLine(s)
552

553
        Puts s in the output buffer. If it doesn't fit the buffer is
554
        flushed first. This routine keeps tokens as one unit.
555
        Par indicates the number of leading blanks in the line.
556
        This parameter is needed here for the WriteLists routine.
557

558
        Remark (27-oct-2007): i and j must be longer than WORD!
559
        It can happen that a number is so long that it has more than 2^15 or 2^31
560
        digits!
561
*/
562

563
VOID TokenToLine(UBYTE *s)
207,960✔
564
{
565
        UBYTE *t, *Out;
207,960✔
566
        LONG num, i = 0, j;
207,960✔
567
        if ( AO.OutInBuffer ) { AddToDollarBuffer(s); return; }
207,960✔
568
        t = s; Out = AO.OutFill;
204,286✔
569
        while ( *t++ ) i++;
682,195✔
570
        while ( i > 0 ) {
408,580✔
571
                if ( ( Out + i ) >= AO.OutStop && ( ( i < ((AC.LineLength-AO.OutSkip)>>1) )
204,294✔
572
                || ( (AO.OutStop-Out) < (i>>2) ) ) ) {
16✔
573
                        if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
4,145✔
574
                                *Out++ = fcontchar;
×
575
                        }
576
#ifdef WITHRETURN
577
                        *Out++ = CARRIAGERETURN;
578
#endif
579
                        *Out++ = LINEFEED;
4,145✔
580
                        AO.FortFirst = 0;
4,145✔
581
                        num = Out - AO.OutputLine; 
4,145✔
582
                        if ( AC.LogHandle >= 0 ) {
4,145✔
583
                                if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline,
1,376✔
584
                                        num-startinline) != (num-startinline) ) {
1,376✔
585
#ifdef DEBUGGER
586
                                        if ( BUG.logfileflag == 0 ) {
587
                                                fprintf(stderr,"Panic: Cannot write to log file! Disk full?\n");
588
                                                BUG.logfileflag = 1;
589
                                        }
590
                                        BUG.eflag = 1; BUG.printflag = 1;
591
#else
NEW
592
                                        TERMINATE(-1);
×
593
#endif
594
                                }
595
                        }
596
                        if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
4,145✔
597
#ifdef WITHRETURN
598
                                if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
599
                                        AO.OutputLine[num-2] = LINEFEED;
600
                                        num--;
601
                                }
602
#endif
603
                                if ( WriteFile(AM.StdOut,AO.OutputLine+startinline,
2,769✔
604
                                        num-startinline) != (num-startinline) ) {
2,769✔
605
#ifdef DEBUGGER
606
                                        if ( BUG.stdoutflag == 0 ) {
607
                                                fprintf(stderr,"Panic: Cannot write to standard output!\n");
608
                                                BUG.stdoutflag = 1;
609
                                        }
610
                                        BUG.eflag = 1; BUG.printflag = 1;
611
#else
NEW
612
                                        TERMINATE(-1);
×
613
#endif
614
                                }
615
                        }
616
                        startinline = 0;
4,145✔
617
                        Out = AO.OutputLine;
4,145✔
618
                        if ( AO.BlockSpaces == 0 ) {
4,145✔
619
                                for ( j = 0; j < AO.OutSkip; j++ ) { *Out++ = ' '; }
24,789✔
620
                                if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) ) {
4,145✔
621
                                  if ( AO.OutSkip == 7 ) {
832✔
622
                                        Out[-2] = fcontchar;
832✔
623
                                        Out[-1] = ' ';
832✔
624
                                  }
625
                                }
626
                        }
627
/*
628
                        Out = AO.OutputLine + AO.OutSkip;
629
                        if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
630
                         && AO.OutSkip == 7 ) {
631
                                Out[-2] = fcontchar;
632
                                Out[-1] = ' ';
633
                        }
634
                        else {
635
                                for ( j = 0; j < AO.OutSkip; j++ ) { AO.OutputLine[j] = ' '; }
636
                        }
637
*/
638
                        if ( AO.IsBracket ) { *Out++ = ' '; *Out++ = ' '; *Out++ = ' '; }
4,145✔
639
                        *Out = '\0';
4,145✔
640
                        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
4,145✔
641
                         || ( AC.OutputMode == CMODE && AO.FactorMode == 0 ) ) AO.InFbrack++;
4,145✔
642
                }
643
                if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
204,294✔
644
                                   /* Very long numbers */
645
                        if ( i > (WORD)(AO.OutStop-Out) ) j = (WORD)(AO.OutStop - Out);
26,756✔
646
                        else                                                   j = i;
26,756✔
647
                        i -= j;
26,756✔
648
                        NCOPYB(Out,s,j);
82,904✔
649
                }
650
                else {
651
                        if ( i > (WORD)(AO.OutStop-Out) ) j = (WORD)(AO.OutStop - Out - 1);
177,538✔
652
                        else                                                   j = i;
653
                        i -= j;
177,538✔
654
                        NCOPYB(Out,s,j);
599,299✔
655
                        if ( i > 0 ) *Out++ = '\\';
177,538✔
656
                }
657
        }
658
        *Out = '\0';
204,286✔
659
        AO.OutFill = Out;
204,286✔
660
}
661

662
/*
663
                 #] TokenToLine : 
664
                 #[ CodeToLine :                        VOID CodeToLine(name,number,mode)
665

666
        Writes a name and possibly its number to output as a single token.
667

668
*/
669

670
UBYTE *CodeToLine(WORD number, UBYTE *Out)
1,084✔
671
{
672
        Out = StrCopy((UBYTE *)"(",Out);
1,084✔
673
        Out = NumCopy(number,Out);
1,084✔
674
        Out = StrCopy((UBYTE *)")",Out);
1,084✔
675
        return(Out);
1,084✔
676
}
677

678
/*
679
                 #] CodeToLine : 
680
                 #[ MultiplyToLine :
681
*/
682

683
void MultiplyToLine(VOID)
26,661✔
684
{
685
        int i;
26,661✔
686
        if ( AO.CurrentDictionary > 0 && AO.CurDictSpecials > 0
26,661✔
687
         && AO.CurDictSpecials == DICT_DOSPECIALS ) {
128✔
688
                DICTIONARY *dict = AO.Dictionaries[AO.CurrentDictionary-1];
128✔
689
/*
690
                Find the star:
691
*/
692
                for ( i = 0; i < dict->numelements; i++ ) {
632✔
693
                        if ( dict->elements[i]->type != DICT_SPECIALCHARACTER ) continue;
512✔
694
                        if ( (UBYTE)dict->elements[i]->lhs[0] == (UBYTE)('*') ) {
8✔
695
                                TokenToLine((UBYTE *)(dict->elements[i]->rhs));
8✔
696
                                return;
8✔
697
                        }
698
                }
699
        }
700
        TokenToLine((UBYTE *)"*");
26,653✔
701
}
702

703
/*
704
                 #] MultiplyToLine : 
705
                 #[ AddArrayIndex :
706
*/
707

708
UBYTE *AddArrayIndex(WORD num,UBYTE *out)
248✔
709
{
710
        if ( AC.OutputMode == CMODE ) {
248✔
711
                out = StrCopy((UBYTE *)"[",out);
×
712
                out = NumCopy(num,out);
×
713
                out = StrCopy((UBYTE *)"]",out);
×
714
        }
715
        else {
716
                out = StrCopy((UBYTE *)"(",out);
248✔
717
                out = NumCopy(num,out);
248✔
718
                out = StrCopy((UBYTE *)")",out);
248✔
719
        }
720
        return(out);
248✔
721
}
722

723
/*
724
                 #] AddArrayIndex : 
725
                 #[ PrtTerms :                        VOID PrtTerms()
726
*/
727

728
VOID PrtTerms(VOID)
40✔
729
{
730
        UWORD a[2];
40✔
731
        WORD na;
40✔
732
        a[0] = (UWORD)AO.NumInBrack;
40✔
733
        a[1] = (UWORD)(AO.NumInBrack >> BITSINWORD);
40✔
734
        if ( a[1] ) na = 2;
40✔
735
        else na = 1;
40✔
736
        TokenToLine((UBYTE *)" ");
40✔
737
        LongToLine(a,na);
40✔
738
        if ( a[0] == 1 && na == 1 ) {
40✔
739
                TokenToLine((UBYTE *)" term");
16✔
740
        }
741
        else TokenToLine((UBYTE *)" terms");
24✔
742
        AO.NumInBrack = 0;
40✔
743
}
40✔
744

745
/*
746
                 #] PrtTerms : 
747
                 #[ WrtPower :
748
*/
749

750
UBYTE *WrtPower(UBYTE *Out, WORD Power)
20,389✔
751
{
752
        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
20,389✔
753
                 || AC.OutputMode == REDUCEMODE ) {
17,741✔
754
                *Out++ = '*'; *Out++ = '*';
2,652✔
755
        }
756
        else if ( AC.OutputMode == CMODE ) *Out++ = ',';
17,737✔
757
        else {
758
                UBYTE *Out1 = IsExponentSign();
16,041✔
759
                if ( Out1 == 0 ) *Out++ = '^';
16,041✔
760
                else {
761
                        while ( *Out1 ) *Out++ = *Out1++;
12✔
762
                        *Out = 0;
4✔
763
                }
764
        }
765
        if ( Power >= 0 ) {
20,389✔
766
                if ( Power < 2*MAXPOWER )
14,546✔
767
                        Out = NumCopy(Power,Out);
14,546✔
768
                else
769
                        Out = StrCopy(FindSymbol((WORD)((LONG)Power-2*MAXPOWER)),Out);
×
770
/*                        Out = StrCopy(VARNAME(symbols,(LONG)Power-2*MAXPOWER),Out); */
771
                if ( AC.OutputMode == CMODE ) *Out++ = ')';
14,546✔
772
                *Out = 0;
14,546✔
773
        }
774
        else {
775
                if ( ( AC.OutputMode >= FORTRANMODE || AC.OutputMode >= PFORTRANMODE
5,843✔
776
                 || AC.OutputMode >= REDUCEMODE ) && AC.OutputMode != CMODE )
5,843✔
777
                        *Out++ = '(';
20✔
778
                *Out++ = '-';
5,843✔
779
                if ( Power > -2*MAXPOWER )
5,843✔
780
                        Out = NumCopy(-Power,Out);
5,843✔
781
                else
782
                        Out = StrCopy(FindSymbol((WORD)((LONG)Power-2*MAXPOWER)),Out);
×
783
/*                        Out = StrCopy(VARNAME(symbols,(LONG)(-Power)-2*MAXPOWER),Out); */
784
                if ( AC.OutputMode >= FORTRANMODE || AC.OutputMode >= PFORTRANMODE
5,843✔
785
                 || AC.OutputMode >= REDUCEMODE) *Out++ = ')';
28✔
786
                *Out = 0;
5,843✔
787
        }
788
        return(Out);
20,389✔
789
}
790

791
/*
792
                 #] WrtPower : 
793
                 #[ PrintTime :
794
*/
795

796
void PrintTime(UBYTE *mess)
×
797
{
798
        LONG millitime = TimeCPU(1);
×
799
        WORD timepart = (WORD)(millitime%1000);
×
800
        millitime /= 1000;
×
801
        timepart /= 10;
×
802
        MesPrint("At %s: Time = %7l.%2i sec",mess,millitime,timepart);
×
803
}
×
804

805
/*
806
                 #] PrintTime : 
807
          #] schryf-Utilities : 
808
         #[ schryf-Writes :
809
                 #[ WriteLists :                        VOID WriteLists()
810

811
        Writes the namelists. If mode > 0 also the internal codes are given.
812

813
*/
814

815
static UBYTE *symname[] = {
816
         (UBYTE *)"(cyclic)",(UBYTE *)"(reversecyclic)"
817
        ,(UBYTE *)"(symmetric)",(UBYTE *)"(antisymmetric)" };
818
static UBYTE *rsymname[] = {
819
         (UBYTE *)"(-cyclic)",(UBYTE *)"(-reversecyclic)"
820
        ,(UBYTE *)"(-symmetric)",(UBYTE *)"(-antisymmetric)" };
821

822
VOID WriteLists(VOID)
16✔
823
{
824
        GETIDENTITY
8✔
825
        WORD i, j, k, *skip;
16✔
826
        int first, startvalue;
16✔
827
        UBYTE *OutScr, *Out;
16✔
828
        EXPRESSIONS e;
16✔
829
        CBUF *C = cbuf+AC.cbufnum;
16✔
830
        int olddict = AO.CurrentDictionary;
16✔
831
        skip = &AO.OutSkip;
16✔
832
        *skip = 0;
16✔
833
        AO.OutputLine = AO.OutFill = (UBYTE *)AT.WorkPointer;
16✔
834
        AO.CurrentDictionary = 0;
16✔
835
        FiniLine();
16✔
836
        OutScr = (UBYTE *)AT.WorkPointer + ( TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer) ) /2;
16✔
837
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
838
        else startvalue = FIRSTUSERSYMBOL;
8✔
839
/*
840
                 #[ Symbols :
841
*/
842
        if ( ( j = NumSymbols ) > startvalue ) {
16✔
843
                TokenToLine((UBYTE *)" Symbols");
8✔
844
                *skip = 3;
8✔
845
                FiniLine();
8✔
846
                for ( i = startvalue; i < j; i++ ) {
196✔
847
                        if ( i >= BUILTINSYMBOLS && i < FIRSTUSERSYMBOL ) continue;
180✔
848
                        Out = StrCopy(VARNAME(symbols,i),OutScr);
92✔
849
                        if ( symbols[i].minpower > -MAXPOWER || symbols[i].maxpower < MAXPOWER ) {
92✔
850
                                Out = StrCopy((UBYTE *)"(",Out);
×
851
                                if ( symbols[i].minpower > -MAXPOWER )
×
852
                                        Out = NumCopy(symbols[i].minpower,Out);
×
853
                                Out = StrCopy((UBYTE *)":",Out);
×
854
                                if ( symbols[i].maxpower < MAXPOWER )
×
855
                                        Out = NumCopy(symbols[i].maxpower,Out);
×
856
                                Out = StrCopy((UBYTE *)")",Out);
×
857
                        }
858
                        if ( ( symbols[i].complex & VARTYPEIMAGINARY ) == VARTYPEIMAGINARY ) {
92✔
859
                                Out = StrCopy((UBYTE *)"#i",Out);
8✔
860
                        }
861
                        else if ( ( symbols[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) {
84✔
862
                                Out = StrCopy((UBYTE *)"#c",Out);
×
863
                        }
864
                        else if ( ( symbols[i].complex & VARTYPEROOTOFUNITY ) == VARTYPEROOTOFUNITY ) {
84✔
865
                                Out = StrCopy((UBYTE *)"#",Out);
×
866
                                if ( ( symbols[i].complex & VARTYPEMINUS ) == VARTYPEMINUS ) {
×
867
                                        Out = StrCopy((UBYTE *)"-",Out);
×
868
                                }
869
                                else {
870
                                        Out = StrCopy((UBYTE *)"+",Out);
×
871
                                }
872
                                Out = NumCopy(symbols[i].maxpower,Out);
×
873
                        }
874
                        if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
92✔
875
                        if ( ( symbols[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) i++;
92✔
876
                        StrCopy((UBYTE *)" ",Out);
92✔
877
                        TokenToLine(OutScr);
92✔
878
                }
879
                *skip = 0;
8✔
880
                FiniLine();
8✔
881
        }
882
/*
883
                 #] Symbols : 
884
                 #[ Indices :
885
*/
886
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
887
        else startvalue = BUILTININDICES;
8✔
888
        if ( ( j = NumIndices ) > startvalue ) {
16✔
889
                TokenToLine((UBYTE *)" Indices");
8✔
890
                *skip = 3;
8✔
891
                FiniLine();
8✔
892
                for ( i = startvalue; i < j; i++ ) {
24✔
893
                        Out = StrCopy(FindIndex(i+AM.OffsetIndex),OutScr);
8✔
894
                        Out = StrCopy(VARNAME(indices,i),OutScr);
8✔
895
                        if ( indices[i].dimension >= 0 ) {
8✔
896
                                if ( indices[i].dimension != AC.lDefDim ) {
8✔
897
                                        Out = StrCopy((UBYTE *)"=",Out);
×
898
                                        Out = NumCopy(indices[i].dimension,Out);
×
899
                                }
900
                        }
901
                        else if ( indices[i].dimension < 0 ) {
×
902
                                Out = StrCopy((UBYTE *)"=",Out);
×
903
                                Out = StrCopy(VARNAME(symbols,-indices[i].dimension),Out);
×
904
                                if ( indices[i].nmin4 < -NMIN4SHIFT ) {
×
905
                                        Out = StrCopy((UBYTE *)":",Out);
×
906
                                        Out = StrCopy(VARNAME(symbols,-indices[i].nmin4-NMIN4SHIFT),Out);
×
907
                                }
908
                        }
909
                        if ( AC.CodesFlag ) Out = CodeToLine(i+AM.OffsetIndex,Out);
8✔
910
                        StrCopy((UBYTE *)" ",Out);
8✔
911
                        TokenToLine(OutScr);
8✔
912
                }
913
                *skip = 0;
8✔
914
                FiniLine();
8✔
915
        }
916
/*
917
                 #] Indices : 
918
                 #[ Vectors :
919
*/
920
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
921
        else startvalue = BUILTINVECTORS;
8✔
922
        if ( ( j = NumVectors ) > startvalue ) {
16✔
923
                TokenToLine((UBYTE *)" Vectors");
8✔
924
                *skip = 3;
8✔
925
                FiniLine();
8✔
926
                for ( i = startvalue; i < j; i++ ) {
24✔
927
                        Out = StrCopy(VARNAME(vectors,i),OutScr);
8✔
928
                        if ( AC.CodesFlag ) Out = CodeToLine(i+AM.OffsetVector,Out);
8✔
929
                        StrCopy((UBYTE *)" ",Out);
8✔
930
                        TokenToLine(OutScr);
8✔
931
                }
932
                *skip = 0;
8✔
933
                FiniLine();
8✔
934
        }
935
/*
936
                 #] Vectors : 
937
                 #[ Functions :
938
*/
939
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
940
        else startvalue = AM.NumFixedFunctions;
8✔
941
        for ( k = 0; k < 2; k++ ) {
48✔
942
                first = 1;
32✔
943
                j = NumFunctions;
32✔
944
                for ( i = startvalue; i < j; i++ ) {
2,512✔
945
                        if ( i > MAXBUILTINFUNCTION-FUNCTION
2,480✔
946
                         && i < FIRSTUSERFUNCTION-FUNCTION ) continue;
2,480✔
947
                        if ( ( k == 0 && functions[i].commute )
1,648✔
948
                        || ( k != 0 && !functions[i].commute ) ) {
1,480✔
949
                                if ( first ) {
832✔
950
                                        TokenToLine((UBYTE *)(FG.FunNam[k]));
16✔
951
                                        *skip = 3;
16✔
952
                                        FiniLine();
16✔
953
                                        first = 0;
16✔
954
                                }
955
                                Out = StrCopy(VARNAME(functions,i),OutScr);
832✔
956
                                if ( ( functions[i].complex & VARTYPEIMAGINARY ) == VARTYPEIMAGINARY ) {
832✔
957
                                        Out = StrCopy((UBYTE *)"#i",Out);
48✔
958
                                }
959
                                else if ( ( functions[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) {
784✔
960
                                        Out = StrCopy((UBYTE *)"#c",Out);
16✔
961
                                }
962
                                if ( functions[i].spec == VERTEXFUNCTION ) {
832✔
963
                                        Out = StrCopy((UBYTE *)"(Particle)",Out);
8✔
964
                                }
965
                                else if ( functions[i].spec >= TENSORFUNCTION ) {
824✔
966
                                        Out = StrCopy((UBYTE *)"(Tensor)",Out);
64✔
967
                                }
968
                                if ( functions[i].symmetric > 0 ) {
832✔
969
                                        if ( ( functions[i].symmetric & REVERSEORDER ) != 0 ) {
8✔
970
                                                Out = StrCopy((UBYTE *)(rsymname[(functions[i].symmetric & ~REVERSEORDER)-1]),Out);
×
971
                                        }
972
                                        else {
973
                                                Out = StrCopy((UBYTE *)(symname[functions[i].symmetric-1]),Out);
8✔
974
                                        }
975
                                }
976
                                if ( AC.CodesFlag ) Out = CodeToLine(i+FUNCTION,Out);
832✔
977
                                if ( ( functions[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) i++;
832✔
978
                                StrCopy((UBYTE *)" ",Out);
832✔
979
                                TokenToLine(OutScr);
832✔
980
                        }
981
                }
982
                *skip = 0;
32✔
983
                if ( first == 0 ) FiniLine();
32✔
984
        }
985
/*
986
                 #] Functions : 
987
                 #[ Sets :
988
*/
989
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
990
        else startvalue = AM.NumFixedSets;
8✔
991
        if ( ( j = AC.SetList.num ) > startvalue ) {
16✔
992
                WORD element, LastElement, type, number;
8✔
993
                TokenToLine((UBYTE *)" Sets");
8✔
994
                for ( i = startvalue; i < j; i++ ) {
128✔
995
                        *skip = 3;
112✔
996
                        FiniLine();
112✔
997
                        if ( Sets[i].name < 0 ) {
112✔
998
                                Out = StrCopy((UBYTE *)"{}",OutScr);
×
999
                        }
1000
                        else {
1001
                                Out = StrCopy(VARNAME(Sets,i),OutScr);
112✔
1002
                        }
1003
                        if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
112✔
1004
                        StrCopy((UBYTE *)":",Out);
112✔
1005
                        TokenToLine(OutScr);
112✔
1006
                        if ( i < AM.NumFixedSets ) {
112✔
1007
                                TokenToLine((UBYTE *)" ");
104✔
1008
                                TokenToLine((UBYTE *)fixedsets[i].description);
104✔
1009
                        }
1010
                        else if ( Sets[i].type == CRANGE ) {
8✔
1011
                                int iflag = 0;
×
1012
                                if ( Sets[i].first == 3*MAXPOWER ) {
×
1013
                                }
1014
                                else if ( Sets[i].first >= MAXPOWER ) {
×
1015
                                        TokenToLine((UBYTE *)"<=");
×
1016
                                        NumCopy(Sets[i].first-2*MAXPOWER,OutScr);
×
1017
                                        TokenToLine(OutScr);
×
1018
                                        iflag = 1;
×
1019
                                }
1020
                                else {
1021
                                        TokenToLine((UBYTE *)"<");
×
1022
                                        NumCopy(Sets[i].first,OutScr);
×
1023
                                        TokenToLine(OutScr);
×
1024
                                        iflag = 1;
×
1025
                                }
1026
                                if ( Sets[i].last == -3*MAXPOWER ) {
×
1027
                                }
1028
                                else if ( Sets[i].last <= -MAXPOWER ) {
×
1029
                                        if ( iflag ) TokenToLine((UBYTE *)",");
×
1030
                                        TokenToLine((UBYTE *)">=");
×
1031
                                        NumCopy(Sets[i].last+2*MAXPOWER,OutScr);
×
1032
                                        TokenToLine(OutScr);
×
1033
                                }
1034
                                else {
1035
                                        if ( iflag ) TokenToLine((UBYTE *)",");
×
1036
                                        TokenToLine((UBYTE *)">");
×
1037
                                        NumCopy(Sets[i].last,OutScr);
×
1038
                                        TokenToLine(OutScr);
×
1039
                                }
1040
                        }
1041
                        else {
1042
                                element = Sets[i].first;
8✔
1043
                                LastElement = Sets[i].last;
8✔
1044
                                type = Sets[i].type;
8✔
1045
                                while ( element < LastElement ) {
16✔
1046
                                        TokenToLine((UBYTE *)" ");
8✔
1047
                                        number = SetElements[element++];
8✔
1048
                                        switch ( type ) {
8✔
1049
                                                case CSYMBOL:
8✔
1050
                                                        if ( number < 0 ) {
8✔
1051
                                                                StrCopy(VARNAME(symbols,-number),OutScr);
×
1052
                                                                StrCopy((UBYTE *)"?",Out);
×
1053
                                                                TokenToLine(OutScr);
×
1054
                                                        }
1055
                                                        else if ( number < MAXPOWER )
8✔
1056
                                                                TokenToLine(VARNAME(symbols,number));
8✔
1057
                                                        else {
1058
                                                                NumCopy(number-2*MAXPOWER,OutScr);
×
1059
                                                                TokenToLine(OutScr);
×
1060
                                                        }
1061
                                                        break;
1062
                                                case CINDEX:
×
1063
                                                        if ( number >= AM.IndDum ) {
×
1064
                                                                Out = StrCopy((UBYTE *)"N",OutScr);
×
1065
                                                                Out = NumCopy(number-(AM.IndDum),Out);
×
1066
                                                                StrCopy((UBYTE *)"_?",Out);
×
1067
                                                                TokenToLine(OutScr);
×
1068
                                                        }
1069
                                                        else if ( number >= AM.OffsetIndex + (WORD)WILDMASK ) {
×
1070
                                                                Out = StrCopy(VARNAME(indices,number
×
1071
                                                                -AM.OffsetIndex-WILDMASK),OutScr);
1072
                                                                StrCopy((UBYTE *)"?",Out);
×
1073
                                                                TokenToLine(OutScr);
×
1074
                                                        }
1075
                                                        else if ( number >= AM.OffsetIndex ) {
×
1076
                                                                TokenToLine(VARNAME(indices,number-AM.OffsetIndex));
×
1077
                                                        }
1078
                                                        else {
1079
                                                                NumCopy(number,OutScr);
×
1080
                                                                TokenToLine(OutScr);
×
1081
                                                        }
1082
                                                        break;
1083
                                                case CVECTOR:
×
1084
                                                        Out = OutScr;
×
1085
                                                        if ( number < AM.OffsetVector ) {
×
1086
                                                                number += WILDMASK;
×
1087
                                                                Out = StrCopy((UBYTE *)"-",Out);
×
1088
                                                        }
1089
                                                        if ( number >= AM.OffsetVector + WILDOFFSET ) {
×
1090
                                                                Out = StrCopy(VARNAME(vectors,number
×
1091
                                                                -AM.OffsetVector-WILDOFFSET),Out);
1092
                                                                StrCopy((UBYTE *)"?",Out);
×
1093
                                                        }
1094
                                                        else {
1095
                                                                Out = StrCopy(VARNAME(vectors,number-AM.OffsetVector),Out);
×
1096
                                                        }
1097
                                                        TokenToLine(OutScr);
×
1098
                                                        break;
×
1099
                                                case CFUNCTION:
×
1100
                                                        if ( number >= FUNCTION + (WORD)WILDMASK ) {
×
1101
                                                                Out = StrCopy(VARNAME(functions,number
×
1102
                                                                -FUNCTION-WILDMASK),OutScr);
1103
                                                                StrCopy((UBYTE *)"?",Out);
×
1104
                                                                TokenToLine(OutScr);
×
1105
                                                        }
1106
                                                        TokenToLine(VARNAME(functions,number-FUNCTION));
×
1107
                                                        break;
×
1108
                                                default:
×
1109
                                                        NumCopy(number,OutScr);
×
1110
                                                        TokenToLine(OutScr);
×
1111
                                                        break;
×
1112
                                        }
1113
                                }
1114
                        }
1115
                }
1116
                *skip = 0;
8✔
1117
                FiniLine();
8✔
1118
        }
1119
/*
1120
                 #] Sets : 
1121
                 #[ Expressions :
1122
*/
1123
        if ( AS.ExecMode ) {
16✔
1124
                e = Expressions;
16✔
1125
                j = NumExpressions;
16✔
1126
                first = 1;
16✔
1127
                for ( i = 0; i < j; i++, e++ ) {
48✔
1128
                        if ( e->status >= 0 ) {
32✔
1129
                                if ( first ) {
32✔
1130
                                        TokenToLine((UBYTE *)" Expressions");
12✔
1131
                                        *skip = 3;
12✔
1132
                                        FiniLine();
12✔
1133
                                        first = 0;
12✔
1134
                                }
1135
                                Out = StrCopy(AC.exprnames->namebuffer+e->name,OutScr);
32✔
1136
                                Out = StrCopy((UBYTE *)(FG.ExprStat[e->status]),Out);
32✔
1137
                                if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
32✔
1138
                                StrCopy((UBYTE *)" ",Out);
32✔
1139
                                TokenToLine(OutScr);
32✔
1140
                        }
1141
                }
1142
                if ( !first ) {
16✔
1143
                        *skip = 0;
12✔
1144
                        FiniLine();
12✔
1145
                }
1146
        }
1147
        e = Expressions;
16✔
1148
        j = NumExpressions;
16✔
1149
        first = 1;
16✔
1150
        for ( i = 0; i < j; i++ ) {
48✔
1151
                if ( e->printflag && ( e->status == LOCALEXPRESSION ||
32✔
1152
                e->status == GLOBALEXPRESSION || e->status == UNHIDELEXPRESSION
×
1153
                || e->status == UNHIDEGEXPRESSION ) ) {
×
1154
                        if ( first ) {
8✔
1155
                                TokenToLine((UBYTE *)" Expressions to be printed");
8✔
1156
                                *skip = 3;
8✔
1157
                                FiniLine();
8✔
1158
                                first = 0;
8✔
1159
                        }
1160
                        Out = StrCopy(AC.exprnames->namebuffer+e->name,OutScr);
8✔
1161
                        StrCopy((UBYTE *)" ",Out);
8✔
1162
                        TokenToLine(OutScr);
8✔
1163
                }
1164
                e++;
32✔
1165
        }
1166
        if ( !first ) {
16✔
1167
                *skip = 0;
8✔
1168
                FiniLine();
8✔
1169
        }
1170
/*
1171
                 #] Expressions : 
1172
                 #[ Dollars :
1173
*/
1174

1175
        if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
16✔
1176
        else startvalue = BUILTINDOLLARS;
8✔
1177
        if ( ( j = NumDollars ) > startvalue ) {
16✔
1178
                TokenToLine((UBYTE *)" Dollar variables");
8✔
1179
                *skip = 3;
8✔
1180
                FiniLine();
8✔
1181
                for ( i = startvalue; i < j; i++ ) {
24✔
1182
                        Out = StrCopy((UBYTE *)"$", OutScr);
8✔
1183
                        Out = StrCopy(DOLLARNAME(Dollars, i), Out);
8✔
1184
                        if ( AC.CodesFlag ) Out = CodeToLine(i, Out);
8✔
1185
                        StrCopy((UBYTE *)" ", Out);
8✔
1186
                        TokenToLine(OutScr);
8✔
1187
                }
1188
                *skip = 0;
8✔
1189
                FiniLine();
8✔
1190
        }
1191

1192
        if ( ( j = NumPotModdollars ) > 0 ) {
16✔
1193
                TokenToLine((UBYTE *)" Dollar variables to be modified");
×
1194
                *skip = 3;
×
1195
                FiniLine();
×
1196
                for ( i = 0; i < j; i++ ) {
×
1197
                        Out = StrCopy((UBYTE *)"$", OutScr);
×
1198
                        Out = StrCopy(DOLLARNAME(Dollars, PotModdollars[i]), Out);
×
1199
                        for ( k = 0; k < NumModOptdollars; k++ )
×
1200
                                if ( ModOptdollars[k].number == PotModdollars[i] ) break;
×
1201
                        if ( k < NumModOptdollars ) {
×
1202
                                switch ( ModOptdollars[k].type ) {
×
1203
                                        case MODSUM:
×
1204
                                                Out = StrCopy((UBYTE *)"(sum)", Out);
×
1205
                                                break;
×
1206
                                        case MODMAX:
×
1207
                                                Out = StrCopy((UBYTE *)"(maximum)", Out);
×
1208
                                                break;
×
1209
                                        case MODMIN:
×
1210
                                                Out = StrCopy((UBYTE *)"(minimum)", Out);
×
1211
                                                break;
×
1212
                                        case MODLOCAL:
×
1213
                                                Out = StrCopy((UBYTE *)"(local)", Out);
×
1214
                                                break;
×
1215
                                        default:
×
1216
                                                Out = StrCopy((UBYTE *)"(?)", Out);
×
1217
                                                break;
×
1218
                                }
1219
                        }
×
1220
                        StrCopy((UBYTE *)" ", Out);
×
1221
                        TokenToLine(OutScr);
×
1222
                }
1223
                *skip = 0;
×
1224
                FiniLine();
×
1225
        }
1226
/*
1227
                 #] Dollars : 
1228
*/
1229

1230
        if ( AC.ncmod != 0 ) {
16✔
1231
                TokenToLine((UBYTE *)"All arithmetic is modulus ");
×
1232
                LongToLine((UWORD *)AC.cmod,ABS(AC.ncmod));
×
1233
                if ( AC.ncmod > 0 ) TokenToLine((UBYTE *)" with powerreduction");
×
1234
                else                         TokenToLine((UBYTE *)" without powerreduction");
×
1235
                if ( ( AC.modmode & POSNEG ) != 0 ) TokenToLine((UBYTE *)" centered around 0");
×
1236
                else                                TokenToLine((UBYTE *)" positive numbers only");
×
1237
                FiniLine();
×
1238
        }
1239
        if ( AC.lDefDim != 4 ) {
16✔
1240
                TokenToLine((UBYTE *)"The default dimension is ");
×
1241
                if ( AC.lDefDim >= 0 ) {
×
1242
                        NumCopy(AC.lDefDim,OutScr);
×
1243
                        TokenToLine(OutScr);
×
1244
                }
1245
                else {
1246
                        TokenToLine(VARNAME(symbols,-AC.lDefDim));
×
1247
                        if ( AC.lDefDim4 != -NMIN4SHIFT ) {
×
1248
                                TokenToLine((UBYTE *)":");
×
1249
                                if ( AC.lDefDim4 >= -NMIN4SHIFT ) {
×
1250
                                        NumCopy(AC.lDefDim4,OutScr);
×
1251
                                        TokenToLine(OutScr);
×
1252
                                }
1253
                                else {
1254
                                        TokenToLine(VARNAME(symbols,-AC.lDefDim4-NMIN4SHIFT));
×
1255
                                }
1256
                        }
1257
                }
1258
                FiniLine();
×
1259
        }
1260
        if ( AC.lUnitTrace != 4 ) {
16✔
1261
                TokenToLine((UBYTE *)"The trace of the unit matrix is ");
×
1262
                if ( AC.lUnitTrace >= 0 ) {
×
1263
                        NumCopy(AC.lUnitTrace,OutScr);
×
1264
                        TokenToLine(OutScr);
×
1265
                }
1266
                else {
1267
                        TokenToLine(VARNAME(symbols,-AC.lUnitTrace));
×
1268
                }
1269
                FiniLine();
×
1270
        }
1271
        if ( AO.NumDictionaries > 0 ) {
16✔
1272
                for ( i = 0; i < AO.NumDictionaries; i++ ) {
×
1273
                        WriteDictionary(AO.Dictionaries[i]);
×
1274
                }
1275
                if ( olddict > 0 )
×
1276
                        MesPrint("\nCurrently dictionary %s is active\n",
×
1277
                                AO.Dictionaries[olddict-1]->name);
×
1278
                else
1279
                        MesPrint("\nCurrently there is no active dictionary\n");
×
1280
        }
1281
        if ( AC.CodesFlag ) {
16✔
1282
                if ( C->numlhs > 0 ) {
8✔
1283
                        TokenToLine((UBYTE *)" Left Hand Sides:");
×
1284
                        AO.OutSkip = 3;
×
1285
                        for ( i = 1; i <= C->numlhs; i++ ) {
×
1286
                                FiniLine();
×
1287
                                skip = C->lhs[i];
×
1288
                                j = skip[1];
×
1289
                                while ( --j >= 0 ) { TalToLine((UWORD)(*skip++)); TokenToLine((UBYTE *)"  "); }
×
1290
                        }
1291
                        AO.OutSkip = 0;
×
1292
                        FiniLine();
×
1293
                }
1294
                if ( C->numrhs > 0 ) {
8✔
1295
                        TokenToLine((UBYTE *)" Right Hand Sides:");
×
1296
                        AO.OutSkip = 3;
×
1297
                        for ( i = 1; i <= C->numrhs; i++ ) {
×
1298
                                FiniLine();
×
1299
                                skip = C->rhs[i];
×
1300
                                while ( ( j = skip[0] ) != 0 ) {
×
1301
                                        while ( --j >= 0 ) { TalToLine((UWORD)(*skip++)); TokenToLine((UBYTE *)"  "); }
×
1302
                                }
1303
                                FiniLine();
×
1304
                        }
1305
                        AO.OutSkip = 0;
×
1306
                        FiniLine();
×
1307
                }
1308
        }
1309
        AO.CurrentDictionary = olddict;
16✔
1310
}
16✔
1311

1312
/*
1313
                 #] WriteLists : 
1314
                 #[ WriteDictionary :
1315

1316
        This routine is part of WriteLists and should be called from there.
1317
*/
1318

1319
void WriteDictionary(DICTIONARY *dict)
×
1320
{
1321
        GETIDENTITY
1322
        int i, first;
×
1323
        WORD *skip, na, *a, spec, *t, *tstop, j;
×
1324
        UBYTE str[2], *OutScr, *Out;
×
1325
        WORD oldoutputmode = AC.OutputMode, oldoutputspaces = AC.OutputSpaces;
×
1326
        WORD oldoutskip = AO.OutSkip;
×
1327
        AC.OutputMode = NORMALFORMAT;
×
1328
        AC.OutputSpaces = NOSPACEFORMAT;
×
1329
        MesPrint("===Contents of dictionary %s===",dict->name);
×
1330
        skip = &AO.OutSkip;
×
1331
        *skip = 3;
×
1332
        AO.OutputLine = AO.OutFill = (UBYTE *)AT.WorkPointer;
×
1333
        for ( j = 0; j < *skip; j++ ) *(AO.OutFill)++ = ' ';
×
1334

1335
        OutScr = (UBYTE *)AT.WorkPointer + ( TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer) ) /2;
×
1336
        for ( i = 0; i < dict->numelements; i++ ) {
×
1337
                switch ( dict->elements[i]->type ) {
×
1338
                        case DICT_INTEGERNUMBER:
×
1339
                                LongToLine((UWORD *)(dict->elements[i]->lhs),dict->elements[i]->size);
×
1340
                                Out = OutScr; *Out = 0;
×
1341
                                break;
×
1342
                        case DICT_RATIONALNUMBER:
×
1343
                                a = dict->elements[i]->lhs;
×
1344
                                na = a[a[0]-1]; na = (ABS(na)-1)/2;
×
1345
                                RatToLine((UWORD *)(a+1),na);
×
1346
                                Out = OutScr; *Out = 0;
×
1347
                                break;
×
1348
                        case DICT_SYMBOL:
×
1349
                                na = dict->elements[i]->lhs[0];
×
1350
                                Out = StrCopy(VARNAME(symbols,na),OutScr);
×
1351
                                break;
×
1352
                        case DICT_VECTOR:
×
1353
                                na = dict->elements[i]->lhs[0]-AM.OffsetVector;
×
1354
                                Out = StrCopy(VARNAME(vectors,na),OutScr);
×
1355
                                break;
×
1356
                        case DICT_INDEX:
×
1357
                                na = dict->elements[i]->lhs[0]-AM.OffsetIndex;
×
1358
                                Out = StrCopy(VARNAME(indices,na),OutScr);
×
1359
                                break;
×
1360
                        case DICT_FUNCTION:
×
1361
                                na = dict->elements[i]->lhs[0]-FUNCTION;
×
1362
                                Out = StrCopy(VARNAME(functions,na),OutScr);
×
1363
                                break;
×
1364
                        case DICT_FUNCTION_WITH_ARGUMENTS:
×
1365
                                t = dict->elements[i]->lhs;
×
1366
                                na = *t-FUNCTION;
×
1367
                                Out = StrCopy(VARNAME(functions,na),OutScr);
×
1368
                                spec = functions[*t - FUNCTION].spec;
×
1369
                                tstop = t + t[1];
×
1370
                                first = 1;
×
1371
                                if ( t[1] <= FUNHEAD ) {}
×
1372
                                else if ( spec >= TENSORFUNCTION ) {
×
1373
                                        t += FUNHEAD; *Out++ = (UBYTE)'(';
×
1374
                                        while ( t < tstop ) {
×
1375
                                                if ( first == 0 ) *Out++ = (UBYTE)(',');
×
1376
                                                else first = 0;
1377
                                                j = *t++;
×
1378
                                                if ( j >= 0 ) {
×
1379
                                                        if ( j < AM.OffsetIndex ) { Out = NumCopy(j,Out); }
×
1380
                                                        else if ( j < AM.IndDum ) {
×
1381
                                                                Out = StrCopy(VARNAME(indices,j-AM.OffsetIndex),Out);
×
1382
                                                        }
1383
                                                        else {
1384
                                                                MesPrint("Currently wildcards are not allowed in dictionary elements");
×
NEW
1385
                                                                TERMINATE(-1);
×
1386
                                                        }
1387
                                                }
1388
                                                else {
1389
                                                        Out = StrCopy(VARNAME(vectors,j-AM.OffsetVector),Out);
×
1390
                                                }
1391
                                        }
1392
                                        *Out++ = (UBYTE)')'; *Out = 0;
×
1393
                                }
1394
                                else {
1395
                                        t += FUNHEAD; *Out++ = (UBYTE)'('; *Out = 0;
×
1396
                                        TokenToLine(OutScr);
×
1397
                                        while ( t < tstop ) {
×
1398
                                                if ( !first ) TokenToLine((UBYTE *)",");
×
1399
                                                WriteArgument(t);
×
1400
                                                NEXTARG(t)
×
1401
                                                first = 0;
1402
                                        }
1403
                                        Out = OutScr;
×
1404
                                        *Out++ = (UBYTE)')'; *Out = 0;
×
1405
                                }
1406
                                break;
1407
                        case DICT_SPECIALCHARACTER:
×
1408
                                str[0] = (UBYTE)(dict->elements[i]->lhs[0]);
×
1409
                                str[1] = 0; 
×
1410
                                Out = StrCopy(str,OutScr);
×
1411
                                break;
×
1412
                        default:
×
1413
                                Out = OutScr; *Out = 0;
×
1414
                                break;
×
1415
                }
1416
                Out = StrCopy((UBYTE *)": \"",Out);
×
1417
                Out = StrCopy((UBYTE *)(dict->elements[i]->rhs),Out);
×
1418
                Out = StrCopy((UBYTE *)"\"",Out);
×
1419
                TokenToLine(OutScr);
×
1420
                FiniLine();
×
1421
        }
1422
        MesPrint("========End of dictionary %s===",dict->name);
×
1423
        AC.OutputMode = oldoutputmode;
×
1424
        AC.OutputSpaces = oldoutputspaces;
×
1425
        AO.OutSkip = oldoutskip;
×
1426
}
×
1427

1428
/*
1429
                 #] WriteDictionary : 
1430
                 #[ WriteArgument :                VOID WriteArgument(WORD *t)
1431

1432
                Write a single argument field. The general field goes to
1433
                WriteExpression and the fast field is dealt with here.
1434
*/
1435

1436
VOID WriteArgument(WORD *t)
12,086✔
1437
{
1438
        UBYTE buffer[180];
12,086✔
1439
        UBYTE *Out;
12,086✔
1440
        WORD i;
12,086✔
1441
        int oldoutsidefun, oldlowestlevel = lowestlevel;
12,086✔
1442
        lowestlevel = 0;
12,086✔
1443
        if ( *t > 0 ) {
12,086✔
1444
                oldoutsidefun = AC.outsidefun; AC.outsidefun = 0;
4,924✔
1445
                WriteExpression(t+ARGHEAD,(LONG)(*t-ARGHEAD));
4,924✔
1446
                AC.outsidefun = oldoutsidefun;
4,924✔
1447
                goto CleanUp;
4,924✔
1448
        }
1449
        Out = buffer;
7,162✔
1450
        if ( *t == -SNUMBER) {
7,162✔
1451
                NumCopy(t[1],Out);
5,108✔
1452
        }
1453
        else if ( *t == -SYMBOL ) {
2,054✔
1454
                if ( t[1] >= MAXVARIABLES-cbuf[AM.sbufnum].numrhs ) {
1,042✔
1455
                        Out = StrCopy(FindExtraSymbol(MAXVARIABLES-t[1]),Out);
60✔
1456
/*
1457
                        Out = StrCopy((UBYTE *)AC.extrasym,Out);
1458
                        if ( AC.extrasymbols == 0 ) {
1459
                                Out = NumCopy((MAXVARIABLES-t[1]),Out);
1460
                                Out = StrCopy((UBYTE *)"_",Out);
1461
                        }
1462
                        else if ( AC.extrasymbols == 1 ) {
1463
                                Out = AddArrayIndex((MAXVARIABLES-t[1]),Out);
1464
                        }
1465
*/
1466
/*
1467
                        else if ( AC.extrasymbols == 2 ) {
1468
                                Out = NumCopy((MAXVARIABLES-t[1]),Out);
1469
                        }
1470
*/
1471
                }
1472
                else {
1473
                        StrCopy(FindSymbol(t[1]),Out);
982✔
1474
/*                        StrCopy(VARNAME(symbols,t[1]),Out); */
1475
                }
1476
        }
1477
        else if ( *t == -VECTOR ) {
1,012✔
1478
                if ( t[1] == FUNNYVEC ) { *Out++ = '?'; *Out = 0; }
620✔
1479
                else
1480
                        StrCopy(FindVector(t[1]),Out);
620✔
1481
/*                        StrCopy(VARNAME(vectors,t[1] - AM.OffsetVector),Out); */
1482
        }
1483
        else if ( *t == -MINVECTOR ) {
392✔
1484
                *Out++ = '-';
24✔
1485
                StrCopy(FindVector(t[1]),Out);
24✔
1486
/*                StrCopy(VARNAME(vectors,t[1] - AM.OffsetVector),Out); */
1487
        }
1488
        else if ( *t == -INDEX ) {
368✔
1489
                if ( t[1] >= 0 ) {
368✔
1490
                        if ( t[1] < AM.OffsetIndex ) { NumCopy(t[1],Out); }
368✔
1491
                        else {
1492
                                i = t[1];
368✔
1493
                                if ( i >= AM.IndDum ) {
368✔
1494
                                        i -= AM.IndDum;
164✔
1495
                                        *Out++ = 'N';
164✔
1496
                                        Out = NumCopy(i,Out);
164✔
1497
                                        *Out++ = '_';
164✔
1498
                                        *Out++ = '?';
164✔
1499
                                        *Out = 0;
164✔
1500
                                }
1501
                                else {
1502
                                        i -= AM.OffsetIndex;
204✔
1503
                                        Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),Out);
204✔
1504
/*                                        Out = StrCopy(VARNAME(indices,i%WILDOFFSET),Out); */
1505
                                        if ( i >= WILDOFFSET ) { *Out++ = '?'; *Out = 0; }
204✔
1506
                                }
1507
                        }
1508
                }
1509
                else if ( t[1] == FUNNYVEC ) { *Out++ = '?'; *Out = 0; }
×
1510
                else
1511
                        StrCopy(FindVector(t[1]),Out);
×
1512
/*                        StrCopy(VARNAME(vectors,t[1] - AM.OffsetVector),Out); */
1513
        }
1514
        else if ( *t == -DOLLAREXPRESSION ) {
×
1515
                DOLLARS d = Dollars + t[1];
×
1516
                *Out++ = '$';
×
1517
                StrCopy(AC.dollarnames->namebuffer+d->name,Out);
×
1518
        }
1519
        else if ( *t == -EXPRESSION ) {
×
1520
                StrCopy(EXPRNAME(t[1]),Out);
×
1521
        }
1522
        else if ( *t == -SETSET ) {
×
1523
                StrCopy(VARNAME(Sets,t[1]),Out);
×
1524
        }
1525
        else if ( *t <= -FUNCTION ) {
×
1526
                StrCopy(FindFunction(-*t),Out);
×
1527
/*                StrCopy(VARNAME(functions,-*t-FUNCTION),Out); */
1528
        }
1529
        else {
1530
                MesPrint("Illegal function argument while writing");
×
1531
                goto CleanUp;
×
1532
        }
1533
        TokenToLine(buffer);
7,162✔
1534
CleanUp:
12,086✔
1535
        lowestlevel = oldlowestlevel;
12,086✔
1536
        return;
12,086✔
1537
}
1538

1539
/*
1540
                 #] WriteArgument : 
1541
                 #[ WriteSubTerm :                WORD WriteSubTerm(sterm,first)
1542

1543
        Writes a single subterm field to the output line.
1544
        There is a recursion for functions.
1545

1546

1547
#define NUMSPECS 8
1548
UBYTE *specfunnames[NUMSPECS] = {
1549
          (UBYTE *)"fac" , (UBYTE *)"nargs", (UBYTE *)"binom"
1550
        , (UBYTE *)"sign", (UBYTE *)"mod", (UBYTE *)"min", (UBYTE *)"max"
1551
        , (UBYTE *)"invfac" };
1552
*/
1553

1554
WORD WriteSubTerm(WORD *sterm, WORD first)
28,849✔
1555
{
1556
        UBYTE buffer[80];
28,849✔
1557
        UBYTE *Out, closepar[2] = { (UBYTE)')', 0};
28,849✔
1558
        WORD *stopper, *t, *tt, i, j, po = 0;
28,849✔
1559
        int oldoutsidefun;
28,849✔
1560
        stopper = sterm + sterm[1];
28,849✔
1561
        t = sterm + 2;
28,849✔
1562
        switch ( *sterm ) {
28,849✔
1563
                case SYMBOL :
1564
                        while ( t < stopper ) {
58,008✔
1565
                                if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
36,773✔
1566
                                        FiniLine();
×
1567
                                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1568
                                                else IniLine(3);
×
1569
                                        if ( first ) TokenToLine((UBYTE *)" ");
×
1570
                                }
1571
                                if ( !first ) MultiplyToLine();
36,773✔
1572
                                if ( AC.OutputMode == CMODE && t[1] != 1 ) {
36,773✔
1573
                                        if ( AC.Cnumpows >= t[1] && t[1] > 0 ) {
1,684✔
1574
                                                po = t[1];
×
1575
                                                Out = StrCopy((UBYTE *)"POW",buffer);
×
1576
                                                Out = NumCopy(po,Out);
×
1577
                                                Out = StrCopy((UBYTE *)"(",Out);
×
1578
                                                TokenToLine(buffer);
×
1579
                                        }
1580
                                        else {
1581
                                                TokenToLine((UBYTE *)"pow(");
1,684✔
1582
                                        }
1583
                                }
1584
                                if ( *t < NumSymbols ) {
36,773✔
1585
                                        Out = StrCopy(FindSymbol(*t),buffer); t++;
36,473✔
1586
/*                                        Out = StrCopy(VARNAME(symbols,*t),buffer); t++; */
1587
                                }
1588
                                else {
1589
/*
1590
                                        see also routine PrintSubtermList.
1591
*/
1592
                                        Out = StrCopy(FindExtraSymbol(MAXVARIABLES-*t),buffer);
300✔
1593
/*
1594
                                        Out = StrCopy((UBYTE *)AC.extrasym,buffer);
1595
                                        if ( AC.extrasymbols == 0 ) {
1596
                                                Out = NumCopy((MAXVARIABLES-*t),Out);
1597
                                                Out = StrCopy((UBYTE *)"_",Out);
1598
                                        }
1599
                                        else if ( AC.extrasymbols == 1 ) {
1600
                                                Out = AddArrayIndex((MAXVARIABLES-*t),Out);
1601
                                        }
1602
*/
1603
/*
1604
                                        else if ( AC.extrasymbols == 2 ) {
1605
                                                Out = NumCopy((MAXVARIABLES-*t),Out);
1606
                                        }
1607
*/
1608
                                        t++;
300✔
1609
                                }
1610
                                if ( AC.OutputMode == CMODE && po > 1
36,773✔
1611
                                  && AC.Cnumpows >= po ) {
×
1612
                                        Out = StrCopy((UBYTE *)")",Out);
×
1613
                                        po = 0;
×
1614
                                }
1615
                                else if ( *t != 1 ) WrtPower(Out,*t);
36,773✔
1616
                                TokenToLine(buffer);
36,773✔
1617
                                t++;
36,773✔
1618
                                first = 0;
36,773✔
1619
                        }
1620
                        break;
1621
                case VECTOR :
1622
                        while ( t < stopper ) {
×
1623
                                if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
×
1624
                                        FiniLine();
×
1625
                                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1626
                                                else IniLine(3);
×
1627
                                        if ( first ) TokenToLine((UBYTE *)" ");
×
1628
                                }
1629
                                if ( !first ) MultiplyToLine();
×
1630

1631
                                Out = StrCopy(FindVector(*t),buffer);
×
1632
/*                                Out = StrCopy(VARNAME(vectors,*t - AM.OffsetVector),buffer); */
1633
                                t++;
×
1634
                                if ( AC.OutputMode == MATHEMATICAMODE ) *Out++ = '[';
×
1635
                                else *Out++ = '(';
×
1636
                                if ( *t >= AM.OffsetIndex ) {
×
1637
                                        i = *t++;
×
1638
                                        if ( i >= AM.IndDum ) {
×
1639
                                                i -= AM.IndDum;
×
1640
                                                *Out++ = 'N';
×
1641
                                                Out = NumCopy(i,Out);
×
1642
                                                *Out++ = '_';
×
1643
                                                *Out++ = '?';
×
1644
                                                *Out = 0;
×
1645
                                        }
1646
                                        else
1647
                                                Out = StrCopy(FindIndex(i),Out);
×
1648
/*                                                Out = StrCopy(VARNAME(indices,i - AM.OffsetIndex),Out); */
1649
                                }
1650
                                else if ( *t == FUNNYVEC ) { *Out++ = '?'; *Out = 0; }
×
1651
                                else {
1652
                                        Out = NumCopy(*t++,Out);
×
1653
                                }
1654
                                if ( AC.OutputMode == MATHEMATICAMODE ) *Out++ = ']';
×
1655
                                else *Out++ = ')';
×
1656
                                *Out = 0;
×
1657
                                TokenToLine(buffer);
×
1658
                                first = 0;
×
1659
                        }
1660
                          break;
1661
                case INDEX :
1662
                        while ( t < stopper ) {
64✔
1663
                                if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
32✔
1664
                                        FiniLine();
×
1665
                                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1666
                                                else IniLine(3);
×
1667
                                        if ( first ) TokenToLine((UBYTE *)" ");
×
1668
                                }
1669
                                if ( !first ) MultiplyToLine();
32✔
1670
                        if ( *t >= 0 ) {
32✔
1671
                                if ( *t < AM.OffsetIndex ) {
×
1672
                                        TalToLine((UWORD)(*t++));
×
1673
                                }
1674
                                else {
1675
                                        i = *t++;
×
1676
                                        if ( i >= AM.IndDum ) {
×
1677
                                                i -= AM.IndDum;
×
1678
                                                Out = buffer;
×
1679
                                                *Out++ = 'N';
×
1680
                                                Out = NumCopy(i,Out);
×
1681
                                                *Out++ = '_';
×
1682
                                                *Out++ = '?';
×
1683
                                                *Out = 0;
×
1684
                                        }
1685
                                        else {
1686
                                                i -= AM.OffsetIndex;
×
1687
                                                Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),buffer);
×
1688
/*                                                Out = StrCopy(VARNAME(indices,i%WILDOFFSET),buffer); */
1689
                                                if ( i >= WILDOFFSET ) { *Out++ = '?'; *Out = 0; }
×
1690
                                        }
1691
                                        TokenToLine(buffer);
×
1692
                                }
1693
                        }
1694
                        else {
1695
                                TokenToLine(FindVector(*t)); t++;
32✔
1696
/*                                TokenToLine(VARNAME(vectors,*t - AM.OffsetVector)); t++; */
1697
                        }
1698
                        first = 0;
1699
                        }
1700
                        break;
1701
                case DOLLAREXPRESSION:
×
1702
                        {
1703
                                DOLLARS d = Dollars + sterm[2];
×
1704
                                Out = StrCopy((UBYTE *)"$",buffer);
×
1705
                                Out = StrCopy(AC.dollarnames->namebuffer+d->name,Out);
×
1706
                                if ( sterm[3] != 1 ) WrtPower(Out,sterm[3]);
×
1707
                                TokenToLine(buffer);
×
1708
                        }
1709
                        first = 0;
×
1710
                        break;
×
1711
                case DELTA :
1712
                        while ( t < stopper ) {
80✔
1713
                                if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
60✔
1714
                                        FiniLine();
×
1715
                                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1716
                                                else IniLine(3);
×
1717
                                        if ( first ) TokenToLine((UBYTE *)" ");
×
1718
                                }
1719
                                if ( !first ) MultiplyToLine();
60✔
1720
                                Out = StrCopy((UBYTE *)"d_(",buffer);
60✔
1721
                                if ( *t >= AM.OffsetIndex ) {
60✔
1722
                                        if ( *t < AM.IndDum ) {
60✔
1723
                                                Out = StrCopy(FindIndex(*t),Out);
60✔
1724
/*                                                Out = StrCopy(VARNAME(indices,*t - AM.OffsetIndex),Out); */
1725
                                                t++;
60✔
1726
                                        }
1727
                                        else {
1728
                                                *Out++ = 'N';
×
1729
                                                Out = NumCopy( *t++ - AM.IndDum, Out);
×
1730
                                                *Out++ = '_';
×
1731
                                                *Out++ = '?';
×
1732
                                                *Out = 0;
×
1733
                                        }
1734
                                }
1735
                                else if ( *t == FUNNYVEC ) { *Out++ = '?'; *Out = 0; }
×
1736
                                else {
1737
                                        Out = NumCopy(*t++,Out);
×
1738
                                }
1739
                                *Out++ = ',';
60✔
1740
                                if ( *t >= AM.OffsetIndex ) {
60✔
1741
                                        if ( *t < AM.IndDum ) {
60✔
1742
                                                Out = StrCopy(FindIndex(*t),Out);
60✔
1743
/*                                                Out = StrCopy(VARNAME(indices,*t - AM.OffsetIndex),Out); */
1744
                                                t++;
60✔
1745
                                        }
1746
                                        else {
1747
                                                *Out++ = 'N';
×
1748
                                                Out = NumCopy(*t++ - AM.IndDum,Out);
×
1749
                                                *Out++ = '_';
×
1750
                                                *Out++ = '?';
×
1751
                                        }
1752
                                }
1753
                                else {
1754
                                        Out = NumCopy(*t++,Out);
×
1755
                                }
1756
                                *Out++ = ')';
60✔
1757
                                *Out = 0;
60✔
1758
                                TokenToLine(buffer);
60✔
1759
                                first = 0;
60✔
1760
                        }
1761
                        break;
1762
                case DOTPRODUCT :
1763
                        while ( t < stopper ) {
332✔
1764
                                if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
192✔
1765
                                        FiniLine();
×
1766
                                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1767
                                                else IniLine(3);
×
1768
                                        if ( first ) TokenToLine((UBYTE *)" ");
×
1769
                                }
1770
                                if ( !first ) MultiplyToLine();
192✔
1771
                                if ( AC.OutputMode == CMODE && t[2] != 1 )
192✔
1772
                                        TokenToLine((UBYTE *)"pow(");
12✔
1773
                                if ( AC.OutputMode == MATHEMATICAMODE )
192✔
1774
                                        TokenToLine((UBYTE *)"(");
16✔
1775
                                Out = StrCopy(FindVector(*t),buffer);
192✔
1776
/*                                Out = StrCopy(VARNAME(vectors,*t - AM.OffsetVector),buffer); */
1777
                                t++;
192✔
1778
                                if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
192✔
1779
                                 || AC.OutputMode == CMODE )
176✔
1780
                                        *Out++ = AO.FortDotChar;
32✔
1781
                                else *Out++ = '.';
160✔
1782
                                Out = StrCopy(FindVector(*t),Out);
192✔
1783
/*                                Out = StrCopy(VARNAME(vectors,*t - AM.OffsetVector),Out); */
1784
                                if ( AC.OutputMode == MATHEMATICAMODE ) {
192✔
1785
                                        *Out++ = ')';
16✔
1786
                                        *Out = 0;
16✔
1787
                                }
1788
                                t++;
192✔
1789
                                if ( *t != 1 ) WrtPower(Out,*t);
192✔
1790
                                t++;
192✔
1791
                                TokenToLine(buffer);
192✔
1792
                                first = 0;
192✔
1793
                        }
1794
                        break;
1795
                case EXPONENT :
×
1796
#if FUNHEAD != 2
1797
                        t += FUNHEAD - 2;
×
1798
#endif
1799
                        if ( !first ) MultiplyToLine();
×
1800
                        if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)"pow(");
×
1801
                        else TokenToLine((UBYTE *)"(");
×
1802
                        WriteArgument(t);
×
1803
                        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
×
1804
                         || AC.OutputMode == REDUCEMODE )
×
1805
                                TokenToLine((UBYTE *)")**(");
×
1806
                        else if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)",");
×
1807
                        else {
1808
                                UBYTE *Out1 = IsExponentSign();
×
1809
                                if ( Out1 ) {
×
1810
                                        TokenToLine((UBYTE *)")");
×
1811
                                        TokenToLine(Out1);
×
1812
                                        TokenToLine((UBYTE *)"(");
×
1813
                                }
1814
                                else TokenToLine((UBYTE *)")^(");
×
1815
                        }
1816
                        NEXTARG(t)
×
1817
                        WriteArgument(t);
×
1818
                        TokenToLine((UBYTE *)")");
×
1819
                        break;
×
1820
                case DENOMINATOR :
×
1821
#if FUNHEAD != 2
1822
                        t += FUNHEAD - 2;
×
1823
#endif
1824
                        if ( first ) TokenToLine((UBYTE *)"1/(");
×
1825
                        else TokenToLine((UBYTE *)"/(");
×
1826
                        WriteArgument(t);
×
1827
                        TokenToLine((UBYTE *)")");
×
1828
                        break;
×
1829
                case SUBEXPRESSION:
×
1830
                        if ( !first ) MultiplyToLine();
×
1831
                        TokenToLine((UBYTE *)"(");
×
1832
                        t = cbuf[sterm[4]].rhs[sterm[2]];
×
1833
                        tt = t;
×
1834
                        while ( *tt ) tt += *tt;
×
1835
                        oldoutsidefun = AC.outsidefun; AC.outsidefun = 0;
×
1836
                        if ( *t ) {
×
1837
                                WriteExpression(t,(LONG)(tt-t));
×
1838
                        }
1839
                        else {
1840
                                TokenToLine((UBYTE *)"0");
×
1841
                        }
1842
                        AC.outsidefun = oldoutsidefun;
×
1843
                        TokenToLine((UBYTE *)")");
×
1844
                        if ( sterm[3] != 1 ) {
×
1845
                                UBYTE *Out1 = IsExponentSign();
×
1846
                                if ( Out1 ) TokenToLine(Out1);
×
1847
                                else TokenToLine((UBYTE *)"^");
×
1848
                                Out = buffer;
×
1849
                                NumCopy(sterm[3],Out);
×
1850
                                TokenToLine(buffer);
×
1851
                        }
1852
                        break;
1853
                default :
7,422✔
1854
                        if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
7,422✔
1855
                                FiniLine();
×
1856
                                if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
1857
                                        else IniLine(3);
×
1858
                                if ( first ) TokenToLine((UBYTE *)" ");
×
1859
                        }
1860
                        if ( *sterm < FUNCTION ) {
7,422✔
1861
                        return(MesPrint("Illegal subterm while writing"));
×
1862
                        }
1863
                        if ( !first ) MultiplyToLine();
7,422✔
1864
                        first = 1;
7,422✔
1865
                        { UBYTE *tmp;
7,422✔
1866
                                if ( ( tmp = FindFunWithArgs(sterm) ) != 0 ) {
7,422✔
1867
                                        TokenToLine(tmp);
12✔
1868
                                        break;
12✔
1869
                                }
1870
                        }
1871
                        t += FUNHEAD-2;
7,410✔
1872

1873
                        if ( *sterm == GAMMA && t[-FUNHEAD+1] == FUNHEAD+1 ) {
7,410✔
1874
                                TokenToLine((UBYTE *)"gi_(");
×
1875
                        }
1876
                        else {
1877
                                if ( *sterm != DUMFUN ) {
7,410✔
1878
                                        Out = StrCopy(FindFunction(*sterm),buffer);
7,386✔
1879
/*                                        Out = StrCopy(VARNAME(functions,*sterm - FUNCTION),buffer); */
1880
                                }
1881
                                else { Out = buffer; *Out = 0; }
24✔
1882
                                if ( t >= stopper ) {
7,410✔
1883
                                        TokenToLine(buffer);
104✔
1884
                                        break;
104✔
1885
                                }
1886
                                if ( AC.OutputMode == MATHEMATICAMODE ) { *Out++ = '['; closepar[0] = (UBYTE)']'; }
7,306✔
1887
                                else { *Out++ = '('; }
7,210✔
1888
                                *Out = 0;
7,306✔
1889
                                TokenToLine(buffer);
7,306✔
1890
                        }
1891
                        i = functions[*sterm - FUNCTION].spec;
7,306✔
1892
                        if ( i >= TENSORFUNCTION ) {
7,306✔
1893
                                int curdict = AO.CurrentDictionary;
172✔
1894
                                if ( AO.CurrentDictionary && AO.CurDictNotInFunctions > 0 )
172✔
1895
                                        AO.CurrentDictionary = 0;
×
1896
                                t = sterm + FUNHEAD;
172✔
1897
                                while ( t < stopper ) {
852✔
1898
                                        if ( !first ) TokenToLine((UBYTE *)",");
680✔
1899
                                        else first = 0;
1900
                                        j = *t++;
680✔
1901
                                        if ( j >= 0 ) {
680✔
1902
                                                if ( j < AM.OffsetIndex ) TalToLine((UWORD)(j));
388✔
1903
                                                else if ( j < AM.IndDum ) {
296✔
1904
                                                        i = j - AM.OffsetIndex;
100✔
1905
                                                        Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),buffer);
100✔
1906
/*                                                        Out = StrCopy(VARNAME(indices,i%WILDOFFSET),buffer); */
1907
                                                        if ( i >= WILDOFFSET ) { *Out++ = '?'; *Out = 0; }
100✔
1908
                                                        TokenToLine(buffer);
100✔
1909
                                                }
1910
                                                else {
1911
                                                        Out = buffer;
196✔
1912
                                                        *Out++ = 'N';
196✔
1913
                                                        Out = NumCopy(j - AM.IndDum,Out);
196✔
1914
                                                        *Out++ = '_';
196✔
1915
                                                        *Out++ = '?';
196✔
1916
                                                        *Out = 0;
196✔
1917
                                                        TokenToLine(buffer);
196✔
1918
                                                }
1919
                                        }
1920
                                        else if ( j == FUNNYVEC ) { TokenToLine((UBYTE *)"?"); }
292✔
1921
                                        else if ( j > -WILDOFFSET ) {
292✔
1922
                                                Out = buffer;
4✔
1923
                                                Out = NumCopy((UWORD)(-j + 4),Out);
4✔
1924
                                                *Out++ = '_';
4✔
1925
                                                *Out = 0;
4✔
1926
                                                TokenToLine(buffer);                                        
4✔
1927
                                        }
1928
                                        else {
1929
                                                TokenToLine(FindVector(j));
288✔
1930
/*                                                TokenToLine(VARNAME(vectors,j - AM.OffsetVector)); */
1931
                                        }
1932
                                }
1933
                                AO.CurrentDictionary = curdict;
172✔
1934
                        }
1935
                        else {
1936
                                int curdict = AO.CurrentDictionary;
7,134✔
1937
                                if ( AO.CurrentDictionary && AO.CurDictNotInFunctions > 0 )
7,134✔
1938
                                        AO.CurrentDictionary = 0;
×
1939
                                while ( t < stopper ) {
19,220✔
1940
                                        if ( !first ) TokenToLine((UBYTE *)",");
12,086✔
1941
                                        WriteArgument(t);
12,086✔
1942
                                        NEXTARG(t)
12,086✔
1943
                                        first = 0;
1944
                                }
1945
                                AO.CurrentDictionary = curdict;
7,134✔
1946
                        }
1947
                        TokenToLine(closepar);
7,306✔
1948
                        closepar[0] = (UBYTE)')';
7,306✔
1949
                        break;
7,306✔
1950
        }
1951
        return(0);
1952
}
1953

1954
/*
1955
                 #] WriteSubTerm : 
1956
                 #[ WriteInnerTerm :                WORD WriteInnerTerm(term,first)
1957

1958
        Writes the contents of term to the output.
1959
        Only the part that is inside parentheses is written.
1960

1961
*/
1962

1963
WORD WriteInnerTerm(WORD *term, WORD first)
29,479✔
1964
{
1965
        WORD *t, *s, *s1, *s2, n, i, pow;
29,479✔
1966
#ifdef WITHFLOAT
1967
        int FloatChars = 0;
29,479✔
1968
        GETIDENTITY
14,838✔
1969
#endif
1970
        t = term;
29,479✔
1971
        s = t+1;
29,479✔
1972
        GETCOEF(t,n);
29,479✔
1973
        while ( s < t ) {
59,143✔
1974
                if ( *s == HAAKJE ) break;
30,904✔
1975
                s += s[1];
29,664✔
1976
        }
1977
        if ( s < t ) { s += s[1]; }
29,479✔
1978
        else { s = term+1; }
1979

1980
        if ( n < 0 || !first ) {
29,479✔
1981
                if ( n > 0 ) { TOKENTOLINE(" + ","+") }
22,095✔
1982
                else if ( n < 0 ) { n = -n; TOKENTOLINE(" - ","-") }
2,338✔
1983
        }
1984
        if ( AC.modpowers ) {
29,479✔
1985
                if ( n == 1 && *t == 1 && t > s ) first = 1;
×
1986
                else if ( ABS(AC.ncmod) == 1 ) {
×
1987
                        UBYTE *Out1 = IsExponentSign();
×
1988
                        LongToLine((UWORD *)AC.powmod,AC.npowmod);
×
1989
                        if ( Out1 ) TokenToLine(Out1);
×
1990
                        else TokenToLine((UBYTE *)"^");
×
1991
                        TalToLine(AC.modpowers[(LONG)((UWORD)*t)]);
×
1992
                        first = 0;
×
1993
                }
1994
                else {
1995
                        LONG jj;
×
1996
                        UBYTE *Out1 = IsExponentSign();
×
1997
                        LongToLine((UWORD *)AC.powmod,AC.npowmod);
×
1998
                        if ( Out1 ) TokenToLine(Out1);
×
1999
                        else TokenToLine((UBYTE *)"^");
×
2000
                        jj = (UWORD)*t;
×
2001
                        if ( n == 2 ) jj += ((LONG)t[1])<<BITSINWORD;
×
2002
                        if ( AC.modpowers[jj+1] == 0 ) {
×
2003
                                TalToLine(AC.modpowers[jj]);
×
2004
                        }
2005
                        else {
2006
                                LongToLine(AC.modpowers+jj,2);
×
2007
                        }
2008
                        first = 0;
2009
                }
2010
        }
2011
        else if ( n != 1 || *t != 1 || t[1] != 1 || t <= s ) { 
29,479✔
2012
                if ( lowestlevel && ( ( AO.PrintType & PRINTONEFUNCTION ) != 0 ) ) {
11,661✔
2013
                                FiniLine();
×
2014
                                if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
2015
                                else IniLine(3);
×
2016
                }
2017
                if ( AO.CurrentDictionary > 0 ) TransformRational((UWORD *)t,n);
11,661✔
2018
                else                            RatToLine((UWORD *)t,n);
11,561✔
2019
                first = 0;
2020
        }
2021
#ifdef WITHFLOAT
2022
/*
2023
        Check whether there is a 'proper' float_ function and no raw mode.
2024
        If so, print as float.
2025
        Raw mode is indicated as AO.FloatPrec < 0.
2026
        AO.FloatPrec == 0 indicated as many digits as the precision allows.
2027
*/
2028
        else if ( AO.FloatPrec >= 0 && AT.aux_ != 0 ) {
17,818✔
2029
                WORD *ss = s;
2030
                while ( ss < t ) {
×
2031
                        if ( *ss == FLOATFUN ) {
×
2032
                                if ( ( FloatChars = PrintFloat(ss,AO.FloatPrec) ) != 0 ) {
×
2033
                                        TokenToLine(AO.floatspace);
×
2034
                                        first = 0;
×
2035
                                }
2036
                                break;
2037
                        }
2038
                        ss += ss[1];
×
2039
                }
2040
                if ( ss >= t ) first = 1;
×
2041
        }
2042
#endif
2043
        else first = 1;
2044
        while ( s < t ) {
58,328✔
2045
                if ( lowestlevel && ( (AO.PrintType & (PRINTONEFUNCTION | PRINTALL)) == PRINTONEFUNCTION ) ) {
28,849✔
2046
                        FiniLine();
×
2047
                        if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
×
2048
                        else IniLine(3);
×
2049
                }
2050

2051
/*
2052
                 #[ NEWGAMMA :
2053
*/
2054
#ifdef NEWGAMMA
2055
                if ( *s == GAMMA ) {        /* String them up */
2056
                        WORD *tt,*ss;
2057
                        ss = AT.WorkPointer;
2058
                        *ss++ = GAMMA;
2059
                        *ss++ = s[1];
2060
                        FILLFUN(ss)
2061
                        *ss++ = s[FUNHEAD];
2062
                        tt = s + FUNHEAD + 1;
2063
                        n = s[1] - FUNHEAD-1;
2064
                        do {
2065
                                while ( --n >= 0 ) *ss++ = *tt++;
2066
                                tt = s + s[1];
2067
                                while ( *tt == GAMMA && tt[FUNHEAD] == s[FUNHEAD] && tt < t ) {
2068
                                        s = tt;
2069
                                        tt += FUNHEAD + 1;
2070
                                        n = s[1] - FUNHEAD-1;
2071
                                        if ( n > 0 ) break;
2072
                                }
2073
                        } while ( n > 0 );
2074
                        tt = AT.WorkPointer;
2075
                        AT.WorkPointer = ss;
2076
                        tt[1] = WORDDIF(ss,tt);
2077
                        if ( WriteSubTerm(tt,first) ) {
2078
                                MesCall("WriteInnerTerm");
2079
                                SETERROR(-1)
2080
                        }
2081
                        AT.WorkPointer = tt;
2082
                }
2083
                else
2084
#endif
2085
/*
2086
                 #] NEWGAMMA : 
2087
*/
2088
#ifdef WITHFLOAT
2089
                if ( *s == FLOATFUN && AO.FloatPrec >= 0 && AT.aux_ != 0 ) {
28,849✔
2090
                }
2091
                else 
2092
#endif
2093
                {
2094
                        if ( *s >= FUNCTION && AC.funpowers > 0
28,849✔
2095
                        && functions[*s-FUNCTION].spec == 0 && ( AC.funpowers == ALLFUNPOWERS ||
7,422✔
2096
                        ( AC.funpowers == COMFUNPOWERS && functions[*s-FUNCTION].commute == 0 ) ) ) {
7,250✔
2097
                                pow = 1;
2098
                                for(;;) {
8,188✔
2099
                                        s1 = s; s2 = s + s[1]; i = s[1];
7,649✔
2100
                                        if ( s2 < t ) {
7,649✔
2101
                                                while ( --i >= 0 && *s1 == *s2 ) { s1++; s2++; }
7,358✔
2102
                                                if ( i < 0 ) {
3,436✔
2103
                                                        pow++; s = s+s[1];
539✔
2104
                                                }
2105
                                                else break;
2106
                                        }
2107
                                        else break;
2108
                                }
2109
                                if ( pow > 1 ) {
7,110✔
2110
                                        if ( AC.OutputMode == CMODE ) {
180✔
2111
                                                if ( !first ) MultiplyToLine();
×
2112
                                                TokenToLine((UBYTE *)"pow(");
×
2113
                                                first = 1;
×
2114
                                        }
2115
                                        if ( WriteSubTerm(s,first) ) {
180✔
2116
                                                MesCall("WriteInnerTerm");
×
2117
                                                SETERROR(-1)
×
2118
                                        }
2119
                                        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
180✔
2120
                                         || AC.OutputMode == REDUCEMODE ) { TokenToLine((UBYTE *)"**"); }
180✔
2121
                                        else if ( AC.OutputMode == CMODE ) { TokenToLine((UBYTE *)","); }
176✔
2122
                                        else {
2123
                                                UBYTE *Out1 = IsExponentSign();
176✔
2124
                                                if ( Out1 ) TokenToLine(Out1);
176✔
2125
                                                else TokenToLine((UBYTE *)"^");
176✔
2126
                                        }
2127
                                        TalToLine(pow);
180✔
2128
                                        if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)")");
180✔
2129
                                }
2130
                                else if ( WriteSubTerm(s,first) ) {
6,930✔
2131
                                        MesCall("WriteInnerTerm");
×
2132
                                        SETERROR(-1)
×
2133
                                }
2134
                        }
2135
                        else if ( WriteSubTerm(s,first) ) {
21,739✔
2136
                                MesCall("WriteInnerTerm");
×
2137
                                SETERROR(-1)
×
2138
                        }
2139
                }
2140
                first = 0;
28,849✔
2141
                s += s[1];
28,849✔
2142
        }
2143
        return(0);
2144
}
2145

2146
/*
2147
                 #] WriteInnerTerm : 
2148
                 #[ WriteTerm :                        WORD WriteTerm(term,lbrac,first,prtf,br)
2149

2150
        Writes a term to output. It tests the bracket information first.
2151
        If there are no brackets or the bracket is the same all is passed
2152
        to WriteInnerTerm. If there are brackets and the bracket is not
2153
        the same as for the predecessor the old bracket is closed and
2154
        a new one is opened.
2155
        br indicates whether we are in a subexpression, barring zeroing
2156
        AO.IsBracket
2157

2158
*/
2159

2160
WORD WriteTerm(WORD *term, WORD *lbrac, WORD first, WORD prtf, WORD br)
28,063✔
2161
{
2162
        WORD *t, *stopper, *b, n;
28,063✔
2163
        int oldIsFortran90 = AC.IsFortran90, i;
28,063✔
2164
        if ( *lbrac >= 0 ) {
28,063✔
2165
                t = term + 1;
14,665✔
2166
                stopper = (term + *term - 1);
14,665✔
2167
                stopper -= ABS(*stopper) - 1;
14,665✔
2168
                while ( t < stopper ) {
31,739✔
2169
                        if ( *t == HAAKJE ) {
18,454✔
2170
                                stopper = t;
1,380✔
2171
                                t = term+1;
1,380✔
2172
                                if ( *lbrac == ( n = WORDDIF(stopper,t) ) ) {
1,380✔
2173
                                        b = AO.bracket + 1;
1,228✔
2174
                                        t = term + 1;
1,228✔
2175
                                        while ( n > 0 && ( *b++ == *t++ ) ) { n--; }
5,564✔
2176
                                        if ( n <= 0 && ( ( AM.FortranCont <= 0 || AO.InFbrack < AM.FortranCont )
1,228✔
2177
                                        || ( lowestlevel == 0 ) ) ) {
×
2178
/*
2179
                                                We continue inside a bracket.
2180
*/
2181
                                                AO.IsBracket = 1;
844✔
2182
                                                if ( ( prtf & PRINTCONTENTS ) != 0 ) {
844✔
2183
                                                        AO.NumInBrack++;
100✔
2184
                                                }
2185
                                                else {
2186
                                                        if ( WriteInnerTerm(term,0) ) goto WrtTmes;
744✔
2187
                                                        if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
744✔
2188
                                                                FiniLine();
32✔
2189
                                                                TokenToLine((UBYTE *)"   ");
32✔
2190
                                                        }
2191
                                                }
2192
                                                return(0);
844✔
2193
                                        }
2194
                                        t = term + 1;
2195
                                        n = WORDDIF(stopper,t);
2196
                                }
2197
/*
2198
                                Close the bracket
2199
*/
2200
                                if ( *lbrac ) {
536✔
2201
                                        if ( ( prtf & PRINTCONTENTS ) ) PrtTerms();
428✔
2202
                                        TOKENTOLINE(" )",")")
428✔
2203
                                        if ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
428✔
2204
                                                TokenToLine((UBYTE *)";");
×
2205
                                        else if ( AO.FactorMode && ( n == 0 ) ) {
428✔
2206
/*
2207
                                                This should not happen.
2208
*/
2209
                                                return(0);
2210
                                        }
2211
                                        AC.IsFortran90 = ISNOTFORTRAN90;
428✔
2212
                                        FiniLine();
428✔
2213
                                        AC.IsFortran90 = oldIsFortran90;
428✔
2214
                                        if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
428✔
2215
                                                && AC.OutputSpaces == NORMALFORMAT
428✔
2216
                                                && AO.FactorMode == 0 ) FiniLine();
304✔
2217
                                }
2218
                                else {
2219
                                        if ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
108✔
2220
                                                TokenToLine((UBYTE *)";");
×
2221
                                        if ( AO.FortFirst == 0 ) {
108✔
2222
                                                if ( !first ) {
108✔
2223
                                                        AC.IsFortran90 = ISNOTFORTRAN90;
8✔
2224
                                                        FiniLine();
8✔
2225
                                                        AC.IsFortran90 = oldIsFortran90;
8✔
2226
                                                }
2227
                                        }
2228
                                }
2229
                                if ( AO.FactorMode == 0 ) {
536✔
2230
                                  if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
92✔
2231
                                   && !first ) {
×
2232
                                        WORD oldmode = AC.OutputMode;
×
2233
                                        AC.OutputMode = 0;
×
2234
                                        IniLine(0);
×
2235
                                        AC.OutputMode = oldmode;
×
2236
                                        AO.OutSkip = 7;
×
2237

2238
                                        if ( AO.FortFirst == 0 ) {
×
2239
                                                TokenToLine(AO.CurBufWrt);
×
2240
                                                TOKENTOLINE(" = ","=")
×
2241
                                                TokenToLine(AO.CurBufWrt);
×
2242
                                        }
2243
                                        else {
2244
                                                AO.FortFirst = 0;
×
2245
                                                TokenToLine(AO.CurBufWrt);
×
2246
                                                TOKENTOLINE(" = ","=")
×
2247
                                        }
2248
                                  }
2249
                                  else if ( AC.OutputMode == CMODE && !first ) {
92✔
2250
                                        IniLine(0);
×
2251
                                        if ( AO.FortFirst == 0 ) {
×
2252
                                                TokenToLine(AO.CurBufWrt);
×
2253
                                                TOKENTOLINE(" += ","+=")
×
2254
                                        }
2255
                                        else {
2256
                                                AO.FortFirst = 0;
×
2257
                                                TokenToLine(AO.CurBufWrt);
×
2258
                                                TOKENTOLINE(" = ","=")
×
2259
                                        }
2260
                                  }
2261
                                  else if ( startinline == 0 ) {
92✔
2262
                                        IniLine(0);
92✔
2263
                                  }
2264
                                  AO.InFbrack = 0;
92✔
2265
                                  if ( ( *lbrac = n ) > 0 ) {
92✔
2266
                                        b = AO.bracket;
76✔
2267
                                        *b++ = n + 4;
76✔
2268
                                        while ( --n >= 0 ) *b++ = *t++;
476✔
2269
                                        *b++ = 1; *b++ = 1; *b = 3;
76✔
2270
                                        AO.IsBracket = 0;
76✔
2271
                                        if ( WriteInnerTerm(AO.bracket,0) ) {
76✔
2272
                                                /* Error message */
2273
                                                WORD i;
×
2274
WrtTmes:                                t = term;
×
2275
                                                AO.OutSkip = 3;
×
2276
                                                FiniLine();
×
2277
                                                i = *t;
×
2278
                                                while ( --i >= 0 ) { TalToLine((UWORD)(*t++));
×
2279
                                                        if ( AC.OutputSpaces == NORMALFORMAT )
×
2280
                                                                                        TokenToLine((UBYTE *)"  "); }
×
2281
                                                AO.OutSkip = 0;
×
2282
                                                FiniLine();
×
2283
                                                MesCall("WriteTerm");
×
2284
                                                SETERROR(-1)
×
2285
                                        }
2286
                                        TOKENTOLINE(" * ( ","*(")
76✔
2287
                                        AO.NumInBrack = 0;
76✔
2288
                                        AO.IsBracket = 1;
76✔
2289
                                        if ( ( prtf & PRINTONETERM ) != 0 ) {
76✔
2290
                                                first = 0;
16✔
2291
                                                FiniLine();
16✔
2292
                                                TokenToLine((UBYTE *)"   ");
16✔
2293
                                        }
2294
                                        else first = 1;
2295
                                  }
2296
                                  else {
2297
                                        AO.IsBracket = 0;
16✔
2298
                                        first = 0;
16✔
2299
                                  }
2300
                                }
2301
                                else {
2302
/*
2303
                                        Here is the code that writes the glue between two factors.
2304
                                        We should not forget factors that are zero!
2305
*/
2306
                                        if ( ( *lbrac = n ) > 0 ) {
444✔
2307
                                                b = AO.bracket;
444✔
2308
                                                *b++ = n + 4;
444✔
2309
                                                while ( --n >= 0 ) *b++ = *t++;
2,220✔
2310
                                                *b++ = 1; *b++ = 1; *b = 3;
444✔
2311
                                                for ( i = AO.FactorNum+1; i < AO.bracket[4]; i++ ) {
464✔
2312
                                                        if ( first ) {
20✔
2313
                                                                TOKENTOLINE("   ( 0 )"," (0)")
4✔
2314
                                                                first = 0;
2315
                                                        }
2316
                                                        else {
2317
                                                                TOKENTOLINE(" * ( 0 )","*(0)")
16✔
2318
                                                        }
2319
                                                        FiniLine();
20✔
2320
                                                        IniLine(0);
20✔
2321
                                                }
2322
                                                AO.FactorNum = AO.bracket[4];
444✔
2323
                                        }
2324
                                        else {
2325
                                                AO.NumInBrack = 0;
×
2326
                                                return(0);
×
2327
                                        }
2328
                                        if ( first == 0 ) { TOKENTOLINE(" * ( ","*(") }
444✔
2329
                                        else              { TOKENTOLINE("   ( "," (") }
76✔
2330
                                        AO.NumInBrack = 0;
444✔
2331
                                        first = 1;
444✔
2332
                                }
2333
                                if ( ( prtf & PRINTCONTENTS ) != 0 ) AO.NumInBrack++;
536✔
2334
                                else if ( WriteInnerTerm(term,first) ) goto WrtTmes;
496✔
2335
                                if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
536✔
2336
                                        FiniLine();
20✔
2337
                                        TokenToLine((UBYTE *)"   ");
20✔
2338
                                }
2339
                                return(0);
536✔
2340
                        }
2341
                        else t += t[1];
17,074✔
2342
                }
2343
                if ( *lbrac > 0 ) {
13,285✔
2344
                        if ( ( prtf & PRINTCONTENTS ) != 0 ) PrtTerms();
×
2345
                        TokenToLine((UBYTE *)" )");
×
2346
                        if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)";");
×
2347
                        if ( AO.FortFirst == 0 ) {
×
2348
                                AC.IsFortran90 = ISNOTFORTRAN90;
×
2349
                                FiniLine();
×
2350
                                AC.IsFortran90 = oldIsFortran90;
×
2351
                        }
2352
                        if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
×
2353
                                 && AC.OutputSpaces == NORMALFORMAT ) FiniLine();
×
2354
                        if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
×
2355
                         && !first ) {
×
2356
                                WORD oldmode = AC.OutputMode;
×
2357
                                AC.OutputMode = 0;
×
2358
                                IniLine(0);
×
2359
                                AC.OutputMode = oldmode;
×
2360
                                AO.OutSkip = 7;
×
2361
                                if ( AO.FortFirst == 0 ) {
×
2362
                                        TokenToLine(AO.CurBufWrt);
×
2363
                                        TOKENTOLINE(" = ","=")
×
2364
                                        TokenToLine(AO.CurBufWrt);
×
2365
                                }
2366
                                else {
2367
                                        AO.FortFirst = 0;
×
2368
                                        TokenToLine(AO.CurBufWrt);
×
2369
                                        TOKENTOLINE(" = ","=")
×
2370
                                }
2371
/*
2372
                                TokenToLine(AO.CurBufWrt);
2373
                                TOKENTOLINE(" = ","=")
2374
                                if ( AO.FortFirst == 0 )
2375
                                        TokenToLine(AO.CurBufWrt);
2376
                                else AO.FortFirst = 0;
2377
*/
2378
                        }
2379
                        else if ( AC.OutputMode == CMODE && !first ) {
×
2380
                                IniLine(0);
×
2381
                                if ( AO.FortFirst == 0 ) {
×
2382
                                        TokenToLine(AO.CurBufWrt);
×
2383
                                        TOKENTOLINE(" += ","+=")
×
2384
                                }
2385
                                else {
2386
                                        AO.FortFirst = 0;
×
2387
                                        TokenToLine(AO.CurBufWrt);
×
2388
                                        TOKENTOLINE(" = ","=")
×
2389
                                }
2390
/*
2391
                                TokenToLine(AO.CurBufWrt);
2392
                                if ( AO.FortFirst == 0 ) { TOKENTOLINE(" += ","+=") }
2393
                                else {
2394
                                        TOKENTOLINE(" = ","=")
2395
                                        AO.FortFirst = 0;
2396
                                }
2397
*/
2398
                        }
2399
                        else IniLine(0);
×
2400
                        *lbrac = 0;
×
2401
                        first = 1;
×
2402
                }
2403
        }
2404
        if ( !br ) AO.IsBracket = 0;
26,683✔
2405
        if ( ( AM.FortranCont > 0 && AO.InFbrack >= AM.FortranCont ) && lowestlevel ) {
26,683✔
2406
                if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)";");
308✔
2407
                if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
308✔
2408
                 && !first ) {
48✔
2409
                        WORD oldmode = AC.OutputMode;
48✔
2410
                        if ( AO.FortFirst == 0 ) {
48✔
2411
                                AC.IsFortran90 = ISNOTFORTRAN90;
48✔
2412
                                FiniLine();
48✔
2413
                                AC.IsFortran90 = oldIsFortran90;
48✔
2414
                                AC.OutputMode = 0;
48✔
2415
                                IniLine(0);
48✔
2416
                                AC.OutputMode = oldmode;
48✔
2417
                                AO.OutSkip = 7;
48✔
2418
                                TokenToLine(AO.CurBufWrt);
48✔
2419
                                TOKENTOLINE(" = ","=")
48✔
2420
                                TokenToLine(AO.CurBufWrt);
48✔
2421
                        }
2422
                        else {
2423
                                AO.FortFirst = 0;
×
2424
/*
2425
                                TokenToLine(AO.CurBufWrt);
2426
                                TOKENTOLINE(" = ","=")
2427
*/
2428
                        }
2429
/*
2430
                        TokenToLine(AO.CurBufWrt);
2431
                        TOKENTOLINE(" = ","=")
2432
                        if ( AO.FortFirst == 0 )
2433
                                TokenToLine(AO.CurBufWrt);
2434
                        else AO.FortFirst = 0;
2435
*/
2436
                }
2437
                else if ( AC.OutputMode == CMODE && !first ) {
260✔
2438
                        FiniLine();
260✔
2439
                        IniLine(0);
260✔
2440
                        if ( AO.FortFirst == 0 ) {
260✔
2441
                                TokenToLine(AO.CurBufWrt);
260✔
2442
                                TOKENTOLINE(" += ","+=")
260✔
2443
                        }
2444
                        else {
2445
                                AO.FortFirst = 0;
×
2446
                                TokenToLine(AO.CurBufWrt);
×
2447
                                TOKENTOLINE(" = ","=")
×
2448
                        }
2449
/*
2450
                        TokenToLine(AO.CurBufWrt);
2451
                        if ( AO.FortFirst == 0 ) { TOKENTOLINE(" += ","+=") }
2452
                        else {
2453
                                TOKENTOLINE(" = ","=")
2454
                                AO.FortFirst = 0;
2455
                        }
2456
*/
2457
                }
2458
                else {
2459
                        FiniLine();
×
2460
                        IniLine(0);
×
2461
                }
2462
                AO.InFbrack = 0;
308✔
2463
        }
2464
        if ( WriteInnerTerm(term,first) ) goto WrtTmes;
26,683✔
2465
        if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
26,683✔
2466
                FiniLine();
2,688✔
2467
                IniLine(0);
2,688✔
2468
        }
2469
        return(0);
2470
}
2471

2472
/*
2473
                 #] WriteTerm : 
2474
                 #[ WriteExpression :        WORD WriteExpression(terms,ltot)
2475

2476
        Writes a subexpression to output.
2477
        The subexpression is in terms and contains ltot words.
2478
        This is only used for function arguments.
2479

2480
*/
2481

2482
WORD WriteExpression(WORD *terms, LONG ltot)
4,964✔
2483
{
2484
        WORD *stopper;
4,964✔
2485
        WORD first, btot;
4,964✔
2486
        WORD OldIsBracket = AO.IsBracket, OldPrintType = AO.PrintType;
4,964✔
2487
        if ( !AC.outsidefun ) { AO.PrintType &= ~PRINTONETERM; first = 1; }
4,964✔
2488
        else first = 0;
2489
        stopper = terms + ltot;
4,964✔
2490
        btot = -1;
4,964✔
2491
        while ( terms < stopper ) {
18,362✔
2492
                   AO.IsBracket = OldIsBracket;
13,398✔
2493
                if ( WriteTerm(terms,&btot,first,0,1) ) {
13,398✔
2494
                        MesCall("WriteExpression");
×
2495
                        SETERROR(-1)
×
2496
                }
2497
                first = 0;
13,398✔
2498
                terms += *terms;
13,398✔
2499
        }
2500
/*        AO.IsBracket = 0; */
2501
        AO.IsBracket = OldIsBracket;
4,964✔
2502
        AO.PrintType = OldPrintType;
4,964✔
2503
        return(0);
4,964✔
2504
}
2505

2506
/*
2507
                 #] WriteExpression : 
2508
                 #[ WriteAll :                        WORD WriteAll()
2509

2510
                Writes all expressions that should be written
2511
*/
2512

2513
WORD WriteAll(VOID)
3,403✔
2514
{
2515
        GETIDENTITY
990✔
2516
        WORD lbrac, first;
3,403✔
2517
        WORD *t, *stopper, n, prtf;
3,403✔
2518
        int oldIsFortran90 = AC.IsFortran90, i;
3,403✔
2519
        POSITION pos;
3,403✔
2520
        FILEHANDLE *f;
3,403✔
2521
        EXPRESSIONS e;
3,403✔
2522
        if ( AM.exitflag ) return(0);
3,403✔
2523
#ifdef WITHMPI
2524
        if ( PF.me != MASTER ) {
1,917✔
2525
                /*
2526
                 * For the slaves, we need to call Optimize() the same number of times
2527
                 * as the master. The first argument doesn't have any important role.
2528
                 */
2529
                for ( n = 0; n < NumExpressions; n++ ) {
9,072✔
2530
                        e = &Expressions[n];
7,635✔
2531
                        if ( !e->printflag & PRINTON ) continue;
7,635✔
2532
                        switch ( e->status ) {
1,866✔
2533
                                case LOCALEXPRESSION:
2534
                                case GLOBALEXPRESSION:
2535
                                case UNHIDELEXPRESSION:
2536
                                case UNHIDEGEXPRESSION:
2537
                                        break;
1,866✔
2538
                                default:
2539
                                        continue;
2540
                        }
2541
                        e->printflag = 0;
1,866✔
2542
                        PutPreVar(AM.oldnumextrasymbols, GetPreVar((UBYTE *)"EXTRASYMBOLS_", 0), 0, 1);
1,866✔
2543
                        if ( AO.OptimizationLevel > 0 ) {
1,866✔
2544
                                if ( Optimize(0, 1) ) return(-1);
15✔
2545
                        }
2546
                }
2547
                return(0);
2548
        }
2549
#endif
2550
        SeekScratch(AR.outfile,&pos);
1,966✔
2551
        if ( ResetScratch() ) {
1,966✔
2552
                MesCall("WriteAll");
×
2553
                SETERROR(-1)
×
2554
        }
2555
        AO.termbuf = AT.WorkPointer;
1,966✔
2556
    AO.bracket = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
1,966✔
2557
    AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer*2);
1,966✔
2558
        AO.OutFill = AO.OutputLine = (UBYTE *)AT.WorkPointer;
1,966✔
2559
        AT.WorkPointer += 2*AC.LineLength;
1,966✔
2560
        *(AR.CompressBuffer) = 0;
1,966✔
2561
        first = 0;
1,966✔
2562
        for ( n = 0; n < NumExpressions; n++ ) {
9,701✔
2563
                if ( ( Expressions[n].printflag & PRINTON ) != 0 ) { first = 1; break; }
8,740✔
2564
        }
2565
        if ( !first ) goto EndWrite;
1,966✔
2566
        AO.IsBracket = 0;
1,005✔
2567
        AO.OutSkip = 3;
1,005✔
2568
        AR.DeferFlag = 0;
1,005✔
2569
        while ( GetTerm(BHEAD AO.termbuf) ) {
3,592✔
2570
                t = AO.termbuf + 1;
2,587✔
2571
                e = Expressions + AO.termbuf[3];
2,587✔
2572
                n = e->status;
2,587✔
2573
                if ( ( n == LOCALEXPRESSION || n == GLOBALEXPRESSION
2,587✔
2574
                || n == UNHIDELEXPRESSION || n == UNHIDEGEXPRESSION ) &&
4✔
2575
                ( ( prtf = e->printflag ) & PRINTON ) != 0 ) {
2,587✔
2576
                        e->printflag = 0;
2,539✔
2577
                        AO.NumInBrack = 0;
2,539✔
2578
                        PutPreVar(AM.oldnumextrasymbols,
2,539✔
2579
                                        GetPreVar((UBYTE *)"EXTRASYMBOLS_",0),0,1);
2580
                        if ( ( prtf & PRINTLFILE ) != 0 ) {
2,539✔
2581
                                if ( AC.LogHandle < 0 ) prtf &= ~PRINTLFILE;
20✔
2582
                        }
2583
                        AO.PrintType = prtf;
2,539✔
2584
/*
2585
                        if ( AC.OutputMode == VORTRANMODE ) {
2586
                                UBYTE *oldOutFill = AO.OutFill, *oldOutputLine = AO.OutputLine;
2587
                                AO.OutSkip = 6;
2588
                                if ( Optimize(AO.termbuf[3], 1) ) goto AboWrite;
2589
                                AO.OutSkip = 3;
2590
                                AO.OutFill = oldOutFill; AO.OutputLine = oldOutputLine;
2591
                                FiniLine();
2592
                                continue;
2593
                        }
2594
                        else
2595
*/
2596
                        if ( AO.OptimizationLevel > 0 ) {
2,539✔
2597
                                UBYTE *oldOutFill = AO.OutFill, *oldOutputLine = AO.OutputLine;
20✔
2598
                                AO.OutSkip = 6;
20✔
2599
                                if ( Optimize(AO.termbuf[3], 1) ) goto AboWrite;
20✔
2600
                                AO.OutSkip = 3;
20✔
2601
                                AO.OutFill = oldOutFill; AO.OutputLine = oldOutputLine;
20✔
2602
                                FiniLine();
20✔
2603
                                continue;
20✔
2604
                        }
2605
                        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2,519✔
2606
                                         AO.OutSkip = 6;
24✔
2607
                        FiniLine();
2,519✔
2608
                        AO.CurBufWrt = EXPRNAME(AO.termbuf[3]);
2,519✔
2609
                        TokenToLine(AO.CurBufWrt);
2,519✔
2610
                        stopper = t + t[1];
2,519✔
2611
                        t += SUBEXPSIZE;
2,519✔
2612
                        if ( t < stopper ) {
2,519✔
2613
                                TokenToLine((UBYTE *)"(");
×
2614
                                first = 1;
×
2615
                                while ( t < stopper ) {
×
2616
                                        n = *t;
×
2617
                                        if ( !first ) TokenToLine((UBYTE *)",");
×
2618
                                        switch ( n ) {
×
2619
                                                case SYMTOSYM :
×
2620
                                                        TokenToLine(FindSymbol(t[2]));
×
2621
/*                                                        TokenToLine(VARNAME(symbols,t[2])); */
2622
                                                        break;
×
2623
                                                case VECTOVEC :
×
2624
                                                        TokenToLine(FindVector(t[2]));
×
2625
/*                                                        TokenToLine(VARNAME(vectors,t[2] - AM.OffsetVector)); */
2626
                                                        break;
×
2627
                                                case INDTOIND :
×
2628
                                                        TokenToLine(FindIndex(t[2]));
×
2629
/*                                                        TokenToLine(VARNAME(indices,t[2] - AM.OffsetIndex)); */
2630
                                                        break;
×
2631
                                                default :
×
2632
                                                        TokenToLine(FindFunction(t[2]));
×
2633
/*                                                        TokenToLine(VARNAME(functions,t[2] - FUNCTION)); */
2634
                                                        break;
×
2635
                                        }
2636
                                        t += t[1];
×
2637
                                        first = 0;
×
2638
                                }
2639
                                TokenToLine((UBYTE *)")");
×
2640
                        }
2641
                        TOKENTOLINE(" =","=");
2,519✔
2642
                        if ( AC.OutputMode == MATHEMATICAMODE ) {
2,519✔
2643
                                TOKENTOLINE(" (","(");
12✔
2644
                        }
2645
                        lbrac = 0;
2,519✔
2646
                        AO.InFbrack = 0;
2,519✔
2647
                        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2,519✔
2648
                                AO.FortFirst = 1;
24✔
2649
                        else
2650
                                AO.FortFirst = 0;
2,495✔
2651
                        first = 1;
2,519✔
2652
                        if ( ( e->vflags & ISFACTORIZED ) != 0 ) {
2,519✔
2653
                                AO.FactorMode = 1+e->numfactors;
84✔
2654
                                AO.FactorNum = 0; /* Which factor are we doing. For factors that are zero */
84✔
2655
                        }
2656
                        else {
2657
                                AO.FactorMode = 0;
2,435✔
2658
                        }
2659
                        while ( GetTerm(BHEAD AO.termbuf) ) {
11,497✔
2660
                                WORD *m;
8,978✔
2661
                                GETSTOP(AO.termbuf,m);
8,978✔
2662
                                if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
8,978✔
2663
                                && ( ( prtf & PRINTONETERM ) != 0 ) ) {}
172✔
2664
                                else {
2665
                                        if ( first ) {
8,978✔
2666
                                                FiniLine();
2,300✔
2667
                                                IniLine(0);
2,300✔
2668
                                        }
2669
                                }
2670
                                if ( ( prtf & PRINTONETERM ) != 0 ) first = 0;
8,978✔
2671
                                if ( WriteTerm(AO.termbuf,&lbrac,first,prtf,0) )
8,978✔
2672
                                        goto AboWrite;
×
2673
                                first = 0;
2674
                        }
2675
                        if ( AO.FactorMode ) {
2,519✔
2676
                                if ( first ) { AO.FactorNum = 1; TOKENTOLINE("   ( 0 )","  (0)") }
84✔
2677
                                else TOKENTOLINE(" )",")");
80✔
2678
                                for ( i = AO.FactorNum+1; i <= e->numfactors; i++ ) {
84✔
2679
                                        FiniLine();
×
2680
                                        IniLine(0);
×
2681
                                        TOKENTOLINE(" * ( 0 )","*(0)");
×
2682
                                }
2683
                                AO.FactorNum = e->numfactors;
84✔
2684
                                if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE )
84✔
2685
                                        TokenToLine((UBYTE *)";");
84✔
2686
                        }
2687
                        else if ( AO.FactorMode == 0 || first ) {
2,435✔
2688
                                if ( first ) { TOKENTOLINE(" 0","0") }
2,435✔
2689
                                else if ( lbrac ) {
2,220✔
2690
                                        if ( ( prtf & PRINTCONTENTS ) != 0 ) PrtTerms();
12✔
2691
                                        TOKENTOLINE(" )",")")
12✔
2692
                                }
2693
                                else if ( ( prtf & PRINTCONTENTS ) != 0 ) {
2,208✔
2694
                                        TOKENTOLINE(" + 1 * ( ","+1*(")
4✔
2695
                                        PrtTerms();
4✔
2696
                                        TOKENTOLINE(" )",")")
4✔
2697
                                }
2698
                                if ( AC.OutputMode == MATHEMATICAMODE ) {
2,435✔
2699
                                        TokenToLine((UBYTE *)")");
12✔
2700
                                }
2701
                                if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE )
2,435✔
2702
                                        TokenToLine((UBYTE *)";");
2,411✔
2703
                        }
2704
                        AO.OutSkip = 3;
2,519✔
2705
                        AC.IsFortran90 = ISNOTFORTRAN90;
2,519✔
2706
                        FiniLine();
2,519✔
2707
                        AC.IsFortran90 = oldIsFortran90;
2,519✔
2708
                        AO.FactorMode = 0;
2,519✔
2709
                }
2710
                else {
2711
                        do { } while ( GetTerm(BHEAD AO.termbuf) );
284✔
2712
                }
2713
        }
2714
        if ( AC.OutputSpaces == NORMALFORMAT ) FiniLine();
1,005✔
2715
EndWrite:
16✔
2716
        if ( AR.infile->handle >= 0 ) {
1,966✔
2717
                SeekFile(AR.infile->handle,&(AR.infile->filesize),SEEK_SET);
6✔
2718
        }
2719
        AO.IsBracket = 0;
1,966✔
2720
        AT.WorkPointer = AO.termbuf;
1,966✔
2721
        SetScratch(AR.infile,&pos);
1,966✔
2722
        f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
1,966✔
2723
        return(0);
1,966✔
2724
AboWrite:
×
2725
        SetScratch(AR.infile,&pos);
×
2726
        f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
×
2727
        MesCall("WriteAll");
×
NEW
2728
        TERMINATE(-1);
×
2729
        return(-1);
×
2730
}
2731

2732
/*
2733
                 #] WriteAll : 
2734
                 #[ WriteOne :                        WORD WriteOne(name,alreadyinline)
2735

2736
                Writes one expression from the preprocessor
2737
*/
2738

2739
WORD WriteOne(UBYTE *name, int alreadyinline, int nosemi, WORD plus)
64✔
2740
{
2741
        GETIDENTITY
32✔
2742
        WORD number;
64✔
2743
        WORD lbrac, first;
64✔
2744
        POSITION pos;
64✔
2745
        FILEHANDLE *f;
64✔
2746
        WORD prf;
64✔
2747

2748
        if ( GetName(AC.exprnames,name,&number,NOAUTO) != CEXPRESSION ) {
64✔
2749
                MesPrint("@%s is not an expression",name);
×
2750
                return(-1);
×
2751
        }
2752
        switch ( Expressions[number].status ) {
64✔
2753
                case HIDDENLEXPRESSION:
×
2754
                case HIDDENGEXPRESSION:
2755
                case HIDELEXPRESSION:
2756
                case HIDEGEXPRESSION:
2757
                case UNHIDELEXPRESSION:
2758
                case UNHIDEGEXPRESSION:
2759
/*
2760
                case DROPHLEXPRESSION:
2761
                case DROPHGEXPRESSION:
2762
*/
2763
                        AR.GetFile = 2;
×
2764
                        break;
×
2765
                case LOCALEXPRESSION:
64✔
2766
                case GLOBALEXPRESSION:
2767
                case SKIPLEXPRESSION:
2768
                case SKIPGEXPRESSION:
2769
/*
2770
                case DROPLEXPRESSION:
2771
                case DROPGEXPRESSION:
2772
*/
2773
                        AR.GetFile = 0;
64✔
2774
                        break;
64✔
2775
                default:
×
2776
                        MesPrint("@expressions %s is not active. It cannot be written",name);
×
2777
                        return(-1);
×
2778
        }
2779
        SeekScratch(AR.outfile,&pos);
64✔
2780

2781
        f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
64✔
2782
/*
2783
        if ( ResetScratch() ) {
2784
                MesCall("WriteOne");
2785
                SETERROR(-1)
2786
        }
2787
*/
2788
        if ( AR.GetFile == 2 ) f = AR.hidefile;
64✔
2789
        else f = AR.infile;
2790
        prf = Expressions[number].printflag;
64✔
2791
        if ( plus ) prf |= PRINTONETERM;
64✔
2792
/*
2793
                Now position the file
2794
*/
2795
        if ( f->handle >= 0 ) {
64✔
2796
                SetScratch(f,&(Expressions[number].onfile));
×
2797
        }
2798
        else {
2799
                f->POfill = (WORD *)((UBYTE *)(f->PObuffer)
64✔
2800
                                 + BASEPOSITION(Expressions[number].onfile));
64✔
2801
        }
2802
        AO.termbuf = AT.WorkPointer;
64✔
2803
    AO.bracket = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
64✔
2804
    AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer*2);
64✔
2805

2806
        AO.OutFill = AO.OutputLine = (UBYTE *)AT.WorkPointer;
64✔
2807
        AT.WorkPointer += 2*AC.LineLength;
64✔
2808
        *(AR.CompressBuffer) = 0;
64✔
2809

2810
        AO.IsBracket = 0;
64✔
2811
        AO.OutSkip = 3;
64✔
2812
        AR.DeferFlag = 0;
64✔
2813

2814
        if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
64✔
2815
                         AO.OutSkip = 6;
44✔
2816
        if ( GetTerm(BHEAD AO.termbuf) <= 0 ) {
64✔
2817
                MesPrint("@ReadError in expression %s",name);
×
2818
                goto AboWrite;
×
2819
        }
2820
/*
2821
        PutPreVar(AM.oldnumextrasymbols,
2822
                        GetPreVar((UBYTE *)"EXTRASYMBOLS_",0),0,1);
2823
*/
2824
        /*
2825
         * Currently WriteOne() is called only from writeToChannel() with setting
2826
         * AO.OptimizationLevel = 0, which means Optimize() is never called here.
2827
         * So we don't need to think about how to ensure that the master and the
2828
         * slaves call Optimize() at the same time. (TU 26 Jul 2013)
2829
         */
2830
        if ( AO.OptimizationLevel > 0 ) {
64✔
2831
                AO.OutSkip = 6;
×
2832
                if ( Optimize(AO.termbuf[3], 1) ) goto AboWrite;
×
2833
                AO.OutSkip = 3;
×
2834
                FiniLine();
×
2835
        }
2836
        else {
2837
                lbrac = 0;
64✔
2838
                AO.InFbrack = 0;
64✔
2839
                AO.FortFirst = 0;
64✔
2840
                first = 1;
64✔
2841
                while ( GetTerm(BHEAD AO.termbuf) ) {
4,468✔
2842
                        WORD *m;
4,404✔
2843
                        GETSTOP(AO.termbuf,m);
4,404✔
2844
                        if ( first ) {
4,404✔
2845
                                IniLine(0);
64✔
2846
                                startinline = alreadyinline;
64✔
2847
                                AO.OutFill = AO.OutputLine + startinline;
64✔
2848
                                if ( WriteTerm(AO.termbuf,&lbrac,first,0,0) )
64✔
2849
                                        goto AboWrite;
×
2850
                                first = 0;
2851
                        }
2852
                        else {
2853
                                if ( ( prf & PRINTONETERM ) != 0 ) first = 1;
4,340✔
2854
                                if ( first ) {
×
2855
                                        FiniLine();
×
2856
                                        IniLine(0);
×
2857
                                }
2858
                                first = 0;
4,340✔
2859
                                if ( WriteTerm(AO.termbuf,&lbrac,first,0,0) )
4,340✔
2860
                                        goto AboWrite;
×
2861
                        }
2862
                }
2863
                if ( first ) {
64✔
2864
                        IniLine(0);
×
2865
                        startinline = alreadyinline;
×
2866
                        AO.OutFill = AO.OutputLine + startinline;
×
2867
                        TOKENTOLINE(" 0","0");
×
2868
                }
2869
                else if ( lbrac ) {
64✔
2870
                        TOKENTOLINE(" )",")");
×
2871
                }
2872
                if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
64✔
2873
                         && nosemi == 0 ) TokenToLine((UBYTE *)";");
20✔
2874
                AO.OutSkip = 3;
64✔
2875
                if ( AC.OutputSpaces == NORMALFORMAT && nosemi == 0 ) {
64✔
2876
                        FiniLine();
8✔
2877
                }
2878
                else {
2879
                        noextralinefeed = 1;
56✔
2880
                        FiniLine();
56✔
2881
                        noextralinefeed = 0;
56✔
2882
                }
2883
        }
2884
        AO.IsBracket = 0;
64✔
2885
        AT.WorkPointer = AO.termbuf;
64✔
2886
        SetScratch(f,&pos);
64✔
2887
        f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
64✔
2888
        AO.InFbrack = 0;
64✔
2889
        return(0);
64✔
2890
AboWrite:
×
2891
        SetScratch(AR.infile,&pos);
×
2892
        f->POposition = pos;
×
2893
        f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
×
2894
        MesCall("WriteOne");
×
NEW
2895
        TERMINATE(-1);
×
2896
        return(-1);
×
2897
}
2898

2899
/*
2900
                 #] WriteOne : 
2901
          #] schryf-Writes : 
2902
*/
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