38static int startinline = 0;
39static char fcontchar =
'&';
40static int noextralinefeed = 0;
41static int lowestlevel = 1;
49UBYTE *StrCopy(UBYTE *from, UBYTE *to)
51 while( ( *to++ = *from++ ) != 0 );
64void AddToLine(UBYTE *s)
69 if ( AO.OutInBuffer ) { AddToDollarBuffer(s);
return; }
72 if ( Out >= AO.OutStop ) {
73 if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
77 *Out++ = CARRIAGERETURN;
81 num = Out - AO.OutputLine;
83 if ( AC.LogHandle >= 0 ) {
84 if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline
85 ,num-startinline) != (num-startinline) ) {
91 if ( BUG.logfileflag == 0 ) {
92 fprintf(stderr,
"Panic: Cannot write to log file! Disk full?\n");
95 BUG.eflag = 1; BUG.printflag = 1;
102 if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
104 if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
105 AO.OutputLine[num-2] = LINEFEED;
109 if ( WriteFile(AM.StdOut,AO.OutputLine+startinline
110 ,num-startinline) != (num-startinline) ) {
112 if ( BUG.stdoutflag == 0 ) {
113 fprintf(stderr,
"Panic: Cannot write to standard output!\n");
116 BUG.eflag = 1; BUG.printflag = 1;
130 for ( i = 0; i < AO.OutSkip; i++ ) AO.OutputLine[i] =
' ';
131 Out = AO.OutputLine + AO.OutSkip;
132 if ( ( AC.OutputMode == FORTRANMODE
133 || AC.OutputMode == PFORTRANMODE ) && AO.OutSkip == 7 ) {
135 if(AC.IsFortran90 == ISFORTRAN90) {
143 if ( AO.IsBracket ) { *Out++ =
' ';
144 if ( AC.OutputSpaces == NORMALFORMAT ) {
145 *Out++ =
' '; *Out++ =
' '; }
148 if ( AC.OutputMode == FORTRANMODE
149 || ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
150 || AC.OutputMode == PFORTRANMODE )
169 if ( AO.OutInBuffer )
return;
171 while ( Out > AO.OutputLine ) {
172 if ( Out[-1] ==
' ' ) Out--;
175 i = (WORD)(Out-AO.OutputLine);
176 if ( noextralinefeed == 0 ) {
177 if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90
178 && Out > AO.OutputLine ) {
184 *Out++ = CARRIAGERETURN;
189 num = Out - AO.OutputLine;
191 if ( AC.LogHandle >= 0 ) {
192 if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline
193 ,num-startinline) != (num-startinline) ) {
195 if ( BUG.logfileflag == 0 ) {
196 fprintf(stderr,
"Panic: Cannot write to log file! Disk full?\n");
199 BUG.eflag = 1; BUG.printflag = 1;
206 if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
208 if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
209 AO.OutputLine[num-2] = LINEFEED;
213 if ( WriteFile(AM.StdOut,AO.OutputLine+startinline,
214 num-startinline) != (num-startinline) ) {
216 if ( BUG.stdoutflag == 0 ) {
217 fprintf(stderr,
"Panic: Cannot write to standard output!\n");
220 BUG.eflag = 1; BUG.printflag = 1;
227 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
228 || ( AC.OutputMode == CMODE && AO.FactorMode == 0 ) ) AO.InFbrack++;
230 AO.OutStop = Out + AC.LineLength;
232 while ( --i >= 0 ) *Out++ =
' ';
233 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
234 && AO.OutSkip == 7 ) {
249void IniLine(WORD extrablank)
253 AO.OutStop = Out + AC.LineLength;
259 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
266 while ( extrablank > 0 ) {
283static UBYTE *LLscratch = 0;
285void LongToLine(UWORD *a, WORD na)
288 if ( LLscratch == 0 ) {
289 LLscratch = (UBYTE *)Malloc1(4*(AM.MaxTal*
sizeof(WORD)+2)*
sizeof(UBYTE),
"LongToLine");
291 OutScratch = LLscratch;
292 if ( na < 0 ) na = -na;
294 PrtLong(a,na,OutScratch);
295 if ( AO.NoSpacesInNumbers || AC.OutputMode == REDUCEMODE ) {
297 TokenToLine(OutScratch);
301 TokenToLine(OutScratch);
304 else if ( !na ) TokenToLine((UBYTE *)
"0");
316static UBYTE *RLscratch = 0;
317static UWORD *RLscratE = 0;
319void RatToLine(UWORD *a, WORD na)
325 if ( AC.OutputMode == CMODE ) {
337 if ( na < 0 ) na = -na;
339 if ( AC.OutNumberType == RATIONALMODE ) {
342 WORD isOne = 0, isOneOver = 0, isIntegral = 0;
343 WORD isLongNum = 0, isLongDen = 0;
344 UnPack(a,na,&adenom,&anumer);
345 if ( na == 1 && a[0] == 1 && a[1] == 1 ) { isOne = 1; isIntegral = 1; }
346 else if ( adenom == 1 && a[na] == 1 ) { isIntegral = 1; }
347 else if ( anumer == 1 && a[0] == 1 ) { isOneOver = 1; }
348 if ( anumer > 1 || ( anumer == 1 && a[0] > maxInt ) ) { isLongNum = 1; };
349 if ( adenom > 1 || ( adenom == 1 && a[na] > maxInt ) ) { isLongDen = 1; };
352 UBYTE* suffNum = (UBYTE*)
"";
353 UBYTE* suffDen = (UBYTE*)
"";
354 if ( isLongNum || !isIntegral || AC.Fortran90Kind || ( AO.DoubleFlag & 4 ) == 4 ) {
355 if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
356 if ( AC.Fortran90Kind ) { suffNum = AC.Fortran90Kind; }
357 else { suffNum = (UBYTE*)
"."; }
359 else if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == CMODE ) {
360 if ( ( AO.DoubleFlag & 2 ) == 2 ) { suffNum = (UBYTE*)
".Q0"; }
361 else if ( ( AO.DoubleFlag & 1 ) == 1 ) { suffNum = (UBYTE*)
".D0"; }
362 else { suffNum = (UBYTE*)
"."; }
366 if ( isLongDen || !isIntegral || AC.Fortran90Kind || ( AO.DoubleFlag & 4 ) == 4 ) {
367 if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
368 if ( AC.Fortran90Kind ) { suffDen = AC.Fortran90Kind; }
369 else { suffDen = (UBYTE*)
"."; }
371 else if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == CMODE ) {
372 if ( ( AO.DoubleFlag & 2 ) == 2 ) { suffDen = (UBYTE*)
".Q0"; }
373 else if ( ( AO.DoubleFlag & 1 ) == 1 ) { suffDen = (UBYTE*)
".D0"; }
374 else { suffDen = (UBYTE*)
"."; }
379 if ( AC.OutputMode == PFORTRANMODE ) {
381 if ( ( AO.DoubleFlag & 2 ) == 2 ) { suffNum = (UBYTE*)
".Q0"; }
382 else { suffNum = (UBYTE*)
".D0"; }
385 if ( ( AO.DoubleFlag & 2 ) == 2 ) { suffDen = (UBYTE*)
".Q0"; }
386 else { suffDen = (UBYTE*)
".D0"; }
396 if ( AC.OutputMode == PFORTRANMODE ) {
398 AddToLine((UBYTE *)
"one");
400 else if ( isOneOver ) {
401 AddToLine((UBYTE *)
"(one/");
402 LongToLine(a+na,adenom);
404 AddToLine((UBYTE*)
")");
406 else if ( isIntegral ) {
407 LongToLine(a,anumer);
412 AddToLine((UBYTE *)
"((one*");
413 LongToLine(a,anumer);
415 AddToLine((UBYTE*)
")/");
416 LongToLine(a+na,adenom);
418 AddToLine((UBYTE*)
")");
424 LongToLine(a,anumer);
428 AddToLine((UBYTE*)
"/");
429 LongToLine(a+na,adenom);
440 WORD exponent = 0, i, ndig, newl;
441 UWORD *c, *den, b = 10, dig[10];
446 if ( RLscratch == 0 ) {
447 RLscratch = (UBYTE *)Malloc1(4*(AM.MaxTal+2)*
sizeof(UBYTE),
"RatToLine");
448 RLscratE = (UWORD *)Malloc1(2*(AM.MaxTal+2)*
sizeof(UWORD),
"RatToLine");
450 out = OutScratch = RLscratch;
451 c = RLscratE;
for ( i = 0; i < 2*na; i++ ) c[i] = a[i];
452 UnPack(c,na,&adenom,&anumer);
453 while ( BigLong(c,anumer,c+na,adenom) >= 0 ) {
454 Divvy(BHEAD c,&na,&b,1);
455 UnPack(c,na,&adenom,&anumer);
458 while ( BigLong(c,anumer,c+na,adenom) < 0 ) {
459 Mully(BHEAD c,&na,&b,1);
460 UnPack(c,na,&adenom,&anumer);
467 DivLong(c,anumer,den,adenom,dig,&ndig,c,&newl);
468 *out++ = (UBYTE)(dig[0]+
'0'); *out++ =
'.';
469 while ( newl && i < AC.OutNumberType ) {
470 Pack(c,&newl,den,adenom);
471 Mully(BHEAD c,&newl,&b,1);
473 UnPack(c,na,&adenom,&anumer);
475 DivLong(c,anumer,den,adenom,dig,&ndig,c,&newl);
476 if ( ndig == 0 ) *out++ =
'0';
477 else *out++ = (UBYTE)(dig[0]+
'0');
481 if ( exponent < 0 ) { exponent = -exponent; *out++ =
'-'; }
482 else { *out++ =
'+'; }
485 *out++ = (UBYTE)((exponent % 10)+
'0');
487 }
while ( exponent );
489 while ( o < out ) { cc = *o; *o = *out; *out = cc; o++; out--; }
490 TokenToLine(OutScratch);
504void TalToLine(UWORD x)
506 UBYTE t[BITSINWORD/3+1];
510 do { *s++ = (UBYTE)((x % 10)+
'0'); i++; }
while ( ( x /= 10 ) != 0 );
514 i = t[j]; t[j] = s[-j]; s[-j] = (UBYTE)i; j--;
533void TokenToLine(UBYTE *s)
537 if ( AO.OutInBuffer ) { AddToDollarBuffer(s);
return; }
538 t = s; Out = AO.OutFill;
541 if ( ( Out + i ) >= AO.OutStop && ( ( i < ((AC.LineLength-AO.OutSkip)>>1) )
542 || ( (AO.OutStop-Out) < (i>>2) ) ) ) {
543 if ( AC.OutputMode == FORTRANMODE && AC.IsFortran90 == ISFORTRAN90 ) {
547 *Out++ = CARRIAGERETURN;
551 num = Out - AO.OutputLine;
552 if ( AC.LogHandle >= 0 ) {
553 if ( WriteFile(AC.LogHandle,AO.OutputLine+startinline,
554 num-startinline) != (num-startinline) ) {
556 if ( BUG.logfileflag == 0 ) {
557 fprintf(stderr,
"Panic: Cannot write to log file! Disk full?\n");
560 BUG.eflag = 1; BUG.printflag = 1;
566 if ( ( AO.PrintType & PRINTLFILE ) == 0 ) {
568 if ( num > 1 && AO.OutputLine[num-2] == CARRIAGERETURN ) {
569 AO.OutputLine[num-2] = LINEFEED;
573 if ( WriteFile(AM.StdOut,AO.OutputLine+startinline,
574 num-startinline) != (num-startinline) ) {
576 if ( BUG.stdoutflag == 0 ) {
577 fprintf(stderr,
"Panic: Cannot write to standard output!\n");
580 BUG.eflag = 1; BUG.printflag = 1;
588 if ( AO.BlockSpaces == 0 ) {
589 for ( j = 0; j < AO.OutSkip; j++ ) { *Out++ =
' '; }
590 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) ) {
591 if ( AO.OutSkip == 7 ) {
608 if ( AO.IsBracket ) { *Out++ =
' '; *Out++ =
' '; *Out++ =
' '; }
610 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
611 || ( AC.OutputMode == CMODE && AO.FactorMode == 0 ) ) AO.InFbrack++;
613 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
615 if ( i > (WORD)(AO.OutStop-Out) ) j = (WORD)(AO.OutStop - Out);
621 if ( i > (WORD)(AO.OutStop-Out) ) j = (WORD)(AO.OutStop - Out - 1);
625 if ( i > 0 ) *Out++ =
'\\';
640UBYTE *CodeToLine(WORD number, UBYTE *Out)
642 Out = StrCopy((UBYTE *)
"(",Out);
643 Out = NumCopy(number,Out);
644 Out = StrCopy((UBYTE *)
")",Out);
653void MultiplyToLine(
void)
656 if ( AO.CurrentDictionary > 0 && AO.CurDictSpecials > 0
657 && AO.CurDictSpecials == DICT_DOSPECIALS ) {
658 DICTIONARY *dict = AO.Dictionaries[AO.CurrentDictionary-1];
662 for ( i = 0; i < dict->numelements; i++ ) {
663 if ( dict->elements[i]->type != DICT_SPECIALCHARACTER )
continue;
664 if ( (UBYTE)dict->elements[i]->lhs[0] == (UBYTE)(
'*') ) {
665 TokenToLine((UBYTE *)(dict->elements[i]->rhs));
670 TokenToLine((UBYTE *)
"*");
678UBYTE *AddArrayIndex(WORD num,UBYTE *out)
680 if ( AC.OutputMode == CMODE ) {
681 out = StrCopy((UBYTE *)
"[",out);
682 out = NumCopy(num,out);
683 out = StrCopy((UBYTE *)
"]",out);
686 out = StrCopy((UBYTE *)
"(",out);
687 out = NumCopy(num,out);
688 out = StrCopy((UBYTE *)
")",out);
702 a[0] = (UWORD)AO.NumInBrack;
703 a[1] = (UWORD)(AO.NumInBrack >> BITSINWORD);
706 TokenToLine((UBYTE *)
" ");
708 if ( a[0] == 1 && na == 1 ) {
709 TokenToLine((UBYTE *)
" term");
711 else TokenToLine((UBYTE *)
" terms");
720UBYTE *WrtPower(UBYTE *Out, WORD Power)
722 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
723 || AC.OutputMode == REDUCEMODE ) {
724 *Out++ =
'*'; *Out++ =
'*';
726 else if ( AC.OutputMode == CMODE ) *Out++ =
',';
728 UBYTE *Out1 = IsExponentSign();
729 if ( Out1 == 0 ) *Out++ =
'^';
731 while ( *Out1 ) *Out++ = *Out1++;
736 if ( Power < 2*MAXPOWER )
737 Out = NumCopy(Power,Out);
739 Out = StrCopy(FindSymbol((WORD)((LONG)Power-2*MAXPOWER)),Out);
741 if ( AC.OutputMode == CMODE ) *Out++ =
')';
745 if ( ( AC.OutputMode >= FORTRANMODE || AC.OutputMode >= PFORTRANMODE
746 || AC.OutputMode >= REDUCEMODE ) && AC.OutputMode != CMODE )
749 if ( Power > -2*MAXPOWER )
750 Out = NumCopy(-Power,Out);
752 Out = StrCopy(FindSymbol((WORD)((LONG)Power-2*MAXPOWER)),Out);
754 if ( AC.OutputMode >= FORTRANMODE || AC.OutputMode >= PFORTRANMODE
755 || AC.OutputMode >= REDUCEMODE) *Out++ =
')';
766void PrintTime(UBYTE *mess)
769 WORD timepart = (WORD)(millitime%1000);
772 MesPrint(
"At %s: Time = %7l.%2i sec",mess,millitime,timepart);
785static UBYTE *symname[] = {
786 (UBYTE *)
"(cyclic)",(UBYTE *)
"(reversecyclic)"
787 ,(UBYTE *)
"(symmetric)",(UBYTE *)
"(antisymmetric)" };
788static UBYTE *rsymname[] = {
789 (UBYTE *)
"(-cyclic)",(UBYTE *)
"(-reversecyclic)"
790 ,(UBYTE *)
"(-symmetric)",(UBYTE *)
"(-antisymmetric)" };
796 int first, startvalue;
799 CBUF *C = cbuf+AC.cbufnum;
800 int olddict = AO.CurrentDictionary;
803 AO.OutputLine = AO.OutFill = (UBYTE *)AT.WorkPointer;
804 AO.CurrentDictionary = 0;
806 OutScr = (UBYTE *)AT.WorkPointer + ( TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer) ) /2;
807 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
808 else startvalue = FIRSTUSERSYMBOL;
812 if ( ( j = NumSymbols ) > startvalue ) {
813 TokenToLine((UBYTE *)
" Symbols");
816 for ( i = startvalue; i < j; i++ ) {
817 if ( i >= BUILTINSYMBOLS && i < FIRSTUSERSYMBOL )
continue;
818 Out = StrCopy(VARNAME(symbols,i),OutScr);
819 if ( symbols[i].minpower > -MAXPOWER || symbols[i].maxpower < MAXPOWER ) {
820 Out = StrCopy((UBYTE *)
"(",Out);
821 if ( symbols[i].minpower > -MAXPOWER )
822 Out = NumCopy(symbols[i].minpower,Out);
823 Out = StrCopy((UBYTE *)
":",Out);
824 if ( symbols[i].maxpower < MAXPOWER )
825 Out = NumCopy(symbols[i].maxpower,Out);
826 Out = StrCopy((UBYTE *)
")",Out);
828 if ( ( symbols[i].complex & VARTYPEIMAGINARY ) == VARTYPEIMAGINARY ) {
829 Out = StrCopy((UBYTE *)
"#i",Out);
831 else if ( ( symbols[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) {
832 Out = StrCopy((UBYTE *)
"#c",Out);
834 else if ( ( symbols[i].complex & VARTYPEROOTOFUNITY ) == VARTYPEROOTOFUNITY ) {
835 Out = StrCopy((UBYTE *)
"#",Out);
836 if ( ( symbols[i].complex & VARTYPEMINUS ) == VARTYPEMINUS ) {
837 Out = StrCopy((UBYTE *)
"-",Out);
840 Out = StrCopy((UBYTE *)
"+",Out);
842 Out = NumCopy(symbols[i].maxpower,Out);
844 if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
845 if ( ( symbols[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) i++;
846 StrCopy((UBYTE *)
" ",Out);
856 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
857 else startvalue = BUILTININDICES;
858 if ( ( j = NumIndices ) > startvalue ) {
859 TokenToLine((UBYTE *)
" Indices");
862 for ( i = startvalue; i < j; i++ ) {
863 Out = StrCopy(FindIndex(i+AM.OffsetIndex),OutScr);
864 Out = StrCopy(VARNAME(indices,i),OutScr);
865 if ( indices[i].dimension >= 0 ) {
866 if ( indices[i].dimension != AC.lDefDim ) {
867 Out = StrCopy((UBYTE *)
"=",Out);
868 Out = NumCopy(indices[i].dimension,Out);
871 else if ( indices[i].dimension < 0 ) {
872 Out = StrCopy((UBYTE *)
"=",Out);
873 Out = StrCopy(VARNAME(symbols,-indices[i].dimension),Out);
874 if ( indices[i].nmin4 < -NMIN4SHIFT ) {
875 Out = StrCopy((UBYTE *)
":",Out);
876 Out = StrCopy(VARNAME(symbols,-indices[i].nmin4-NMIN4SHIFT),Out);
879 if ( AC.CodesFlag ) Out = CodeToLine(i+AM.OffsetIndex,Out);
880 StrCopy((UBYTE *)
" ",Out);
890 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
891 else startvalue = BUILTINVECTORS;
892 if ( ( j = NumVectors ) > startvalue ) {
893 TokenToLine((UBYTE *)
" Vectors");
896 for ( i = startvalue; i < j; i++ ) {
897 Out = StrCopy(VARNAME(vectors,i),OutScr);
898 if ( AC.CodesFlag ) Out = CodeToLine(i+AM.OffsetVector,Out);
899 StrCopy((UBYTE *)
" ",Out);
909 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
910 else startvalue = AM.NumFixedFunctions;
911 for ( k = 0; k < 2; k++ ) {
914 for ( i = startvalue; i < j; i++ ) {
915 if ( i > MAXBUILTINFUNCTION-FUNCTION
916 && i < FIRSTUSERFUNCTION-FUNCTION )
continue;
917 if ( ( k == 0 && functions[i].commute )
918 || ( k != 0 && !functions[i].commute ) ) {
920 TokenToLine((UBYTE *)(FG.FunNam[k]));
925 Out = StrCopy(VARNAME(functions,i),OutScr);
926 if ( ( functions[i].complex & VARTYPEIMAGINARY ) == VARTYPEIMAGINARY ) {
927 Out = StrCopy((UBYTE *)
"#i",Out);
929 else if ( ( functions[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) {
930 Out = StrCopy((UBYTE *)
"#c",Out);
932 if ( functions[i].spec == VERTEXFUNCTION ) {
933 Out = StrCopy((UBYTE *)
"(Particle)",Out);
935 else if ( functions[i].spec >= TENSORFUNCTION ) {
936 Out = StrCopy((UBYTE *)
"(Tensor)",Out);
938 if ( functions[i].symmetric > 0 ) {
939 if ( ( functions[i].symmetric & REVERSEORDER ) != 0 ) {
940 Out = StrCopy((UBYTE *)(rsymname[(functions[i].symmetric & ~REVERSEORDER)-1]),Out);
943 Out = StrCopy((UBYTE *)(symname[functions[i].symmetric-1]),Out);
946 if ( AC.CodesFlag ) Out = CodeToLine(i+FUNCTION,Out);
947 if ( ( functions[i].complex & VARTYPECOMPLEX ) == VARTYPECOMPLEX ) i++;
948 StrCopy((UBYTE *)
" ",Out);
953 if ( first == 0 ) FiniLine();
959 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
960 else startvalue = AM.NumFixedSets;
961 if ( ( j = AC.SetList.num ) > startvalue ) {
962 WORD element, LastElement, type, number;
963 TokenToLine((UBYTE *)
" Sets");
964 for ( i = startvalue; i < j; i++ ) {
967 if ( Sets[i].name < 0 ) {
968 Out = StrCopy((UBYTE *)
"{}",OutScr);
971 Out = StrCopy(VARNAME(Sets,i),OutScr);
973 if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
974 StrCopy((UBYTE *)
":",Out);
976 if ( i < AM.NumFixedSets ) {
977 TokenToLine((UBYTE *)
" ");
978 TokenToLine((UBYTE *)fixedsets[i].description);
980 else if ( Sets[i].type == CRANGE ) {
982 if ( Sets[i].first == 3*MAXPOWER ) {
984 else if ( Sets[i].first >= MAXPOWER ) {
985 TokenToLine((UBYTE *)
"<=");
986 NumCopy(Sets[i].first-2*MAXPOWER,OutScr);
991 TokenToLine((UBYTE *)
"<");
992 NumCopy(Sets[i].first,OutScr);
996 if ( Sets[i].last == -3*MAXPOWER ) {
998 else if ( Sets[i].last <= -MAXPOWER ) {
999 if ( iflag ) TokenToLine((UBYTE *)
",");
1000 TokenToLine((UBYTE *)
">=");
1001 NumCopy(Sets[i].last+2*MAXPOWER,OutScr);
1002 TokenToLine(OutScr);
1005 if ( iflag ) TokenToLine((UBYTE *)
",");
1006 TokenToLine((UBYTE *)
">");
1007 NumCopy(Sets[i].last,OutScr);
1008 TokenToLine(OutScr);
1012 element = Sets[i].first;
1013 LastElement = Sets[i].last;
1014 type = Sets[i].type;
1015 while ( element < LastElement ) {
1016 TokenToLine((UBYTE *)
" ");
1017 number = SetElements[element++];
1021 StrCopy(VARNAME(symbols,-number),OutScr);
1022 StrCopy((UBYTE *)
"?",Out);
1023 TokenToLine(OutScr);
1025 else if ( number < MAXPOWER )
1026 TokenToLine(VARNAME(symbols,number));
1028 NumCopy(number-2*MAXPOWER,OutScr);
1029 TokenToLine(OutScr);
1033 if ( number >= AM.IndDum ) {
1034 Out = StrCopy((UBYTE *)
"N",OutScr);
1035 Out = NumCopy(number-(AM.IndDum),Out);
1036 StrCopy((UBYTE *)
"_?",Out);
1037 TokenToLine(OutScr);
1039 else if ( number >= AM.OffsetIndex + (WORD)WILDMASK ) {
1040 Out = StrCopy(VARNAME(indices,number
1041 -AM.OffsetIndex-WILDMASK),OutScr);
1042 StrCopy((UBYTE *)
"?",Out);
1043 TokenToLine(OutScr);
1045 else if ( number >= AM.OffsetIndex ) {
1046 TokenToLine(VARNAME(indices,number-AM.OffsetIndex));
1049 NumCopy(number,OutScr);
1050 TokenToLine(OutScr);
1055 if ( number < AM.OffsetVector ) {
1057 Out = StrCopy((UBYTE *)
"-",Out);
1059 if ( number >= AM.OffsetVector + WILDOFFSET ) {
1060 Out = StrCopy(VARNAME(vectors,number
1061 -AM.OffsetVector-WILDOFFSET),Out);
1062 StrCopy((UBYTE *)
"?",Out);
1065 Out = StrCopy(VARNAME(vectors,number-AM.OffsetVector),Out);
1067 TokenToLine(OutScr);
1070 if ( number >= FUNCTION + (WORD)WILDMASK ) {
1071 Out = StrCopy(VARNAME(functions,number
1072 -FUNCTION-WILDMASK),OutScr);
1073 StrCopy((UBYTE *)
"?",Out);
1074 TokenToLine(OutScr);
1076 TokenToLine(VARNAME(functions,number-FUNCTION));
1079 NumCopy(number,OutScr);
1080 TokenToLine(OutScr);
1093 if ( AS.ExecMode ) {
1097 for ( i = 0; i < j; i++, e++ ) {
1098 if ( e->status >= 0 ) {
1100 TokenToLine((UBYTE *)
" Expressions");
1105 Out = StrCopy(AC.exprnames->namebuffer+e->name,OutScr);
1106 Out = StrCopy((UBYTE *)(FG.ExprStat[e->status]),Out);
1107 if ( AC.CodesFlag ) Out = CodeToLine(i,Out);
1108 StrCopy((UBYTE *)
" ",Out);
1109 TokenToLine(OutScr);
1120 for ( i = 0; i < j; i++ ) {
1121 if ( e->printflag && ( e->status == LOCALEXPRESSION ||
1122 e->status == GLOBALEXPRESSION || e->status == UNHIDELEXPRESSION
1123 || e->status == UNHIDEGEXPRESSION ) ) {
1125 TokenToLine((UBYTE *)
" Expressions to be printed");
1130 Out = StrCopy(AC.exprnames->namebuffer+e->name,OutScr);
1131 StrCopy((UBYTE *)
" ",Out);
1132 TokenToLine(OutScr);
1145 if ( AC.CodesFlag || AC.NamesFlag > 1 ) startvalue = 0;
1146 else startvalue = BUILTINDOLLARS;
1147 if ( ( j = NumDollars ) > startvalue ) {
1148 TokenToLine((UBYTE *)
" Dollar variables");
1151 for ( i = startvalue; i < j; i++ ) {
1152 Out = StrCopy((UBYTE *)
"$", OutScr);
1153 Out = StrCopy(DOLLARNAME(Dollars, i), Out);
1154 if ( AC.CodesFlag ) Out = CodeToLine(i, Out);
1155 StrCopy((UBYTE *)
" ", Out);
1156 TokenToLine(OutScr);
1162 if ( ( j = NumPotModdollars ) > 0 ) {
1163 TokenToLine((UBYTE *)
" Dollar variables to be modified");
1166 for ( i = 0; i < j; i++ ) {
1167 Out = StrCopy((UBYTE *)
"$", OutScr);
1168 Out = StrCopy(DOLLARNAME(Dollars, PotModdollars[i]), Out);
1169 for ( k = 0; k < NumModOptdollars; k++ )
1170 if ( ModOptdollars[k].number == PotModdollars[i] )
break;
1171 if ( k < NumModOptdollars ) {
1172 switch ( ModOptdollars[k].type ) {
1174 Out = StrCopy((UBYTE *)
"(sum)", Out);
1177 Out = StrCopy((UBYTE *)
"(maximum)", Out);
1180 Out = StrCopy((UBYTE *)
"(minimum)", Out);
1183 Out = StrCopy((UBYTE *)
"(local)", Out);
1186 Out = StrCopy((UBYTE *)
"(?)", Out);
1190 StrCopy((UBYTE *)
" ", Out);
1191 TokenToLine(OutScr);
1200 if ( AC.ncmod != 0 ) {
1201 TokenToLine((UBYTE *)
"All arithmetic is modulus ");
1202 LongToLine((UWORD *)AC.cmod,ABS(AC.ncmod));
1203 if ( AC.ncmod > 0 ) TokenToLine((UBYTE *)
" with powerreduction");
1204 else TokenToLine((UBYTE *)
" without powerreduction");
1205 if ( ( AC.modmode & POSNEG ) != 0 ) TokenToLine((UBYTE *)
" centered around 0");
1206 else TokenToLine((UBYTE *)
" positive numbers only");
1209 if ( AC.lDefDim != 4 ) {
1210 TokenToLine((UBYTE *)
"The default dimension is ");
1211 if ( AC.lDefDim >= 0 ) {
1212 NumCopy(AC.lDefDim,OutScr);
1213 TokenToLine(OutScr);
1216 TokenToLine(VARNAME(symbols,-AC.lDefDim));
1217 if ( AC.lDefDim4 != -NMIN4SHIFT ) {
1218 TokenToLine((UBYTE *)
":");
1219 if ( AC.lDefDim4 >= -NMIN4SHIFT ) {
1220 NumCopy(AC.lDefDim4,OutScr);
1221 TokenToLine(OutScr);
1224 TokenToLine(VARNAME(symbols,-AC.lDefDim4-NMIN4SHIFT));
1230 if ( AC.lUnitTrace != 4 ) {
1231 TokenToLine((UBYTE *)
"The trace of the unit matrix is ");
1232 if ( AC.lUnitTrace >= 0 ) {
1233 NumCopy(AC.lUnitTrace,OutScr);
1234 TokenToLine(OutScr);
1237 TokenToLine(VARNAME(symbols,-AC.lUnitTrace));
1241 if ( AO.NumDictionaries > 0 ) {
1242 for ( i = 0; i < AO.NumDictionaries; i++ ) {
1243 WriteDictionary(AO.Dictionaries[i]);
1246 MesPrint(
"\nCurrently dictionary %s is active\n",
1247 AO.Dictionaries[olddict-1]->name);
1249 MesPrint(
"\nCurrently there is no active dictionary\n");
1251 if ( AC.CodesFlag ) {
1252 if ( C->numlhs > 0 ) {
1253 TokenToLine((UBYTE *)
" Left Hand Sides:");
1255 for ( i = 1; i <= C->numlhs; i++ ) {
1259 while ( --j >= 0 ) { TalToLine((UWORD)(*skip++)); TokenToLine((UBYTE *)
" "); }
1264 if ( C->numrhs > 0 ) {
1265 TokenToLine((UBYTE *)
" Right Hand Sides:");
1267 for ( i = 1; i <= C->numrhs; i++ ) {
1270 while ( ( j = skip[0] ) != 0 ) {
1271 while ( --j >= 0 ) { TalToLine((UWORD)(*skip++)); TokenToLine((UBYTE *)
" "); }
1279 AO.CurrentDictionary = olddict;
1293 WORD *skip, na, *a, spec, *t, *tstop, j;
1294 UBYTE str[2], *OutScr, *Out;
1295 WORD oldoutputmode = AC.OutputMode, oldoutputspaces = AC.OutputSpaces;
1296 WORD oldoutskip = AO.OutSkip;
1297 AC.OutputMode = NORMALFORMAT;
1298 AC.OutputSpaces = NOSPACEFORMAT;
1299 MesPrint(
"===Contents of dictionary %s===",dict->name);
1302 AO.OutputLine = AO.OutFill = (UBYTE *)AT.WorkPointer;
1303 for ( j = 0; j < *skip; j++ ) *(AO.OutFill)++ =
' ';
1305 OutScr = (UBYTE *)AT.WorkPointer + ( TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer) ) /2;
1306 for ( i = 0; i < dict->numelements; i++ ) {
1307 switch ( dict->elements[i]->type ) {
1308 case DICT_INTEGERNUMBER:
1309 LongToLine((UWORD *)(dict->elements[i]->lhs),dict->elements[i]->size);
1310 Out = OutScr; *Out = 0;
1312 case DICT_RATIONALNUMBER:
1313 a = dict->elements[i]->lhs;
1314 na = a[a[0]-1]; na = (ABS(na)-1)/2;
1315 RatToLine((UWORD *)(a+1),na);
1316 Out = OutScr; *Out = 0;
1319 na = dict->elements[i]->lhs[0];
1320 Out = StrCopy(VARNAME(symbols,na),OutScr);
1323 na = dict->elements[i]->lhs[0]-AM.OffsetVector;
1324 Out = StrCopy(VARNAME(vectors,na),OutScr);
1327 na = dict->elements[i]->lhs[0]-AM.OffsetIndex;
1328 Out = StrCopy(VARNAME(indices,na),OutScr);
1331 na = dict->elements[i]->lhs[0]-FUNCTION;
1332 Out = StrCopy(VARNAME(functions,na),OutScr);
1334 case DICT_FUNCTION_WITH_ARGUMENTS:
1335 t = dict->elements[i]->lhs;
1337 Out = StrCopy(VARNAME(functions,na),OutScr);
1338 spec = functions[*t - FUNCTION].spec;
1341 if ( t[1] <= FUNHEAD ) {}
1342 else if ( spec >= TENSORFUNCTION ) {
1343 t += FUNHEAD; *Out++ = (UBYTE)
'(';
1344 while ( t < tstop ) {
1345 if ( first == 0 ) *Out++ = (UBYTE)(
',');
1349 if ( j < AM.OffsetIndex ) { Out = NumCopy(j,Out); }
1350 else if ( j < AM.IndDum ) {
1351 Out = StrCopy(VARNAME(indices,j-AM.OffsetIndex),Out);
1354 MesPrint(
"Currently wildcards are not allowed in dictionary elements");
1359 Out = StrCopy(VARNAME(vectors,j-AM.OffsetVector),Out);
1362 *Out++ = (UBYTE)
')'; *Out = 0;
1365 t += FUNHEAD; *Out++ = (UBYTE)
'('; *Out = 0;
1366 TokenToLine(OutScr);
1367 while ( t < tstop ) {
1368 if ( !first ) TokenToLine((UBYTE *)
",");
1374 *Out++ = (UBYTE)
')'; *Out = 0;
1377 case DICT_SPECIALCHARACTER:
1378 str[0] = (UBYTE)(dict->elements[i]->lhs[0]);
1380 Out = StrCopy(str,OutScr);
1383 Out = OutScr; *Out = 0;
1386 Out = StrCopy((UBYTE *)
": \"",Out);
1387 Out = StrCopy((UBYTE *)(dict->elements[i]->rhs),Out);
1388 Out = StrCopy((UBYTE *)
"\"",Out);
1389 TokenToLine(OutScr);
1392 MesPrint(
"========End of dictionary %s===",dict->name);
1393 AC.OutputMode = oldoutputmode;
1394 AC.OutputSpaces = oldoutputspaces;
1395 AO.OutSkip = oldoutskip;
1406void WriteArgument(WORD *t)
1411 int oldoutsidefun, oldlowestlevel = lowestlevel;
1414 oldoutsidefun = AC.outsidefun; AC.outsidefun = 0;
1415 WriteExpression(t+ARGHEAD,(LONG)(*t-ARGHEAD));
1416 AC.outsidefun = oldoutsidefun;
1420 if ( *t == -SNUMBER) {
1423 else if ( *t == -SYMBOL ) {
1424 if ( t[1] >= MAXVARIABLES-cbuf[AM.sbufnum].numrhs ) {
1425 Out = StrCopy(FindExtraSymbol(MAXVARIABLES-t[1]),Out);
1443 StrCopy(FindSymbol(t[1]),Out);
1447 else if ( *t == -VECTOR ) {
1448 if ( t[1] == FUNNYVEC ) { *Out++ =
'?'; *Out = 0; }
1450 StrCopy(FindVector(t[1]),Out);
1453 else if ( *t == -MINVECTOR ) {
1455 StrCopy(FindVector(t[1]),Out);
1458 else if ( *t == -INDEX ) {
1460 if ( t[1] < AM.OffsetIndex ) { NumCopy(t[1],Out); }
1463 if ( i >= AM.IndDum ) {
1466 Out = NumCopy(i,Out);
1472 i -= AM.OffsetIndex;
1473 Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),Out);
1475 if ( i >= WILDOFFSET ) { *Out++ =
'?'; *Out = 0; }
1479 else if ( t[1] == FUNNYVEC ) { *Out++ =
'?'; *Out = 0; }
1481 StrCopy(FindVector(t[1]),Out);
1484 else if ( *t == -DOLLAREXPRESSION ) {
1487 StrCopy(AC.dollarnames->namebuffer+d->name,Out);
1489 else if ( *t == -EXPRESSION ) {
1490 StrCopy(EXPRNAME(t[1]),Out);
1492 else if ( *t == -SETSET ) {
1493 StrCopy(VARNAME(Sets,t[1]),Out);
1495 else if ( *t <= -FUNCTION ) {
1496 StrCopy(FindFunction(-*t),Out);
1500 MesPrint(
"Illegal function argument while writing");
1503 TokenToLine(buffer);
1505 lowestlevel = oldlowestlevel;
1524int WriteSubTerm(WORD *sterm, WORD first)
1527 UBYTE *Out, closepar[2] = { (UBYTE)
')', 0};
1528 WORD *stopper, *t, *tt, i, j, po = 0;
1530 stopper = sterm + sterm[1];
1534 while ( t < stopper ) {
1535 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1537 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1539 if ( first ) TokenToLine((UBYTE *)
" ");
1541 if ( !first ) MultiplyToLine();
1542 if ( AC.OutputMode == CMODE && t[1] != 1 ) {
1543 if ( AC.Cnumpows >= t[1] && t[1] > 0 ) {
1545 Out = StrCopy((UBYTE *)
"POW",buffer);
1546 Out = NumCopy(po,Out);
1547 Out = StrCopy((UBYTE *)
"(",Out);
1548 TokenToLine(buffer);
1551 TokenToLine((UBYTE *)
"pow(");
1554 if ( *t < NumSymbols ) {
1555 Out = StrCopy(FindSymbol(*t),buffer); t++;
1562 Out = StrCopy(FindExtraSymbol(MAXVARIABLES-*t),buffer);
1580 if ( AC.OutputMode == CMODE && po > 1
1581 && AC.Cnumpows >= po ) {
1582 Out = StrCopy((UBYTE *)
")",Out);
1585 else if ( *t != 1 ) WrtPower(Out,*t);
1586 TokenToLine(buffer);
1592 while ( t < stopper ) {
1593 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1595 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1597 if ( first ) TokenToLine((UBYTE *)
" ");
1599 if ( !first ) MultiplyToLine();
1601 Out = StrCopy(FindVector(*t),buffer);
1604 if ( AC.OutputMode == MATHEMATICAMODE ) *Out++ =
'[';
1606 if ( *t >= AM.OffsetIndex ) {
1608 if ( i >= AM.IndDum ) {
1611 Out = NumCopy(i,Out);
1617 Out = StrCopy(FindIndex(i),Out);
1620 else if ( *t == FUNNYVEC ) { *Out++ =
'?'; *Out = 0; }
1622 Out = NumCopy(*t++,Out);
1624 if ( AC.OutputMode == MATHEMATICAMODE ) *Out++ =
']';
1627 TokenToLine(buffer);
1632 while ( t < stopper ) {
1633 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1635 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1637 if ( first ) TokenToLine((UBYTE *)
" ");
1639 if ( !first ) MultiplyToLine();
1641 if ( *t < AM.OffsetIndex ) {
1642 TalToLine((UWORD)(*t++));
1646 if ( i >= AM.IndDum ) {
1650 Out = NumCopy(i,Out);
1656 i -= AM.OffsetIndex;
1657 Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),buffer);
1659 if ( i >= WILDOFFSET ) { *Out++ =
'?'; *Out = 0; }
1661 TokenToLine(buffer);
1665 TokenToLine(FindVector(*t)); t++;
1671 case DOLLAREXPRESSION:
1673 DOLLARS d = Dollars + sterm[2];
1674 Out = StrCopy((UBYTE *)
"$",buffer);
1675 Out = StrCopy(AC.dollarnames->namebuffer+d->name,Out);
1676 if ( sterm[3] != 1 ) WrtPower(Out,sterm[3]);
1677 TokenToLine(buffer);
1682 while ( t < stopper ) {
1683 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1685 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1687 if ( first ) TokenToLine((UBYTE *)
" ");
1689 if ( !first ) MultiplyToLine();
1690 Out = StrCopy((UBYTE *)
"d_(",buffer);
1691 if ( *t >= AM.OffsetIndex ) {
1692 if ( *t < AM.IndDum ) {
1693 Out = StrCopy(FindIndex(*t),Out);
1699 Out = NumCopy( *t++ - AM.IndDum, Out);
1705 else if ( *t == FUNNYVEC ) { *Out++ =
'?'; *Out = 0; }
1707 Out = NumCopy(*t++,Out);
1710 if ( *t >= AM.OffsetIndex ) {
1711 if ( *t < AM.IndDum ) {
1712 Out = StrCopy(FindIndex(*t),Out);
1718 Out = NumCopy(*t++ - AM.IndDum,Out);
1724 Out = NumCopy(*t++,Out);
1728 TokenToLine(buffer);
1733 while ( t < stopper ) {
1734 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1736 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1738 if ( first ) TokenToLine((UBYTE *)
" ");
1740 if ( !first ) MultiplyToLine();
1741 if ( AC.OutputMode == CMODE && t[2] != 1 )
1742 TokenToLine((UBYTE *)
"pow(");
1743 if ( AC.OutputMode == MATHEMATICAMODE )
1744 TokenToLine((UBYTE *)
"(");
1745 Out = StrCopy(FindVector(*t),buffer);
1748 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
1749 || AC.OutputMode == CMODE )
1750 *Out++ = AO.FortDotChar;
1752 Out = StrCopy(FindVector(*t),Out);
1754 if ( AC.OutputMode == MATHEMATICAMODE ) {
1759 if ( *t != 1 ) WrtPower(Out,*t);
1761 TokenToLine(buffer);
1769 if ( !first ) MultiplyToLine();
1770 if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)
"pow(");
1771 else TokenToLine((UBYTE *)
"(");
1773 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
1774 || AC.OutputMode == REDUCEMODE )
1775 TokenToLine((UBYTE *)
")**(");
1776 else if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)
",");
1778 UBYTE *Out1 = IsExponentSign();
1780 TokenToLine((UBYTE *)
")");
1782 TokenToLine((UBYTE *)
"(");
1784 else TokenToLine((UBYTE *)
")^(");
1788 TokenToLine((UBYTE *)
")");
1794 if ( first ) TokenToLine((UBYTE *)
"1/(");
1795 else TokenToLine((UBYTE *)
"/(");
1797 TokenToLine((UBYTE *)
")");
1800 if ( !first ) MultiplyToLine();
1801 TokenToLine((UBYTE *)
"(");
1802 t = cbuf[sterm[4]].rhs[sterm[2]];
1804 while ( *tt ) tt += *tt;
1805 oldoutsidefun = AC.outsidefun; AC.outsidefun = 0;
1807 WriteExpression(t,(LONG)(tt-t));
1810 TokenToLine((UBYTE *)
"0");
1812 AC.outsidefun = oldoutsidefun;
1813 TokenToLine((UBYTE *)
")");
1814 if ( sterm[3] != 1 ) {
1815 UBYTE *Out1 = IsExponentSign();
1816 if ( Out1 ) TokenToLine(Out1);
1817 else TokenToLine((UBYTE *)
"^");
1819 NumCopy(sterm[3],Out);
1820 TokenToLine(buffer);
1824 if ( lowestlevel && ( ( AO.PrintType & PRINTALL ) != 0 ) ) {
1826 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1828 if ( first ) TokenToLine((UBYTE *)
" ");
1830 if ( *sterm < FUNCTION ) {
1831 return(MesPrint(
"Illegal subterm while writing"));
1833 if ( !first ) MultiplyToLine();
1836 if ( ( tmp = FindFunWithArgs(sterm) ) != 0 ) {
1843 if ( *sterm == GAMMA && t[-FUNHEAD+1] == FUNHEAD+1 ) {
1844 TokenToLine((UBYTE *)
"gi_(");
1847 if ( *sterm != DUMFUN ) {
1848 Out = StrCopy(FindFunction(*sterm),buffer);
1851 else { Out = buffer; *Out = 0; }
1852 if ( t >= stopper ) {
1853 TokenToLine(buffer);
1856 if ( AC.OutputMode == MATHEMATICAMODE ) { *Out++ =
'['; closepar[0] = (UBYTE)
']'; }
1857 else { *Out++ =
'('; }
1859 TokenToLine(buffer);
1861 i = functions[*sterm - FUNCTION].spec;
1862 if ( i >= TENSORFUNCTION ) {
1863 int curdict = AO.CurrentDictionary;
1864 if ( AO.CurrentDictionary && AO.CurDictNotInFunctions > 0 )
1865 AO.CurrentDictionary = 0;
1866 t = sterm + FUNHEAD;
1867 while ( t < stopper ) {
1868 if ( !first ) TokenToLine((UBYTE *)
",");
1872 if ( j < AM.OffsetIndex ) TalToLine((UWORD)(j));
1873 else if ( j < AM.IndDum ) {
1874 i = j - AM.OffsetIndex;
1875 Out = StrCopy(FindIndex(i%WILDOFFSET+AM.OffsetIndex),buffer);
1877 if ( i >= WILDOFFSET ) { *Out++ =
'?'; *Out = 0; }
1878 TokenToLine(buffer);
1883 Out = NumCopy(j - AM.IndDum,Out);
1887 TokenToLine(buffer);
1890 else if ( j == FUNNYVEC ) { TokenToLine((UBYTE *)
"?"); }
1891 else if ( j > -WILDOFFSET ) {
1893 Out = NumCopy((UWORD)(-j + 4),Out);
1896 TokenToLine(buffer);
1899 TokenToLine(FindVector(j));
1903 AO.CurrentDictionary = curdict;
1906 int curdict = AO.CurrentDictionary;
1907 if ( AO.CurrentDictionary && AO.CurDictNotInFunctions > 0 )
1908 AO.CurrentDictionary = 0;
1909 while ( t < stopper ) {
1910 if ( !first ) TokenToLine((UBYTE *)
",");
1915 AO.CurrentDictionary = curdict;
1917 TokenToLine(closepar);
1918 closepar[0] = (UBYTE)
')';
1933int WriteInnerTerm(WORD *term, WORD first)
1935 WORD *t, *s, *s1, *s2, n, i, pow;
1944 if ( *s == HAAKJE )
break;
1947 if ( s < t ) { s += s[1]; }
1948 else { s = term+1; }
1950 if ( n < 0 || !first ) {
1951 if ( n > 0 ) { TOKENTOLINE(
" + ",
"+") }
1952 else if ( n < 0 ) { n = -n; TOKENTOLINE(
" - ",
"-") }
1954 if ( AC.modpowers ) {
1955 if ( n == 1 && *t == 1 && t > s ) first = 1;
1956 else if ( ABS(AC.ncmod) == 1 ) {
1957 UBYTE *Out1 = IsExponentSign();
1958 LongToLine((UWORD *)AC.powmod,AC.npowmod);
1959 if ( Out1 ) TokenToLine(Out1);
1960 else TokenToLine((UBYTE *)
"^");
1961 TalToLine(AC.modpowers[(LONG)((UWORD)*t)]);
1966 UBYTE *Out1 = IsExponentSign();
1967 LongToLine((UWORD *)AC.powmod,AC.npowmod);
1968 if ( Out1 ) TokenToLine(Out1);
1969 else TokenToLine((UBYTE *)
"^");
1971 if ( n == 2 ) jj += ((LONG)t[1])<<BITSINWORD;
1972 if ( AC.modpowers[jj+1] == 0 ) {
1973 TalToLine(AC.modpowers[jj]);
1976 LongToLine(AC.modpowers+jj,2);
1981 else if ( n != 1 || *t != 1 || t[1] != 1 || t <= s ) {
1982 if ( lowestlevel && ( ( AO.PrintType & PRINTONEFUNCTION ) != 0 ) ) {
1984 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
1987 if ( AO.CurrentDictionary > 0 ) TransformRational((UWORD *)t,n);
1988 else RatToLine((UWORD *)t,n);
1998 else if ( AO.FloatPrec >= 0 && AT.aux_ != 0 ) {
2001 if ( *ss == FLOATFUN ) {
2002 if ( ( FloatChars = PrintFloat(ss,AO.FloatPrec) ) != 0 ) {
2003 TokenToLine(AO.floatspace);
2004 if ( AC.IsFortran90 == ISFORTRAN90 && AC.Fortran90Kind ) {
2005 AddToLine(AC.Fortran90Kind);
2013 if ( ss >= t ) first = 1;
2018 if ( lowestlevel && ( (AO.PrintType & (PRINTONEFUNCTION | PRINTALL)) == PRINTONEFUNCTION ) ) {
2020 if ( AC.OutputSpaces == NOSPACEFORMAT ) IniLine(1);
2028 if ( *s == GAMMA ) {
2030 ss = AT.WorkPointer;
2035 tt = s + FUNHEAD + 1;
2036 n = s[1] - FUNHEAD-1;
2038 while ( --n >= 0 ) *ss++ = *tt++;
2040 while ( *tt == GAMMA && tt[FUNHEAD] == s[FUNHEAD] && tt < t ) {
2043 n = s[1] - FUNHEAD-1;
2047 tt = AT.WorkPointer;
2048 AT.WorkPointer = ss;
2049 tt[1] = WORDDIF(ss,tt);
2050 if ( WriteSubTerm(tt,first) ) {
2051 MesCall(
"WriteInnerTerm");
2054 AT.WorkPointer = tt;
2062 if ( *s == FLOATFUN && AO.FloatPrec >= 0 && AT.aux_ != 0 ) {
2067 if ( *s >= FUNCTION && AC.funpowers > 0
2068 && functions[*s-FUNCTION].spec == 0 && ( AC.funpowers == ALLFUNPOWERS ||
2069 ( AC.funpowers == COMFUNPOWERS && functions[*s-FUNCTION].commute == 0 ) ) ) {
2072 s1 = s; s2 = s + s[1]; i = s[1];
2074 while ( --i >= 0 && *s1 == *s2 ) { s1++; s2++; }
2083 if ( AC.OutputMode == CMODE ) {
2084 if ( !first ) MultiplyToLine();
2085 TokenToLine((UBYTE *)
"pow(");
2088 if ( WriteSubTerm(s,first) ) {
2089 MesCall(
"WriteInnerTerm");
2092 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE
2093 || AC.OutputMode == REDUCEMODE ) { TokenToLine((UBYTE *)
"**"); }
2094 else if ( AC.OutputMode == CMODE ) { TokenToLine((UBYTE *)
","); }
2096 UBYTE *Out1 = IsExponentSign();
2097 if ( Out1 ) TokenToLine(Out1);
2098 else TokenToLine((UBYTE *)
"^");
2101 if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)
")");
2103 else if ( WriteSubTerm(s,first) ) {
2104 MesCall(
"WriteInnerTerm");
2108 else if ( WriteSubTerm(s,first) ) {
2109 MesCall(
"WriteInnerTerm");
2133int WriteTerm(WORD *term, WORD *lbrac, WORD first, WORD prtf, WORD br)
2135 WORD *t, *stopper, *b, n;
2136 int oldIsFortran90 = AC.IsFortran90, i;
2137 if ( *lbrac >= 0 ) {
2139 stopper = (term + *term - 1);
2140 stopper -= ABS(*stopper) - 1;
2141 while ( t < stopper ) {
2142 if ( *t == HAAKJE ) {
2145 if ( *lbrac == ( n = WORDDIF(stopper,t) ) ) {
2148 while ( n > 0 && ( *b++ == *t++ ) ) { n--; }
2149 if ( n <= 0 && ( ( AM.FortranCont <= 0 || AO.InFbrack < AM.FortranCont )
2150 || ( lowestlevel == 0 ) ) ) {
2155 if ( ( prtf & PRINTCONTENTS ) != 0 ) {
2159 if ( WriteInnerTerm(term,0) )
goto WrtTmes;
2160 if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
2162 TokenToLine((UBYTE *)
" ");
2168 n = WORDDIF(stopper,t);
2174 if ( ( prtf & PRINTCONTENTS ) ) PrtTerms();
2175 TOKENTOLINE(
" )",
")")
2176 if ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
2177 TokenToLine((UBYTE *)";");
2178 else if ( AO.FactorMode && ( n == 0 ) ) {
2184 AC.IsFortran90 = ISNOTFORTRAN90;
2186 AC.IsFortran90 = oldIsFortran90;
2187 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
2188 && AC.OutputSpaces == NORMALFORMAT
2189 && AO.FactorMode == 0 ) FiniLine();
2192 if ( AC.OutputMode == CMODE && AO.FactorMode == 0 )
2193 TokenToLine((UBYTE *)
";");
2194 if ( AO.FortFirst == 0 ) {
2196 AC.IsFortran90 = ISNOTFORTRAN90;
2198 AC.IsFortran90 = oldIsFortran90;
2202 if ( AO.FactorMode == 0 ) {
2203 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2205 WORD oldmode = AC.OutputMode;
2208 AC.OutputMode = oldmode;
2211 if ( AO.FortFirst == 0 ) {
2212 TokenToLine(AO.CurBufWrt);
2213 TOKENTOLINE(
" = ",
"=")
2214 TokenToLine(AO.CurBufWrt);
2218 TokenToLine(AO.CurBufWrt);
2219 TOKENTOLINE(
" = ",
"=")
2222 else if ( AC.OutputMode == CMODE && !first ) {
2224 if ( AO.FortFirst == 0 ) {
2225 TokenToLine(AO.CurBufWrt);
2226 TOKENTOLINE(
" += ",
"+=")
2230 TokenToLine(AO.CurBufWrt);
2231 TOKENTOLINE(
" = ",
"=")
2234 else if ( startinline == 0 ) {
2238 if ( ( *lbrac = n ) > 0 ) {
2241 while ( --n >= 0 ) *b++ = *t++;
2242 *b++ = 1; *b++ = 1; *b = 3;
2244 if ( WriteInnerTerm(AO.bracket,0) ) {
2251 while ( --i >= 0 ) { TalToLine((UWORD)(*t++));
2252 if ( AC.OutputSpaces == NORMALFORMAT )
2253 TokenToLine((UBYTE *)
" "); }
2256 MesCall(
"WriteTerm");
2259 TOKENTOLINE(
" * ( ",
"*(")
2262 if ( ( prtf & PRINTONETERM ) != 0 ) {
2265 TokenToLine((UBYTE *)
" ");
2279 if ( ( *lbrac = n ) > 0 ) {
2282 while ( --n >= 0 ) *b++ = *t++;
2283 *b++ = 1; *b++ = 1; *b = 3;
2284 for ( i = AO.FactorNum+1; i < AO.bracket[4]; i++ ) {
2286 TOKENTOLINE(
" ( 0 )",
" (0)")
2290 TOKENTOLINE(
" * ( 0 )",
"*(0)")
2295 AO.FactorNum = AO.bracket[4];
2301 if ( first == 0 ) { TOKENTOLINE(
" * ( ",
"*(") }
2302 else { TOKENTOLINE(
" ( ",
" (") }
2306 if ( ( prtf & PRINTCONTENTS ) != 0 ) AO.NumInBrack++;
2307 else if ( WriteInnerTerm(term,first) )
goto WrtTmes;
2308 if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
2310 TokenToLine((UBYTE *)
" ");
2317 if ( ( prtf & PRINTCONTENTS ) != 0 ) PrtTerms();
2318 TokenToLine((UBYTE *)
" )");
2319 if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)
";");
2320 if ( AO.FortFirst == 0 ) {
2321 AC.IsFortran90 = ISNOTFORTRAN90;
2323 AC.IsFortran90 = oldIsFortran90;
2325 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
2326 && AC.OutputSpaces == NORMALFORMAT ) FiniLine();
2327 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2329 WORD oldmode = AC.OutputMode;
2332 AC.OutputMode = oldmode;
2334 if ( AO.FortFirst == 0 ) {
2335 TokenToLine(AO.CurBufWrt);
2336 TOKENTOLINE(
" = ",
"=")
2337 TokenToLine(AO.CurBufWrt);
2341 TokenToLine(AO.CurBufWrt);
2342 TOKENTOLINE(
" = ",
"=")
2352 else if ( AC.OutputMode == CMODE && !first ) {
2354 if ( AO.FortFirst == 0 ) {
2355 TokenToLine(AO.CurBufWrt);
2356 TOKENTOLINE(
" += ",
"+=")
2360 TokenToLine(AO.CurBufWrt);
2361 TOKENTOLINE(
" = ",
"=")
2377 if ( !br ) AO.IsBracket = 0;
2378 if ( ( AM.FortranCont > 0 && AO.InFbrack >= AM.FortranCont ) && lowestlevel ) {
2379 if ( AC.OutputMode == CMODE ) TokenToLine((UBYTE *)
";");
2380 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2382 WORD oldmode = AC.OutputMode;
2383 if ( AO.FortFirst == 0 ) {
2384 AC.IsFortran90 = ISNOTFORTRAN90;
2386 AC.IsFortran90 = oldIsFortran90;
2389 AC.OutputMode = oldmode;
2391 TokenToLine(AO.CurBufWrt);
2392 TOKENTOLINE(
" = ",
"=")
2393 TokenToLine(AO.CurBufWrt);
2410 else if ( AC.OutputMode == CMODE && !first ) {
2413 if ( AO.FortFirst == 0 ) {
2414 TokenToLine(AO.CurBufWrt);
2415 TOKENTOLINE(
" += ",
"+=")
2419 TokenToLine(AO.CurBufWrt);
2420 TOKENTOLINE(
" = ",
"=")
2437 if ( WriteInnerTerm(term,first) )
goto WrtTmes;
2438 if ( ( AO.PrintType & PRINTONETERM ) != 0 ) {
2455int WriteExpression(WORD *terms, LONG ltot)
2459 WORD OldIsBracket = AO.IsBracket, OldPrintType = AO.PrintType;
2460 if ( !AC.outsidefun ) { AO.PrintType &= ~PRINTONETERM; first = 1; }
2462 stopper = terms + ltot;
2464 while ( terms < stopper ) {
2465 AO.IsBracket = OldIsBracket;
2466 if ( WriteTerm(terms,&btot,first,0,1) ) {
2467 MesCall(
"WriteExpression");
2474 AO.IsBracket = OldIsBracket;
2475 AO.PrintType = OldPrintType;
2490 WORD *t, *stopper, n, prtf;
2491 int oldIsFortran90 = AC.IsFortran90, i;
2495 if ( AM.exitflag )
return(0);
2497 if ( PF.me != MASTER ) {
2502 for ( n = 0; n < NumExpressions; n++ ) {
2503 e = &Expressions[n];
2504 if ( (!e->printflag) & PRINTON )
continue;
2505 switch ( e->status ) {
2506 case LOCALEXPRESSION:
2507 case GLOBALEXPRESSION:
2508 case UNHIDELEXPRESSION:
2509 case UNHIDEGEXPRESSION:
2515 PutPreVar(AM.oldnumextrasymbols, GetPreVar((UBYTE *)
"EXTRASYMBOLS_", 0), 0, 1);
2516 if ( AO.OptimizationLevel > 0 ) {
2523 SeekScratch(AR.outfile,&pos);
2524 if ( ResetScratch() ) {
2525 MesCall(
"WriteAll");
2528 AO.termbuf = AT.WorkPointer;
2529 AO.bracket = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
2530 AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer*2);
2531 AO.OutFill = AO.OutputLine = (UBYTE *)AT.WorkPointer;
2532 AT.WorkPointer += 2*AC.LineLength;
2533 *(AR.CompressBuffer) = 0;
2535 for ( n = 0; n < NumExpressions; n++ ) {
2536 if ( ( Expressions[n].printflag & PRINTON ) != 0 ) { first = 1;
break; }
2538 if ( !first )
goto EndWrite;
2542 while ( GetTerm(BHEAD AO.termbuf) ) {
2544 e = Expressions + AO.termbuf[3];
2546 if ( ( n == LOCALEXPRESSION || n == GLOBALEXPRESSION
2547 || n == UNHIDELEXPRESSION || n == UNHIDEGEXPRESSION ) &&
2548 ( ( prtf = e->printflag ) & PRINTON ) != 0 ) {
2552 GetPreVar((UBYTE *)
"EXTRASYMBOLS_",0),0,1);
2553 if ( ( prtf & PRINTLFILE ) != 0 ) {
2554 if ( AC.LogHandle < 0 ) prtf &= ~PRINTLFILE;
2556 AO.PrintType = prtf;
2569 if ( AO.OptimizationLevel > 0 ) {
2570 UBYTE *oldOutFill = AO.OutFill, *oldOutputLine = AO.OutputLine;
2572 if (
Optimize(AO.termbuf[3], 1) )
goto AboWrite;
2574 AO.OutFill = oldOutFill; AO.OutputLine = oldOutputLine;
2578 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2581 AO.CurBufWrt = EXPRNAME(AO.termbuf[3]);
2582 TokenToLine(AO.CurBufWrt);
2585 if ( t < stopper ) {
2586 TokenToLine((UBYTE *)
"(");
2588 while ( t < stopper ) {
2590 if ( !first ) TokenToLine((UBYTE *)
",");
2593 TokenToLine(FindSymbol(t[2]));
2597 TokenToLine(FindVector(t[2]));
2601 TokenToLine(FindIndex(t[2]));
2605 TokenToLine(FindFunction(t[2]));
2612 TokenToLine((UBYTE *)
")");
2614 TOKENTOLINE(
" =",
"=");
2615 if ( AC.OutputMode == MATHEMATICAMODE ) {
2616 TOKENTOLINE(
" (",
"(");
2620 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2625 if ( ( e->vflags & ISFACTORIZED ) != 0 ) {
2626 AO.FactorMode = 1+e->numfactors;
2632 while ( GetTerm(BHEAD AO.termbuf) ) {
2634 GETSTOP(AO.termbuf,m);
2635 if ( ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2636 && ( ( prtf & PRINTONETERM ) != 0 ) ) {}
2643 if ( ( prtf & PRINTONETERM ) != 0 ) first = 0;
2644 if ( WriteTerm(AO.termbuf,&lbrac,first,prtf,0) )
2648 if ( AO.FactorMode ) {
2649 if ( first ) { AO.FactorNum = 1; TOKENTOLINE(
" ( 0 )",
" (0)") }
2650 else TOKENTOLINE(
" )",
")");
2651 for ( i = AO.FactorNum+1; i <= e->numfactors; i++ ) {
2654 TOKENTOLINE(
" * ( 0 )",
"*(0)");
2656 AO.FactorNum = e->numfactors;
2657 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE )
2658 TokenToLine((UBYTE *)
";");
2660 else if ( AO.FactorMode == 0 || first ) {
2661 if ( first ) { TOKENTOLINE(
" 0",
"0") }
2663 if ( ( prtf & PRINTCONTENTS ) != 0 ) PrtTerms();
2664 TOKENTOLINE(
" )",
")")
2666 else if ( ( prtf & PRINTCONTENTS ) != 0 ) {
2667 TOKENTOLINE(
" + 1 * ( ",
"+1*(")
2669 TOKENTOLINE(" )",")")
2671 if ( AC.OutputMode == MATHEMATICAMODE ) {
2672 TokenToLine((UBYTE *)
")");
2674 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE )
2675 TokenToLine((UBYTE *)
";");
2678 AC.IsFortran90 = ISNOTFORTRAN90;
2680 AC.IsFortran90 = oldIsFortran90;
2684 do { }
while ( GetTerm(BHEAD AO.termbuf) );
2687 if ( AC.OutputSpaces == NORMALFORMAT ) FiniLine();
2689 if ( AR.infile->handle >= 0 ) {
2690 SeekFile(AR.infile->handle,&(AR.infile->filesize),SEEK_SET);
2693 AT.WorkPointer = AO.termbuf;
2694 SetScratch(AR.infile,&pos);
2695 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
2698 SetScratch(AR.infile,&pos);
2699 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
2700 MesCall(
"WriteAll");
2712int WriteOne(UBYTE *name,
int alreadyinline,
int nosemi, WORD plus)
2721 if ( GetName(AC.exprnames,name,&number,NOAUTO) != CEXPRESSION ) {
2722 MesPrint(
"@%s is not an expression",name);
2725 switch ( Expressions[number].status ) {
2726 case HIDDENLEXPRESSION:
2727 case HIDDENGEXPRESSION:
2728 case HIDELEXPRESSION:
2729 case HIDEGEXPRESSION:
2730 case UNHIDELEXPRESSION:
2731 case UNHIDEGEXPRESSION:
2738 case LOCALEXPRESSION:
2739 case GLOBALEXPRESSION:
2740 case SKIPLEXPRESSION:
2741 case SKIPGEXPRESSION:
2749 MesPrint(
"@expressions %s is not active. It cannot be written",name);
2752 SeekScratch(AR.outfile,&pos);
2754 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
2761 if ( AR.GetFile == 2 ) f = AR.hidefile;
2763 prf = Expressions[number].printflag;
2764 if ( plus ) prf |= PRINTONETERM;
2769 SetScratch(f,&(Expressions[number].onfile));
2772 f->POfill = (WORD *)((UBYTE *)(f->PObuffer)
2773 + BASEPOSITION(Expressions[number].onfile));
2775 AO.termbuf = AT.WorkPointer;
2776 AO.bracket = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
2777 AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer*2);
2779 AO.OutFill = AO.OutputLine = (UBYTE *)AT.WorkPointer;
2780 AT.WorkPointer += 2*AC.LineLength;
2781 *(AR.CompressBuffer) = 0;
2787 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE )
2789 if ( GetTerm(BHEAD AO.termbuf) <= 0 ) {
2790 MesPrint(
"@ReadError in expression %s",name);
2803 if ( AO.OptimizationLevel > 0 ) {
2805 if (
Optimize(AO.termbuf[3], 1) )
goto AboWrite;
2814 while ( GetTerm(BHEAD AO.termbuf) ) {
2816 GETSTOP(AO.termbuf,m);
2819 startinline = alreadyinline;
2820 AO.OutFill = AO.OutputLine + startinline;
2821 if ( WriteTerm(AO.termbuf,&lbrac,first,0,0) )
2826 if ( ( prf & PRINTONETERM ) != 0 ) first = 1;
2832 if ( WriteTerm(AO.termbuf,&lbrac,first,0,0) )
2838 startinline = alreadyinline;
2839 AO.OutFill = AO.OutputLine + startinline;
2840 TOKENTOLINE(
" 0",
"0");
2843 TOKENTOLINE(
" )",
")");
2845 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE
2846 && nosemi == 0 ) TokenToLine((UBYTE *)
";");
2848 if ( AC.OutputSpaces == NORMALFORMAT && nosemi == 0 ) {
2852 noextralinefeed = 1;
2854 noextralinefeed = 0;
2858 AT.WorkPointer = AO.termbuf;
2860 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
2864 SetScratch(AR.infile,&pos);
2865 f->POposition = pos;
2866 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
2867 MesCall(
"WriteOne");
int PutPreVar(UBYTE *, UBYTE *, UBYTE *, int)