1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754
|
#ifndef __FDECLARE__
#define __FDECLARE__
/** @file declare.h
*
* Contains macros and function declarations.
*/
/* #[ License : */
/*
* Copyright (C) 1984-2026 J.A.M. Vermaseren
* When using this file you are requested to refer to the publication
* J.A.M.Vermaseren "New features of FORM" math-ph/0010025
* This is considered a matter of courtesy as the development was paid
* for by FOM the Dutch physics granting agency and we would like to
* be able to track its scientific use to convince FOM of its value
* for the community.
*
* This file is part of FORM.
*
* FORM is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* FORM is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with FORM. If not, see <http://www.gnu.org/licenses/>.
*/
/* #] License : */
/*
#[ Macro's :
*/
#define MaX(x,y) ((x) > (y) ? (x): (y))
#define MiN(x,y) ((x) < (y) ? (x): (y))
#define ABS(x) ( (x) < 0 ? -(x): (x) )
#define SGN(x) ( (x) > 0 ? 1 : (x) < 0 ? -1 : 0 )
#define REDLENG(x) ((((x)<0)?((x)+1):((x)-1))/2)
#define INCLENG(x) (((x)<0)?(((x)*2)-1):(((x)*2)+1))
#define GETCOEF(x,y) x += *x;y = x[-1];x -= ABS(y);y=REDLENG(y)
#define GETSTOP(x,y) y=x+(*x)-1;y -= ABS(*y)-1
#define StuffAdd(x,y) (((x)<0?-1:1)*(y)+((y)<0?-1:1)*(x))
#define EXCHN(t1,t2,n) { WORD a,i; for(i=0;i<n;i++){a=t1[i];t1[i]=t2[i];t2[i]=a;} }
#define EXCH(x,y) { WORD a = (x); (x) = (y); (y) = a; }
#define TOKENTOLINE(x,y) if ( AC.OutputSpaces == NOSPACEFORMAT ) { \
TokenToLine((UBYTE *)(y)); } else { TokenToLine((UBYTE *)(x)); }
#define UngetFromStream(stream,c) ((stream)->nextchar[(stream)->isnextchar++]=c)
#ifdef WITHRETURN
#define AddLineFeed(s,n) { (s)[(n)++] = CARRIAGERETURN; (s)[(n)++] = LINEFEED; }
#else
#define AddLineFeed(s,n) { (s)[(n)++] = LINEFEED; }
#endif
#define TryRecover(x) Terminate(-1)
#define UngetChar(c) { pushbackchar = c; }
#define ParseNumber(x,s) {(x)=0;while(*(s)>='0'&&*(s)<='9')(x)=10*(x)+*(s)++ -'0';}
#define ParseSign(sgn,s) {(sgn)=0;while(*(s)=='-'||*(s)=='+'){\
if ( *(s)++ == '-' ) sgn ^= 1;}}
#define ParseSignedNumber(x,s) { int sgn; ParseSign(sgn,s)\
ParseNumber(x,s) if ( sgn ) x = -x; }
/* (n) is necessary here, since the macro is sometimes passed dereferenced pointers for n */
#define NCOPY(s,t,n) { while ( (n)-- > 0 ) { *s++ = *t++; } }
/*#define NCOPY(s,t,n) { memcpy(s,t,n*sizeof(WORD)); s+=n; t+=n; n = -1; }*/
#define NCOPYI(s,t,n) { while ( (n)-- > 0 ) { *s++ = *t++; } }
#define NCOPYB(s,t,n) { while ( (n)-- > 0 ) { *s++ = *t++; } }
#define NCOPYI32(s,t,n) { while ( (n)-- > 0 ) { *s++ = *t++; } }
#define WCOPY(s,t,n) { int nn=n; WORD *ss=(WORD *)s, *tt=(WORD *)t; while ( (nn)-- > 0 ) { *ss++ = *tt++; } }
#define NeedNumber(x,s,err) { int sgn = 1; \
while ( *s == ' ' || *s == '\t' || *s == '-' || *s == '+' ) { \
if ( *s == '-' ) {sgn = -sgn;} s++; } \
if ( chartype[*s] != 1 ) goto err; \
ParseNumber(x,s) \
if ( sgn < 0 ) {(x) = -(x);} while ( *s == ' ' || *s == '\t' ) s++;\
}
#define SKIPBLANKS(s) { while ( *(s) == ' ' || *(s) == '\t' ) (s)++; }
#define FLUSHCONSOLE if ( AP.InOutBuf > 0 ) CharOut(LINEFEED)
#define SKIPBRA1(s) { int lev1=0; s++; while(*s) { if(*s=='['){lev1++;} \
else {if(*s==']'&&--lev1<0){break;}} s++;} }
#define SKIPBRA2(s) { int lev2=0; s++; while(*s) { if(*s=='{'){lev2++;} \
else {if(*s=='}'&&--lev2<0){break;} \
else {if(*s=='['){SKIPBRA1(s)}}} s++;} }
#define SKIPBRA3(s) { int lev3=0; s++; while(*s) { if(*s=='('){lev3++;} \
else {if(*s==')'&&--lev3<0){break;} \
else {if(*s=='{'){SKIPBRA2(s)} \
else {if(*s=='['){SKIPBRA1(s)}}}} s++;} }
#define SKIPBRA4(s) { int lev4=0; s++; while(*s) { if(*s=='('){lev4++;} \
else {if(*s==')'&&--lev4<0){break;} \
else {if(*s=='['){SKIPBRA1(s)}}} s++;} }
#define SKIPBRA5(s) { int lev5=0; s++; while(*s) { if(*s=='{'){lev5++;} \
else {if(*s=='}'&&--lev5<0){break;} \
else {if(*s=='('){SKIPBRA4(s)} \
else {if(*s=='['){SKIPBRA1(s)}}}} s++;} }
/*
#define CYCLE1(a,i) {WORD iX,jX; iX=*a; for(jX=1;jX<i;jX++)a[jX-1]=a[jX]; a[i-1]=iX;}
*/
#define CYCLE1(t,a,i) {t iX=*a; WORD jX; for(jX=1;jX<i;jX++)a[jX-1]=a[jX]; a[i-1]=iX;}
#define AddToCB(c,wx) if(c->Pointer>=c->Top) \
{DoubleCbuffer(c-cbuf,c->Pointer,21);} \
*(c->Pointer)++ = wx;
#define EXCHINOUT { FILEHANDLE *ffFi = AR.outfile; \
AR.outfile = AR.infile; AR.infile = ffFi; }
#define BACKINOUT { FILEHANDLE *ffFi = AR.outfile; POSITION posi; \
AR.outfile = AR.infile; AR.infile = ffFi; \
SetEndScratch(AR.infile,&posi); }
#define CopyArg(to,from) { if ( *from > 0 ) { int ica = *from; NCOPY(to,from,ica) } \
else if ( *from <= -FUNCTION ) *to++ = *from++; \
else { *to++ = *from++; *to++ = *from++; } }
#if ARGHEAD > 2
#define FILLARG(w) { int i = ARGHEAD-2; while ( --i >= 0 ) *w++ = 0; }
#define COPYARG(w,t) { int i = ARGHEAD-2; while ( --i >= 0 ) *w++ = *t++; }
#define ZEROARG(w) { int i; for ( i = 2; i < ARGHEAD; i++ ) w[i] = 0; }
#else
#define FILLARG(w)
#define COPYARG(w,t)
#define ZEROARG(w)
#endif
#if FUNHEAD > 2
#define FILLFUN(w) { *w++ = 0; FILLFUN3(w) }
#define COPYFUN(w,t) { *w++ = *t++; COPYFUN3(w,t) }
#else
#define FILLFUN(w)
#define COPYFUN(w,t)
#endif
#if FUNHEAD > 3
#define FILLFUN3(w) { int ie = FUNHEAD-3; while ( --ie >= 0 ) *w++ = 0; }
#define COPYFUN3(w,t) { int ie = FUNHEAD-3; while ( --ie >= 0 ) *w++ = *t++; }
#else
#define COPYFUN3(w,t)
#define FILLFUN3(w)
#endif
#if SUBEXPSIZE > 5
#define FILLSUB(w) { int ie = SUBEXPSIZE-5; while ( --ie >= 0 ) *w++ = 0; }
#define COPYSUB(w,ww) { int ie = SUBEXPSIZE-5; while ( --ie >= 0 ) *w++ = *ww++; }
#else
#define FILLSUB(w)
#define COPYSUB(w,ww)
#endif
#if EXPRHEAD > 4
#define FILLEXPR(w) { int ie = EXPRHEAD-4; while ( --ie >= 0 ) *w++ = 0; }
#else
#define FILLEXPR(w)
#endif
#define NEXTARG(x) if(*x>0) x += *x; else if(*x <= -FUNCTION)x++; else x += 2;
#define COPY1ARG(s1,t1) { int ica; if ( (ica=*t1) > 0 ) { NCOPY(s1,t1,ica) } \
else if(*t1<=-FUNCTION){*s1++=*t1++;} else{*s1++=*t1++;*s1++=*t1++;} }
/**
* Fills a buffer by zero in the range [begin,end).
*
* @param w The buffer.
* @param begin The index for the beginning of the range.
* @param end The index for the end of the range (exclusive).
*/
#define ZeroFillRange(w,begin,end) do { \
int tmp_i; \
for ( tmp_i = begin; tmp_i < end; tmp_i++ ) { (w)[tmp_i] = 0; } \
} while (0)
#define TABLESIZE(a,b) (((WORD)sizeof(a))/((WORD)sizeof(b)))
#define WORDDIF(x,y) (WORD)(x-y)
#define wsizeof(a) ((WORD)sizeof(a))
#define VARNAME(type,num) (AC.varnames->namebuffer+type[num].name)
#define DOLLARNAME(type,num) (AC.dollarnames->namebuffer+type[num].name)
#define EXPRNAME(num) (AC.exprnames->namebuffer+Expressions[num].name)
#define PREV(x) prevorder?prevorder:x
#define Terminate(x) do { TerminateImpl(x, __FILE__, __LINE__, __FUNCTION__); } while(0)
#define SETERROR(x) { Terminate(-1); return(-1); }
/* use this macro to avoid the unused parameter warning */
#define DUMMYUSE(x) (void)(x);
#ifdef _FILE_OFFSET_BITS
#if _FILE_OFFSET_BITS==64
/*:[19mar2004 mt]*/
#define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(off_t)(x))
#define SETBASELENGTH(ss,x) (ss).p1 = (off_t)(x)
#define SETBASEPOSITION(pp,x) (pp).p1 = (off_t)(x)
#define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(off_t)(x)) )
#define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(off_t)(x)) )
#define DIVPOS(pp,n) ( (pp).p1/(off_t)(n) )
#define MULPOS(pp,n) (pp).p1 *= (off_t)(n)
#else
#define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(x))
#define SETBASELENGTH(ss,x) (ss).p1 = (x)
#define SETBASEPOSITION(pp,x) (pp).p1 = (x)
#define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(LONG)(x)) )
#define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(LONG)(x)) )
#define DIVPOS(pp,n) ( (pp).p1/(n) )
#define MULPOS(pp,n) (pp).p1 *= (n)
#endif
#else
#define ADDPOS(pp,x) (pp).p1 = ((pp).p1+(LONG)(x))
#define SETBASELENGTH(ss,x) (ss).p1 = (LONG)(x)
#define SETBASEPOSITION(pp,x) (pp).p1 = (LONG)(x)
#define ISEQUALPOSINC(pp1,pp2,x) ( (pp1).p1 == ((pp2).p1+(LONG)(x)) )
#define ISGEPOSINC(pp1,pp2,x) ( (pp1).p1 >= ((pp2).p1+(LONG)(x)) )
#define DIVPOS(pp,n) ( (pp).p1/(LONG)(n) )
#define MULPOS(pp,n) (pp).p1 *= (LONG)(n)
#endif
#define DIFPOS(ss,pp1,pp2) (ss).p1 = ((pp1).p1-(pp2).p1)
#define DIFBASE(pp1,pp2) ((pp1).p1-(pp2).p1)
#define ADD2POS(pp1,pp2) (pp1).p1 += (pp2).p1
#define PUTZERO(pp) (pp).p1 = 0
#define BASEPOSITION(pp) ((pp).p1)
#define SETSTARTPOS(pp) (pp).p1 = -2
#define NOTSTARTPOS(pp) ( (pp).p1 > -2 )
#define ISMINPOS(pp) ( (pp).p1 == -1 )
#define ISEQUALPOS(pp1,pp2) ( (pp1).p1 == (pp2).p1 )
#define ISNOTEQUALPOS(pp1,pp2) ( (pp1).p1 != (pp2).p1 )
#define ISLESSPOS(pp1,pp2) ( (pp1).p1 < (pp2).p1 )
#define ISGEPOS(pp1,pp2) ( (pp1).p1 >= (pp2).p1 )
#define ISNOTZEROPOS(pp) ( (pp).p1 != 0 )
#define ISZEROPOS(pp) ( (pp).p1 == 0 )
#define ISPOSPOS(pp) ( (pp).p1 > 0 )
#define ISNEGPOS(pp) ( (pp).p1 < 0 )
extern void TELLFILE(int,POSITION *);
#define TOLONG(x) ((LONG)(x))
#define Add2Com(x) { WORD cod[2]; cod[0] = x; cod[1] = 2; AddNtoL(2,cod); }
#define Add3Com(x1,x2) { WORD cod[3]; cod[0] = x1; cod[1] = 3; cod[2] = x2; AddNtoL(3,cod); }
#define Add4Com(x1,x2,x3) { WORD cod[4]; cod[0] = x1; cod[1] = 4; \
cod[2] = x2; cod[3] = x3; AddNtoL(4,cod); }
#define Add5Com(x1,x2,x3,x4) { WORD cod[5]; cod[0] = x1; cod[1] = 5; \
cod[2] = x2; cod[3] = x3; cod[4] = x4; AddNtoL(5,cod); }
/*
The temporary variable ppp is to avoid a compiler warning about strict aliassing
*/
#define WantAddPointers(x) while((AT.pWorkPointer+(x))>AR.pWorkSize){WORD ***ppp=&AT.pWorkSpace;\
ExpandBuffer((void **)ppp,&AR.pWorkSize,(int)(sizeof(WORD *)));}
#define WantAddLongs(x) while((AT.lWorkPointer+(x))>AR.lWorkSize){LONG **ppp=&AT.lWorkSpace;\
ExpandBuffer((void **)ppp,&AR.lWorkSize,sizeof(LONG));}
#define WantAddPositions(x) while((AT.posWorkPointer+(x))>AR.posWorkSize){POSITION **ppp=&AT.posWorkSpace;\
ExpandBuffer((void **)ppp,&AR.posWorkSize,sizeof(POSITION));}
/* inline in form3.h (or config.h). */
#define FORM_INLINE inline
/*
Macro's for memory management. This can be done by routines, but that
would be slower. Inline routines could do this, but we don't want to
leave this to the friendliness of the compiler(s).
The routines can be found in the file tools.c
*/
#define MEMORYMACROS
#ifdef MEMORYMACROS
#define TermMalloc(x) ( (AT.TermMemTop <= 0 ) ? TermMallocAddMemory(BHEAD0), AT.TermMemHeap[--AT.TermMemTop]: AT.TermMemHeap[--AT.TermMemTop] )
#define NumberMalloc(x) ( (AT.NumberMemTop <= 0 ) ? NumberMallocAddMemory(BHEAD0), AT.NumberMemHeap[--AT.NumberMemTop]: AT.NumberMemHeap[--AT.NumberMemTop] )
#define CacheNumberMalloc(x) ( (AT.CacheNumberMemTop <= 0 ) ? CacheNumberMallocAddMemory(BHEAD0), AT.CacheNumberMemHeap[--AT.CacheNumberMemTop]: AT.CacheNumberMemHeap[--AT.CacheNumberMemTop] )
#define TermFree(TermMem,x) AT.TermMemHeap[AT.TermMemTop++] = (WORD *)(TermMem)
#define NumberFree(NumberMem,x) AT.NumberMemHeap[AT.NumberMemTop++] = (UWORD *)(NumberMem)
#define CacheNumberFree(NumberMem,x) AT.CacheNumberMemHeap[AT.CacheNumberMemTop++] = (UWORD *)(NumberMem)
#else
#define TermMalloc(x) TermMalloc2(BHEAD (char *)(x))
#define NumberMalloc(x) NumberMalloc2(BHEAD (char *)(x))
#define CacheNumberMalloc(x) CacheNumberMalloc2(BHEAD (char *)(x))
#define TermFree(x,y) TermFree2(BHEAD (WORD *)(x),(char *)(y))
#define NumberFree(x,y) NumberFree2(BHEAD (UWORD *)(x),(char *)(y))
#define CacheNumberFree(x,y) CacheNumberFree2(BHEAD (UWORD *)(x),(char *)(y))
#endif
/*
* Macros for checking nesting levels in the compiler, used as follows:
*
* AC.IfSumCheck[AC.IfLevel] = NestingChecksum();
* AC.IfLevel++;
*
* AC.IfLevel--;
* if ( AC.IfSumCheck[AC.IfLevel] != NestingChecksum() ) {
* MesNesting();
* }
*
* Note that NestingChecksum() also contains AC.IfLevel and so in this case
* using increment/decrement operators on it in the left-hand side may be
* confusing.
*/
#define NestingChecksum() (AC.IfLevel + AC.RepLevel + AC.arglevel + AC.insidelevel + AC.termlevel + AC.inexprlevel + AC.dolooplevel +AC.SwitchLevel)
#define MesNesting() MesPrint("&Illegal nesting of if, repeat, argument, inside, term, inexpression and do")
#define MarkPolyRatFunDirty(T) {if(*T&&AR.PolyFunType==2){WORD *TP,*TT;TT=T+*T;TT-=ABS(TT[-1]);\
TP=T+1;while(TP<TT){if(*TP==AR.PolyFun){TP[2]|=(DIRTYFLAG|MUSTCLEANPRF);}TP+=TP[1];}}}
/*
Macros for nesting input levels for #$name = ...; assign instructions.
Note that the level should never go below zero.
*/
#define PUSHPREASSIGNLEVEL AP.PreAssignLevel++; { GETIDENTITY \
if ( AP.PreAssignLevel >= AP.MaxPreAssignLevel ) { int i; \
LONG *ap = (LONG *)Malloc1(2*AP.MaxPreAssignLevel*sizeof(LONG *),"PreAssignStack"); \
for ( i = 0; i < AP.MaxPreAssignLevel; i++ ) ap[i] = AP.PreAssignStack[i]; \
M_free(AP.PreAssignStack,"PreAssignStack"); \
AP.MaxPreAssignLevel *= 2; AP.PreAssignStack = ap; \
} \
*AT.WorkPointer++ = AP.PreContinuation; AP.PreContinuation = 0; \
AP.PreAssignStack[AP.PreAssignLevel] = AC.iPointer - AC.iBuffer; }
#define POPPREASSIGNLEVEL if ( AP.PreAssignLevel > 0 ) { GETIDENTITY \
AC.iPointer = AC.iBuffer + AP.PreAssignStack[AP.PreAssignLevel--]; \
AP.PreContinuation = *--AT.WorkPointer; \
*AC.iPointer = 0; }
#ifdef WITHFLOAT
/*
The following macro's are needed to avoid problems with the compilers
and gmp.h. For the C++ files we need the Form include files to be inside
and extern C {} environment, but then the structs.h needs gmp.h to
recognise the mpf_t datatype. This causes no end of problems.
Hence we collect the sensitive objects as (void *) and cast them to
something usable with the macro's below. This way the gmp.h file
needs to be included only in a very limited number of .c files.
*/
#define mpftab1 ((mpf_t *)(AT.mpf_tab1))
#define mpftab2 ((mpf_t *)(AT.mpf_tab2))
#define mpfaux_ ((mpf_t *)(AT.aux_))
#define aux1 (((mpf_t *)(AT.aux_))[0])
#define aux2 (((mpf_t *)(AT.aux_))[1])
#define aux3 (((mpf_t *)(AT.aux_))[2])
#define aux4 (((mpf_t *)(AT.aux_))[3])
#define aux5 (((mpf_t *)(AT.aux_))[4])
#define auxjm (((mpf_t *)(AT.aux_))[5])
#define auxjjm (((mpf_t *)(AT.aux_))[6])
#define auxsum (((mpf_t *)(AT.aux_))[7])
#define mpfdelta1 (((mpf_t *)(AS.delta_1))[0])
#endif
/*
MesPrint("P-level popped to %d with %d",AP.PreAssignLevel,(WORD)(AC.iPointer - AC.iBuffer));
#] Macro's :
#[ Inline functions :
*/
/*
* The following three functions give the unsigned absolute value of a signed
* integer even for the most negative integer. This is beyond the scope of
* the standard abs() function and its family, whose return-values are signed.
* In short, we should not use the unary minus operator with signed numbers
* unless we are sure that there are no integer overflows. Instead, we rely on
* two well-defined operations: (i) signed-to-unsigned conversion and
* (ii) unary minus of unsigned operands.
*
* See also:
* https://stackoverflow.com/a/4536188 (Unary minus and signed-to-unsigned conversion)
* https://stackoverflow.com/q/8026694 (C: unary minus operator behavior with unsigned operands)
* https://stackoverflow.com/q/1610947 (Why does stdlib.h's abs() family of functions return a signed value?)
* https://blog.regehr.org/archives/226 (A Guide to Undefined Behavior in C and C++, Part 2)
*/
static inline unsigned int IntAbs(int x)
{
if ( x >= 0 ) return (unsigned int)x;
return(-((unsigned int)x));
}
static inline UWORD WordAbs(WORD x)
{
if ( x >= 0 ) return (UWORD)x;
return(-((UWORD)x));
}
static inline ULONG LongAbs(LONG x)
{
if ( x >= 0 ) return (ULONG)x;
return(-((ULONG)x));
}
/*
* The following functions provide portable unsigned-to-signed conversions
* (to avoid the implementation-defined behaviour), which is expected to be
* optimized to a no-op.
*
* See also:
* https://stackoverflow.com/a/13208789 (Efficient unsigned-to-signed cast avoiding implementation-defined behavior)
*/
static inline int UnsignedToInt(unsigned int x)
{
extern void TerminateImpl(int, const char*, int, const char*) NORETURN;
if ( x <= INT_MAX ) return((int)x);
if ( x >= (unsigned int)INT_MIN )
return((int)(x - (unsigned int)INT_MIN) + INT_MIN);
Terminate(1);
return(0);
}
static inline WORD UWordToWord(UWORD x)
{
extern void TerminateImpl(int, const char*, int, const char*) NORETURN;
if ( x <= WORD_MAX_VALUE ) return((WORD)x);
if ( x >= (UWORD)WORD_MIN_VALUE )
return((WORD)(x - (UWORD)WORD_MIN_VALUE) + WORD_MIN_VALUE);
Terminate(1);
return(0);
}
static inline LONG ULongToLong(ULONG x)
{
extern void TerminateImpl(int, const char*, int, const char*) NORETURN;
if ( x <= LONG_MAX_VALUE ) return((LONG)x);
if ( x >= (ULONG)LONG_MIN_VALUE )
return((LONG)(x - (ULONG)LONG_MIN_VALUE) + LONG_MIN_VALUE);
Terminate(1);
return(0);
}
/*
#] Inline functions :
#[ Thread objects :
*/
/**
* NOTE: We have replaced LOCK(ErrorMessageLock) and UNLOCK(ErrorMessageLock)
* by MLOCK(ErrorMessageLock) and MUNLOCK(ErrorMessageLock). They are used
* for the synchronised output in ParFORM.
* (TU 28 May 2011)
*/
#ifdef WITHPTHREADS
#define EXTERNLOCK(x) extern pthread_mutex_t x;
#define INILOCK(x) pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER;
#define EXTERNRWLOCK(x) extern pthread_rwlock_t x;
#define INIRWLOCK(x) pthread_rwlock_t x = PTHREAD_RWLOCK_INITIALIZER;
#ifdef DEBUGGINGLOCKS
#include <asm/errno.h>
#define LOCK(x) while ( pthread_mutex_trylock(&(x)) == EBUSY ) {}
#define RWLOCKR(x) while ( pthread_rwlock_tryrdlock(&(x)) == EBUSY ) {}
#define RWLOCKW(x) while ( pthread_rwlock_trywrlock(&(x)) == EBUSY ) {}
#else
#define LOCK(x) pthread_mutex_lock(&(x))
#define RWLOCKR(x) pthread_rwlock_rdlock(&(x))
#define RWLOCKW(x) pthread_rwlock_wrlock(&(x))
#endif
#define UNLOCK(x) pthread_mutex_unlock(&(x))
#define UNRWLOCK(x) pthread_rwlock_unlock(&(x))
#define MLOCK(x) LOCK(x)
#define MUNLOCK(x) UNLOCK(x)
#define GETBIDENTITY
#define GETIDENTITY int identity = WhoAmI(); ALLPRIVATES *B = AB[identity];
#else
#define EXTERNLOCK(x)
#define INILOCK(x)
#define LOCK(x)
#define UNLOCK(x)
#define EXTERNRWLOCK(x)
#define INIRWLOCK(x)
#define RWLOCKR(x)
#define RWLOCKW(x)
#define UNRWLOCK(x)
#ifdef WITHMPI
#define MLOCK(x) do { if ( PF.me != MASTER ) PF_MLock(); } while (0)
#define MUNLOCK(x) do { if ( PF.me != MASTER ) PF_MUnlock(); } while (0)
#else
#define MLOCK(x)
#define MUNLOCK(x)
#endif
#define GETIDENTITY
#define GETBIDENTITY
#endif
/*
#] Thread objects :
#[ Declarations :
*/
#ifdef TERMMALLOCDEBUG
extern WORD **DebugHeap1, **DebugHeap2;
#endif
/**
* All functions (well, nearly all) are declared here.
*/
extern void StartVariables(void);
extern void setSignalHandlers(void);
extern UBYTE *CodeToLine(WORD,UBYTE *);
extern UBYTE *AddArrayIndex(WORD ,UBYTE *);
extern INDEXENTRY *FindInIndex(WORD,FILEDATA *,WORD,WORD);
extern INDEXENTRY *NextFileIndex(POSITION *);
extern WORD *PasteTerm(PHEAD WORD,WORD *,WORD *,WORD,WORD);
extern UBYTE *StrCopy(UBYTE *,UBYTE *);
extern UBYTE *WrtPower(UBYTE *,WORD);
extern int AccumGCD(PHEAD UWORD *,WORD *,UWORD *,WORD);
extern void AddArgs(PHEAD WORD *,WORD *,WORD *);
extern int AddCoef(PHEAD WORD **,WORD **);
extern int AddLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int AddPLon(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int AddPoly(PHEAD WORD **,WORD **);
extern int AddRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern void AddToLine(UBYTE *);
extern int AddWild(PHEAD WORD,WORD,WORD);
extern int BigLong(UWORD *,WORD,UWORD *,WORD);
extern int BinomGen(PHEAD WORD *,WORD,WORD **,WORD,WORD,WORD,WORD,WORD,UWORD *,WORD);
extern int CheckWild(PHEAD WORD,WORD,WORD,WORD *);
extern int Chisholm(PHEAD WORD *,WORD);
extern int CleanExpr(WORD);
extern void CleanUp(WORD);
extern void ClearWild(PHEAD0);
extern int CompareFunctions(WORD *,WORD *);
extern int Commute(WORD *,WORD *);
extern WORD DetCommu(WORD *);
extern WORD DoesCommu(WORD *);
extern int CompArg(WORD *,WORD *);
extern WORD CompCoef(WORD *, WORD *);
extern int CompGroup(PHEAD WORD,WORD **,WORD *,WORD *,WORD);
extern WORD Compare1(PHEAD WORD *,WORD *,WORD);
extern WORD CountDo(WORD *,WORD *);
extern WORD CountFun(WORD *,WORD *);
extern WORD DimensionSubterm(WORD *);
extern WORD DimensionTerm(WORD *);
extern WORD DimensionExpression(PHEAD WORD *);
extern int Deferred(PHEAD WORD *,WORD);
extern int DeleteStore(WORD);
extern WORD DetCurDum(PHEAD WORD *);
extern void DetVars(WORD *,WORD);
extern int Distribute(DISTRIBUTE *,WORD);
extern int DivLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *,UWORD *,WORD *);
extern int DivRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int Divvy(PHEAD UWORD *,WORD *,UWORD *,WORD);
extern int DoDelta(WORD *);
extern int DoDelta3(PHEAD WORD *,WORD);
extern int TestPartitions(WORD *, PARTI *);
extern int DoPartitions(PHEAD WORD *,WORD);
extern int CoCanonicalize(UBYTE *);
extern int DoCanonicalize(PHEAD WORD *, WORD *);
extern int GenDiagrams(PHEAD WORD *,WORD);
extern int DoTopologyCanonicalize(PHEAD WORD *,WORD,WORD,WORD *);
extern int DoShattering(PHEAD WORD *,WORD *,WORD *,WORD);
extern int DoTableExpansion(WORD *,WORD);
extern int DoDistrib(PHEAD WORD *,WORD);
extern int DoShuffle(WORD *,WORD,WORD,WORD);
extern int DoPermutations(PHEAD WORD *,WORD);
extern int Shuffle(WORD *, WORD *, WORD *);
extern int FinishShuffle(WORD *);
extern int DoStuffle(WORD *,WORD,WORD,WORD);
extern int Stuffle(WORD *, WORD *, WORD *);
extern int FinishStuffle(WORD *);
extern WORD *StuffRootAdd(WORD *, WORD *, WORD *);
extern int TestUse(WORD *,WORD);
extern DBASE *FindTB(UBYTE *);
extern int CheckTableDeclarations(DBASE *);
extern void Apply(WORD *,WORD);
extern int ApplyExec(WORD *,int,WORD);
extern void ApplyReset(WORD);
extern void TableReset(void);
extern void ReWorkT(WORD *,WORD *,WORD);
extern WORD GetIfDollarNum(WORD *, WORD *);
extern int FindVar(WORD *,WORD *);
extern int DoIfStatement(PHEAD WORD *,WORD *);
extern int DoOnePow(PHEAD WORD *,WORD,WORD,WORD *,WORD *,WORD,WORD *);
extern void DoRevert(WORD *,WORD *);
extern int DoSumF1(PHEAD WORD *,WORD *,WORD,WORD);
extern int DoSumF2(PHEAD WORD *,WORD *,WORD,WORD);
extern int DoTheta(PHEAD WORD *);
extern LONG EndSort(PHEAD WORD *,int);
extern int EntVar(WORD,UBYTE *,WORD,WORD,WORD,WORD);
extern int EpfCon(PHEAD WORD *,WORD *,WORD,WORD);
extern int EpfFind(PHEAD WORD *,WORD *);
extern WORD EpfGen(WORD,WORD *,WORD *,WORD *,WORD);
extern int EqualArg(WORD *,WORD,WORD);
extern int Factorial(PHEAD WORD,UWORD *,WORD *);
extern int Bernoulli(WORD,UWORD *,WORD *);
extern int FactorIn(PHEAD WORD *,WORD);
extern int FactorInExpr(PHEAD WORD *,WORD);
extern int FindAll(PHEAD WORD *,WORD *,WORD,WORD *);
extern WORD FindMulti(PHEAD WORD *,WORD *);
extern int FindOnce(PHEAD WORD *,WORD *);
extern int FindOnly(PHEAD WORD *,WORD *);
extern int FindRest(PHEAD WORD *,WORD *);
extern void FindSpecial(WORD *);
extern WORD FindrNumber(WORD,VARRENUM *);
extern void FiniLine(void);
extern int FiniTerm(PHEAD WORD *,WORD *,WORD *,WORD,WORD);
extern int FlushOut(POSITION *,FILEHANDLE *,int);
extern void FunLevel(PHEAD WORD *);
extern void AdjustRenumScratch(PHEAD0);
extern void GarbHand(void);
extern int GcdLong(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int LcmLong(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern void GCD(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern ULONG GCD2(ULONG,ULONG);
extern int Generator(PHEAD WORD *,WORD);
extern int GetBinom(UWORD *,WORD *,WORD,WORD);
extern WORD GetFromStore(WORD *,POSITION *,RENUMBER,WORD *,WORD);
extern int GetLong(UBYTE *,UWORD *,WORD *);
extern WORD GetMoreTerms(WORD *);
extern int GetMoreFromMem(WORD *,WORD **);
extern WORD GetOneTerm(PHEAD WORD *,FILEHANDLE *,POSITION *,int);
extern RENUMBER GetTable(WORD,POSITION *,WORD);
extern WORD GetTerm(PHEAD WORD *);
extern int Glue(PHEAD WORD *,WORD *,WORD *,WORD);
extern int InFunction(PHEAD WORD *,WORD *);
extern void IniLine(WORD);
extern void IniVars(void);
extern int InsertTerm(PHEAD WORD *,WORD,WORD,WORD *,WORD *,WORD);
extern void LongToLine(UWORD *,WORD);
extern int MakeDirty(WORD *,WORD *,WORD);
extern void MarkDirty(WORD *,WORD);
extern void PolyFunDirty(PHEAD WORD *);
extern void PolyFunClean(PHEAD WORD *);
extern int MakeModTable(void);
extern int MatchE(PHEAD WORD *,WORD *,WORD *,WORD);
extern int MatchCy(PHEAD WORD *,WORD *,WORD *,WORD);
extern int FunMatchCy(PHEAD WORD *,WORD *,WORD *,WORD);
extern int FunMatchSy(PHEAD WORD *,WORD *,WORD *,WORD);
extern int MatchArgument(PHEAD WORD *,WORD *);
extern int MatchFunction(PHEAD WORD *,WORD *,WORD *);
extern int MergePatches(WORD);
extern int MesCerr(char *, UBYTE *);
extern int MesComp(char *, UBYTE *, UBYTE *);
extern int Modulus(WORD *);
extern void MoveDummies(PHEAD WORD *,WORD);
extern int MulLong(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int MulRat(PHEAD UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern int Mully(PHEAD UWORD *,WORD *,UWORD *,WORD);
extern int MultDo(PHEAD WORD *,WORD *);
extern int NewSort(PHEAD0);
extern int ExtraSymbol(WORD,WORD,WORD,WORD *,WORD *);
extern int Normalize(PHEAD WORD *);
extern int BracketNormalize(PHEAD WORD *);
extern void DropCoefficient(PHEAD WORD *);
extern void DropSymbols(PHEAD WORD *);
extern int PutInside(PHEAD WORD *, WORD *);
extern void OpenTemp(void);
extern void Pack(UWORD *,WORD *,UWORD *,WORD );
extern LONG PasteFile(PHEAD WORD,WORD *,POSITION *,WORD **,RENUMBER,WORD *,WORD);
extern int Permute(PERM *,WORD);
extern int PermuteP(PERMP *,WORD);
extern int PolyFunMul(PHEAD WORD *);
extern int PopVariables(void);
extern int PrepPoly(PHEAD WORD *,WORD);
extern int Processor(void);
extern int Product(UWORD *,WORD *,WORD);
extern void PrtLong(UWORD *,WORD,UBYTE *);
extern void PrtTerms(void);
extern void PrintDeprecation(const char *,const char *);
extern void PrintFeatureList(void);
extern void PrintRunningTime(void);
extern LONG GetRunningTime(void);
extern int PutBracket(PHEAD WORD *);
extern LONG PutIn(FILEHANDLE *,POSITION *,WORD *,WORD **,int);
extern int PutInStore(INDEXENTRY *,WORD);
extern WORD PutOut(PHEAD WORD *,POSITION *,FILEHANDLE *,WORD);
extern UWORD Quotient(UWORD *,WORD *,WORD);
extern int RaisPow(PHEAD UWORD *,WORD *,UWORD);
extern void RaisPowCached (PHEAD WORD, WORD, UWORD **, WORD *);
extern WORD RaisPowMod (WORD, WORD, WORD);
extern int NormalModulus(UWORD *,WORD *);
extern int MakeInverses(void);
extern int GetModInverses(WORD,WORD,WORD *,WORD *);
extern int GetLongModInverses(PHEAD UWORD *, WORD, UWORD *, WORD, UWORD *, WORD *, UWORD *, WORD *);
extern void RatToLine(UWORD *,WORD);
extern int RatioFind(PHEAD WORD *,WORD *);
extern int RatioGen(PHEAD WORD *,WORD *,WORD,WORD);
extern WORD ReNumber(PHEAD WORD *);
extern WORD ReadSnum(UBYTE **);
extern WORD Remain10(UWORD *,WORD *);
extern WORD Remain4(UWORD *,WORD *);
extern int ResetScratch(void);
extern int ResolveSet(PHEAD WORD *,WORD *,WORD *);
extern int RevertScratch(void);
extern int ScanFunctions(PHEAD WORD *,WORD *,WORD);
extern void SeekScratch(FILEHANDLE *,POSITION *);
extern void SetEndScratch(FILEHANDLE *,POSITION *);
extern void SetEndHScratch(FILEHANDLE *,POSITION *);
extern int SetFileIndex(void);
extern int Sflush(FILEHANDLE *);
extern int Simplify(PHEAD UWORD *,WORD *,UWORD *,WORD *);
extern int SortWild(WORD *,WORD);
extern FILE *LocateBase(char **,char **,char *);
extern LONG SplitMerge(PHEAD WORD **,LONG);
extern int StoreTerm(PHEAD WORD *);
extern void SubPLon(UWORD *,WORD,UWORD *,WORD,UWORD *,WORD *);
extern void Substitute(PHEAD WORD *,WORD *,WORD);
extern int SymFind(PHEAD WORD *,WORD *);
extern int SymGen(PHEAD WORD *,WORD *,WORD,WORD);
extern WORD Symmetrize(PHEAD WORD *,WORD *,WORD,WORD,WORD);
extern int FullSymmetrize(PHEAD WORD *,int);
extern int TakeModulus(UWORD *,WORD *,UWORD *,WORD,WORD);
extern int TakeNormalModulus(UWORD *,WORD *,UWORD *,WORD,WORD);
extern void TalToLine(UWORD);
extern int TenVec(PHEAD WORD *,WORD *,WORD,WORD);
extern int TenVecFind(PHEAD WORD *,WORD *);
extern int TermRenumber(WORD *,RENUMBER,WORD);
extern void TestDrop(void);
extern void PutInVflags(WORD);
extern int TestMatch(PHEAD WORD *,WORD *);
extern WORD TestSub(PHEAD WORD *,WORD);
extern LONG TimeCPU(WORD);
extern LONG TimeChildren(WORD);
extern LONG TimeWallClock(WORD);
extern LONG Timer(int);
extern int GetTimerInfo(LONG **,LONG **);
extern void WriteTimerInfo(LONG *,LONG *);
extern LONG GetWorkerTimes(void);
extern int ToStorage(EXPRESSIONS,POSITION *);
extern void TokenToLine(UBYTE *);
extern int Trace4(PHEAD WORD *,WORD *,WORD,WORD);
extern int Trace4Gen(PHEAD TRACES *,WORD);
extern int Trace4no(WORD,WORD *,TRACES *);
extern int TraceFind(PHEAD WORD *,WORD *);
extern int TraceN(PHEAD WORD *,WORD *,WORD,WORD);
extern int TraceNgen(PHEAD TRACES *,WORD);
extern WORD TraceNno(WORD,WORD *,TRACES *);
extern int Traces(PHEAD WORD *,WORD *,WORD,WORD);
extern WORD Trick(WORD *,TRACES *);
extern int TryDo(PHEAD WORD *,WORD *,WORD);
extern void UnPack(UWORD *,WORD,WORD *,WORD *);
extern int VarStore(UBYTE *,WORD,WORD,WORD);
extern WORD WildFill(PHEAD WORD *,WORD *,WORD *);
extern int WriteAll(void);
extern int WriteOne(UBYTE *,int,int,WORD);
extern void WriteArgument(WORD *);
extern int WriteExpression(WORD *,LONG);
extern int WriteInnerTerm(WORD *,WORD);
extern void WriteLists(void);
extern void WriteSetup(void);
extern void WriteStats(POSITION *,WORD,WORD);
extern int WriteSubTerm(WORD *,WORD);
extern int WriteTerm(WORD *,WORD *,WORD,WORD,WORD);
extern int execarg(PHEAD WORD *,WORD);
extern int execterm(PHEAD WORD *,WORD);
extern void SpecialCleanup(PHEAD0);
extern void SetMods(void);
extern void UnSetMods(void);
/*---------------------------------------------------------------------*/
extern int DoExecute(WORD,WORD);
extern void SetScratch(FILEHANDLE *,POSITION *);
extern void Warning(char *);
extern void HighWarning(char *);
extern int SpareTable(TABLES);
extern UBYTE *strDup1(UBYTE *,char *);
extern void *Malloc1(LONG,const char *);
extern int DoTail(int,UBYTE **);
extern int OpenInput(void);
extern int PutPreVar(UBYTE *,UBYTE *,UBYTE *,int);
extern void Error0(char *);
extern void Error1(char *,UBYTE *);
extern void Error2(char *,char *,UBYTE *);
extern UBYTE ReadFromStream(STREAM *);
extern UBYTE GetFromStream(STREAM *);
extern UBYTE LookInStream(STREAM *);
extern STREAM *OpenStream(UBYTE *,int,int,int);
extern int LocateFile(UBYTE **,int);
extern STREAM *CloseStream(STREAM *);
extern void PositionStream(STREAM *,LONG);
extern int ReverseStatements(STREAM *);
extern int ProcessOption(UBYTE *,UBYTE *,int);
extern int DoSetups(void);
extern void TerminateImpl(int, const char *,int, const char *) NORETURN;
extern NAMENODE *GetNode(NAMETREE *,UBYTE *);
extern int AddName(NAMETREE *,UBYTE *,WORD,WORD,int *);
extern int GetName(NAMETREE *,UBYTE *,WORD *,int);
extern UBYTE *GetFunction(UBYTE *,WORD *);
extern UBYTE *GetNumber(UBYTE *,WORD *);
extern int GetLastExprName(UBYTE *,WORD *);
extern int GetAutoName(UBYTE *,WORD *);
extern int GetVar(UBYTE *,WORD *,WORD *,int,int);
extern int MakeDubious(NAMETREE *,UBYTE *,WORD *);
extern int GetOName(NAMETREE *,UBYTE *,WORD *,int);
extern void DumpTree(NAMETREE *);
extern void DumpNode(NAMETREE *,WORD,WORD);
extern void LinkTree(NAMETREE *,WORD,WORD);
extern void CopyTree(NAMETREE *,NAMETREE *,WORD,WORD);
extern int CompactifyTree(NAMETREE *,WORD);
extern NAMETREE *MakeNameTree(void);
extern void FreeNameTree(NAMETREE *);
extern int AddExpression(UBYTE *,int,int);
extern int AddSymbol(UBYTE *,int,int,int,int);
extern int AddDollar(UBYTE *,WORD,WORD *,LONG);
extern int ReplaceDollar(WORD,WORD,WORD *,LONG);
extern int DollarRaiseLow(UBYTE *,LONG);
extern int AddVector(UBYTE *,int,int);
extern int AddDubious(UBYTE *);
extern int AddIndex(UBYTE *,int,int);
extern UBYTE *DoDimension(UBYTE *,int *,int *);
extern int AddFunction(UBYTE *,int,int,int,int,int,int,int);
extern int CoCommuteInSet(UBYTE *);
extern int CoFunction(UBYTE *,int,int);
extern int TestName(UBYTE *);
extern int AddSet(UBYTE *,WORD);
extern int DoElements(UBYTE *,SETS,UBYTE *);
extern int DoTempSet(UBYTE *,UBYTE *);
extern int NameConflict(int,UBYTE *);
extern int OpenFile(char *);
extern int OpenAddFile(char *);
extern int ReOpenFile(char *);
extern int CreateFile(char *);
extern int CreateLogFile(char *);
extern void CloseFile(int);
extern int CopyFile(char *, char *);
extern int CreateHandle(void);
extern LONG ReadFile(int,UBYTE *,LONG);
extern LONG ReadPosFile(PHEAD FILEHANDLE *,UBYTE *,LONG,POSITION *);
extern LONG WriteFileToFile(int,UBYTE *,LONG);
extern void SeekFile(int,POSITION *,int);
extern LONG TellFile(int);
extern void FlushFile(int);
extern int GetPosFile(int,fpos_t *);
extern int SetPosFile(int,fpos_t *);
extern void SynchFile(int);
extern void TruncateFile(int);
extern int GetChannel(char *,int);
extern int GetAppendChannel(char *);
extern int CloseChannel(char *);
extern void inictable(void);
extern KEYWORD *findcommand(UBYTE *);
extern int inicbufs(void);
extern void StartFiles(void);
extern UBYTE *MakeDate(void);
extern void PreProcessor(void);
extern void *FromList(LIST *);
extern void *From0List(LIST *);
extern void *FromVarList(LIST *);
extern int DoubleList(void ***,int *,int,char *);
extern int DoubleLList(void ***,LONG *,int,char *);
extern void DoubleBuffer(void **,void **,int,char *);
extern void ExpandBuffer(void **,LONG *,int);
extern LONG iexp(LONG,int);
extern int IsLikeVector(WORD *);
extern int AreArgsEqual(WORD *,WORD *);
extern int CompareArgs(WORD *,WORD *);
extern UBYTE *SkipField(UBYTE *,int);
extern int StrCmp(UBYTE *,UBYTE *);
extern int StrICmp(UBYTE *,UBYTE *);
extern int StrHICmp(UBYTE *,UBYTE *);
extern int StrICont(UBYTE *,UBYTE *);
extern int CmpArray(WORD *,WORD *,WORD);
extern int ConWord(UBYTE *,UBYTE *);
extern int StrLen(UBYTE *);
extern UBYTE *GetPreVar(UBYTE *,int);
extern void ToGeneral(WORD *,WORD *,WORD);
extern WORD ToPolyFunGeneral(PHEAD WORD *);
extern int ToFast(WORD *,WORD *);
extern SETUPPARAMETERS *GetSetupPar(UBYTE *);
extern int RecalcSetups(void);
extern int AllocSetups(void);
extern SORTING *AllocSort(LONG,LONG,LONG,LONG,int,int,LONG,int);
extern void AllocSortFileName(SORTING *);
extern UBYTE *LoadInputFile(UBYTE *,int);
extern UBYTE GetInput(void);
extern void ClearPushback(void);
extern UBYTE GetChar(int);
extern void CharOut(UBYTE);
extern void UnsetAllowDelay(void);
extern void PopPreVars(int);
extern void IniModule(int);
extern void IniSpecialModule(int);
extern int ModuleInstruction(int *,int *);
extern int PreProInstruction(void);
extern int LoadInstruction(int);
extern int LoadStatement(int);
extern KEYWORD *FindKeyWord(UBYTE *,KEYWORD *,int);
extern KEYWORD *FindInKeyWord(UBYTE *,KEYWORD *,int);
extern int DoDefine(UBYTE *);
extern int DoRedefine(UBYTE *);
extern int TheDefine(UBYTE *,int);
extern int TheUndefine(UBYTE *);
extern int ClearMacro(UBYTE *);
extern int DoUndefine(UBYTE *);
extern int DoInclude(UBYTE *);
extern int DoReverseInclude(UBYTE *);
extern int Include(UBYTE *,int);
/*[14apr2004 mt]:*/
extern int DoExternal(UBYTE *);
extern int DoToExternal(UBYTE *);
extern int DoFromExternal(UBYTE *);
extern int DoPrompt(UBYTE *);
extern int DoSetExternal(UBYTE *);
/*[10may2006 mt]:*/
extern int DoSetExternalAttr(UBYTE *);
/*:[10may2006 mt]*/
extern int DoRmExternal(UBYTE *);
/*:[14apr2004 mt]*/
extern int DoFactDollar(UBYTE *);
extern WORD GetDollarNumber(UBYTE **,DOLLARS);
extern int DoSetRandom(UBYTE *);
extern int DoOptimize(UBYTE *);
extern int DoClearOptimize(UBYTE *);
extern int DoSkipExtraSymbols(UBYTE *);
extern int DoTimeOutAfter(UBYTE *);
extern int DoMessage(UBYTE *);
extern int DoPreOut(UBYTE *);
extern int DoPreAppend(UBYTE *);
extern int DoPreCreate(UBYTE *);
extern int DoPreAssign(UBYTE *);
extern int DoPreBreak(UBYTE *);
extern int DoPreDefault(UBYTE *);
extern int DoPreSwitch(UBYTE *);
extern int DoPreEndSwitch(UBYTE *);
extern int DoPreCase(UBYTE *);
extern int DoPreShow(UBYTE *);
extern int DoPreExchange(UBYTE *);
extern int DoSystem(UBYTE *);
extern int DoPipe(UBYTE *);
extern void StartPrepro(void);
extern int DoIfdef(UBYTE *,int);
extern int DoIfydef(UBYTE *);
extern int DoIfndef(UBYTE *);
extern int DoElse(UBYTE *);
extern int DoElseif(UBYTE *);
extern int DoEndif(UBYTE *);
extern int DoTerminate(UBYTE *);
extern int DoIf(UBYTE *);
extern int DoCall(UBYTE *);
extern int DoDebug(UBYTE *);
extern int DoContinueDo(UBYTE *);
extern int DoDo(UBYTE *);
extern int DoBreakDo(UBYTE *);
extern int DoEnddo(UBYTE *);
extern int DoEndprocedure(UBYTE *);
extern int DoInside(UBYTE *);
extern int DoEndInside(UBYTE *);
extern int DoProcedure(UBYTE *);
extern int DoPrePrintTimes(UBYTE *);
extern int DoPreWrite(UBYTE *);
extern int DoPreClose(UBYTE *);
extern int DoPreRemove(UBYTE *);
extern int DoPreSortReallocate(UBYTE *);
extern int DoCommentChar(UBYTE *);
extern int DoPrcExtension(UBYTE *);
extern int DoPreReset(UBYTE *);
extern void WriteString(int,UBYTE *,int);
extern void WriteUnfinString(int,UBYTE *,int);
extern UBYTE *AddToString(UBYTE *,UBYTE *,int);
extern UBYTE *PreCalc(void);
extern UBYTE *PreEval(UBYTE *,LONG *);
extern void NumToStr(UBYTE *,LONG);
extern int PreCmp(int,int,UBYTE *,int,int,UBYTE *,int);
extern int PreEq(int,int,UBYTE *,int,int,UBYTE *,int);
extern UBYTE *pParseObject(UBYTE *,int *,LONG *);
extern UBYTE *PreIfEval(UBYTE *,int *);
extern int EvalPreIf(UBYTE *);
extern int PreLoad(PRELOAD *,UBYTE *,UBYTE *,int,char *);
extern int PreSkip(UBYTE *,UBYTE *,int);
extern UBYTE *EndOfToken(UBYTE *);
extern void SetSpecialMode(int,int);
extern void MakeGlobal(void);
extern int ExecModule(int);
extern int ExecStore(void);
extern void FullCleanUp(void);
extern int DoExecStatement(void);
extern int DoPipeStatement(void);
extern int DoPolyfun(UBYTE *);
extern int DoPolyratfun(UBYTE *);
extern int CompileStatement(UBYTE *);
extern UBYTE *ToToken(UBYTE *);
extern int GetDollar(UBYTE *);
extern void MesWork(void) NORETURN;
extern int MesPrint(const char *,...);
extern int MesCall(char *);
extern UBYTE *NumCopy(WORD,UBYTE *);
extern char *LongCopy(LONG,char *);
extern char *LongLongCopy(off_t *,char *);
extern void ReserveTempFiles(int);
extern void PrintTerm(WORD *,char *);
extern void PrintTermC(WORD *,char *);
extern void PrintSubTerm(WORD *,char *);
extern void PrintWords(WORD *,LONG);
extern void PrintSeq(WORD *,char *);
extern int ExpandTripleDots(int);
extern LONG ComPress(WORD **,LONG *);
extern void StageSort(FILEHANDLE *);
#define M_alloc(x) malloc((size_t)(x))
extern void M_free(void *,const char *);
extern void ClearWildcardNames(void);
extern int AddWildcardName(UBYTE *);
extern int GetWildcardName(UBYTE *);
extern void Globalize(int);
extern void ResetVariables(int);
extern void AddToPreTypes(int);
extern void MessPreNesting(int);
extern LONG GetStreamPosition(STREAM *);
extern WORD *DoubleCbuffer(int,WORD *,int);
extern WORD *AddLHS(int);
extern WORD *AddRHS(int,int);
extern int AddNtoL(int,WORD *);
extern int AddNtoC(int,int,WORD *,int);
extern void DoubleIfBuffers(void);
extern STREAM *CreateStream(UBYTE *);
extern int setonoff(UBYTE *,int *,int,int);
extern int DoPrint(UBYTE *,int);
extern int SetExpr(UBYTE *,int,int);
extern void AddToCom(int,WORD *);
extern int Add2ComStrings(int,WORD *,UBYTE *,UBYTE *);
extern int DoSymmetrize(UBYTE *,int);
extern int DoArgument(UBYTE *,int);
extern int ArgFactorize(PHEAD WORD *,WORD *);
extern WORD *TakeArgContent(PHEAD WORD *, WORD *);
extern WORD *MakeInteger(PHEAD WORD *,WORD *,WORD *);
extern WORD *MakeMod(PHEAD WORD *,WORD *,WORD *);
extern WORD FindArg(PHEAD WORD *);
extern int InsertArg(PHEAD WORD *,WORD *,int);
extern int CleanupArgCache(PHEAD WORD);
extern int ArgSymbolMerge(WORD *, WORD *);
extern int ArgDotproductMerge(WORD *, WORD *);
extern void SortWeights(LONG *,LONG *,WORD);
extern int DoBrackets(UBYTE *,int);
extern int DoPutInside(UBYTE *,int);
extern WORD *CountComp(UBYTE *,WORD *);
extern int CoAntiBracket(UBYTE *);
extern int CoAntiSymmetrize(UBYTE *);
extern int DoArgPlode(UBYTE *,int);
extern int CoArgExplode(UBYTE *);
extern int CoArgImplode(UBYTE *);
extern int CoArgument(UBYTE *);
extern int CoInside(UBYTE *);
extern int ExecInside(UBYTE *);
extern int CoInExpression(UBYTE *);
extern int CoInParallel(UBYTE *);
extern int CoNotInParallel(UBYTE *);
extern int DoInParallel(UBYTE *,int);
extern int CoEndInExpression(UBYTE *);
extern int CoBracket(UBYTE *);
extern int CoPutInside(UBYTE *);
extern int CoAntiPutInside(UBYTE *);
extern int CoMultiBracket(UBYTE *);
extern int CoCFunction(UBYTE *);
extern int CoCTensor(UBYTE *);
extern int CoCollect(UBYTE *);
extern int CoCompress(UBYTE *);
extern int CoContract(UBYTE *);
extern int CoCycleSymmetrize(UBYTE *);
extern int CoDelete(UBYTE *);
extern int CoTableBase(UBYTE *);
extern int CoApply(UBYTE *);
extern int CoDenominators(UBYTE *);
extern int CoDimension(UBYTE *);
extern int CoDiscard(UBYTE *);
extern int CoDisorder(UBYTE *);
extern int CoDrop(UBYTE *);
extern int CoDropCoefficient(UBYTE *);
extern int CoDropSymbols(UBYTE *);
extern int CoElse(UBYTE *);
extern int CoElseIf(UBYTE *);
extern int CoEndArgument(UBYTE *);
extern int CoEndInside(UBYTE *);
extern int CoEndIf(UBYTE *);
extern int CoEndRepeat(UBYTE *);
extern int CoEndTerm(UBYTE *);
extern int CoEndWhile(UBYTE *);
extern int CoExit(UBYTE *);
extern int CoFactArg(UBYTE *);
extern int CoFactDollar(UBYTE *);
extern int CoFactorize(UBYTE *);
extern int CoNFactorize(UBYTE *);
extern int CoUnFactorize(UBYTE *);
extern int CoNUnFactorize(UBYTE *);
extern int DoFactorize(UBYTE *,int);
extern int CoFill(UBYTE *);
extern int CoFillExpression(UBYTE *);
extern int CoFixIndex(UBYTE *);
extern int CoFormat(UBYTE *);
extern int CoGlobal(UBYTE *);
extern int CoGlobalFactorized(UBYTE *);
extern int CoGoTo(UBYTE *);
extern int CoId(UBYTE *);
extern int CoIdNew(UBYTE *);
extern int CoIdOld(UBYTE *);
extern int CoIf(UBYTE *);
extern int CoIfMatch(UBYTE *);
extern int CoIfNoMatch(UBYTE *);
extern int CoIndex(UBYTE *);
extern int CoInsideFirst(UBYTE *);
extern int CoKeep(UBYTE *);
extern int CoLabel(UBYTE *);
extern int CoLoad(UBYTE *);
extern int CoLocal(UBYTE *);
extern int CoLocalFactorized(UBYTE *);
extern int CoMany(UBYTE *);
extern int CoMerge(UBYTE *);
extern int CoStuffle(UBYTE *);
extern int CoMetric(UBYTE *);
extern int CoModOption(UBYTE *);
extern int CoModuleOption(UBYTE *);
extern int CoModulus(UBYTE *);
extern int CoMulti(UBYTE *);
extern int CoMultiply(UBYTE *);
extern int CoNFunction(UBYTE *);
extern int CoNPrint(UBYTE *);
extern int CoNTensor(UBYTE *);
extern int CoNWrite(UBYTE *);
extern int CoNoDrop(UBYTE *);
extern int CoNoSkip(UBYTE *);
extern int CoNormalize(UBYTE *);
extern int CoMakeInteger(UBYTE *);
extern int CoFlags(UBYTE *,int);
extern int CoOff(UBYTE *);
extern int CoOn(UBYTE *);
extern int CoOnce(UBYTE *);
extern int CoOnly(UBYTE *);
extern int CoOptimizeOption(UBYTE *);
extern int CoPolyFun(UBYTE *);
extern int CoPolyRatFun(UBYTE *);
extern int CoPrint(UBYTE *);
extern int CoPrintB(UBYTE *);
extern int CoProperCount(UBYTE *);
extern int CoUnitTrace(UBYTE *);
extern int CoRCycleSymmetrize(UBYTE *);
extern int CoRatio(UBYTE *);
extern int CoRedefine(UBYTE *);
extern int CoRenumber(UBYTE *);
extern int CoRepeat(UBYTE *);
extern int CoSave(UBYTE *);
extern int CoSelect(UBYTE *);
extern int CoSet(UBYTE *);
extern int CoSetExitFlag(UBYTE *);
extern int CoSkip(UBYTE *);
extern int CoProcessBucket(UBYTE *);
extern int CoPushHide(UBYTE *);
extern int CoPopHide(UBYTE *);
extern int CoHide(UBYTE *);
extern int CoIntoHide(UBYTE *);
extern int CoNoIntoHide(UBYTE *);
extern int CoNoHide(UBYTE *);
extern int CoUnHide(UBYTE *);
extern int CoNoUnHide(UBYTE *);
extern int CoSort(UBYTE *);
extern int CoSplitArg(UBYTE *);
extern int CoSplitFirstArg(UBYTE *);
extern int CoSplitLastArg(UBYTE *);
extern int CoSum(UBYTE *);
extern int CoSymbol(UBYTE *);
extern int CoSymmetrize(UBYTE *);
extern int DoTable(UBYTE *,int);
extern int CoTable(UBYTE *);
extern int CoTerm(UBYTE *);
extern int CoNTable(UBYTE *);
extern int CoCTable(UBYTE *);
extern void EmptyTable(TABLES);
extern int CoToTensor(UBYTE *);
extern int CoToVector(UBYTE *);
extern int CoTrace4(UBYTE *);
extern int CoTraceN(UBYTE *);
extern int CoChisholm(UBYTE *);
extern int CoTransform(UBYTE *);
extern int CoClearTable(UBYTE *);
extern int DoChain(UBYTE *,int);
extern int CoChainin(UBYTE *);
extern int CoChainout(UBYTE *);
extern int CoTryReplace(UBYTE *);
extern int CoVector(UBYTE *);
extern int CoWhile(UBYTE *);
extern int CoWrite(UBYTE *);
extern int CoAuto(UBYTE *);
extern int CoSwitch(UBYTE *);
extern int CoCase(UBYTE *);
extern int CoBreak(UBYTE *);
extern int CoDefault(UBYTE *);
extern int CoEndSwitch(UBYTE *);
extern int CoTBaddto(UBYTE *);
extern int CoTBaudit(UBYTE *);
extern int CoTBcleanup(UBYTE *);
extern int CoTBcreate(UBYTE *);
extern int CoTBenter(UBYTE *);
extern int CoTBhelp(UBYTE *);
extern int CoTBload(UBYTE *);
extern int CoTBoff(UBYTE *);
extern int CoTBon(UBYTE *);
extern int CoTBopen(UBYTE *);
extern int CoTBreplace(UBYTE *);
extern int CoTBuse(UBYTE *);
extern int CoTestUse(UBYTE *);
extern int CoThreadBucket(UBYTE *);
extern int AddComString(int,WORD *,UBYTE *,int);
extern int CompileAlgebra(UBYTE *,int,WORD *);
extern int IsIdStatement(UBYTE *);
extern UBYTE *IsRHS(UBYTE *,UBYTE);
extern int ParenthesesTest(UBYTE *);
extern int tokenize(UBYTE *,WORD);
extern void WriteTokens(SBYTE *);
extern int simp1token(SBYTE *);
extern int simpwtoken(SBYTE *);
extern int simp2token(SBYTE *);
extern int simp3atoken(SBYTE *,int);
extern int simp3btoken(SBYTE *,int);
extern int simp4token(SBYTE *);
extern int simp5token(SBYTE *,int);
extern int simp6token(SBYTE *,int);
extern UBYTE *SkipAName(UBYTE *);
extern int TestTables(void);
extern int GetLabel(UBYTE *);
extern int CoIdExpression(UBYTE *,int);
extern int CoAssign(UBYTE *);
extern int DoExpr(UBYTE *,int,int);
extern int CompileSubExpressions(SBYTE *);
extern int CodeGenerator(SBYTE *);
extern int CompleteTerm(WORD *,UWORD *,UWORD *,WORD,WORD,int);
extern int CodeFactors(SBYTE *s);
extern WORD GenerateFactors(WORD,WORD);
extern int InsTree(int,int);
extern int FindTree(int,WORD *);
extern void RedoTree(CBUF *,int);
extern void ClearTree(int);
extern int CatchDollar(int);
extern int AssignDollar(PHEAD WORD *,WORD);
extern UBYTE *WriteDollarToBuffer(WORD,WORD);
extern UBYTE *WriteDollarFactorToBuffer(WORD,WORD,WORD);
extern void AddToDollarBuffer(UBYTE *);
extern int PutTermInDollar(WORD *,WORD);
extern void TermAssign(WORD *);
extern void WildDollars(PHEAD WORD *);
extern LONG numcommute(WORD *,LONG *);
extern int FullRenumber(PHEAD WORD *,WORD);
extern int Lus(WORD *,WORD,WORD,WORD,WORD,WORD);
extern int FindLus(int,int,int);
extern int CoReplaceLoop(UBYTE *);
extern int CoFindLoop(UBYTE *);
extern int DoFindLoop(UBYTE *,int);
extern int CoFunPowers(UBYTE *);
extern int SortTheList(int *,int);
extern int MatchIsPossible(WORD *,WORD *);
extern int StudyPattern(WORD *);
extern WORD DolToTensor(PHEAD WORD);
extern WORD DolToFunction(PHEAD WORD);
extern WORD DolToVector(PHEAD WORD);
extern WORD DolToNumber(PHEAD WORD);
extern WORD DolToSymbol(PHEAD WORD);
extern WORD DolToIndex(PHEAD WORD);
extern LONG DolToLong(PHEAD WORD);
extern int DollarFactorize(PHEAD WORD);
extern int CoPrintTable(UBYTE *);
extern int CoDeallocateTable(UBYTE *);
extern void CleanDollarFactors(DOLLARS);
extern WORD *TakeDollarContent(PHEAD WORD *,WORD **);
extern WORD *MakeDollarInteger(PHEAD WORD *,WORD **);
extern WORD *MakeDollarMod(PHEAD WORD *,WORD **);
extern int GetDolNum(PHEAD WORD *, WORD *);
extern void AddPotModdollar(WORD);
extern int Optimize(WORD, int);
extern int ClearOptimize(void);
extern int TakeLongRoot(UWORD *,WORD *,WORD);
extern int TakeRatRoot(UWORD *,WORD *,WORD);
extern int MakeRational(WORD ,WORD , WORD *, WORD *);
extern int MakeLongRational(PHEAD UWORD *,WORD ,UWORD *,WORD ,UWORD *,WORD *);
extern void ClearTableTree(TABLES);
extern int InsTableTree(TABLES,WORD *);
extern void RedoTableTree(TABLES,int);
extern int FindTableTree(TABLES,WORD *,int);
extern void finishcbuf(WORD);
extern void clearcbuf(WORD);
extern void CleanUpSort(int);
extern FILEHANDLE *AllocFileHandle(WORD,char *);
extern void DeAllocFileHandle(FILEHANDLE *);
extern void LowerSortLevel(void);
extern WORD *PolyRatFunSpecial(PHEAD WORD *, WORD *);
extern void SimpleSplitMergeRec(WORD *,WORD,WORD *);
extern void SimpleSplitMerge(WORD *,WORD);
extern WORD BinarySearch(WORD *,WORD,WORD);
extern int InsideDollar(PHEAD WORD *,WORD);
extern DOLLARS DolToTerms(PHEAD WORD);
extern WORD EvalDoLoopArg(PHEAD WORD *,WORD);
extern int SetExprCases(int,int,int);
extern int TestSelect(WORD *,WORD *);
extern void SubsInAll(PHEAD0);
extern void TransferBuffer(int,int,int);
extern int TakeIDfunction(PHEAD WORD *);
extern int MakeSetupAllocs(void);
extern int TryFileSetups(void);
extern void ExchangeExpressions(int,int);
extern void ExchangeDollars(int,int);
extern int GetFirstBracket(WORD *,int);
extern int GetFirstTerm(WORD *,int,int);
extern int GetContent(WORD *,int);
extern int CleanupTerm(WORD *);
extern WORD ContentMerge(PHEAD WORD *,WORD *);
extern UBYTE *PreIfDollarEval(UBYTE *,int *);
extern LONG TermsInDollar(WORD);
extern LONG SizeOfDollar(WORD);
extern LONG TermsInExpression(WORD);
extern LONG SizeOfExpression(WORD);
extern WORD *TranslateExpression(UBYTE *);
extern int IsSetMember(WORD *,WORD);
extern int IsMultipleOf(WORD *,WORD *);
extern int TwoExprCompare(WORD *,WORD *,int);
extern void UpdatePositions(void);
extern void M_check(void);
extern void M_print(void);
extern void M_check1(void);
extern void PrintTime(UBYTE *);
extern POSITION *FindBracket(WORD,WORD *);
extern void PutBracketInIndex(PHEAD WORD *,POSITION *);
extern void ClearBracketIndex(WORD);
extern void OpenBracketIndex(WORD);
extern int DoNoParallel(UBYTE *);
extern int DoParallel(UBYTE *);
extern int DoModSum(UBYTE *);
extern int DoModMax(UBYTE *);
extern int DoModMin(UBYTE *);
extern int DoModLocal(UBYTE *);
extern UBYTE *DoModDollar(UBYTE *,int);
extern int DoProcessBucket(UBYTE *);
extern int DoinParallel(UBYTE *);
extern int DonotinParallel(UBYTE *);
extern int FlipTable(FUNCTIONS,int);
extern int ChainIn(PHEAD WORD *,WORD);
extern int ChainOut(PHEAD WORD *,WORD);
extern int ArgumentImplode(PHEAD WORD *,WORD *);
extern int ArgumentExplode(PHEAD WORD *,WORD *);
extern int DenToFunction(WORD *,WORD);
extern WORD HowMany(PHEAD WORD *,WORD *);
extern void RemoveDollars(void);
extern LONG CountTerms1(PHEAD0);
extern LONG TermsInBracket(PHEAD WORD *,WORD);
extern int Crash(void);
extern char *str_dup(char *);
extern void convertblock(INDEXBLOCK *,INDEXBLOCK *,int);
extern void convertnamesblock(NAMESBLOCK *,NAMESBLOCK *,int);
extern void convertiniinfo(INIINFO *,INIINFO *,int);
extern int ReadIndex(DBASE *);
extern int WriteIndexBlock(DBASE *,MLONG);
extern int WriteNamesBlock(DBASE *,MLONG);
extern int WriteIndex(DBASE *);
extern int WriteIniInfo(DBASE *);
extern int ReadIniInfo(DBASE *);
extern int AddToIndex(DBASE *,MLONG);
extern DBASE *GetDbase(char *,MLONG);
extern DBASE *OpenDbase(char *);
extern char *ReadObject(DBASE *,MLONG,char *);
extern char *ReadijObject(DBASE *,MLONG,MLONG,char *);
extern int ExistsObject(DBASE *,MLONG,char *);
extern int DeleteObject(DBASE *,MLONG,char *);
extern int WriteObject(DBASE *,MLONG,char *,char *,MLONG);
extern MLONG AddObject(DBASE *,MLONG,char *,char *);
extern DBASE *NewDbase(char *,MLONG);
extern void FreeTableBase(DBASE *);
extern int ComposeTableNames(DBASE *);
extern int PutTableNames(DBASE *);
extern MLONG AddTableName(DBASE *,char *,TABLES);
extern MLONG GetTableName(DBASE *,char *);
extern MLONG FindTableNumber(DBASE *,char *);
extern int TryEnvironment(void);
#ifdef WITHZLIB
extern int SetupOutputGZIP(FILEHANDLE *);
extern int PutOutputGZIP(FILEHANDLE *);
extern int FlushOutputGZIP(FILEHANDLE *);
extern int SetupAllInputGZIP(SORTING *);
extern LONG FillInputGZIP(FILEHANDLE *,POSITION *,UBYTE *,LONG,int);
extern void ClearSortGZIP(FILEHANDLE *f);
#endif
#ifdef WITHPTHREADS
extern void BeginIdentities(void);
extern int WhoAmI(void);
extern int StartAllThreads(int);
extern void StartHandleLock(void);
extern void TerminateAllThreads(void);
extern int GetAvailableThread(void);
extern int ConditionalGetAvailableThread(void);
extern int BalanceRunThread(PHEAD int,WORD *,WORD);
extern void WakeupThread(int,int);
extern int MasterWait(void);
extern int InParallelProcessor(void);
extern int ThreadsProcessor(EXPRESSIONS,WORD,WORD);
extern int MasterMerge(void);
extern int PutToMaster(PHEAD WORD *);
extern void SetWorkerFiles(void);
extern int MakeThreadBuckets(int,int);
extern int SendOneBucket(int);
extern int LoadOneThread(int,int,THREADBUCKET *,int);
extern void *RunSortBot(void *);
extern void MasterWaitAllSortBots(void);
extern int SortBotMerge(PHEAD0);
extern int SortBotOut(PHEAD WORD *);
extern void DefineSortBotTree(void);
extern int SortBotMasterMerge(void);
extern int SortBotWait(int);
extern void StartIdentity(void);
extern void FinishIdentity(void *);
extern int SetIdentity(int *);
extern ALLPRIVATES *InitializeOneThread(int);
extern void FinalizeOneThread(int);
extern void ClearAllThreads(void);
extern void *RunThread(void *);
extern void IAmAvailable(int);
extern int ThreadWait(int);
extern int ThreadClaimedBlock(int);
extern int GetThread(int);
extern int UpdateOneThread(int);
extern void MasterWaitAll(void);
extern void MasterWaitAllBlocks(void);
extern int MasterWaitThread(int);
extern void WakeupMasterFromThread(int,int);
extern int LoadReadjusted(void);
extern int IniSortBlocks(int);
extern int UpdateSortBlocks(int);
extern int TreatIndexEntry(PHEAD LONG);
extern WORD GetTerm2(PHEAD WORD *);
extern void SetHideFiles(void);
#endif
extern int CopyExpression(FILEHANDLE *,FILEHANDLE *);
extern int set_in(UBYTE, set_of_char);
extern one_byte set_set(UBYTE, set_of_char);
extern one_byte set_del(UBYTE, set_of_char);
extern one_byte set_sub (set_of_char, set_of_char, set_of_char);
extern int DoPreAddSeparator(UBYTE *);
extern int DoPreRmSeparator(UBYTE *);
/*See the file extcmd.c*/
extern int openExternalChannel(UBYTE *,int,UBYTE *,UBYTE *);
extern int initPresetExternalChannels(UBYTE *, int);
extern int closeExternalChannel(int);
extern int selectExternalChannel(int);
extern int getCurrentExternalChannel(void);
extern void closeAllExternalChannels(void);
typedef int (*WRITEBUFTOEXTCHANNEL)(char *,size_t);
typedef int (*GETCFROMEXTCHANNEL)(void);
typedef int (*SETTERMINATORFOREXTERNALCHANNEL)(char *);
typedef int (*SETKILLMODEFOREXTERNALCHANNEL)(int,int);
typedef LONG (*WRITEFILE)(int,UBYTE *,LONG);
typedef WORD (*GETTERM)(PHEAD WORD *);
#define CompareTerms ((COMPARE)AR.CompareRoutine)
#define FiniShuffle AN.SHvar.finishuf
#define DoShtuffle ((DO_UFFLE)AN.SHvar.do_uffle)
extern UBYTE *defineChannel(UBYTE*, HANDLERS*);
extern int writeToChannel(int,UBYTE *,HANDLERS*);
#ifdef WITHEXTERNALCHANNEL
extern LONG WriteToExternalChannel(int,UBYTE *,LONG);
#endif
extern int writeBufToExtChannelOk(char *,size_t);
extern int getcFromExtChannelOk(void);
extern int setKillModeForExternalChannelOk(int,int);
extern int setTerminatorForExternalChannelOk(char *);
extern int getcFromExtChannelFailure(void);
extern int setKillModeForExternalChannelFailure(int,int);
extern int setTerminatorForExternalChannelFailure(char *);
extern int writeBufToExtChannelFailure(char *,size_t);
extern int ReleaseTB(void);
extern int SymbolNormalize(WORD *);
extern int TestFunFlag(PHEAD WORD *);
extern WORD CompareSymbols(PHEAD WORD *,WORD *,WORD);
extern WORD CompareHSymbols(PHEAD WORD *,WORD *,WORD);
extern WORD NextPrime(PHEAD WORD);
extern WORD Moebius(PHEAD WORD);
extern UWORD wranf(PHEAD0);
extern UWORD iranf(PHEAD UWORD);
extern void iniwranf(PHEAD0);
extern UBYTE *PreRandom(UBYTE *);
extern WORD *PolyNormPoly(PHEAD WORD);
extern WORD *EvaluateGcd(PHEAD WORD *);
extern int TreatPolyRatFun(PHEAD WORD *);
extern int ReadSaveHeader(void);
extern LONG ReadSaveIndex(FILEINDEX *);
extern LONG ReadSaveExpression(UBYTE *,UBYTE *,LONG *,LONG *);
extern UBYTE *ReadSaveTerm32(UBYTE *,UBYTE *,UBYTE **,UBYTE *,UBYTE *,int);
extern LONG ReadSaveVariables(UBYTE *,UBYTE *,LONG *,LONG *,INDEXENTRY *,LONG *);
extern LONG WriteStoreHeader(WORD);
extern void InitRecovery(void);
extern int CheckRecoveryFile(void);
extern void DeleteRecoveryFile(void);
extern char *RecoveryFilename(void);
extern int DoRecovery(int *);
extern void DoCheckpoint(int);
extern void NumberMallocAddMemory(PHEAD0);
extern void CacheNumberMallocAddMemory(PHEAD0);
extern void TermMallocAddMemory(PHEAD0);
#ifndef MEMORYMACROS
extern WORD *TermMalloc2(PHEAD char *text);
extern void TermFree2(PHEAD WORD *term,char *text);
extern UWORD *NumberMalloc2(PHEAD char *text);
extern UWORD *CacheNumberMalloc2(PHEAD char *text);
extern void NumberFree2(PHEAD UWORD *NumberMem,char *text);
extern void CacheNumberFree2(PHEAD UWORD *NumberMem,char *text);
#endif
extern void ExprStatus(EXPRESSIONS);
extern void iniTools(void);
extern int TestTerm(WORD *);
extern int RunTransform(PHEAD WORD *term, WORD *params);
extern int RunEncode(PHEAD WORD *fun, WORD *args, WORD *info);
extern int RunDecode(PHEAD WORD *fun, WORD *args, WORD *info);
extern int RunReplace(PHEAD WORD *fun, WORD *args, WORD *info);
extern int RunImplode(WORD *fun, WORD *args);
extern int RunExplode(PHEAD WORD *fun, WORD *args);
extern int TestArgNum(int n, int totarg, WORD *args);
extern WORD PutArgInScratch(WORD *arg,UWORD *scrat);
extern UBYTE *ReadRange(UBYTE *s, WORD *out, int par);
extern int FindRange(PHEAD WORD *,WORD *,WORD *,WORD);
extern int RunPermute(PHEAD WORD *fun, WORD *args, WORD *info);
extern int RunReverse(PHEAD WORD *fun, WORD *args);
extern int RunCycle(PHEAD WORD *fun, WORD *args, WORD *info);
extern int RunAddArg(PHEAD WORD *fun, WORD *args);
extern int RunMulArg(PHEAD WORD *fun, WORD *args);
extern int RunIsLyndon(PHEAD WORD *fun, WORD *args, int par);
extern WORD RunToLyndon(PHEAD WORD *fun, WORD *args, int par);
extern int RunDropArg(PHEAD WORD *fun, WORD *args);
extern int RunSelectArg(PHEAD WORD *fun, WORD *args);
extern int RunDedup(PHEAD WORD *fun, WORD *args);
extern int RunZtoHArg(PHEAD WORD *fun, WORD *args);
extern int RunHtoZArg(PHEAD WORD *fun, WORD *args);
extern int NormPolyTerm(PHEAD WORD *);
extern WORD ComparePoly(WORD *, WORD *, WORD);
extern int ConvertToPoly(PHEAD WORD *, WORD *,WORD *,WORD);
extern int LocalConvertToPoly(PHEAD WORD *, WORD *, WORD,WORD);
extern int ConvertFromPoly(PHEAD WORD *, WORD *, WORD, WORD, WORD, WORD);
extern int FindSubterm(WORD *);
extern int FindLocalSubterm(PHEAD WORD *, WORD);
extern void PrintSubtermList(int,int);
extern void PrintExtraSymbol(int,WORD *,int);
extern int FindSubexpression(WORD *);
extern void UpdateMaxSize(void);
extern int CoToPolynomial(UBYTE *);
extern int CoFromPolynomial(UBYTE *);
extern int CoArgToExtraSymbol(UBYTE *);
extern int CoExtraSymbols(UBYTE *);
extern UBYTE *GetDoParam(UBYTE *, WORD **, int);
extern WORD *GetIfDollarFactor(UBYTE **, WORD *);
extern int CoDo(UBYTE *);
extern int CoEndDo(UBYTE *);
extern int ExtraSymFun(PHEAD WORD *,WORD);
extern int PruneExtraSymbols(WORD);
extern int IniFbuffer(WORD);
extern void IniFbufs(void);
extern int GCDfunction(PHEAD WORD *,WORD);
extern WORD *GCDfunction3(PHEAD WORD *,WORD *);
extern int ReadPolyRatFun(PHEAD WORD *);
extern int FromPolyRatFun(PHEAD WORD *, WORD **, WORD **);
extern WORD *PolyDiv(PHEAD WORD *,WORD *,char *);
extern void GCDclean(PHEAD WORD *, WORD *);
extern WORD *TakeSymbolContent(PHEAD WORD *,WORD *);
extern int GCDterms(PHEAD WORD *,WORD *,WORD *);
extern WORD *PutExtraSymbols(PHEAD WORD *,WORD,int *);
extern WORD *TakeExtraSymbols(PHEAD WORD *,WORD);
extern WORD *MultiplyWithTerm(PHEAD WORD *, WORD *,WORD);
extern WORD *TakeContent(PHEAD WORD *, WORD *);
extern int MergeSymbolLists(PHEAD WORD *, WORD *, int);
extern int MergeDotproductLists(PHEAD WORD *, WORD *, int);
extern WORD *CreateExpression(PHEAD WORD);
extern int DIVfunction(PHEAD WORD *,WORD,int);
extern WORD *MULfunc(PHEAD WORD *, WORD *);
extern WORD *ConvertArgument(PHEAD WORD *,int *);
extern int ExpandRat(PHEAD WORD *);
extern int InvPoly(PHEAD WORD *,WORD,WORD);
extern WORD TestDoLoop(PHEAD WORD *,WORD);
extern WORD TestEndDoLoop(PHEAD WORD *,WORD);
extern WORD *poly_gcd(PHEAD WORD *, WORD *, WORD);
extern WORD *poly_div(PHEAD WORD *, WORD *, WORD);
extern WORD *poly_rem(PHEAD WORD *, WORD *, WORD);
extern WORD *poly_inverse(PHEAD WORD *, WORD *);
extern WORD *poly_mul(PHEAD WORD *, WORD *);
extern WORD *poly_ratfun_add(PHEAD WORD *, WORD *);
extern int poly_ratfun_normalize(PHEAD WORD *);
extern int poly_factorize_argument(PHEAD WORD *, WORD *);
extern WORD *poly_factorize_dollar(PHEAD WORD *);
extern int poly_factorize_expression(EXPRESSIONS);
extern int poly_unfactorize_expression(EXPRESSIONS);
extern void poly_free_poly_vars(PHEAD const char *);
#ifdef WITHFLINT
extern void flint_final_cleanup_thread(void);
extern void flint_final_cleanup_master(void);
extern WORD* flint_div(PHEAD WORD *, WORD *, const WORD);
extern int flint_factorize_argument(PHEAD WORD *, WORD *);
extern WORD* flint_factorize_dollar(PHEAD WORD *);
extern WORD* flint_gcd(PHEAD WORD *, WORD *, const WORD);
extern WORD* flint_inverse(PHEAD WORD *, WORD *);
extern WORD* flint_mul(PHEAD WORD *, WORD *);
extern WORD* flint_ratfun_add(PHEAD WORD *, WORD *);
extern int flint_ratfun_normalize(PHEAD WORD *);
extern WORD* flint_rem(PHEAD WORD *, WORD *, const WORD);
extern void flint_check_version(void);
#endif
extern void optimize_print_code (int);
#ifdef WITHPTHREADS
extern void find_Horner_MCTS_expand_tree(void);
extern void find_Horner_MCTS_expand_tree_threaded(void);
extern void optimize_expression_given_Horner(void);
extern void optimize_expression_given_Horner_threaded(void);
#endif
extern int DoPreAdd(UBYTE *s);
extern int DoPreUseDictionary(UBYTE *s);
extern int DoPreCloseDictionary(UBYTE *s);
extern int DoPreOpenDictionary(UBYTE *s);
extern void RemoveDictionary(DICTIONARY *dict);
extern void UnSetDictionary(void);
extern int SetDictionaryOptions(UBYTE *options);
extern int AddToDictionary(DICTIONARY *dict,UBYTE *left,UBYTE *right);
extern int AddDictionary(UBYTE *name);
extern int FindDictionary(UBYTE *name);
extern UBYTE *IsExponentSign(void);
extern UBYTE *IsMultiplySign(void);
extern void TransformRational(UWORD *a, WORD na);
extern void WriteDictionary(DICTIONARY *);
extern void ShrinkDictionary(DICTIONARY *);
extern void MultiplyToLine(void);
extern UBYTE *FindSymbol(WORD num);
extern UBYTE *FindVector(WORD num);
extern UBYTE *FindIndex(WORD num);
extern UBYTE *FindFunction(WORD num);
extern UBYTE *FindFunWithArgs(WORD *t);
extern UBYTE *FindExtraSymbol(WORD num);
extern LONG DictToBytes(DICTIONARY *dict,UBYTE *buf);
extern DICTIONARY *DictFromBytes(UBYTE *buf);
extern int CoCreateSpectator(UBYTE *inp);
extern int CoToSpectator(UBYTE *inp);
extern int CoRemoveSpectator(UBYTE *inp);
extern int CoEmptySpectator(UBYTE *inp);
extern int CoCopySpectator(UBYTE *inp);
extern int PutInSpectator(WORD *,WORD);
extern void ClearSpectators(WORD);
extern WORD GetFromSpectator(WORD *,WORD);
extern void FlushSpectators(void);
extern WORD *PreGCD(PHEAD WORD *, WORD *,int);
extern int InvPoly(PHEAD WORD *,WORD,WORD);
extern int ReadFromScratch(FILEHANDLE *,POSITION *,UBYTE *,POSITION *);
extern int AddToScratch(FILEHANDLE *,POSITION *,UBYTE *,POSITION *,int);
extern int DoPreAppendPath(UBYTE *);
extern int DoPrePrependPath(UBYTE *);
extern int DoSwitch(PHEAD WORD *, WORD *);
extern int DoEndSwitch(PHEAD WORD *, WORD *);
extern SWITCHTABLE *FindCase(WORD, WORD);
extern void SwitchSplitMergeRec(SWITCHTABLE *, WORD, SWITCHTABLE *);
extern void SwitchSplitMerge(SWITCHTABLE *, WORD);
extern int DoubleSwitchBuffers(void);
extern int DistrN(int, int *, int, int *);
extern int DoNamespace(UBYTE *);
extern int DoEndNamespace(UBYTE *);
extern int DoUse(UBYTE *);
extern UBYTE *SkipName(UBYTE *);
extern UBYTE *ConstructName(UBYTE *,UBYTE);
extern int DoSetUserFlag(UBYTE *);
extern int DoClearUserFlag(UBYTE *);
VERTEX *CreateVertex(MODEL *);
UBYTE *ReadParticle(UBYTE *, VERTEX *,MODEL *, int);
int CoModel(UBYTE *);
int CoParticle(UBYTE *);
int CoVertex(UBYTE *);
int CoEndModel(UBYTE *);
int LoadModel(MODEL *);
int CoSetUserFlag(UBYTE *);
int CoClearUserFlag(UBYTE *);
int CoCreateAllLoops(UBYTE *);
int CoCreateAllPaths(UBYTE *);
int CoCreateAll(UBYTE *);
int AllLoops(PHEAD WORD *,WORD);
LONG StartLoops(PHEAD WORD *,WORD,LONG,WORD,WORD *,WORD,WORD *,WORD);
LONG GenLoops(PHEAD WORD *,WORD,LONG,WORD,WORD *,WORD,WORD *,WORD);
void LoopOutput(PHEAD WORD *,WORD,WORD *,WORD);
int AllPaths(PHEAD WORD *,WORD);
LONG GenPaths(PHEAD WORD *,WORD,LONG,WORD,WORD *,WORD,WORD *,WORD);
void PathOutput(PHEAD WORD *,WORD,WORD *,WORD);
#ifdef WITHFLOAT
int DoStartFloat(UBYTE *);
int DoEndFloat(UBYTE *);
int SetFloatPrecision(WORD);
void SetupMZVTables(void);
void SetupMPFTables(void);
void ClearMZVTables(void);
int EvaluateEuler(PHEAD WORD *,WORD,WORD);
int EvaluateSqrt(PHEAD WORD *,WORD,WORD);
int CoEvaluate(UBYTE *);
int PrintFloat(WORD *fun,int numdigits);
int CoToRat(UBYTE *);
int CoToFloat(UBYTE *);
int CoChop(UBYTE *);
int ToRat(PHEAD WORD *,WORD);
int ToFloat(PHEAD WORD *,WORD);
int Chop(PHEAD WORD *, WORD);
WORD FloatFunToRat(PHEAD UWORD *,WORD *);
int AddWithFloat(PHEAD WORD **,WORD **);
int MergeWithFloat(PHEAD WORD **,WORD **);
void ClearfFloat(void);
int TestFloat(WORD *);
SBYTE *ReadFloat(SBYTE *);
UBYTE *CheckFloat(UBYTE *,int *);
void SetfFloatPrecision(LONG);
int EvaluateFun(PHEAD WORD *, WORD, WORD *);
int CoStrictRounding(UBYTE *);
int StrictRounding(PHEAD WORD *, WORD, WORD, WORD);
#endif
/*
#] Declarations :
*/
#endif
|