56static KEYWORD com1commands[] = {
57 {
"also", (TFUN)CoIdOld, STATEMENT, PARTEST}
58 ,{
"abrackets", (TFUN)CoAntiBracket, TOOUTPUT, PARTEST}
59 ,{
"antisymmetrize", (TFUN)CoAntiSymmetrize, STATEMENT, PARTEST}
60 ,{
"antibrackets", (TFUN)CoAntiBracket, TOOUTPUT, PARTEST}
61 ,{
"brackets", (TFUN)CoBracket, TOOUTPUT, PARTEST}
62 ,{
"cfunctions", (TFUN)CoCFunction, DECLARATION, PARTEST|WITHAUTO}
63 ,{
"commuting", (TFUN)CoCFunction, DECLARATION, PARTEST|WITHAUTO}
64 ,{
"compress", (TFUN)CoCompress, DECLARATION, PARTEST}
65 ,{
"ctensors", (TFUN)CoCTensor, DECLARATION, PARTEST|WITHAUTO}
66 ,{
"cyclesymmetrize",(TFUN)CoCycleSymmetrize, STATEMENT, PARTEST}
67 ,{
"dimension", (TFUN)CoDimension, DECLARATION, PARTEST}
68 ,{
"discard", (TFUN)CoDiscard, STATEMENT, PARTEST}
69 ,{
"functions", (TFUN)CoNFunction, DECLARATION, PARTEST|WITHAUTO}
70 ,{
"format", (TFUN)CoFormat, TOOUTPUT, PARTEST}
71 ,{
"fixindex", (TFUN)CoFixIndex, DECLARATION, PARTEST}
72 ,{
"global", (TFUN)CoGlobal, DEFINITION, PARTEST}
73 ,{
"gfactorized", (TFUN)CoGlobalFactorized, DEFINITION, PARTEST}
74 ,{
"globalfactorized",(TFUN)CoGlobalFactorized,DEFINITION, PARTEST}
75 ,{
"goto", (TFUN)CoGoTo, STATEMENT, PARTEST}
76 ,{
"indexes", (TFUN)CoIndex, DECLARATION, PARTEST|WITHAUTO}
77 ,{
"indices", (TFUN)CoIndex, DECLARATION, PARTEST|WITHAUTO}
78 ,{
"identify", (TFUN)CoId, STATEMENT, PARTEST}
79 ,{
"idnew", (TFUN)CoIdNew, STATEMENT, PARTEST}
80 ,{
"idold", (TFUN)CoIdOld, STATEMENT, PARTEST}
81 ,{
"local", (TFUN)CoLocal, DEFINITION, PARTEST}
82 ,{
"lfactorized", (TFUN)CoLocalFactorized, DEFINITION, PARTEST}
83 ,{
"localfactorized",(TFUN)CoLocalFactorized, DEFINITION, PARTEST}
84 ,{
"load", (TFUN)CoLoad, DECLARATION, PARTEST}
85 ,{
"label", (TFUN)CoLabel, STATEMENT, PARTEST}
86 ,{
"modulus", (TFUN)CoModulus, DECLARATION, PARTEST}
87 ,{
"multiply", (TFUN)CoMultiply, STATEMENT, PARTEST}
88 ,{
"nfunctions", (TFUN)CoNFunction, DECLARATION, PARTEST|WITHAUTO}
89 ,{
"nprint", (TFUN)CoNPrint, TOOUTPUT, PARTEST}
90 ,{
"ntensors", (TFUN)CoNTensor, DECLARATION, PARTEST|WITHAUTO}
91 ,{
"nwrite", (TFUN)CoNWrite, DECLARATION, PARTEST}
92 ,{
"print", (TFUN)CoPrint, MIXED, 0}
93 ,{
"redefine", (TFUN)CoRedefine, STATEMENT, 0}
94 ,{
"rcyclesymmetrize",(TFUN)CoRCycleSymmetrize,STATEMENT, PARTEST}
95 ,{
"symbols", (TFUN)CoSymbol, DECLARATION, PARTEST|WITHAUTO}
96 ,{
"save", (TFUN)CoSave, DECLARATION, PARTEST}
97 ,{
"symmetrize", (TFUN)CoSymmetrize, STATEMENT, PARTEST}
98 ,{
"tensors", (TFUN)CoCTensor, DECLARATION, PARTEST|WITHAUTO}
99 ,{
"unittrace", (TFUN)CoUnitTrace, DECLARATION, PARTEST}
100 ,{
"vectors", (TFUN)CoVector, DECLARATION, PARTEST|WITHAUTO}
101 ,{
"write", (TFUN)CoWrite, DECLARATION, PARTEST}
104static KEYWORD com2commands[] = {
105 {
"antiputinside", (TFUN)CoAntiPutInside, STATEMENT, PARTEST}
106 ,{
"apply", (TFUN)CoApply, STATEMENT, PARTEST}
107 ,{
"aputinside", (TFUN)CoAntiPutInside, STATEMENT, PARTEST}
108 ,{
"argexplode", (TFUN)CoArgExplode, STATEMENT, PARTEST}
109 ,{
"argimplode", (TFUN)CoArgImplode, STATEMENT, PARTEST}
110 ,{
"argtoextrasymbol",(TFUN)CoArgToExtraSymbol,STATEMENT, PARTEST}
111 ,{
"argument", (TFUN)CoArgument, STATEMENT, PARTEST}
112 ,{
"assign", (TFUN)CoAssign, STATEMENT, PARTEST}
113 ,{
"auto", (TFUN)CoAuto, DECLARATION, PARTEST}
114 ,{
"autodeclare", (TFUN)CoAuto, DECLARATION, PARTEST}
115 ,{
"break", (TFUN)CoBreak, STATEMENT, PARTEST}
116 ,{
"canonicalize", (TFUN)CoCanonicalize, STATEMENT, PARTEST}
117 ,{
"case", (TFUN)CoCase, STATEMENT, PARTEST}
118 ,{
"chainin", (TFUN)CoChainin, STATEMENT, PARTEST}
119 ,{
"chainout", (TFUN)CoChainout, STATEMENT, PARTEST}
120 ,{
"chisholm", (TFUN)CoChisholm, STATEMENT, PARTEST}
122 ,{
"chop", (TFUN)CoChop, STATEMENT, PARTEST}
124 ,{
"clearflag", (TFUN)CoClearUserFlag, STATEMENT, PARTEST}
125 ,{
"cleartable", (TFUN)CoClearTable, DECLARATION, PARTEST}
126 ,{
"collect", (TFUN)CoCollect, SPECIFICATION,PARTEST}
127 ,{
"commuteinset", (TFUN)CoCommuteInSet, DECLARATION, PARTEST}
128 ,{
"contract", (TFUN)CoContract, STATEMENT, PARTEST}
129 ,{
"copyspectator", (TFUN)CoCopySpectator, DEFINITION, PARTEST}
130 ,{
"createall", (TFUN)CoCreateAll, STATEMENT, PARTEST}
131 ,{
"createspectator",(TFUN)CoCreateSpectator, DECLARATION, PARTEST}
132 ,{
"ctable", (TFUN)CoCTable, DECLARATION, PARTEST}
133 ,{
"deallocatetable",(TFUN)CoDeallocateTable, DECLARATION, PARTEST}
134 ,{
"default", (TFUN)CoDefault, STATEMENT, PARTEST}
135 ,{
"delete", (TFUN)CoDelete, SPECIFICATION,PARTEST}
136 ,{
"denominators", (TFUN)CoDenominators, STATEMENT, PARTEST}
137 ,{
"disorder", (TFUN)CoDisorder, STATEMENT, PARTEST}
138 ,{
"do", (TFUN)CoDo, STATEMENT, PARTEST}
139 ,{
"drop", (TFUN)CoDrop, SPECIFICATION,PARTEST}
140 ,{
"dropcoefficient",(TFUN)CoDropCoefficient, STATEMENT, PARTEST}
141 ,{
"dropsymbols", (TFUN)CoDropSymbols, STATEMENT, PARTEST}
142 ,{
"else", (TFUN)CoElse, STATEMENT, PARTEST}
143 ,{
"elseif", (TFUN)CoElseIf, STATEMENT, PARTEST}
144 ,{
"emptyspectator", (TFUN)CoEmptySpectator, SPECIFICATION,PARTEST}
145 ,{
"endargument", (TFUN)CoEndArgument, STATEMENT, PARTEST}
146 ,{
"enddo", (TFUN)CoEndDo, STATEMENT, PARTEST}
147 ,{
"endif", (TFUN)CoEndIf, STATEMENT, PARTEST}
148 ,{
"endinexpression",(TFUN)CoEndInExpression, STATEMENT, PARTEST}
149 ,{
"endinside", (TFUN)CoEndInside, STATEMENT, PARTEST}
150 ,{
"endmodel", (TFUN)CoEndModel, DECLARATION, PARTEST}
151 ,{
"endrepeat", (TFUN)CoEndRepeat, STATEMENT, PARTEST}
152 ,{
"endswitch", (TFUN)CoEndSwitch, STATEMENT, PARTEST}
153 ,{
"endterm", (TFUN)CoEndTerm, STATEMENT, PARTEST}
154 ,{
"endwhile", (TFUN)CoEndWhile, STATEMENT, PARTEST}
156 ,{
"evaluate", (TFUN)CoEvaluate, STATEMENT, PARTEST}
158 ,{
"exit", (TFUN)CoExit, STATEMENT, PARTEST}
159 ,{
"extrasymbols", (TFUN)CoExtraSymbols, DECLARATION, PARTEST}
160 ,{
"factarg", (TFUN)CoFactArg, STATEMENT, PARTEST}
161 ,{
"factdollar", (TFUN)CoFactDollar, STATEMENT, PARTEST}
162 ,{
"factorize", (TFUN)CoFactorize, TOOUTPUT, PARTEST}
163 ,{
"fill", (TFUN)CoFill, DECLARATION, PARTEST}
164 ,{
"fillexpression", (TFUN)CoFillExpression, DECLARATION, PARTEST}
165 ,{
"frompolynomial", (TFUN)CoFromPolynomial, STATEMENT, PARTEST}
166 ,{
"funpowers", (TFUN)CoFunPowers, DECLARATION, PARTEST}
167 ,{
"hide", (TFUN)CoHide, SPECIFICATION,PARTEST}
168 ,{
"if", (TFUN)CoIf, STATEMENT, PARTEST}
169 ,{
"ifmatch", (TFUN)CoIfMatch, STATEMENT, PARTEST}
170 ,{
"ifnomatch", (TFUN)CoIfNoMatch, STATEMENT, PARTEST}
171 ,{
"ifnotmatch", (TFUN)CoIfNoMatch, STATEMENT, PARTEST}
172 ,{
"inexpression", (TFUN)CoInExpression, STATEMENT, PARTEST}
173 ,{
"inparallel", (TFUN)CoInParallel, SPECIFICATION,PARTEST}
174 ,{
"inside", (TFUN)CoInside, STATEMENT, PARTEST}
175 ,{
"insidefirst", (TFUN)CoInsideFirst, DECLARATION, PARTEST}
176 ,{
"intohide", (TFUN)CoIntoHide, SPECIFICATION,PARTEST}
177 ,{
"keep", (TFUN)CoKeep, SPECIFICATION,PARTEST}
178 ,{
"makeinteger", (TFUN)CoMakeInteger, STATEMENT, PARTEST}
179 ,{
"many", (TFUN)CoMany, STATEMENT, PARTEST}
180 ,{
"merge", (TFUN)CoMerge, STATEMENT, PARTEST}
181 ,{
"metric", (TFUN)CoMetric, DECLARATION, PARTEST}
182 ,{
"model", (TFUN)CoModel, DECLARATION, PARTEST}
183 ,{
"moduleoption", (TFUN)CoModuleOption, ATENDOFMODULE,PARTEST}
184 ,{
"multi", (TFUN)CoMulti, STATEMENT, PARTEST}
185 ,{
"multibracket", (TFUN)CoMultiBracket, STATEMENT, PARTEST}
186 ,{
"ndrop", (TFUN)CoNoDrop, SPECIFICATION,PARTEST}
187 ,{
"nfactorize", (TFUN)CoNFactorize, TOOUTPUT, PARTEST}
188 ,{
"nhide", (TFUN)CoNoHide, SPECIFICATION,PARTEST}
189 ,{
"nintohide", (TFUN)CoNoIntoHide, SPECIFICATION,PARTEST}
190 ,{
"normalize", (TFUN)CoNormalize, STATEMENT, PARTEST}
191 ,{
"notinparallel", (TFUN)CoNotInParallel, SPECIFICATION,PARTEST}
192 ,{
"nskip", (TFUN)CoNoSkip, SPECIFICATION,PARTEST}
193 ,{
"ntable", (TFUN)CoNTable, DECLARATION, PARTEST}
194 ,{
"nunfactorize", (TFUN)CoNUnFactorize, TOOUTPUT, PARTEST}
195 ,{
"nunhide", (TFUN)CoNoUnHide, SPECIFICATION,PARTEST}
196 ,{
"off", (TFUN)CoOff, DECLARATION, PARTEST}
197 ,{
"on", (TFUN)CoOn, DECLARATION, PARTEST}
198 ,{
"once", (TFUN)CoOnce, STATEMENT, PARTEST}
199 ,{
"only", (TFUN)CoOnly, STATEMENT, PARTEST}
200 ,{
"particle", (TFUN)CoParticle, DECLARATION, PARTEST}
201 ,{
"polyfun", (TFUN)CoPolyFun, DECLARATION, PARTEST}
202 ,{
"polyratfun", (TFUN)CoPolyRatFun, DECLARATION, PARTEST}
203 ,{
"pophide", (TFUN)CoPopHide, SPECIFICATION,PARTEST}
204 ,{
"print[]", (TFUN)CoPrintB, TOOUTPUT, PARTEST}
205 ,{
"printtable", (TFUN)CoPrintTable, MIXED, PARTEST}
206 ,{
"processbucketsize",(TFUN)CoProcessBucket, DECLARATION, PARTEST}
207 ,{
"propercount", (TFUN)CoProperCount, DECLARATION, PARTEST}
208 ,{
"pushhide", (TFUN)CoPushHide, SPECIFICATION,PARTEST}
209 ,{
"putinside", (TFUN)CoPutInside, STATEMENT, PARTEST}
210 ,{
"ratio", (TFUN)CoRatio, STATEMENT, PARTEST}
211 ,{
"removespectator",(TFUN)CoRemoveSpectator, SPECIFICATION,PARTEST}
212 ,{
"renumber", (TFUN)CoRenumber, STATEMENT, PARTEST}
213 ,{
"repeat", (TFUN)CoRepeat, STATEMENT, PARTEST}
214 ,{
"replaceloop", (TFUN)CoReplaceLoop, STATEMENT, PARTEST}
215 ,{
"select", (TFUN)CoSelect, STATEMENT, PARTEST}
216 ,{
"set", (TFUN)CoSet, DECLARATION, PARTEST}
217 ,{
"setexitflag", (TFUN)CoSetExitFlag, STATEMENT, PARTEST}
218 ,{
"setflag", (TFUN)CoSetUserFlag, STATEMENT, PARTEST}
219 ,{
"shuffle", (TFUN)CoMerge, STATEMENT, PARTEST}
220 ,{
"skip", (TFUN)CoSkip, SPECIFICATION,PARTEST}
221 ,{
"sort", (TFUN)CoSort, STATEMENT, PARTEST}
222 ,{
"splitarg", (TFUN)CoSplitArg, STATEMENT, PARTEST}
223 ,{
"splitfirstarg", (TFUN)CoSplitFirstArg, STATEMENT, PARTEST}
224 ,{
"splitlastarg", (TFUN)CoSplitLastArg, STATEMENT, PARTEST}
226 ,{
"strictrounding", (TFUN)CoStrictRounding, STATEMENT, PARTEST}
228 ,{
"stuffle", (TFUN)CoStuffle, STATEMENT, PARTEST}
229 ,{
"sum", (TFUN)CoSum, STATEMENT, PARTEST}
230 ,{
"switch", (TFUN)CoSwitch, STATEMENT, PARTEST}
231 ,{
"table", (TFUN)CoTable, DECLARATION, PARTEST}
232 ,{
"tablebase", (TFUN)CoTableBase, DECLARATION, PARTEST}
233 ,{
"tb", (TFUN)CoTableBase, DECLARATION, PARTEST}
234 ,{
"term", (TFUN)CoTerm, STATEMENT, PARTEST}
235 ,{
"testuse", (TFUN)CoTestUse, STATEMENT, PARTEST}
236 ,{
"threadbucketsize",(TFUN)CoThreadBucket, DECLARATION, PARTEST}
238 ,{
"tofloat", (TFUN)CoToFloat, STATEMENT, PARTEST}
240 ,{
"topolynomial", (TFUN)CoToPolynomial, STATEMENT, PARTEST}
242 ,{
"torat", (TFUN)CoToRat, STATEMENT, PARTEST}
243 ,{
"torational", (TFUN)CoToRat, STATEMENT, PARTEST}
245 ,{
"tospectator", (TFUN)CoToSpectator, STATEMENT, PARTEST}
246 ,{
"totensor", (TFUN)CoToTensor, STATEMENT, PARTEST}
247 ,{
"tovector", (TFUN)CoToVector, STATEMENT, PARTEST}
248 ,{
"trace4", (TFUN)CoTrace4, STATEMENT, PARTEST}
249 ,{
"tracen", (TFUN)CoTraceN, STATEMENT, PARTEST}
250 ,{
"transform", (TFUN)CoTransform, STATEMENT, PARTEST}
251 ,{
"tryreplace", (TFUN)CoTryReplace, STATEMENT, PARTEST}
252 ,{
"unfactorize", (TFUN)CoUnFactorize, TOOUTPUT, PARTEST}
253 ,{
"unhide", (TFUN)CoUnHide, SPECIFICATION,PARTEST}
254 ,{
"vertex", (TFUN)CoVertex, DECLARATION, PARTEST}
255 ,{
"while", (TFUN)CoWhile, STATEMENT, PARTEST}
270SUBBUF *topsubexpbuffers = 0;
271LONG insubexpbuffers = 0;
273#define REDUCESUBEXPBUFFERS { if ( (topsubexpbuffers-subexpbuffers) > 256 ) {\
274 M_free(subexpbuffers,"subexpbuffers");\
275 subexpbuffers = (SUBBUF *)Malloc1(256*sizeof(SUBBUF),"subexpbuffers");\
276 topsubexpbuffers = subexpbuffers+256; } insubexpbuffers = 0; }
279 #define PUTNUMBER128(t,n) { if ( n >= 2097152 ) { \
280 *t++ = ((n/128)/128)/128; *t++ = ((n/128)/128)%128; *t++ = (n/128)%128; *t++ = n%128; } \
281 else if ( n >= 16384 ) { \
282 *t++ = n/(128*128); *t++ = (n/128)%128; *t++ = n%128; } \
283 else if ( n >= 128 ) { *t++ = n/128; *t++ = n%128; } \
285 #define PUTNUMBER100(t,n) { if ( n >= 1000000 ) { \
286 *t++ = ((n/100)/100)/100; *t++ = ((n/100)/100)%100; *t++ = (n/100)%100; *t++ = n%100; } \
287 else if ( n >= 10000 ) { \
288 *t++ = n/10000; *t++ = (n/100)%100; *t++ = n%100; } \
289 else if ( n >= 100 ) { *t++ = n/100; *t++ = n%100; } \
291#elif BITSINWORD == 16
292 #define PUTNUMBER128(t,n) { if ( n >= 16384 ) { \
293 *t++ = n/(128*128); *t++ = (n/128)%128; *t++ = n%128; } \
294 else if ( n >= 128 ) { *t++ = n/128; *t++ = n%128; } \
296 #define PUTNUMBER100(t,n) { if ( n >= 10000 ) { \
297 *t++ = n/10000; *t++ = (n/100)%100; *t++ = n%100; } \
298 else if ( n >= 100 ) { *t++ = n/100; *t++ = n%100; } \
301 #error Only 64-bit and 32-bit platforms are supported.
319 ksize =
sizeof(com1commands)/
sizeof(
KEYWORD);
322 for ( i = 0; i < 26; i++ ) {
323 while ( j < ksize && k[j].name[0] ==
'a'+i ) j++;
346 while ( FG.cTable[*s] <= 1 ) s++;
347 if ( s > in && *s ==
'[' && s[1] ==
']' ) s += 2;
348 if ( *s ) { c = *s; *s = 0; }
354 hi =
sizeof(com2commands)/
sizeof(
KEYWORD)-1;
356 med = ( hi + lo ) / 2;
357 i = StrICmp(in,(UBYTE *)com2commands[med].name);
358 if ( i == 0 ) {
if ( c ) *s = c;
return(com2commands+med); }
359 if ( i < 0 ) hi = med-1;
361 }
while ( hi >= lo );
365 i = tolower(*in) -
'a';
367 hi = alfatable1[i+1];
369 if ( StrICont(in,(UBYTE *)com1commands[med].name) == 0 )
370 {
if ( c ) *s = c;
return(com1commands+med); }
385int ParenthesesTest(UBYTE *sin)
387 WORD L1 = 0, L2 = 0, L3 = 0;
390 if ( *s ==
'[' ) L1++;
391 else if ( *s ==
']' ) {
393 if ( L1 < 0 ) { MesPrint(
"&Unmatched []");
return(1); }
397 if ( L1 > 0 ) { MesPrint(
"&Unmatched []");
return(1); }
400 if ( *s ==
'[' ) SKIPBRA1(s)
401 else if ( *s ==
'(' ) { L2++; s++; }
402 else if ( *s ==
')' ) {
404 if ( L2 < 0 ) { MesPrint(
"&Unmatched ()");
return(1); }
408 if ( L2 > 0 ) { MesPrint(
"&Unmatched ()");
return(1); }
411 if ( *s ==
'[' ) SKIPBRA1(s)
412 else if ( *s ==
'[' ) SKIPBRA4(s)
413 else if ( *s ==
'{' ) { L3++; s++; }
414 else if ( *s ==
'}' ) {
416 if ( L3 < 0 ) { MesPrint(
"&Unmatched {}");
return(1); }
420 if ( L3 > 0 ) { MesPrint(
"&Unmatched {}");
return(1); }
454 MesPrint(
"&Illegal name: '%s'",t);
459 else if ( FG.cTable[*s] == 0 || *s ==
'_' || *s ==
'$' ) {
460 if ( *s ==
'$' ) s++;
461 while ( FG.cTable[*s] <= 1 ) s++;
462 if ( *s ==
'_' ) s++;
465 MesPrint(
"&Illegal name: '%s'",t);
476UBYTE *IsRHS(UBYTE *s, UBYTE c)
478 while ( *s && *s != c ) {
482 MesPrint(
"&Unmatched []");
486 else if ( *s ==
'{' ) {
489 MesPrint(
"&Unmatched {}");
493 else if ( *s ==
'(' ) {
496 MesPrint(
"&Unmatched ()");
500 else if ( *s ==
')' ) {
501 MesPrint(
"&Unmatched ()");
504 else if ( *s ==
'}' ) {
505 MesPrint(
"&Unmatched {}");
508 else if ( *s ==
']' ) {
509 MesPrint(
"&Unmatched []");
522int IsIdStatement(UBYTE *s)
536int CompileAlgebra(UBYTE *s,
int leftright, WORD *prototype)
540 WORD *oldproto = AC.ProtoType;
541 AC.ProtoType = prototype;
542 if ( AC.TokensWriteFlag ) {
543 MesPrint(
"To tokenize: %s",s);
544 error = tokenize(s,leftright);
545 MesPrint(
" The contents of the token buffer are:");
546 WriteTokens(AC.tokens);
548 else error = tokenize(s,leftright);
550 AR.Eside = leftright;
552 if ( leftright == LHSIDE ) { AC.DumNum = AR.CurDum = 0; }
553 error = CompileSubExpressions(AC.tokens);
557 AC.ProtoType = oldproto;
560 AC.ProtoType = oldproto;
561 if ( error < 0 )
return(-1);
562 else if ( leftright == LHSIDE )
return(cbuf[AC.cbufnum].numlhs);
563 else return(cbuf[AC.cbufnum].numrhs);
572int CompileStatement(UBYTE *in)
576 int error1 = 0, error2;
578 if ( *s == 0 )
return(0);
580 k = findcommand((UBYTE *)
"assign");
583 if ( ( k = findcommand(s) ) == 0 && IsIdStatement(s) == 0 ) {
584 MesPrint(
"&Unrecognized statement %s",s);
588 k = com1commands + alfatable1[
'i'-
'a'];
589 while ( k->name[1] !=
'd' || k->name[2] ) k++;
592 while ( FG.cTable[*s] <= 1 ) s++;
593 if ( s > in && *s ==
'[' && s[1] ==
']' ) s += 2;
604 if ( *s ==
',' ) s++;
612 if ( AP.PreAssignFlag == 0 && AM.OldOrderFlag == 0 ) {
613 if ( AP.PreInsideLevel ) {
614 if ( k->type != STATEMENT && k->type != MIXED ) {
615 MesPrint(
"&Only executable and print statements are allowed in an %#inside/%#endinside construction");
620 if ( ( AC.compiletype == DECLARATION || AC.compiletype == SPECIFICATION )
621 && ( k->type == STATEMENT || k->type == DEFINITION || k->type == TOOUTPUT ) ) {
622 if ( AC.tablecheck == 0 ) {
624 if ( TestTables() ) error1 = 1;
627 if ( k->type == MIXED ) {
628 if ( AC.compiletype <= DEFINITION ) {
629 AC.compiletype = STATEMENT;
632 else if ( k->type > AC.compiletype ) {
642 if ( StrCmp((UBYTE *)(k->name),(UBYTE *)
"format") == 0 )
643 goto NoUpdateCompileType;
644 if ( StrCmp((UBYTE *)(k->name),(UBYTE *)
"moduleoption") == 0 ) {
647 if ( ConsumeOption(&ss,
"sum")
648 || ConsumeOption(&ss,
"maximum")
649 || ConsumeOption(&ss,
"minimum")
650 || ConsumeOption(&ss,
"local") )
goto NoUpdateCompileType;
652 AC.compiletype = k->type;
656 else if ( k->type < AC.compiletype ) {
659 MesPrint(
"&Declaration out of order");
663 MesPrint(
"&Definition out of order");
667 MesPrint(
"&Specification out of order");
671 MesPrint(
"&Statement out of order");
674 MesPrint(
"&Output control statement out of order");
678 AC.compiletype = k->type;
679 if ( AC.firstctypemessage == 0 ) {
680 MesPrint(
"&Proper order inside a module is:");
681 MesPrint(
"Declarations, specifications, definitions, statements, output control statements");
682 AC.firstctypemessage = 1;
691 if ( AC.AutoDeclareFlag && ( ( k->flags & WITHAUTO ) == 0 ) ) {
692 MesPrint(
"&Illegal type of auto-declaration");
695 if ( ( ( k->flags & PARTEST ) != 0 ) && ParenthesesTest(s) )
return(1);
696 error2 = (*k->func)(s);
697 if ( error2 == 0 )
return(error1);
713 i = NumFunctions + FUNCTION - MAXBUILTINFUNCTION - 1;
714 f = f + MAXBUILTINFUNCTION - FUNCTION + 1;
715 if ( AC.MustTestTable > 0 ) {
718 for ( x = 0, j = 0; x < t->
totind; x++ ) {
723 MesPrint(
"&In table %s there are %d unfilled elements",
724 AC.varnames->namebuffer+f->
name,j);
727 MesPrint(
"&In table %s there is one unfilled element",
728 AC.varnames->namebuffer+f->
name);
750int CompileSubExpressions(SBYTE *tokens)
753 SBYTE *fill = tokens, *s = tokens, *t;
754 WORD number[MAXNUMSIZE], *oldwork, *w1, *w2;
755 int level, num, i, sumlevel = 0, sumtype = SYMTOSYM;
756 int retval, error = 0;
761 while ( *s != TENDOFIT ) {
762 if ( *s == TFUNOPEN ) {
763 if ( fill < s ) *fill = TENDOFIT;
765 while ( t >= tokens && t[0] >= 0 ) t--;
766 if ( t >= tokens && *t == TFUNCTION ) {
767 t++; i = 0;
while ( *t >= 0 ) i = 128*i + *t++;
768 if ( i == AM.sumnum || i == AM.sumpnum ) {
770 if ( *t == TSYMBOL || *t == TINDEX ) {
771 t++; i = 0;
while ( *t >= 0 ) i = 128*i + *t++;
772 if ( s[1] == TINDEX ) {
776 else sumtype = SYMTOSYM;
783 else if ( *s == TFUNCLOSE ) { sumlevel = 0; *fill++ = *s++; }
784 else if ( *s == LPARENTHESIS ) {
793 while ( level >= 0 ) {
795 if ( *s == LPARENTHESIS ) level++;
796 else if ( *s == RPARENTHESIS ) level--;
797 else if ( *s == TENDOFIT ) {
798 MesPrint(
"&Unbalanced subexpression parentheses");
803 if ( sumlevel > 0 ) {
804 oldwork = w1 = AT.WorkPointer;
807 while ( --i >= 0 ) *w1++ = *w2++;
809 *w1++ = sumtype; *w1++ = 4; *w1++ = sumlevel; *w1++ = sumlevel;
810 w2 = AC.ProtoType; AT.WorkPointer = w1;
811 AC.ProtoType = oldwork;
812 num = CompileSubExpressions(t);
813 AC.ProtoType = w2; AT.WorkPointer = oldwork;
815 else num = CompileSubExpressions(t);
816 if ( num < 0 )
return(-1);
824 if ( insubexpbuffers >= MAXSUBEXPRESSIONS ) {
825 MesPrint(
"&More than %d subexpressions inside one expression",(WORD)MAXSUBEXPRESSIONS);
828 if ( subexpbuffers+insubexpbuffers >= topsubexpbuffers ) {
829 DoubleBuffer((
void **)((
void *)(&subexpbuffers))
830 ,(
void **)((
void *)(&topsubexpbuffers)),
sizeof(
SUBBUF),
"subexpbuffers");
832 subexpbuffers[insubexpbuffers].subexpnum = num;
833 subexpbuffers[insubexpbuffers].buffernum = AC.cbufnum;
834 num = insubexpbuffers++;
837 do { number[i++] = num & 0x7F; num >>= 7; }
while ( num );
838 while ( --i >= 0 ) *fill++ = (SBYTE)(number[i]);
841 else if ( *s == TEMPTY ) s++;
849 if ( AC.CompileLevel == 1 && AC.ToBeInFactors ) {
850 error = CodeFactors(tokens);
853 retval = CodeGenerator(tokens);
854 if ( error < 0 )
return(error);
883static UWORD *CGscrat7 = 0;
885int CodeGenerator(SBYTE *tokens)
888 SBYTE *s = tokens, c;
889 int i, sign = 1, first = 1, deno = 1, error = 0, minus, n, needarg, numexp, cc;
890 int base, sumlevel = 0, sumtype = SYMTOSYM, firstsumarg, inset = 0;
891 int funflag = 0, settype, x1, x2, mulflag = 0;
892 WORD *t, *v, *r, *term, nnumerator, ndenominator, *oldwork, x3, y, nin;
893 WORD *w1, *w2, *tsize = 0, *relo = 0;
894 UWORD *numerator, *denominator, *innum;
897 WORD TMproto[SUBEXPSIZE];
904 if ( AC.TokensWriteFlag ) WriteTokens(tokens);
906 CGscrat7 = (UWORD *)Malloc1((AM.MaxTal+2)*
sizeof(WORD),
"CodeGenerator");
908 C = cbuf + AC.cbufnum;
912 oldwork = AT.WorkPointer;
913 numerator = (UWORD *)(AT.WorkPointer);
914 denominator = numerator + 2*AM.MaxTal;
915 innum = denominator + 2*AM.MaxTal;
916 term = (WORD *)(innum + 2*AM.MaxTal);
917 AT.WorkPointer = term + AM.MaxTer/
sizeof(WORD);
918 if ( AT.WorkPointer > AT.WorkTop )
goto OverWork;
921 numerator[0] = denominator[0] = 1;
922 nnumerator = ndenominator = 1;
923 while ( *s != TENDOFIT ) {
924 if ( *s == TPLUS || *s == TMINUS ) {
925 if ( first || mulflag ) {
if ( *s == TMINUS ) sign = -sign; }
929 if ( cc && sign ) C->
CanCommu[numexp]++;
930 CompleteTerm(term,numerator,denominator,nnumerator,ndenominator,sign);
931 first = 1; cc = 0; t = term + 1; deno = 1;
932 numerator[0] = denominator[0] = 1;
933 nnumerator = ndenominator = 1;
934 if ( *s == TMINUS ) sign = -1;
940 mulflag = first = 0; c = *s++;
943 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
944 if ( *s == TWILDCARD ) { s++; x1 += 2*MAXPOWER; }
945 *t++ = SYMBOL; *t++ = 4; *t++ = x1;
946 if ( inset ) *relo = 2;
947TryPower:
if ( *s == TPOWER ) {
949 if ( *s == TMINUS ) { s++; deno = -deno; }
951 base = ( c == TNUMBER ) ? 100: 128;
952 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
953 if ( c == TSYMBOL ) {
954 if ( *s == TWILDCARD ) s++;
962 while ( relo < AT.WorkTop ) *t++ = *relo++;
963 inset = 0; tsize[1] = t - tsize;
967 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
968 *t++ = INDEX; *t++ = 3;
969 if ( *s == TWILDCARD ) { s++; x1 += WILDOFFSET; }
970 if ( inset ) { *t++ = x1; *relo = 2; }
971 else *t++ = x1 + AM.OffsetIndex;
972 if ( t[-1] > AM.IndDum ) {
973 x1 = t[-1] - AM.IndDum;
978 *t++ = INDEX; *t++ = 3; *t++ = AC.DumNum+WILDOFFSET;
982 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
983dovector:
if ( inset == 0 ) x1 += AM.OffsetVector;
984 if ( *s == TWILDCARD ) { s++; x1 += WILDOFFSET; }
985 if ( inset ) *relo = 2;
988 if ( *s == TSETNUM || *s == TSETDOL ) {
989 settype = ( *s == TSETDOL );
990 s++; x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
991 if ( settype ) x2 = -x2;
993 tsize = t; *t++ = SETSET; *t++ = 0;
997 *--relo = x2; *--relo = 3;
999 if ( *s != TVECTOR && *s != TDUBIOUS ) {
1000 MesPrint(
"&Illegally formed dotproduct");
1003 s++; x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1004 if ( inset < 2 ) x2 += AM.OffsetVector;
1005 if ( *s == TWILDCARD ) { s++; x2 += WILDOFFSET; }
1006 *t++ = DOTPRODUCT; *t++ = 5; *t++ = x1; *t++ = x2;
1009 else if ( *s == TFUNOPEN ) {
1011 if ( *s == TSETNUM || *s == TSETDOL ) {
1012 settype = ( *s == TSETDOL );
1013 s++; x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1014 if ( settype ) x2 = -x2;
1016 tsize = t; *t++ = SETSET; *t++ = 0;
1020 *--relo = x2; *--relo = 3;
1022 if ( *s == TINDEX || *s == TDUBIOUS ) {
1024 x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1025 if ( inset < 2 ) x2 += AM.OffsetIndex;
1026 if ( *s == TWILDCARD ) { s++; x2 += WILDOFFSET; }
1027 *t++ = VECTOR; *t++ = 4; *t++ = x1; *t++ = x2;
1028 if ( t[-1] > AM.IndDum ) {
1029 x2 = t[-1] - AM.IndDum;
1033 else if ( *s == TGENINDEX ) {
1034 *t++ = VECTOR; *t++ = 4; *t++ = x1;
1035 *t++ = AC.DumNum + WILDOFFSET;
1037 else if ( *s == TNUMBER || *s == TNUMBER1 ) {
1038 base = ( *s == TNUMBER ) ? 100: 128;
1040 x2 = 0;
while ( *s >= 0 ) { x2 = x2*base + *s++; }
1041 if ( x2 >= AM.OffsetIndex && inset < 2 ) {
1042 MesPrint(
"&Fixed index in vector greater than %d",
1046 *t++ = VECTOR; *t++ = 4; *t++ = x1; *t++ = x2;
1048 else if ( *s == TVECTOR || ( *s == TMINUS && s[1] == TVECTOR ) ) {
1049 if ( *s == TMINUS ) { s++; sign = -sign; }
1051 x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1052 if ( inset < 2 ) x2 += AM.OffsetVector;
1053 if ( *s == TWILDCARD ) { s++; x2 += WILDOFFSET; }
1054 *t++ = DOTPRODUCT; *t++ = 5; *t++ = x1; *t++ = x2; *t++ = deno;
1057 MesPrint(
"&Illegal argument for vector");
1060 if ( *s != TFUNCLOSE ) {
1061 MesPrint(
"&Illegal argument for vector");
1068 *t++ = VECTOR; *t++ = 4; *t++ = x1;
1069 *t++ = AC.DumNum + WILDOFFSET;
1072 *t++ = INDEX; *t++ = 3; *t++ = x1;
1077 if ( *s != TFUNOPEN ) {
1078 MesPrint(
"&d_ needs two arguments");
1081 v = t; *t++ = DELTA; *t++ = 4;
1082 needarg = 2; x3 = x1 = -1;
1085 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
1086 if ( x1 == AM.sumnum || x1 == AM.sumpnum ) sumlevel = x1;
1088 if ( x1 == FIRSTBRACKET ) {
1089 if ( s[0] == TFUNOPEN && s[1] == TEXPRESSION ) {
1091 *t++ = x1; *t++ = FUNHEAD+2; *t++ = 0;
1092 if ( x1 == AR.PolyFun && AR.PolyFunType == 2 && AR.Eside != LHSIDE )
1093 t[-1] |= MUSTCLEANPRF;
1095 x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1096 *t++ = -EXPRESSION; *t++ = x2;
1102 if ( Expressions[x2].status == STOREDEXPRESSION ) {
1103 TMproto[0] = EXPRESSION;
1104 TMproto[1] = SUBEXPSIZE;
1107 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1108 AT.TMaddr = TMproto;
1125 if ( ( renumber = GetTable(x2,&position,0) ) == 0 ) {
1127 MesPrint(
"&Problems getting information about stored expression %s(1)"
1130 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1131 M_free(renumber->
symb.
lo,
"VarSpace");
1132 M_free(renumber,
"Renumber");
1133 AR.StoreData.dirtyflag = 1;
1135 if ( *s != TFUNCLOSE ) {
1136 if ( x1 == FIRSTBRACKET )
1137 MesPrint(
"&Problems with argument of FirstBracket_");
1138 else if ( x1 == FIRSTTERM )
1139 MesPrint(
"&Problems with argument of FirstTerm_");
1140 else if ( x1 == CONTENTTERM )
1141 MesPrint(
"&Problems with argument of FirstTerm_");
1142 else if ( x1 == TERMSINEXPR )
1143 MesPrint(
"&Problems with argument of TermsIn_");
1144 else if ( x1 == SIZEOFFUNCTION )
1145 MesPrint(
"&Problems with argument of SizeOf_");
1146 else if ( x1 == NUMFACTORS )
1147 MesPrint(
"&Problems with argument of NumFactors_");
1149 MesPrint(
"&Problems with argument of FactorIn_");
1151 while ( *s != TENDOFIT && *s != TFUNCLOSE ) s++;
1153 if ( *s == TFUNCLOSE ) s++;
1157 else if ( x1 == TERMSINEXPR || x1 == SIZEOFFUNCTION || x1 == FACTORIN
1158 || x1 == NUMFACTORS || x1 == FIRSTTERM || x1 == CONTENTTERM ) {
1159 if ( s[0] == TFUNOPEN && s[1] == TEXPRESSION )
goto doexpr;
1160 if ( s[0] == TFUNOPEN && s[1] == TDOLLAR ) {
1162 *t++ = x1; *t++ = FUNHEAD+2; *t++ = 0;
1164 x2 = 0;
while ( *s >= 0 ) { x2 = x2*128 + *s++; }
1165 *t++ = -DOLLAREXPRESSION; *t++ = x2;
1166 if ( *s != TFUNCLOSE ) {
1167 if ( x1 == TERMSINEXPR )
1168 MesPrint(
"&Problems with argument of TermsIn_");
1169 else if ( x1 == SIZEOFFUNCTION )
1170 MesPrint(
"&Problems with argument of SizeOf_");
1171 else if ( x1 == NUMFACTORS )
1172 MesPrint(
"&Problems with argument of NumFactors_");
1174 MesPrint(
"&Problems with argument of FactorIn_");
1176 while ( *s != TENDOFIT && *s != TFUNCLOSE ) s++;
1178 if ( *s == TFUNCLOSE ) s++;
1183 if ( inset && ( t-tsize == 2 ) ) x1 -= FUNCTION;
1184 if ( *s == TWILDCARD ) { x1 += WILDOFFSET; s++; }
1185 if ( functions[x3-FUNCTION].commute ) cc = 1;
1186 if ( *s != TFUNOPEN ) {
1187 *t++ = x1; *t++ = FUNHEAD; *t++ = 0;
1188 if ( x1 == AR.PolyFun && AR.PolyFunType == 2 && AR.Eside != LHSIDE )
1189 t[-1] |= MUSTCLEANPRF;
1190 FILLFUN3(t) sumlevel = 0;
goto fin;
1192 v = t; *t++ = x1; *t++ = FUNHEAD; *t++ = DIRTYFLAG;
1193 if ( x1 == AR.PolyFun && AR.PolyFunType == 2 && AR.Eside != LHSIDE )
1194 t[-1] |= MUSTCLEANPRF;
1197 if ( !inset && functions[x3-FUNCTION].spec >= TENSORFUNCTION ) {
1200 if ( needarg == 0 ) {
1203 if ( x3 >= FUNCTION+WILDOFFSET ) x3 -= WILDOFFSET;
1204 MesPrint(
"&Too many arguments in function %s",
1205 VARNAME(functions,(x3-FUNCTION)) );
1208 MesPrint(
"&d_ needs exactly two arguments");
1212 else if ( needarg > 0 ) needarg--;
1215 if ( c == TMINUS && *s == TVECTOR ) { sign = -sign; c = *s++; }
1216 base = ( c == TNUMBER ) ? 100: 128;
1217 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
1218 if ( *s == TWILDCARD && c != TNUMBER ) { x2 += WILDOFFSET; s++; }
1219 if ( c == TSETNUM || c == TSETDOL ) {
1220 if ( c == TSETDOL ) x2 = -x2;
1222 w1 = t; t += 2; w2 = t;
1223 while ( w1 > v ) *--w2 = *--w1;
1224 tsize = v; relo = AT.WorkTop;
1225 *v++ = SETSET; *v++ = 0;
1227 inset = 2; *--relo = x2; *--relo = t - v;
1229 x2 = 0;
while ( *s >= 0 ) x2 = 128*x2 + *s++;
1233 if ( t[-1]+AM.OffsetIndex > AM.IndDum ) {
1234 x2 = t[-1]+AM.OffsetIndex - AM.IndDum;
1241 if ( x2 >= 0 && x2 < AM.OffsetIndex ) {
1246 MesPrint(
"&Illegal type of set inside tensor");
1252 else {
switch ( c ) {
1254 if ( inset < 2 ) *t++ = x2 + AM.OffsetIndex;
1256 if ( x2+AM.OffsetIndex > AM.IndDum ) {
1257 x2 = x2+AM.OffsetIndex - AM.IndDum;
1262 *t++ = AC.DumNum + WILDOFFSET;
1265 if ( inset < 2 ) *t++ = x2 + AM.OffsetVector;
1269 *t++ = FUNNYWILD; *t++ = x2;
1273 *t++ = FUNNYDOLLAR; *t++ = x2;
1276 if ( inset < 2 ) *t++ = x2 + AM.OffsetVector;
1280 if ( x3 != GAMMA ) {
1281 MesPrint(
"&5_,6_,7_ can only be used inside g_");
1288 if ( x2 >= AM.OffsetIndex && inset < 2 ) {
1289 MesPrint(
"&Value of constant index in tensor too large");
1295 MesPrint(
"&Illegal object in tensor");
1299 if ( inset >= 2 ) inset = 1;
1300 }
while ( *s == TCOMMA );
1303dofunction: firstsumarg = 1;
1308 if ( c == TMINUS && ( *s == TVECTOR || *s == TNUMBER
1309 || *s == TNUMBER1 || *s == TSUBEXP ) ) {
1310 minus = 1; c = *s++;
1313 base = ( c == TNUMBER ) ? 100: 128;
1314 ux2 = 0;
while ( *s >= 0 ) { ux2 = base*ux2 + *s++; }
1319 if ( firstsumarg ) {
1321 if ( sumlevel > 0 ) {
1322 if ( c == TSYMBOL ) {
1323 sumlevel = x2; sumtype = SYMTOSYM;
1325 else if ( c == TINDEX ) {
1326 sumlevel = x2+AM.OffsetIndex; sumtype = INDTOIND;
1327 if ( sumlevel > AM.IndDum ) {
1328 x2 = sumlevel - AM.IndDum;
1334 if ( *s == TWILDCARD ) {
1335 if ( c == TSYMBOL ) x2 += 2*MAXPOWER;
1336 else if ( c != TNUMBER ) x2 += WILDOFFSET;
1341 *t++ = -SYMBOL; *t++ = x2;
break;
1343 *t++ = -DOLLAREXPRESSION; *t++ = x2;
break;
1345 *t++ = -EXPRESSION; *t++ = x2;
1351 if ( Expressions[x2].status == STOREDEXPRESSION ) {
1352 TMproto[0] = EXPRESSION;
1353 TMproto[1] = SUBEXPSIZE;
1356 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1357 AT.TMaddr = TMproto;
1374 if ( ( renumber = GetTable(x2,&position,0) ) == 0 ) {
1376 MesPrint(
"&Problems getting information about stored expression %s(2)"
1379 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1380 M_free(renumber->
symb.
lo,
"VarSpace");
1381 M_free(renumber,
"Renumber");
1382 AR.StoreData.dirtyflag = 1;
1386 *t++ = -INDEX; *t++ = x2 + AM.OffsetIndex;
1387 if ( t[-1] > AM.IndDum ) {
1388 x2 = t[-1] - AM.IndDum;
1393 *t++ = -INDEX; *t++ = AC.DumNum + WILDOFFSET;
1396 if ( minus ) *t++ = -MINVECTOR;
1397 else *t++ = -VECTOR;
1398 *t++ = x2 + AM.OffsetVector;
1401 MesPrint(
"&5_,6_,7_ can only be used inside g_");
1407 *t++ = -SYMBOL; *t++ = x2;
break;
1409 *t++ = -x2-FUNCTION;
1416 *t++ = -ARGWILD; *t++ = x2;
break;
1422 w1 = t; t += 2; w2 = t;
1423 while ( w1 > v ) *--w2 = *--w1;
1424 tsize = v; relo = AT.WorkTop;
1425 *v++ = SETSET; *v++ = 0;
1428 *--relo = x2; *--relo = t-v+1;
1430 x2 = 0;
while ( *s >= 0 ) x2 = 128*x2 + *s++;
1433 (*relo)--; *t++ = -x2-1;
break;
1435 *t++ = -SYMBOL; *t++ = x2;
break;
1437 *t++ = -INDEX; *t++ = x2;
1438 if ( x2+AM.OffsetIndex > AM.IndDum ) {
1439 x2 = x2+AM.OffsetIndex - AM.IndDum;
1444 *t++ = -VECTOR; *t++ = x2;
break;
1446 *t++ = -SNUMBER; *t++ = x2;
break;
1448 MesPrint(
"&Internal error 435");
1450 *t++ = -SYMBOL; *t++ = x2;
break;
1454 w2 = AC.ProtoType; i = w2[1];
1460 while ( --i >= 0 ) *t++ = *w2++;
1461 w1[ARGHEAD+3] = subexpbuffers[x2].subexpnum;
1462 w1[ARGHEAD+5] = subexpbuffers[x2].buffernum;
1463 if ( sumlevel > 0 ) {
1467 *t++ = sumtype; *t++ = 4;
1468 *t++ = sumlevel; *t++ = sumlevel;
1471 if ( minus ) *t++ = -3;
1476 if ( minus ) x2 = UnsignedToInt(-IntAbs(x2));
1481 MesPrint(
"&Illegal object in function");
1485 }
while ( *s == TCOMMA );
1487 if ( *s != TFUNCLOSE ) {
1488 MesPrint(
"&Illegal argument field for function. Expected )");
1502 x1 = 0;
while ( *s >= 0 ) x1 = 128*x1 + *s++;
1503 if ( *s == TWILDCARD ) s++;
1504 if ( *s == TDOT )
goto dovector;
1505 if ( *s == TFUNOPEN ) {
1508 v = t; *t++ = x1; *t++ = FUNHEAD; *t++ = DIRTYFLAG;
1509 if ( x1 == AR.PolyFun && AR.PolyFunType == 2 && AR.Eside != LHSIDE )
1510 t[-1] |= MUSTCLEANPRF;
1512 needarg = -1;
goto dofunction;
1514 *t++ = SYMBOL; *t++ = 4; *t++ = 0;
1515 if ( inset ) *relo = 2;
1518 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
1519 if ( *s == TPOWER ) {
1521 base = ( c == TNUMBER ) ? 100: 128;
1522 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
1523 if ( *s == TWILDCARD ) { x2 += 2*MAXPOWER; s++; }
1524 else if ( c == TSYMBOL ) x2 += 2*MAXPOWER;
1527 r = AC.ProtoType; n = r[1] - 5; r += 5;
1528 *t++ = SUBEXPRESSION; *t++ = r[-4];
1529 *t++ = subexpbuffers[x1].subexpnum;
1531 *t++ = subexpbuffers[x1].buffernum;
1533 if ( cbuf[subexpbuffers[x1].buffernum].CanCommu[subexpbuffers[x1].subexpnum] ) cc = 1;
1545 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
1547 *t++ = EXPRESSION; *t++ = SUBEXPSIZE; *t++ = x1; *t++ = deno;
1548 *t++ = 0; FILLSUB(t)
1554 if ( *s == TFUNOPEN ) {
1557 base = ( c == TNUMBER ) ? 100: 128;
1558 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
1561 *t++ = SYMBOL; *t++ = 4; *t++ = x2; *t++ = 1;
1564 *t++ = INDEX; *t++ = 3; *t++ = x2+AM.OffsetIndex;
1565 if ( t[-1] > AM.IndDum ) {
1566 x2 = t[-1] - AM.IndDum;
1571 *t++ = INDEX; *t++ = 3; *t++ = x2+AM.OffsetVector;
1574 *t++ = x2+FUNCTION; *t++ = 2;
break;
1577 if ( x2 >= AM.OffsetIndex || x2 < 0 ) {
1578 MesPrint(
"&Index as argument of expression has illegal value");
1581 *t++ = INDEX; *t++ = 3; *t++ = x2;
break;
1587 w1 = t; t += 2; w2 = t;
1588 while ( w1 > v ) *--w2 = *--w1;
1589 tsize = v; relo = AT.WorkTop;
1590 *v++ = SETSET; *v++ = 0;
1593 *--relo = x2; *--relo = t-v+2;
1595 x2 = 0;
while ( *s >= 0 ) x2 = 128*x2 + *s++;
1598 *relo -= 2; *t++ = -x2-1;
break;
1600 *t++ = SYMBOL; *t++ = 4; *t++ = x2; *t++ = 1;
break;
1602 *t++ = INDEX; *t++ = 3; *t++ = x2;
1603 if ( x2+AM.OffsetIndex > AM.IndDum ) {
1604 x2 = x2+AM.OffsetIndex - AM.IndDum;
1609 *t++ = VECTOR; *t++ = 3; *t++ = x2;
break;
1611 *t++ = SNUMBER; *t++ = 4; *t++ = x2; *t++ = 1;
break;
1613 MesPrint(
"&Internal error 435");
1615 *t++ = SYMBOL; *t++ = 4; *t++ = x2; *t++ = 1;
break;
1619 MesPrint(
"&Argument of expression can only be symbol, index, vector or function");
1623 }
while ( *s == TCOMMA );
1624 if ( *s != TFUNCLOSE ) {
1625 MesPrint(
"&Illegal object in argument field for expression");
1627 while ( *s != TFUNCLOSE ) s++;
1631 r = AC.ProtoType; n = r[1];
1632 if ( n > SUBEXPSIZE ) {
1633 *t++ = WILDCARDS; *t++ = n+2;
1641 if ( Expressions[x1].status == STOREDEXPRESSION ) {
1660 if ( ( renumber = GetTable(x1,&position,0) ) == 0 ) {
1662 MesPrint(
"&Problems getting information about stored expression %s(3)"
1665 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1666 M_free(renumber->
symb.
lo,
"VarSpace");
1667 M_free(renumber,
"Renumber");
1668 AR.StoreData.dirtyflag = 1;
1670 if ( *s == LBRACE ) {
1678 if ( *s != TSUBEXP ) {
1679 MesPrint(
"&Internal error 23");
1682 s++; x2 = 0;
while ( *s >= 0 ) { x2 = 128*x2 + *s++; }
1683 r = cbuf[subexpbuffers[x2].buffernum].rhs[subexpbuffers[x2].subexpnum];
1684 *t++ = FROMBRAC; *t++ = *r+2;
1688 MesPrint(
"&Object between [] in expression should be a single term");
1691 if ( *s != RBRACE ) {
1692 MesPrint(
"&Internal error 23b");
1697 if ( *s == TPOWER ) {
1699 base = ( c == TNUMBER ) ? 100: 128;
1700 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
1701 if ( *s == TWILDCARD || c == TSYMBOL ) { x2 += 2*MAXPOWER; s++; }
1710 if ( *s == TPOWER ) {
1711 s++;
if ( *s == TMINUS ) { s++; deno = -deno; }
1712 c = *s++; base = ( c == TNUMBER ) ? 100: 128;
1713 x2 = 0;
while ( *s >= 0 ) { x2 = x2*base + *s++; }
1716 MesPrint(
"&Encountered 0^0 during compilation");
1720 MesPrint(
"&Division by zero during compilation (0 to the power negative number)");
1723 else if ( deno < 0 ) {
1725 MesPrint(
"&Division by zero during compilation");
1730 if ( *s >= 0 ) { y = 100*y + *s++; }
1731 innum[0] = y; nin = 1;
1734 if ( *s >= 0 ) { y = 100*y + *s++; x2 = 10000; }
1735 Product(innum,&nin,(WORD)x2);
1736 if ( y ) AddLong(innum,nin,(UWORD *)(&y),(WORD)1,innum,&nin);
1739 if ( *s == TPOWER ) {
1740 s++;
if ( *s == TMINUS ) { s++; deno = -deno; }
1741 c = *s++; base = ( c == TNUMBER ) ? 100: 128;
1742 x2 = 0;
while ( *s >= 0 ) { x2 = x2*base + *s++; }
1744 innum[0] = 1; nin = 1;
1746 else if ( RaisPow(BHEAD innum,&nin,x2) ) {
1747 error = -1; innum[0] = 1; nin = 1;
1751 Simplify(BHEAD innum,&nin,denominator,&ndenominator);
1752 for ( i = 0; i < nnumerator; i++ ) CGscrat7[i] = numerator[i];
1753 MulLong(innum,nin,CGscrat7,nnumerator,numerator,&nnumerator);
1755 else if ( deno < 0 ) {
1756 Simplify(BHEAD innum,&nin,numerator,&nnumerator);
1757 for ( i = 0; i < ndenominator; i++ ) CGscrat7[i] = denominator[i];
1758 MulLong(innum,nin,CGscrat7,ndenominator,denominator,&ndenominator);
1763 if ( *s == 0 ) { s++; sign = 0;
break; }
1765 if ( *s >= 0 ) { y = 128*y + *s++; }
1767 innum[0] = y; nin = 1;
1770 if ( *s >= 0 ) { y = 128*y + *s++; x2 = 16384; }
1771 Product(innum,&nin,(WORD)x2);
1772 if ( y ) AddLong(innum,nin,(UWORD *)&y,(WORD)1,innum,&nin);
1776 *relo = 2; *t++ = SNUMBER; *t++ = 4; *t++ = y;
1782 i = AT.WorkPointer[1];
1794 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
1795 if ( AR.Eside != LHSIDE ) {
1796 *t++ = SUBEXPRESSION; *t++ = SUBEXPSIZE; *t++ = x1;
1799 *t++ = DOLLAREXPRESSION; *t++ = SUBEXPSIZE; *t++ = x1;
1802 *t++ = AM.dbufnum; FILLSUB(t)
1806 if ( *s == LBRACE ) {
1809 while ( bracelevel > 0 ) {
1810 if ( *s == RBRACE ) {
1813 else if ( *s == TNUMBER ) {
1815 x2 = 0;
while ( *s >= 0 ) { x2 = 100*x2 + *s++; }
1816 *t++ = DOLLAREXPR2; *t++ = 3; *t++ = -x2-1;
1818 while ( bracelevel > 0 ) {
1819 if ( *s != RBRACE ) {
1822 MesPrint(
"&Improper use of [] in $-variable.");
1830 else if ( *s == TDOLLAR ) {
1832 x1 = 0;
while ( *s >= 0 ) { x1 = x1*128 + *s++; }
1833 *t++ = DOLLAREXPR2; *t++ = 3; *t++ = x1;
1834 if ( *s == RBRACE )
goto CloseBraces;
1835 else if ( *s == LBRACE ) {
1839 else goto ErrorBraces;
1845 if ( *s == TPOWER ) {
1847 if ( *s == TMINUS ) { s++; deno = -deno; }
1849 base = ( c == TNUMBER ) ? 100: 128;
1850 x2 = 0;
while ( *s >= 0 ) { x2 = base*x2 + *s++; }
1851 if ( c == TSYMBOL ) {
1852 if ( *s == TWILDCARD ) s++;
1855 *powplace = deno*x2;
1857 else *powplace = deno;
1868 inset = 1; tsize = t; relo = AT.WorkTop;
1869 *t++ = SETSET; *t++ = 0;
1870 x1 = 0;
while ( *s >= 0 ) x1 = x1*128 + *s++;
1871 *--relo = x1; *--relo = 0;
1874 inset = 1; tsize = t; relo = AT.WorkTop;
1875 *t++ = SETSET; *t++ = 0;
1876 x1 = 0;
while ( *s >= 0 ) x1 = x1*128 + *s++;
1877 *--relo = -x1; *--relo = 0;
1880 MesPrint(
"&Illegal use of function arguments");
1887 MesPrint(
"&Illegal use of function arguments");
1893 MesPrint(
"&Illegal use special gamma symbols 5_, 6_, 7_");
1899 MesPrint(
"&Complex conjugate operator (%#) is not implemented");
1904 MesPrint(
"&Internal error in code generator. Unknown object: %d",c);
1912 MesPrint(
"&Irregular end of statement.");
1915 if ( !first && error == 0 ) {
1918 if ( cc && sign ) C->
CanCommu[numexp]++;
1919 error = CompleteTerm(term,numerator,denominator,nnumerator,ndenominator,sign);
1921 AT.WorkPointer = oldwork;
1922 if ( error )
return(-1);
1924 if ( AC.CompileLevel > 0 && AR.Eside != LHSIDE ) {
1926 error = InsTree(AC.cbufnum,C->numrhs);
1927 if ( error < (C->numrhs) ) {
1934 MLOCK(ErrorMessageLock);
1936 MUNLOCK(ErrorMessageLock);
1948int CompleteTerm(WORD *term, UWORD *numer, UWORD *denom, WORD nnum, WORD nden,
int sign)
1952 if ( sign == 0 )
return(0);
1953 if ( nnum >= nden ) nsize = nnum;
1956 for ( i = 0; i < nnum; i++ ) *t++ = numer[i];
1957 for ( ; i < nsize; i++ ) *t++ = 0;
1958 for ( i = 0; i < nden; i++ ) *t++ = denom[i];
1959 for ( ; i < nsize; i++ ) *t++ = 0;
1960 *t++ = (2*nsize+1)*sign;
1962 AddNtoC(AC.cbufnum,*term,term,7);
1985int CodeFactors(SBYTE *tokens)
1989 int nfactor = 1, nparenthesis, i, last = 0, error = 0;
1990 SBYTE *t, *startobject, *tt, *s1, *out, *outtokens;
1991 WORD nexp, subexp = 0, power, pow, x2, powfactor, first;
1996 while ( *t != TENDOFIT ) {
1997 if ( *t >= 0 ) {
while ( *t >= 0 ) t++;
continue; }
1998 if ( *t == LPARENTHESIS || *t == LBRACE || *t == TSETOPEN || *t == TFUNOPEN ) {
1999 nparenthesis = 0; t++;
2000 while ( nparenthesis >= 0 ) {
2001 if ( *t == LPARENTHESIS || *t == LBRACE || *t == TSETOPEN || *t == TFUNOPEN ) nparenthesis++;
2002 else if ( *t == RPARENTHESIS || *t == RBRACE || *t == TSETCLOSE || *t == TFUNCLOSE ) nparenthesis--;
2007 else if ( ( *t == TPLUS || *t == TMINUS ) && ( t > tokens )
2008 && ( t[-1] != TPLUS && t[-1] != TMINUS ) ) {
2009 if ( t[-1] >= 0 || t[-1] == RPARENTHESIS || t[-1] == RBRACE
2010 || t[-1] == TSETCLOSE || t[-1] == TFUNCLOSE ) {
2011 subexp = CodeGenerator(tokens);
2012 if ( subexp < 0 ) error = -1;
2013 if ( insubexpbuffers >= MAXSUBEXPRESSIONS ) {
2014 MesPrint(
"&More than %d subexpressions inside one expression",(WORD)MAXSUBEXPRESSIONS);
2017 if ( subexpbuffers+insubexpbuffers >= topsubexpbuffers ) {
2018 DoubleBuffer((
void **)((
void *)(&subexpbuffers))
2019 ,(
void **)((
void *)(&topsubexpbuffers)),
sizeof(
SUBBUF),
"subexpbuffers");
2021 subexpbuffers[insubexpbuffers].subexpnum = subexp;
2022 subexpbuffers[insubexpbuffers].buffernum = AC.cbufnum;
2023 subexp = insubexpbuffers++;
2025 *t++ = TSYMBOL; *t++ = FACTORSYMBOL;
2026 *t++ = TMULTIPLY; *t++ = TSUBEXP;
2027 PUTNUMBER128(t,subexp)
2030 e->vflags |= ISFACTORIZED;
2034 else if ( ( *t == TMULTIPLY || *t == TDIVIDE ) && t > tokens ) {
2037 else if ( *t == TEXPRESSION ) {
2039 nexp = 0;
while ( *t >= 0 ) { nexp = nexp*128 + *t++; }
2040 if ( *t == LBRACE )
continue;
2041 if ( ( AS.Oldvflags[nexp] & ISFACTORIZED ) != 0 ) {
2042 nfactor += AS.OldNumFactors[nexp];
2047 else if ( *t == TDOLLAR ) {
2049 nexp = 0;
while ( *t >= 0 ) { nexp = nexp*128 + *t++; }
2050 if ( *t == LBRACE )
continue;
2051 if ( Dollars[nexp].nfactors > 0 ) {
2052 nfactor += Dollars[nexp].nfactors;
2063 outtokens = (SBYTE *)Malloc1(((t-tokens)+(nfactor+2)*25)*
sizeof(SBYTE),
"CodeFactors");
2065 t = tokens; first = 1; powfactor = 1;
2066 while ( *t == TPLUS || *t == TMINUS ) {
if ( *t == TMINUS ) first = -first; t++; }
2068 *out++ = TMINUS; *out++ = TSYMBOL; *out++ = FACTORSYMBOL;
2069 *out++ = TPOWER; *out++ = TNUMBER; PUTNUMBER100(out,powfactor)
2072 startobject = t; power = 1;
2073 while ( *t != TENDOFIT ) {
2074 if ( *t >= 0 ) {
while ( *t >= 0 ) t++;
continue; }
2075 if ( *t == LPARENTHESIS || *t == LBRACE || *t == TSETOPEN || *t == TFUNOPEN ) {
2076 nparenthesis = 0; t++;
2077 while ( nparenthesis >= 0 ) {
2078 if ( *t == LPARENTHESIS || *t == LBRACE || *t == TSETOPEN || *t == TFUNOPEN ) nparenthesis++;
2079 else if ( *t == RPARENTHESIS || *t == RBRACE || *t == TSETCLOSE || *t == TFUNCLOSE ) nparenthesis--;
2084 else if ( ( *t == TMULTIPLY || *t == TDIVIDE ) && ( t > tokens ) ) {
2085 if ( t[-1] >= 0 || t[-1] == RPARENTHESIS || t[-1] == RBRACE
2086 || t[-1] == TSETCLOSE || t[-1] == TFUNCLOSE ) {
2088 if ( startobject ) {
2090 if ( power < 0 ) { *out++ = TNUMBER; *out++ = 1; *out++ = TDIVIDE; }
2092 while ( s1 < t ) *out++ = *s1++;
2093 *out++ = TMULTIPLY; *out++ = TSYMBOL; *out++ = FACTORSYMBOL;
2094 *out++ = TPOWER; *out++ = TNUMBER; PUTNUMBER100(out,powfactor)
2097 if ( last ) { startobject = 0;
break; }
2099 if ( *t == TDIVIDE ) power = -1;
2100 if ( *t == TMULTIPLY ) power = 1;
2103 else if ( *t == TPOWER ) {
2106 while ( ( *tt == TMINUS ) || ( *tt == TPLUS ) ) {
2107 if ( *tt == TMINUS ) pow = -pow;
2110 if ( *tt == TSYMBOL ) {
2111 tt++;
while ( *tt >= 0 ) tt++;
2114 tt++; x2 = 0;
while ( *tt >= 0 ) { x2 = 100*x2 + *tt++; }
2119 power = power*pow*x2;
2120 if ( power < 0 ) { pow = -power; power = -1; }
2121 else if ( power == 0 ) { t = tt; startobject = tt;
continue; }
2122 else { pow = power; power = 1; }
2125 subexp = GenerateFactors(pow,1);
2126 if ( subexp < 0 ) { error = -1; subexp = 0; }
2127 *out++ = TSUBEXP; PUTNUMBER128(out,subexp);
2129 *out++ = TSYMBOL; *out++ = FACTORSYMBOL;
2130 *out++ = TPOWER; *out++ = TNUMBER; PUTNUMBER100(out,powfactor)
2132 if ( power > 0 ) *out++ = TMULTIPLY;
2133 else *out++ = TDIVIDE;
2134 s1 = startobject;
while ( s1 < t ) *out++ = *s1++;
2135 startobject = 0; t = tt;
continue;
2137 else if ( *t == TEXPRESSION ) {
2140 nexp = 0;
while ( *t >= 0 ) { nexp = nexp*128 + *t++; }
2141 if ( *t == LBRACE )
continue;
2142 if ( *t == LPARENTHESIS ) {
2143 nparenthesis = 0; t++;
2144 while ( nparenthesis >= 0 ) {
2145 if ( *t == LPARENTHESIS ) nparenthesis++;
2146 else if ( *t == RPARENTHESIS ) nparenthesis--;
2150 if ( ( AS.Oldvflags[nexp] & ISFACTORIZED ) == 0 )
continue;
2151 if ( *t == TPOWER ) {
2154 while ( ( *tt == TMINUS ) || ( *tt == TPLUS ) ) {
2155 if ( *tt == TMINUS ) pow = -pow;
2158 if ( *tt != TNUMBER ) {
2159 MesPrint(
"Internal problems(1) in CodeFactors");
2162 tt++; x2 = 0;
while ( *tt >= 0 ) { x2 = 100*x2 + *tt++; }
2168 power = power*pow*x2;
2169 if ( power < 0 ) { pow = -power; power = -1; }
2170 else if ( power == 0 ) { t = tt; startobject = tt;
continue; }
2171 else { pow = power; power = 1; }
2174 subexp = GenerateFactors(pow,AS.OldNumFactors[nexp]);
2175 if ( subexp < 0 ) { error = -1; subexp = 0; }
2176 *out++ = TSUBEXP; PUTNUMBER128(out,subexp)
2181 *out++ = TSYMBOL; *out++ = FACTORSYMBOL;
2183 *out++ = TPOWER; *out++ = TNUMBER; PUTNUMBER100(out,i)
2187 powfactor += AS.OldNumFactors[nexp]*pow;
2189 while ( s1 < t ) *out++ = *s1++;
2190 startobject = 0; t = tt;
continue;
2193 tt = t; pow = 1; x2 = 1;
goto dopower;
2196 else if ( *t == TDOLLAR ) {
2199 nexp = 0;
while ( *t >= 0 ) { nexp = nexp*128 + *t++; }
2200 if ( *t == LBRACE )
continue;
2201 if ( Dollars[nexp].nfactors == 0 )
continue;
2202 if ( *t == TPOWER ) {
2205 while ( ( *tt == TMINUS ) || ( *tt == TPLUS ) ) {
2206 if ( *tt == TMINUS ) pow = -pow;
2209 if ( *tt != TNUMBER ) {
2210 MesPrint(
"Internal problems(2) in CodeFactors");
2213 tt++; x2 = 0;
while ( *tt >= 0 ) { x2 = 100*x2 + *tt++; }
2219 power = power*pow*x2;
2220 if ( power < 0 ) { pow = -power; power = -1; }
2221 else if ( power == 0 ) { t = tt; startobject = tt;
continue; }
2222 else { pow = power; power = 1; }
2224 subexp = GenerateFactors(pow,1);
2225 if ( subexp < 0 ) { error = -1; subexp = 0; }
2227 for ( i = 1; i <= Dollars[nexp].nfactors; i++ ) {
2228 s1 = startobject; *out++ = TPLUS;
2229 while ( s1 < t ) *out++ = *s1++;
2230 *out++ = LBRACE; *out++ = TNUMBER; PUTNUMBER128(out,i)
2233 *out++ = TSYMBOL; *out++ = FACTORSYMBOL;
2234 *out++ = TPOWER; *out++ = TNUMBER; PUTNUMBER100(out,powfactor)
2237 *out++ = TSUBEXP; PUTNUMBER128(out,subexp)
2240 startobject = 0; t = tt;
continue;
2243 tt = t; pow = 1; x2 = 1;
goto dopowerd;
2248 if ( last == 0 ) { last = 1;
goto dolast; }
2250 e->numfactors = powfactor-1;
2251 e->vflags |= ISFACTORIZED;
2252 subexp = CodeGenerator(outtokens);
2253 if ( subexp < 0 ) error = -1;
2254 if ( insubexpbuffers >= MAXSUBEXPRESSIONS ) {
2255 MesPrint(
"&More than %d subexpressions inside one expression",(WORD)MAXSUBEXPRESSIONS);
2258 if ( subexpbuffers+insubexpbuffers >= topsubexpbuffers ) {
2259 DoubleBuffer((
void **)((
void *)(&subexpbuffers))
2260 ,(
void **)((
void *)(&topsubexpbuffers)),
sizeof(
SUBBUF),
"subexpbuffers");
2262 subexpbuffers[insubexpbuffers].subexpnum = subexp;
2263 subexpbuffers[insubexpbuffers].buffernum = AC.cbufnum;
2264 subexp = insubexpbuffers++;
2265 M_free(outtokens,
"CodeFactors");
2267 *s1++ = TSUBEXP; PUTNUMBER128(s1,subexp); *s1++ = TENDOFIT;
2268 if ( error < 0 )
return(-1);
2269 else return(subexp);
2282WORD GenerateFactors(WORD n,WORD inc)
2287 SBYTE *tokenbuffer = (SBYTE *)Malloc1(8*n*
sizeof(SBYTE),
"GenerateFactors");
2289 *s++ = TNUMBER; *s++ = 1;
2290 for ( i = inc; i < n*inc; i += inc ) {
2291 *s++ = TPLUS; *s++ = TSYMBOL; *s++ = FACTORSYMBOL;
2293 *s++ = TPOWER; *s++ = TNUMBER;
2298 subexp = CodeGenerator(tokenbuffer);
2299 if ( subexp < 0 ) error = -1;
2300 M_free(tokenbuffer,
"GenerateFactors");
2301 if ( insubexpbuffers >= MAXSUBEXPRESSIONS ) {
2302 MesPrint(
"&More than %d subexpressions inside one expression",(WORD)MAXSUBEXPRESSIONS);
2305 if ( subexpbuffers+insubexpbuffers >= topsubexpbuffers ) {
2306 DoubleBuffer((
void **)((
void *)(&subexpbuffers))
2307 ,(
void **)((
void *)(&topsubexpbuffers)),
sizeof(
SUBBUF),
"subexpbuffers");
2309 subexpbuffers[insubexpbuffers].subexpnum = subexp;
2310 subexpbuffers[insubexpbuffers].buffernum = AC.cbufnum;
2311 subexp = insubexpbuffers++;
2312 if ( error < 0 )
return(error);
UBYTE * SkipAName(UBYTE *s)