47int CleanExpr(WORD par)
57 e_in = e_out = Expressions;
59 e_in->vflags &= ~( TOBEFACTORED | TOBEUNFACTORED );
67 M_free(e_in->renum,
"Renumber"); e_in->renum = 0;
70 if ( e_in->status == HIDDENLEXPRESSION
71 || e_in->status == HIDDENGEXPRESSION ) numhid++;
72 switch ( e_in->status ) {
73 case SPECTATOREXPRESSION:
75 case HIDDENLEXPRESSION:
77 AC.exprnames->namenode[e_in->node].type = CDELETE;
79 if ( e_in->status != HIDDENLEXPRESSION )
80 ClearBracketIndex(e_in-Expressions);
84 case GLOBALEXPRESSION:
85 case HIDDENGEXPRESSION:
91 if (
PF_BroadcastExpr(e_in, e_in->status == HIDDENGEXPRESSION ? AR.hidefile : AR.outfile) ) return -1;
92 if ( PF.me == MASTER ) {
98 if ( e_in->status == HIDDENGEXPRESSION ) {
99 if ( e->status == HIDDENGEXPRESSION
100 || e->status == HIDDENLEXPRESSION )
break;
103 if ( e->status == GLOBALEXPRESSION
104 || e->status == LOCALEXPRESSION )
break;
118 DIFPOS(length,e->onfile,e_in->onfile);
121 FILEHANDLE *f = e_in->status == HIDDENGEXPRESSION ? AR.hidefile : AR.outfile;
123 SETBASELENGTH(length,TOLONG(f->POfull)
124 - TOLONG(f->PObuffer)
125 - BASEPOSITION(e_in->onfile));
128 SeekFile(f->
handle,&(f->filesize),SEEK_SET);
129 DIFPOS(length,f->filesize,e_in->onfile);
132 if ( ToStorage(e_in,&length) ) {
133 return(MesCall(
"CleanExpr"));
135 e_in->status = STOREDEXPRESSION;
136 if ( e_in->status != HIDDENGEXPRESSION )
137 ClearBracketIndex(e_in-Expressions);
140 case SKIPLEXPRESSION:
141 case DROPLEXPRESSION:
142 case DROPHLEXPRESSION:
143 case DROPGEXPRESSION:
144 case DROPHGEXPRESSION:
145 case STOREDEXPRESSION:
146 case DROPSPECTATOREXPRESSION:
147 if ( e_out != e_in ) {
148 node = AC.exprnames->namenode + e_in->node;
149 node->number = e_out - Expressions;
151 e_out->onfile = e_in->onfile;
152 e_out->size = e_in->size;
153 e_out->printflag = 0;
154 if ( par ) e_out->status = STOREDEXPRESSION;
155 else e_out->status = e_in->status;
156 e_out->name = e_in->name;
157 e_out->node = e_in->node;
158 e_out->renum = e_in->renum;
160 e_out->counter = e_in->counter;
161 e_out->hidelevel = e_in->hidelevel;
162 e_out->inmem = e_in->inmem;
163 e_out->bracketinfo = e_in->bracketinfo;
164 e_out->newbracketinfo = e_in->newbracketinfo;
165 e_out->numdummies = e_in->numdummies;
166 e_out->numfactors = e_in->numfactors;
167 e_out->vflags = e_in->vflags;
168 e_out->uflags = e_in->uflags;
169 e_out->sizeprototype = e_in->sizeprototype;
177 case DROPPEDEXPRESSION:
180 AC.exprnames->namenode[e_in->node].type = CDELETE;
185 }
while ( --n > 0 ); }
188 if ( numhid == 0 && AR.hidefile->PObuffer ) {
189 if ( AR.hidefile->handle >= 0 ) {
190 CloseFile(AR.hidefile->handle);
191 remove(AR.hidefile->name);
192 AR.hidefile->handle = -1;
194 AR.hidefile->POfull =
195 AR.hidefile->POfill = AR.hidefile->PObuffer;
196 PUTZERO(AR.hidefile->POposition);
211int PopVariables(
void)
218 retval = CleanExpr(1);
221 if ( AC.DidClean ) CompactifyTree(AC.exprnames,EXPRNAMES);
223 AC.CodesFlag = AM.gCodesFlag;
224 AC.NamesFlag = AM.gNamesFlag;
225 AC.StatsFlag = AM.gStatsFlag;
227 AC.MaxWeight = AM.gMaxWeight;
228 AC.DefaultPrecision = AM.gDefaultPrecision;
230 AC.OldFactArgFlag = AM.gOldFactArgFlag;
231 AC.TokensWriteFlag = AM.gTokensWriteFlag;
232 AC.extrasymbols = AM.gextrasymbols;
233 if ( AC.extrasym ) { M_free(AC.extrasym,
"extrasym"); AC.extrasym = 0; }
234 i = 1; s = AM.gextrasym;
while ( *s ) { s++; i++; }
235 AC.extrasym = (UBYTE *)Malloc1(i*
sizeof(UBYTE),
"extrasym");
236 for ( j = 0; j < i; j++ ) AC.extrasym[j] = AM.gextrasym[j];
237 AO.NoSpacesInNumbers = AM.gNoSpacesInNumbers;
238 AO.IndentSpace = AM.gIndentSpace;
239 AC.lUnitTrace = AM.gUnitTrace;
240 AC.lDefDim = AM.gDefDim;
241 AC.lDefDim4 = AM.gDefDim4;
243 if ( AC.ncmod == AM.gncmod && AC.modmode == AM.gmodmode ) {
246 if ( AC.cmod[j] != AM.gcmod[j] )
break;
249 M_free(AC.halfmod,
"halfmod");
250 AC.halfmod = 0; AC.nhalfmod = 0;
254 M_free(AC.halfmod,
"halfmod");
255 AC.halfmod = 0; AC.nhalfmod = 0;
258 if ( AC.modinverses ) {
259 if ( AC.ncmod == AM.gncmod && AC.modmode == AM.gmodmode ) {
262 if ( AC.cmod[j] != AM.gcmod[j] )
break;
265 M_free(AC.modinverses,
"modinverses");
270 M_free(AC.modinverses,
"modinverses");
274 AN.ncmod = AC.ncmod = AM.gncmod;
275 AC.npowmod = AM.gnpowmod;
276 AC.modmode = AM.gmodmode;
277 if ( ( ( AC.modmode & INVERSETABLE ) != 0 ) && ( AC.modinverses == 0 ) )
279 AC.funpowers = AM.gfunpowers;
280 AC.lPolyFun = AM.gPolyFun;
281 AC.lPolyFunInv = AM.gPolyFunInv;
282 AC.lPolyFunType = AM.gPolyFunType;
283 AC.lPolyFunExp = AM.gPolyFunExp;
284 AR.PolyFunVar = AC.lPolyFunVar = AM.gPolyFunVar;
285 AC.lPolyFunPow = AM.gPolyFunPow;
286 AC.parallelflag = AM.gparallelflag;
287 AC.ProcessBucketSize = AC.mProcessBucketSize = AM.gProcessBucketSize;
288 AC.properorderflag = AM.gproperorderflag;
289 AC.ThreadBucketSize = AM.gThreadBucketSize;
290 AC.ThreadStats = AM.gThreadStats;
291 AC.FinalStats = AM.gFinalStats;
292 AC.OldGCDflag = AM.gOldGCDflag;
293 AC.WTimeStatsFlag = AM.gWTimeStatsFlag;
294 AC.ThreadsFlag = AM.gThreadsFlag;
295 AC.ThreadBalancing = AM.gThreadBalancing;
296 AC.ThreadSortFileSynch = AM.gThreadSortFileSynch;
297 AC.ProcessStats = AM.gProcessStats;
298 AC.OldParallelStats = AM.gOldParallelStats;
299 AC.IsFortran90 = AM.gIsFortran90;
300 AC.SizeCommuteInSet = AM.gSizeCommuteInSet;
301 PruneExtraSymbols(AM.gnumextrasym);
303 if ( AC.Fortran90Kind ) {
304 M_free(AC.Fortran90Kind,
"Fortran90 Kind");
305 AC.Fortran90Kind = 0;
307 if ( AM.gFortran90Kind ) {
308 AC.Fortran90Kind = strDup1(AM.gFortran90Kind,
"Fortran90 Kind");
310 if ( AC.ThreadsFlag && AM.totalnumberofthreads > 1 ) AS.MultiThreaded = 1;
322 if ( MakeModTable() ) {
323 MesPrint(
"===No printing in powers of generator");
335 AC.Cnumpows = AM.gCnumpows;
336 AC.OutputMode = AM.gOutputMode;
337 AC.OutputSpaces = AM.gOutputSpaces;
338 AC.OutNumberType = AM.gOutNumberType;
339 AR.SortType = AC.SortType = AM.gSortType;
340 AC.ShortStatsMax = AM.gShortStatsMax;
344 for ( i = 0; i < NumFunctions; i++ ) functions[i].flags &= ~COULDCOMMUTE;
345 if ( AC.CommuteInSet ) {
351 if ( *gg <= GAMMASEVEN && *gg >= GAMMA ) {
352 functions[GAMMA-FUNCTION].flags |= COULDCOMMUTE;
353 functions[GAMMAI-FUNCTION].flags |= COULDCOMMUTE;
354 functions[GAMMAFIVE-FUNCTION].flags |= COULDCOMMUTE;
355 functions[GAMMASIX-FUNCTION].flags |= COULDCOMMUTE;
356 functions[GAMMASEVEN-FUNCTION].flags |= COULDCOMMUTE;
359 functions[*gg-FUNCTION].flags |= COULDCOMMUTE;
367 for ( i = AO.NumDictionaries-1; i >= AO.gNumDictionaries; i-- ) {
368 RemoveDictionary(AO.Dictionaries[i]);
369 M_free(AO.Dictionaries[i],
"Dictionary");
371 for( ; i >= 0; i-- ) {
372 ShrinkDictionary(AO.Dictionaries[i]);
374 AO.NumDictionaries = AO.gNumDictionaries;
390 AM.gCodesFlag = AC.CodesFlag;
391 AM.gNamesFlag = AC.NamesFlag;
392 AM.gStatsFlag = AC.StatsFlag;
394 AM.gMaxWeight = AC.MaxWeight;
395 AM.gDefaultPrecision = AC.DefaultPrecision;
397 AM.gOldFactArgFlag = AC.OldFactArgFlag;
398 AM.gextrasymbols = AC.extrasymbols;
399 if ( AM.gextrasym ) { M_free(AM.gextrasym,
"extrasym"); AM.gextrasym = 0; }
400 i = 1; s = AC.extrasym;
while ( *s ) { s++; i++; }
401 AM.gextrasym = (UBYTE *)Malloc1(i*
sizeof(UBYTE),
"extrasym");
402 for ( j = 0; j < i; j++ ) AM.gextrasym[j] = AC.extrasym[j];
403 AM.gTokensWriteFlag= AC.TokensWriteFlag;
404 AM.gNoSpacesInNumbers = AO.NoSpacesInNumbers;
405 AM.gIndentSpace = AO.IndentSpace;
406 AM.gUnitTrace = AC.lUnitTrace;
407 AM.gDefDim = AC.lDefDim;
408 AM.gDefDim4 = AC.lDefDim4;
409 AM.gncmod = AC.ncmod;
410 AM.gnpowmod = AC.npowmod;
411 AM.gmodmode = AC.modmode;
412 AM.gCnumpows = AC.Cnumpows;
413 AM.gOutputMode = AC.OutputMode;
414 AM.gOutputSpaces = AC.OutputSpaces;
415 AM.gOutNumberType = AC.OutNumberType;
416 AM.gfunpowers = AC.funpowers;
417 AM.gPolyFun = AC.lPolyFun;
418 AM.gPolyFunInv = AC.lPolyFunInv;
419 AM.gPolyFunType = AC.lPolyFunType;
420 AM.gPolyFunExp = AC.lPolyFunExp;
421 AM.gPolyFunVar = AC.lPolyFunVar;
422 AM.gPolyFunPow = AC.lPolyFunPow;
423 AM.gparallelflag = AC.parallelflag;
424 AM.gProcessBucketSize = AC.ProcessBucketSize;
425 AM.gproperorderflag = AC.properorderflag;
426 AM.gThreadBucketSize = AC.ThreadBucketSize;
427 AM.gThreadStats = AC.ThreadStats;
428 AM.gFinalStats = AC.FinalStats;
429 AM.gOldGCDflag = AC.OldGCDflag;
430 AM.gWTimeStatsFlag = AC.WTimeStatsFlag;
431 AM.gThreadsFlag = AC.ThreadsFlag;
432 AM.gThreadBalancing = AC.ThreadBalancing;
433 AM.gThreadSortFileSynch = AC.ThreadSortFileSynch;
434 AM.gProcessStats = AC.ProcessStats;
435 AM.gOldParallelStats = AC.OldParallelStats;
436 AM.gIsFortran90 = AC.IsFortran90;
437 AM.gSizeCommuteInSet = AC.SizeCommuteInSet;
438 AM.gnumextrasym = (cbuf+AM.sbufnum)->numrhs;
439 if ( AM.gFortran90Kind ) {
440 M_free(AM.gFortran90Kind,
"Fortran 90 Kind");
441 AM.gFortran90Kind = 0;
443 if ( AC.Fortran90Kind ) {
444 AM.gFortran90Kind = strDup1(AC.Fortran90Kind,
"Fortran 90 Kind");
458 AM.gSortType = AC.SortType;
459 AM.gShortStatsMax = AC.ShortStatsMax;
461 if ( AO.CurrentDictionary > 0 || AP.OpenDictionary > 0 ) {
462 Warning(
"You cannot have an open or selected dictionary at a .global. Dictionary closed.");
463 AP.OpenDictionary = 0;
464 AO.CurrentDictionary = 0;
467 AO.gNumDictionaries = AO.NumDictionaries;
468 for ( i = 0; i < AO.NumDictionaries; i++ ) {
469 AO.Dictionaries[i]->gnumelements = AO.Dictionaries[i]->numelements;
471 if ( AM.NumSpectatorFiles > 0 ) {
472 for ( i = 0; i < AM.SizeForSpectatorFiles; i++ ) {
473 if ( AM.SpectatorFiles[i].name != 0 )
474 AM.SpectatorFiles[i].flags |= GLOBALSPECTATORFLAG;
488 for ( j = 0, e = Expressions; j < NumExpressions; j++, e++ ) {
489 switch ( e->status ) {
490 case SKIPLEXPRESSION:
491 e->status = LOCALEXPRESSION;
493 case UNHIDELEXPRESSION:
494 e->status = LOCALEXPRESSION;
495 ClearBracketIndex(j);
496 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
498 case HIDELEXPRESSION:
499 e->status = HIDDENLEXPRESSION;
501 case SKIPGEXPRESSION:
502 e->status = GLOBALEXPRESSION;
504 case UNHIDEGEXPRESSION:
505 e->status = GLOBALEXPRESSION;
506 ClearBracketIndex(j);
507 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
509 case HIDEGEXPRESSION:
510 e->status = HIDDENGEXPRESSION;
512 case DROPLEXPRESSION:
513 case DROPGEXPRESSION:
514 case DROPHLEXPRESSION:
515 case DROPHGEXPRESSION:
516 case DROPSPECTATOREXPRESSION:
517 e->status = DROPPEDEXPRESSION;
518 ClearBracketIndex(j);
519 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
520 if ( e->replace >= 0 ) {
521 Expressions[e->replace].replace = REGULAREXPRESSION;
522 AC.exprnames->namenode[e->node].number = e->replace;
523 e->replace = REGULAREXPRESSION;
526 AC.exprnames->namenode[e->node].type = CDELETE;
530 case LOCALEXPRESSION:
531 case GLOBALEXPRESSION:
532 ClearBracketIndex(j);
533 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
535 case HIDDENLEXPRESSION:
536 case HIDDENGEXPRESSION:
538 case INTOHIDELEXPRESSION:
539 ClearBracketIndex(j);
540 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
541 e->status = HIDDENLEXPRESSION;
543 case INTOHIDEGEXPRESSION:
544 ClearBracketIndex(j);
545 e->bracketinfo = e->newbracketinfo; e->newbracketinfo = 0;
546 e->status = HIDDENGEXPRESSION;
549 ClearBracketIndex(j);
553 if ( e->replace == NEWLYDEFINEDEXPRESSION ) e->replace = REGULAREXPRESSION;
562void PutInVflags(WORD nexpr)
569 if ( AS.OldOnFile == 0 ) {
570 AS.NumOldOnFile = 20;
571 AS.OldOnFile = (
POSITION *)Malloc1(AS.NumOldOnFile*
sizeof(
POSITION),
"file pointers");
573 else if ( nexpr >= AS.NumOldOnFile ) {
575 AS.OldOnFile = (
POSITION *)Malloc1(2*AS.NumOldOnFile*
sizeof(
POSITION),
"file pointers");
576 for ( i = 0; i < AS.NumOldOnFile; i++ ) AS.OldOnFile[i] = old[i];
577 AS.NumOldOnFile = 2*AS.NumOldOnFile;
578 M_free(old,
"process file pointers");
580 if ( AS.OldNumFactors == 0 ) {
581 AS.NumOldNumFactors = 20;
582 AS.OldNumFactors = (WORD *)Malloc1(AS.NumOldNumFactors*
sizeof(WORD),
"numfactors pointers");
583 AS.Oldvflags = (WORD *)Malloc1(AS.NumOldNumFactors*
sizeof(WORD),
"vflags pointers");
584 AS.Olduflags = (WORD *)Malloc1(AS.NumOldNumFactors*
sizeof(WORD),
"uflags pointers");
586 else if ( nexpr >= AS.NumOldNumFactors ) {
587 oldw = AS.OldNumFactors;
588 AS.OldNumFactors = (WORD *)Malloc1(2*AS.NumOldNumFactors*
sizeof(WORD),
"numfactors pointers");
589 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.OldNumFactors[i] = oldw[i];
590 M_free(oldw,
"numfactors pointers");
592 AS.Oldvflags = (WORD *)Malloc1(2*AS.NumOldNumFactors*
sizeof(WORD),
"vflags pointers");
593 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Oldvflags[i] = oldw[i];
594 M_free(oldw,
"vflags pointers");
596 AS.Olduflags = (WORD *)Malloc1(2*AS.NumOldNumFactors*
sizeof(WORD),
"uflags pointers");
597 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Olduflags[i] = oldw[i];
598 M_free(oldw,
"uflags pointers");
599 AS.NumOldNumFactors = 2*AS.NumOldNumFactors;
604 if ( nexpr >= AS.NumOldOnFile || nexpr >= AS.NumOldNumFactors )
goto restart;
605 AS.OldOnFile[nexpr] = e->onfile;
606 AS.OldNumFactors[nexpr] = e->numfactors;
607 AS.Oldvflags[nexpr] = e->vflags;
608 AS.Olduflags[nexpr] = e->uflags;
616int DoExecute(WORD par, WORD skip)
620 int i, oldmultithreaded = AS.MultiThreaded;
625 SpecialCleanup(BHEAD0);
626 if ( skip )
goto skipexec;
627 if ( AC.IfLevel > 0 ) {
628 MesPrint(
" %d endif statement(s) missing",AC.IfLevel);
631 if ( AC.WhileLevel > 0 ) {
632 MesPrint(
" %d endwhile statement(s) missing",AC.WhileLevel);
635 if ( AC.arglevel > 0 ) {
636 MesPrint(
" %d endargument statement(s) missing",AC.arglevel);
639 if ( AC.termlevel > 0 ) {
640 MesPrint(
" %d endterm statement(s) missing",AC.termlevel);
643 if ( AC.insidelevel > 0 ) {
644 MesPrint(
" %d endinside statement(s) missing",AC.insidelevel);
647 if ( AC.inexprlevel > 0 ) {
648 MesPrint(
" %d endinexpression statement(s) missing",AC.inexprlevel);
651 if ( AC.NumLabels > 0 ) {
652 for ( i = 0; i < AC.NumLabels; i++ ) {
653 if ( AC.Labels[i] < 0 ) {
654 MesPrint(
" -->Label %s missing",AC.LabelNames[i]);
659 if ( AC.SwitchLevel > 0 ) {
660 MesPrint(
" %d endswitch statement(s) missing",AC.SwitchLevel);
663 if ( AC.dolooplevel > 0 ) {
664 MesPrint(
" %d enddo statement(s) missing",AC.dolooplevel);
667 if ( AP.OpenDictionary > 0 ) {
668 MesPrint(
" Dictionary %s has not been closed.",
669 AO.Dictionaries[AP.OpenDictionary-1]->name);
670 AP.OpenDictionary = 0;
673 if ( RetCode )
return(RetCode);
674 AR.Cnumlhs = cbuf[AM.rbufnum].numlhs;
676 if ( ( AS.ExecMode = par ) == GLOBALMODULE ) AS.ExecMode = 0;
685 if ( NumPotModdollars >= 0 ) {
686 for ( i = 0; i < NumExpressions; i++ ) {
687 if ( Expressions[i].partodo ) { AC.partodoflag = 1;
break; }
691 if ( AC.partodoflag > 0 && PF.numtasks < 3 ) {
695 if ( AC.partodoflag > 0 || ( NumPotModdollars > 0 && AC.mparallelflag == PARALLELFLAG ) ) {
696 if ( NumPotModdollars > NumModOptdollars ) {
697 AC.mparallelflag |= NOPARALLEL_DOLLAR;
699 AS.MultiThreaded = 0;
704 for ( i = 0; i < NumPotModdollars; i++ ) {
705 for ( j = 0; j < NumModOptdollars; j++ )
706 if ( PotModdollars[i] == ModOptdollars[j].number )
break;
707 if ( j >= NumModOptdollars ) {
708 AC.mparallelflag |= NOPARALLEL_DOLLAR;
710 AS.MultiThreaded = 0;
715 switch ( ModOptdollars[j].type ) {
722 AC.mparallelflag |= NOPARALLEL_DOLLAR;
723 AS.MultiThreaded = 0;
730 else if ( ( AC.mparallelflag & NOPARALLEL_USER ) != 0 ) {
732 AS.MultiThreaded = 0;
736 if ( AC.partodoflag == 0 ) {
737 for ( i = 0; i < NumExpressions; i++ ) {
738 Expressions[i].partodo = 0;
741 else if ( AC.partodoflag == -1 ) {
749 if ( AC.RhsExprInModuleFlag && (AC.mparallelflag == PARALLELFLAG || AC.partodoflag) ) {
750 if (PF.rhsInParallel) {
753 PF.slavebuf.PObuffer=(WORD *)Malloc1(AM.ScratSize*
sizeof(WORD),
"PF inbuf");
754 PF.slavebuf.POsize=AM.ScratSize*
sizeof(WORD);
755 PF.slavebuf.POfull = PF.slavebuf.POfill = PF.slavebuf.PObuffer;
756 PF.slavebuf.POstop= PF.slavebuf.PObuffer+AM.ScratSize;
757 PUTZERO(PF.slavebuf.POposition);
761 AC.mparallelflag |= NOPARALLEL_RHS;
763 for ( i = 0; i < NumExpressions; i++ ) {
764 Expressions[i].partodo = 0;
771 if ( (AC.mparallelflag == PARALLELFLAG || AC.partodoflag) && PF.me != MASTER ) {
772 for ( i = 0; i < NumModOptdollars; i++ ) {
773 if ( ModOptdollars[i].type == MODSUM ) {
774 DOLLARS d = Dollars + ModOptdollars[i].number;
776 if ( d->where && d->where != &AM.dollarzero ) M_free(d->where,
"old content of dollar");
777 d->where = &AM.dollarzero;
779 CleanDollarFactors(d);
784 AR.SortType = AC.SortType;
786 if ( PF.me == MASTER )
789 if ( AC.SetupFlag ) WriteSetup();
790 if ( AC.NamesFlag || AC.CodesFlag ) WriteLists();
792 if ( par == GLOBALMODULE ) MakeGlobal();
793 if ( RevertScratch() )
return(-1);
794 if ( AC.ncmod ) SetMods();
799 if ( PF.me == MASTER )
802 if ( !AC.ThreadsFlag || AC.mparallelflag & NOPARALLEL_USER ) {
805 else if ( AC.mparallelflag & NOPARALLEL_DOLLAR ) {
806 if ( AC.WarnFlag >= 1 ) {
809 s = strDup1((UBYTE *)
"",
"NOPARALLEL_DOLLAR s");
811 j = NumPotModdollars;
812 for ( i = 0; i < j; i++ ) {
813 for ( k = 0; k < NumModOptdollars; k++ )
814 if ( ModOptdollars[k].number == PotModdollars[i] )
break;
815 if ( k >= NumModOptdollars ) {
818 s = AddToString(s,(UBYTE *)
", ",0);
819 s = AddToString(s,(UBYTE *)
"$",0);
820 s = AddToString(s,DOLLARNAME(Dollars,PotModdollars[i]),0);
824 s1 = strDup1((UBYTE *)
"This module is forced to run in sequential mode due to $-variable",
"NOPARALLEL_DOLLAR s1");
826 s1 = AddToString(s1,(UBYTE *)
"s",0);
827 s1 = AddToString(s1,(UBYTE *)
": ",0);
828 s1 = AddToString(s1,s,0);
830 M_free(s,
"NOPARALLEL_DOLLAR s");
831 M_free(s1,
"NOPARALLEL_DOLLAR s1");
834 else if ( AC.mparallelflag & NOPARALLEL_RHS ) {
835 HighWarning(
"This module is forced to run in sequential mode due to RHS expression names");
837 else if ( AC.mparallelflag & NOPARALLEL_CONVPOLY ) {
838 HighWarning(
"This module is forced to run in sequential mode due to conversion to extra symbols");
840 else if ( AC.mparallelflag & NOPARALLEL_SPECTATOR ) {
841 HighWarning(
"This module is forced to run in sequential mode due to tospectator/copyspectator");
843 else if ( AC.mparallelflag & NOPARALLEL_TBLDOLLAR ) {
844 HighWarning(
"This module is forced to run in sequential mode due to $-variable assignments in tables");
846 else if ( AC.mparallelflag & NOPARALLEL_NPROC ) {
847 HighWarning(
"This module is forced to run in sequential mode because there is only one processor");
859 if ( AP.preError == 0 && (
Processor() || WriteAll() ) ) RetCode = -1;
866 if ( AC.ncmod ) UnSetMods();
867 AS.MultiThreaded = oldmultithreaded;
873 if ( NumPotModdollars > 0 ) {
875 if ( RetCode )
return RetCode;
877 if ( RetCode )
return RetCode;
880 if ( AC.topolynomialflag & TOPOLYNOMIALFLAG ) {
882 if ( RetCode )
return RetCode;
889 if ( RetCode )
return RetCode;
894 if ( PF.me != MASTER && AR.hidefile->PObuffer ) {
895 if ( AR.hidefile->handle >= 0 ) {
896 CloseFile(AR.hidefile->handle);
897 AR.hidefile->handle = -1;
898 remove(AR.hidefile->name);
900 AR.hidefile->POfull = AR.hidefile->POfill = AR.hidefile->PObuffer;
901 PUTZERO(AR.hidefile->POposition);
905 for ( j = 0; j < NumModOptdollars; j++ ) {
906 if ( ModOptdollars[j].dstruct ) {
912 if ( ModOptdollars[j].type == MODMAX || ModOptdollars[j].type == MODMIN ) {
913 const WORD globalnumber = ModOptdollars[j].number;
914 const DOLLARS gd = Dollars + globalnumber;
918 if ( gd->type == DOLZERO ) {
919 gd->type = DOLNUMBER;
920 if ( ! gd->where || gd->where == &(AM.dollarzero) ) {
922 gd->where = (WORD*)Malloc1(gd->size*
sizeof(WORD),
"dollar contents");
931 for ( i = 0; i < AM.totalnumberofthreads; i++ ) {
932 const DOLLARS ld = &(ModOptdollars[j].dstruct[i]);
935 if ( ld->type == DOLUNDEFINED )
continue;
937 if ( ld->type != DOLZERO && ld->type != DOLNUMBER ) {
938 MLOCK(ErrorMessageLock);
939 MesPrint(
"Illegal dollar variable type in MODMIN/MODMAX case: %d", ld->type);
940 MUNLOCK(ErrorMessageLock);
945 if ( ld->type == DOLZERO ) {
946 ld->type = DOLNUMBER;
947 if ( ! ld->where || ld->where == &(AM.dollarzero) ) {
949 ld->where = (WORD*)Malloc1(ld->size*
sizeof(WORD),
"dollar contents");
962 if ( gd->type == DOLUNDEFINED ) {
964 if ( ! gd->where || gd->where == &(AM.dollarzero) ) {
966 gd->where = (WORD*)Malloc1(gd->size*
sizeof(WORD),
"dollar contents");
968 for (
int v = 0; v < 5; v++ ) {
969 gd->where[v] = ld->where[v];
976 const WORD cmp =
CompCoef(gd->where, ld->where);
977 if ( ( ModOptdollars[j].type == MODMAX && cmp < 0 ) ||
978 ( ModOptdollars[j].type == MODMIN && cmp > 0 ) ) {
980 for (
int v = 0; v < 5; v++ ) {
981 gd->where[v] = ld->where[v];
983 if ( gd->where[4] != 0 ) {
986 MLOCK(ErrorMessageLock);
987 MesPrint(
"Missing trailing zero in MODMIN/MODMAX global dollar %d",
989 MUNLOCK(ErrorMessageLock);
996 if ( gd->where[1] == 0 ) {
998 if ( gd->where && gd->where != &(AM.dollarzero) ) {
999 M_free(gd->where,
"dollar contents");
1002 gd->where = &(AM.dollarzero);
1007 for ( i = 0; i < AM.totalnumberofthreads; i++ ) {
1008 if ( ModOptdollars[j].dstruct[i].size > 0 ) {
1009 CleanDollarFactors(&(ModOptdollars[j].dstruct[i]));
1010 if ( ModOptdollars[j].dstruct[i].where
1011 && ModOptdollars[j].dstruct[i].where != &(AM.dollarzero) ) {
1012 M_free(ModOptdollars[j].dstruct[i].where,
"Local dollar value");
1019 M_free(ModOptdollars[j].dstruct,
"Local DOLLARS");
1020 ModOptdollars[j].dstruct = 0;
1041 if ( ModOptdollars ) M_free(ModOptdollars,
"ModOptdollars pointer");
1042 if ( PotModdollars ) M_free(PotModdollars,
"PotModdollars pointer");
1045 AC.ModOptDolList.lijst = NULL;
1047 AC.PotModDolList.lijst = NULL;
1049 NumPotModdollars = 0;
1050 NumModOptdollars = 0;
1057if ( AC.SwitchInArray > 0 ) {
1058 for ( i = 0; i < AC.SwitchInArray; i++ ) {
1059 SWITCH *sw = AC.SwitchArray + i;
1060 if ( sw->table ) M_free(sw->table,
"Switch table");
1062 sw->defaultcase.ncase = 0;
1063 sw->defaultcase.value = 0;
1064 sw->defaultcase.compbuffer = 0;
1065 sw->endswitch.ncase = 0;
1066 sw->endswitch.value = 0;
1067 sw->endswitch.compbuffer = 0;
1078 AC.SwitchInArray = 0;
1082 AC.numpfirstnum = 0;
1085 AC.PolyRatFunChanged = 0;
1087 if ( par == STOREMODULE || par == CLEARMODULE ) {
1089 if ( par == STOREMODULE && PopVariables() ) RetCode = -1;
1090 if ( AR.infile->handle >= 0 ) {
1091 CloseFile(AR.infile->handle);
1092 remove(AR.infile->name);
1093 AR.infile->handle = -1;
1095 AR.infile->POfill = AR.infile->PObuffer;
1096 PUTZERO(AR.infile->POposition);
1097 AR.infile->POfull = AR.infile->PObuffer;
1098 if ( AR.outfile->handle >= 0 ) {
1099 CloseFile(AR.outfile->handle);
1100 remove(AR.outfile->name);
1101 AR.outfile->handle = -1;
1103 AR.outfile->POfull =
1104 AR.outfile->POfill = AR.outfile->PObuffer;
1105 PUTZERO(AR.outfile->POposition);
1106 if ( AR.hidefile->handle >= 0 ) {
1107 CloseFile(AR.hidefile->handle);
1108 remove(AR.hidefile->name);
1109 AR.hidefile->handle = -1;
1111 AR.hidefile->POfull =
1112 AR.hidefile->POfill = AR.hidefile->PObuffer;
1113 PUTZERO(AR.hidefile->POposition);
1115 if ( par == CLEARMODULE ) {
1116 if ( DeleteStore(0) < 0 ) {
1117 MesPrint(
"Cannot restart the storage file");
1123 AM.gProcessBucketSize = AM.hProcessBucketSize;
1124 AM.gparallelflag = PARALLELFLAG;
1125 AM.gnumextrasym = AM.ggnumextrasym;
1126 PruneExtraSymbols(AM.ggnumextrasym);
1129 ClearSpectators(par);
1132 if ( CleanExpr(0) ) RetCode = -1;
1133 if ( AC.DidClean ) CompactifyTree(AC.exprnames,EXPRNAMES);
1138 if ( AC.MultiBracketBuf != 0 ) {
1139 for ( i = 0; i < MAXMULTIBRACKETLEVELS; i++ ) {
1140 if ( AC.MultiBracketBuf[i] ) {
1141 M_free(AC.MultiBracketBuf[i],
"bracket buffer i");
1142 AC.MultiBracketBuf[i] = 0;
1145 AC.MultiBracketLevels = 0;
1146 M_free(AC.MultiBracketBuf,
"multi bracket buffer");
1147 AC.MultiBracketBuf = 0;
1150 if ( AC.SortReallocateFlag ) {
1154 M_free(S->lBuffer,
"SortReallocate lBuffer+sBuffer");
1155 S->lBuffer = Malloc1(
sizeof(*(S->lBuffer))*(S->LargeSize+S->SmallEsize),
"SortReallocate lBuffer+sBuffer");
1156 S->lTop = S->lBuffer+S->LargeSize;
1157 S->sBuffer = S->lTop;
1158 if ( S->LargeSize == 0 ) { S->lBuffer = 0; S->lTop = 0; }
1159 S->sTop = S->sBuffer + S->SmallSize;
1160 S->sTop2 = S->sBuffer + S->SmallEsize;
1161 S->sHalf = S->sBuffer + (LONG)((S->SmallSize+S->SmallEsize)>>1);
1165 UpdateSortBlocks(AM.totalnumberofthreads-1);
1169 for ( i = 1; i < AM.totalnumberofthreads; i++ ) {
1171 M_free(S->lBuffer,
"SortReallocate lBuffer+sBuffer");
1172 S->lBuffer = Malloc1(
sizeof(*(S->lBuffer))*(S->LargeSize+S->SmallEsize),
"SortReallocate lBuffer+sBuffer");
1173 S->lTop = S->lBuffer+S->LargeSize;
1174 S->sBuffer = S->lTop;
1175 if ( S->LargeSize == 0 ) { S->lBuffer = 0; S->lTop = 0; }
1176 S->sTop = S->sBuffer + S->SmallSize;
1177 S->sTop2 = S->sBuffer + S->SmallEsize;
1178 S->sHalf = S->sBuffer + (LONG)((S->SmallSize+S->SmallEsize)>>1);
1182 if ( AC.SortReallocateFlag == 2 ) {
1185 AC.SortReallocateFlag = 0;
1212int PutBracket(PHEAD WORD *termin)
1215 WORD *t, *t1, *b, i, j, *lastfun;
1217 WORD *bStop, *bb, *bf, *tStop;
1218 WORD *term1,*term2, *m1, *m2, *tStopa;
1219 WORD *bbb = 0, *bind, *binst = 0, bwild = 0, *bss = 0, *bns = 0, bset = 0;
1220 term1 = AT.WorkPointer+1;
1221 term2 = (WORD *)(((UBYTE *)(term1)) + AM.MaxTer);
1222 if ( ( (WORD *)(((UBYTE *)(term2)) + AM.MaxTer) ) > AT.WorkTop ) {
1225 if ( AR.BracketOn < 0 ) {
1226 t2 = term1; t1 = term2;
1229 t1 = term1; t2 = term2;
1231 b = AT.BrackBuf; bStop = b+*b; b++;
1232 while ( b < bStop ) {
1233 if ( *b == INDEX ) { bwild = 1; bbb = b+2; binst = b + b[1]; }
1234 if ( *b == SETSET ) { bset = 1; bss = b+2; bns = b + b[1]; }
1238 t = termin; tStopa = t + *t; i = *(t + *t -1); i = ABS(i);
1239 if ( AR.PolyFun && AT.PolyAct ) tStop = termin + AT.PolyAct;
1241 else if ( AT.FloatPos ) tStop = termin + AT.FloatPos;
1243 else tStop = tStopa - i;
1245 if ( AR.BracketOn < 0 ) {
1247 while ( t < tStop && *t >= FUNCTION
1248 && functions[*t-FUNCTION].commute ) {
1250 while ( b < bStop ) {
1253 while ( t < tStop && *t >= FUNCTION
1254 && functions[*t-FUNCTION].commute ) t += t[1];
1262 if ( b[1] == CFUNCTION ) {
1263 SETS set = Sets+b[0]; WORD i;
1264 for ( i = set->first; i < set->last; i++ ) {
1265 if ( SetElements[i] == *t ) {
1267 while ( t < tStop && *t >= FUNCTION
1268 && functions[*t-FUNCTION].commute ) t += t[1];
1276 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1281 while ( bind < binst ) {
1282 if ( *bind == *s2 ) {
1284 while ( t < tStop && *t >= FUNCTION
1285 && functions[*t-FUNCTION].commute ) t += t[1];
1298 while ( s1 < lastfun ) *t2++ = *s1++;
1299 while ( s1 < t ) *t1++ = *s1++;
1302 while ( s1 < t ) *t2++ = *s1++;
1308 while ( t < tStop && *t >= FUNCTION
1309 && functions[*t-FUNCTION].commute ) {
1311 while ( b < bStop ) {
1312 if ( *b == *t ) { lastfun = t + t[1];
goto NextNcom; }
1318 if ( b[1] == CFUNCTION ) {
1319 SETS set = Sets+b[0]; WORD i;
1320 for ( i = set->first; i < set->last; i++ ) {
1321 if ( SetElements[i] == *t ) {
1330 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1335 while ( bind < binst ) {
1336 if ( *bind == *s2 ) { lastfun = t + t[1];
goto NextNcom; }
1346 while ( s1 < lastfun ) *t1++ = *s1++;
1347 while ( s1 < t ) *t2++ = *s1++;
1352 b = AT.BrackBuf + 1;
1353 while ( b < bStop && *b >= FUNCTION
1354 && ( *b < FUNCTION || functions[*b-FUNCTION].commute ) ) {
1359 while ( t < tStop && ( bf < bStop || bwild || bset ) ) {
1361 while ( b < bStop && *b != *t ) { b += b[1]; }
1363 if ( *t >= FUNCTION ) {
1364 if ( b < bStop && *b == *t )
goto FunBrac;
1368 if ( b[1] == CFUNCTION ) {
1369 SETS set = Sets+b[0]; WORD i;
1370 for ( i = set->first; i < set->last; i++ ) {
1371 if ( SetElements[i] == *t )
goto FunBrac;
1377 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1382 while ( bind < binst ) {
1383 if ( *bind == *s2 )
goto FunBrac;
1391FunBrac: NCOPY(t1,t,i);
1397 if ( *t == DELTA ) {
1398 if ( b < bStop && *b == DELTA ) {
1402 else { NCOPY(t2,t,i); }
1404 else if ( *t == INDEX ) {
1407 *t1++ = *t; t1++; *t2++ = *t; t2++;
1411 while ( --j >= 0 ) {
1412 while ( *bind < *t && bind < binst ) bind++;
1413 if ( *bind == *t && bind < binst ) {
1418 while ( b3 < bns ) {
1419 if ( b3[1] == CVECTOR ) {
1420 SETS set = Sets+b3[0]; WORD i;
1421 for ( i = set->first; i < set->last; i++ ) {
1422 if ( SetElements[i] == *t ) {
1435 m1[1] = WORDDIF(t1,m1);
1436 if ( m1[1] == 2 ) t1 = m1;
1437 m2[1] = WORDDIF(t2,m2);
1438 if ( m2[1] == 2 ) t2 = m2;
1442 *t1++ = *t; t1++; *t2++ = *t; t2++;
1445 while ( --j >= 0 ) {
1447 while ( b3 < bns ) {
1448 if ( b3[1] == CVECTOR ) {
1449 SETS set = Sets+b3[0]; WORD i;
1450 for ( i = set->first; i < set->last; i++ ) {
1451 if ( SetElements[i] == *t ) {
1462 m1[1] = WORDDIF(t1,m1);
1463 if ( m1[1] == 2 ) t1 = m1;
1464 m2[1] = WORDDIF(t2,m2);
1465 if ( m2[1] == 2 ) t2 = m2;
1471 else if ( *t == VECTOR ) {
1472 if ( ( b < bStop && *b == VECTOR ) || bwild ) {
1473 if ( b < bStop && *b == VECTOR ) {
1474 bb = b + b[1]; b += 2;
1478 m1 = t1; m2 = t2; *t1++ = *t; *t2++ = *t; t1++; t2++; t += 2;
1481 while ( b < bb && ( *b < *t ||
1482 ( *b == *t && b[1] < t[1] ) ) ) b += 2;
1483 if ( b < bb && ( *t == *b && t[1] == b[1] ) ) {
1484 *t1++ = *t++; *t1++ = *t++;
goto nextvec;
1488 while ( bind < binst ) {
1489 if ( *t == *bind || t[1] == *bind ) {
1490 *t1++ = *t++; *t1++ = *t++;
1498 while ( b3 < bns ) {
1499 if ( b3[1] == CVECTOR ) {
1500 SETS set = Sets+b3[0]; WORD i;
1501 for ( i = set->first; i < set->last; i++ ) {
1502 if ( SetElements[i] == *t ) {
1503 *t1++ = *t++; *t1++ = *t++;
1511 *t2++ = *t++; *t2++ = *t++;
1514 m1[1] = WORDDIF(t1,m1);
1515 if ( m1[1] == 2 ) t1 = m1;
1516 m2[1] = WORDDIF(t2,m2);
1517 if ( m2[1] == 2 ) t2 = m2;
1520 m1 = t1; *t1++ = *t; t1++;
1521 m2 = t2; *t2++ = *t; t2++;
1525 while ( b3 < bns ) {
1526 if ( b3[1] == CVECTOR ) {
1527 SETS set = Sets+b3[0]; WORD i;
1528 for ( i = set->first; i < set->last; i++ ) {
1529 if ( SetElements[i] == *t ) {
1530 *t1++ = *t++; *t1++ = *t++;
1537 *t2++ = *t++; *t2++ = *t++;
1540 m1[1] = WORDDIF(t1,m1);
1541 if ( m1[1] == 2 ) t1 = m1;
1542 m2[1] = WORDDIF(t2,m2);
1543 if ( m2[1] == 2 ) t2 = m2;
1549 else if ( *t == DOTPRODUCT ) {
1550 if ( ( b < bStop && *b == *t ) || bwild ) {
1551 m1 = t1; *t1++ = *t; t1++;
1552 m2 = t2; *t2++ = *t; t2++;
1553 if ( b >= bStop || *b != *t ) { bb = b; s1 = b; }
1555 s1 = b + b[1]; bb = b + 2;
1558 while ( t < s2 && ( bb < s1 || bwild || bset ) ) {
1559 while ( bb < s1 && ( *bb < *t ||
1560 ( *bb == *t && bb[1] < t[1] ) ) ) bb += 3;
1561 if ( bb < s1 && *bb == *t && bb[1] == t[1] ) {
1562 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++; bb += 3;
1567 while ( bind < binst ) {
1568 if ( *bind == *t || *bind == t[1] ) {
1569 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1577 while ( b3 < bns ) {
1578 if ( b3[1] == CVECTOR ) {
1579 SETS set = Sets+b3[0]; WORD i;
1580 for ( i = set->first; i < set->last; i++ ) {
1581 if ( SetElements[i] == *t || SetElements[i] == t[1] ) {
1582 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1590 *t2++ = *t++; *t2++ = *t++; *t2++ = *t++;
1593 while ( t < s2 ) *t2++ = *t++;
1594 m1[1] = WORDDIF(t1,m1);
1595 if ( m1[1] == 2 ) t1 = m1;
1596 m2[1] = WORDDIF(t2,m2);
1597 if ( m2[1] == 2 ) t2 = m2;
1600 m1 = t1; *t1++ = *t; t1++;
1601 m2 = t2; *t2++ = *t; t2++;
1605 while ( b3 < bns ) {
1606 if ( b3[1] == CVECTOR ) {
1607 SETS set = Sets+b3[0]; WORD i;
1608 for ( i = set->first; i < set->last; i++ ) {
1609 if ( SetElements[i] == *t || SetElements[i] == t[1] ) {
1610 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1617 *t2++ = *t++; *t2++ = *t++; *t2++ = *t++;
1620 m1[1] = WORDDIF(t1,m1);
1621 if ( m1[1] == 2 ) t1 = m1;
1622 m2[1] = WORDDIF(t2,m2);
1623 if ( m2[1] == 2 ) t2 = m2;
1625 else { NCOPY(t2,t,i); }
1627 else if ( *t == SYMBOL ) {
1628 if ( b < bStop && *b == *t ) {
1629 m1 = t1; *t1++ = *t; t1++;
1630 m2 = t2; *t2++ = *t; t2++;
1631 s1 = b + b[1]; bb = b+2;
1633 while ( bb < s1 && t < s2 ) {
1634 while ( bb < s1 && *bb < *t ) bb += 2;
1636 if ( bset )
goto TrySymbolSet;
1639 if ( *bb == *t ) { *t1++ = *t++; *t1++ = *t++; }
1644 while ( bbb < bns ) {
1645 if ( bbb[1] == CSYMBOL ) {
1646 SETS set = Sets+bbb[0]; WORD i;
1647 for ( i = set->first; i < set->last; i++ ) {
1648 if ( SetElements[i] == *t ) {
1649 *t1++ = *t++; *t1++ = *t++;
1656 *t2++ = *t++; *t2++ = *t++;
1658 else { *t2++ = *t++; *t2++ = *t++; }
1661 while ( t < s2 ) *t2++ = *t++;
1662 m1[1] = WORDDIF(t1,m1);
1663 if ( m1[1] == 2 ) t1 = m1;
1664 m2[1] = WORDDIF(t2,m2);
1665 if ( m2[1] == 2 ) t2 = m2;
1669 m1 = t1; *t1++ = *t; t1++;
1670 m2 = t2; *t2++ = *t; t2++;
1674 while ( bbb < bns ) {
1675 if ( bbb[1] == CSYMBOL ) {
1676 SETS set = Sets+bbb[0]; WORD i;
1677 for ( i = set->first; i < set->last; i++ ) {
1678 if ( SetElements[i] == *t ) {
1679 *t1++ = *t++; *t1++ = *t++;
1686 *t2++ = *t++; *t2++ = *t++;
1689 m1[1] = WORDDIF(t1,m1);
1690 if ( m1[1] == 2 ) t1 = m1;
1691 m2[1] = WORDDIF(t2,m2);
1692 if ( m2[1] == 2 ) t2 = m2;
1694 else { NCOPY(t2,t,i); }
1700 if ( ( i = WORDDIF(tStop,t) ) > 0 ) NCOPY(t2,t,i);
1701 if ( AR.BracketOn < 0 ) {
1702 s1 = t1; t1 = t2; t2 = s1;
1704 do { *t2++ = *t++; }
while ( t < (WORD *)tStopa );
1706 i = WORDDIF(t1,term1);
1707 *t++ = 4 + i + WORDDIF(t2,term2);
1712 i = WORDDIF(t2,term2);
1714 if ( i > 0 ) NCOPY(t,t1,i);
1726void SpecialCleanup(PHEAD0)
1729 if ( AT.previousEfactor ) M_free(AT.previousEfactor,
"Efactor cache");
1730 AT.previousEfactor = 0;
1743 if ( AN.cmod != 0 ) M_free(AN.cmod,
"AN.cmod");
1745 AN.cmod = (UWORD *)Malloc1(
sizeof(WORD)*n,
"AN.cmod");
1746 for ( i = 0; i < n; i++ ) AN.cmod[i] = AC.cmod[i];
1760 if ( AN.cmod != 0 ) M_free(AN.cmod,
"AN.cmod");
1773void ExchangeExpressions(
int num1,
int num2)
1776 WORD node1, node2, namesize, TMproto[SUBEXPSIZE];
1782 e1 = Expressions + num1;
1783 e2 = Expressions + num2;
1786 AC.exprnames->namenode[node1].number = num2;
1787 AC.exprnames->namenode[node2].number = num1;
1788 a = e1->name; e1->name = e2->name; e2->name = a;
1789 namesize = e1->namesize; e1->namesize = e2->namesize; e2->namesize = namesize;
1792 if ( e1->status == STOREDEXPRESSION ) {
1796 TMproto[0] = EXPRESSION;
1797 TMproto[1] = SUBEXPSIZE;
1800 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1801 AT.TMaddr = TMproto;
1802 ind = FindInIndex(num1,&AR.StoreData,0,0);
1803 s1 = (SBYTE *)(AC.exprnames->namebuffer+e1->name);
1808 SeekFile(AR.StoreData.Handle,&(e1->onfile),SEEK_SET);
1809 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ind,
1811 MesPrint(
"File error while exchanging expressions");
1814 FlushFile(AR.StoreData.Handle);
1816 if ( e2->status == STOREDEXPRESSION ) {
1820 TMproto[0] = EXPRESSION;
1821 TMproto[1] = SUBEXPSIZE;
1824 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1825 AT.TMaddr = TMproto;
1826 ind = FindInIndex(num1,&AR.StoreData,0,0);
1827 s1 = (SBYTE *)(AC.exprnames->namebuffer+e2->name);
1832 SeekFile(AR.StoreData.Handle,&(e2->onfile),SEEK_SET);
1833 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ind,
1835 MesPrint(
"File error while exchanging expressions");
1838 FlushFile(AR.StoreData.Handle);
1847int GetFirstBracket(WORD *term,
int num)
1858 WORD type, *oldcomppointer, oldonefile, numword;
1861 oldcomppointer = AR.CompressPointer;
1862 type = Expressions[num].status;
1863 if ( type == STOREDEXPRESSION ) {
1864 WORD TMproto[SUBEXPSIZE];
1865 TMproto[0] = EXPRESSION;
1866 TMproto[1] = SUBEXPSIZE;
1869 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1870 AT.TMaddr = TMproto;
1872 if ( ( renumber = GetTable(num,&position,0) ) == 0 ) {
1873 MesCall(
"GetFirstBracket");
1876 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 ) {
1877 MesCall(
"GetFirstBracket");
1883 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1884 M_free(renumber->
symb.
lo,
"VarSpace");
1885 M_free(renumber,
"Renumber");
1891 oldonefile = AR.GetOneFile;
1892 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
1893 AR.GetOneFile = 2; fi = AR.hidefile;
1896 AR.GetOneFile = 0; fi = AR.infile;
1899 PUTZERO(oldposition);
1905 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
1907 position = AS.OldOnFile[num];
1908 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0
1909 || ( GetOneTerm(BHEAD term,fi,&position,1) < 0 ) ) {
1910 MLOCK(ErrorMessageLock);
1911 MesCall(
"GetFirstBracket");
1912 MUNLOCK(ErrorMessageLock);
1927 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
1929 AR.GetOneFile = oldonefile;
1931 AR.CompressPointer = oldcomppointer;
1933 tstop = term + *term; tstop -= ABS(tstop[-1]);
1935 while ( t < tstop ) {
1936 if ( *t == HAAKJE )
break;
1940 term[0] = 4; term[1] = 1; term[2] = 1; term[3] = 3;
1943 *t++ = 1; *t++ = 1; *t++ = 3; *term = t - term;
1947 term[0] = 4; term[1] = 1; term[2] = 1; term[3] = 3;
1972 WORD type, *oldcomppointer, oldonefile, numword;
1974 oldcomppointer = AR.CompressPointer;
1975 type = Expressions[num].status;
1976 if ( type == STOREDEXPRESSION ) {
1977 WORD TMproto[SUBEXPSIZE];
1978 TMproto[0] = EXPRESSION;
1979 TMproto[1] = SUBEXPSIZE;
1982 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1983 AT.TMaddr = TMproto;
1985 if ( ( renumber = GetTable(num,&position,0) ) == 0 ) {
1986 MesCall(
"GetFirstTerm");
1989 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 ) {
1990 MesCall(
"GetFirstTerm");
1996 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1997 M_free(renumber->
symb.
lo,
"VarSpace");
1998 M_free(renumber,
"Renumber");
2004 oldonefile = AR.GetOneFile;
2005 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
2006 AR.GetOneFile = 2; fi = AR.hidefile;
2010 if ( Expressions[num].replace == NEWLYDEFINEDEXPRESSION ) {
2014 if ( pre == 0 ) { fi = AR.outfile; }
2018 MesPrint(
"&isnumerical: expression is not yet defined!");
2025 if ( pre == 0 ) { fi = AR.infile; }
2029 else { fi = AR.outfile; }
2033 PUTZERO(oldposition);
2039 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
2041 position = AS.OldOnFile[num];
2042 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0
2043 || ( GetOneTerm(BHEAD term,fi,&position,1) < 0 ) ) {
2044 MLOCK(ErrorMessageLock);
2045 MesCall(
"GetFirstTerm");
2046 MUNLOCK(ErrorMessageLock);
2061 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
2063 AR.GetOneFile = oldonefile;
2065 AR.CompressPointer = oldcomppointer;
2074int GetContent(WORD *content,
int num)
2089 WORD type, *oldcomppointer, oldonefile, numword, *term, i;
2090 WORD *cbuffer = TermMalloc(
"GetContent");
2091 WORD *oldworkpointer = AT.WorkPointer;
2093 oldcomppointer = AR.CompressPointer;
2094 type = Expressions[num].status;
2095 if ( type == STOREDEXPRESSION ) {
2096 WORD TMproto[SUBEXPSIZE];
2097 TMproto[0] = EXPRESSION;
2098 TMproto[1] = SUBEXPSIZE;
2101 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
2102 AT.TMaddr = TMproto;
2104 if ( ( renumber = GetTable(num,&position,0) ) == 0 )
goto CalledFrom;
2105 if ( GetFromStore(cbuffer,&position,renumber,&numword,num) < 0 )
goto CalledFrom;
2107 term = oldworkpointer;
2108 AR.CompressPointer = oldcomppointer;
2109 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 )
goto CalledFrom;
2110 if ( *term == 0 )
break;
2114 if ( ContentMerge(BHEAD cbuffer,term) < 0 )
goto CalledFrom;
2119 if ( renumber->
symb.
lo != AN.dummyrenumlist )
2120 M_free(renumber->
symb.
lo,
"VarSpace");
2121 M_free(renumber,
"Renumber");
2127 oldonefile = AR.GetOneFile;
2128 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
2129 AR.GetOneFile = 2; fi = AR.hidefile;
2133 if ( Expressions[num].replace == NEWLYDEFINEDEXPRESSION )
2135 else fi = AR.infile;
2138 PUTZERO(oldposition);
2144 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
2146 position = AS.OldOnFile[num];
2147 if ( GetOneTerm(BHEAD cbuffer,fi,&position,1) < 0 )
goto CalledFrom;
2148 AR.CompressPointer = oldcomppointer;
2149 if ( GetOneTerm(BHEAD cbuffer,fi,&position,1) < 0 )
goto CalledFrom;
2158 term = oldworkpointer;
2159 AR.CompressPointer = oldcomppointer;
2160 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0 )
goto CalledFrom;
2161 if ( *term == 0 )
break;
2165 if ( ContentMerge(BHEAD cbuffer,term) < 0 )
goto CalledFrom;
2168 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
2170 AR.GetOneFile = oldonefile;
2172 AR.CompressPointer = oldcomppointer;
2173 for ( i = 0; i < *cbuffer; i++ ) content[i] = cbuffer[i];
2174 TermFree(cbuffer,
"GetContent");
2175 AT.WorkPointer = oldworkpointer;
2178 MLOCK(ErrorMessageLock);
2179 MesCall(
"GetContent");
2180 MUNLOCK(ErrorMessageLock);
2191int CleanupTerm(WORD *term)
2193 WORD *tstop, *t, *tfill, *tt;
2194 GETSTOP(term,tstop);
2196 while ( t < tstop ) {
2197 if ( *t >= FUNCTION && ( functions[*t-FUNCTION].commute || *t == DENOMINATOR ) ) {
2198 tfill = t; tt = t + t[1]; tstop = term + *term;
2199 while ( tt < tstop ) *tfill++ = *tt++;
2200 *term = tfill - term;
2201 tstop -= ABS(tfill[-1]);
2215WORD ContentMerge(PHEAD WORD *content, WORD *term)
2218 WORD *cstop, csize, crsize, sign = 1, numsize, densize, i, tnsize, tdsize;
2219 UWORD *num, *den, *tnum, *tden;
2220 WORD *outfill, *outb = TermMalloc(
"ContentMerge"), *ct;
2221 WORD *t, *tstop, tsize, trsize, *told;
2222 WORD *t1, *t2, *c1, *c2, i1, i2, *out1;
2223 WORD didsymbol = 0, diddotp = 0, tfirst;
2224 cstop = content + *content;
2226 if ( csize < 0 ) { sign = -sign; csize = -csize; }
2228 numsize = densize = crsize = (csize-1)/2;
2229 num = NumberMalloc(
"ContentMerge");
2230 den = NumberMalloc(
"ContentMerge");
2231 for ( i = 0; i < numsize; i++ ) num[i] = (UWORD)(cstop[i]);
2232 for ( i = 0; i < densize; i++ ) den[i] = (UWORD)(cstop[i+crsize]);
2233 while ( num[numsize-1] == 0 ) numsize--;
2234 while ( den[densize-1] == 0 ) densize--;
2238 tstop = term + *term;
2240 if ( tsize < 0 ) tsize = -tsize;
2242 tstop = tstop - tsize;
2243 tnsize = tdsize = trsize = (tsize-1)/2;
2244 tnum = (UWORD *)tstop; tden = (UWORD *)(tstop + trsize);
2245 while ( tnum[tnsize-1] == 0 ) tnsize--;
2246 while ( tden[tdsize-1] == 0 ) tdsize--;
2247 GcdLong(BHEAD num, numsize, tnum, tnsize, num, &numsize);
2248 if ( LcmLong(BHEAD den, densize, tden, tdsize, den, &densize) )
goto CalledFrom;
2252 while ( ct < cstop ) {
2257 while ( t < tstop && *t != *ct ) t += t[1];
2258 if ( t >= tstop )
break;
2259 t1 = t+2; t2 = t+t[1];
2260 c1 = ct+2; c2 = ct+ct[1];
2261 out1 = outfill; *outfill++ = *ct; outfill++;
2262 while ( c1 < c2 && t1 < t2 ) {
2264 if ( t1[1] <= c1[1] ) {
2265 *outfill++ = *t1++; *outfill++ = *t1++;
2269 *outfill++ = *c1++; *outfill++ = *c1++;
2273 else if ( *c1 < *t1 ) {
2275 *outfill++ = *c1++; *outfill++ = *c1++;
2281 *outfill++ = *t1++; *outfill++ = *t1++;
2287 if ( c1[1] < 0 ) { *outfill++ = c1[0]; *outfill++ = c1[1]; }
2291 if ( t1[1] < 0 ) { *outfill++ = t1[0]; *outfill++ = t1[1]; }
2294 out1[1] = outfill - out1;
2295 if ( out1[1] == 2 ) outfill = out1;
2300 while ( t < tstop && *t != *ct ) t += t[1];
2301 if ( t >= tstop )
break;
2302 t1 = t+2; t2 = t+t[1];
2303 c1 = ct+2; c2 = ct+ct[1];
2304 out1 = outfill; *outfill++ = *ct; outfill++;
2305 while ( c1 < c2 && t1 < t2 ) {
2306 if ( *c1 == *t1 && c1[1] == t1[1] ) {
2307 if ( t1[2] <= c1[2] ) {
2308 *outfill++ = *t1++; *outfill++ = *t1++; *outfill++ = *t1++;
2312 *outfill++ = *c1++; *outfill++ = *c1++; *outfill++ = *c1++;
2316 else if ( *c1 < *t1 || ( *c1 == *t1 && c1[1] < t1[1] ) ) {
2318 *outfill++ = *c1++; *outfill++ = *c1++; *outfill++ = *c1++;
2324 *outfill++ = *t1++; *outfill++ = *t1++; *outfill++ = *t1++;
2330 if ( c1[2] < 0 ) { *outfill++ = c1[0]; *outfill++ = c1[1]; *outfill++ = c1[1]; }
2334 if ( t1[2] < 0 ) { *outfill++ = t1[0]; *outfill++ = t1[1]; *outfill++ = t1[1]; }
2337 out1[1] = outfill - out1;
2338 if ( out1[1] == 2 ) outfill = out1;
2342 while ( t < tstop && *t != *ct ) t += t[1];
2343 if ( t >= tstop )
break;
2344 t1 = t+2; t2 = t+t[1];
2345 c1 = ct+2; c2 = ct+ct[1];
2346 out1 = outfill; *outfill++ = *ct; outfill++;
2347 while ( c1 < c2 && t1 < t2 ) {
2352 else if ( *c1 < *t1 ) { c1 += 1; }
2355 out1[1] = outfill - out1;
2356 if ( out1[1] == 2 ) outfill = out1;
2361 while ( t < tstop && *t != *ct ) t += t[1];
2362 if ( t >= tstop )
break;
2363 t1 = t+2; t2 = t+t[1];
2364 c1 = ct+2; c2 = ct+ct[1];
2365 out1 = outfill; *outfill++ = *ct; outfill++;
2366 while ( c1 < c2 && t1 < t2 ) {
2367 if ( *c1 == *t1 && c1[1] && t1[1] ) {
2368 *outfill++ = *c1++; *outfill++ = *c1++;
2371 else if ( *c1 < *t1 || ( *c1 == *t1 && c1[1] < t1[1] ) ) {
2378 out1[1] = outfill - out1;
2379 if ( out1[1] == 2 ) outfill = out1;
2385 while ( t < tstop ) {
2386 if ( *t != *ct ) { t += t[1];
continue; }
2387 if ( ct[1] != t[1] ) { t += t[1];
continue; }
2388 if ( ct[2] != t[2] ) { t += t[1];
continue; }
2389 t1 = t; t2 = ct; i1 = t1[1]; i2 = t2[1];
2391 if ( *t1 != *t2 )
break;
2394 if ( i1 != 0 ) { t += t[1];
continue; }
2396 for ( i = 0; i < i2; i++ ) { *outfill++ = *t++; }
2400 t1[2] |= SUBTERMUSED1;
2401 ct[2] |= SUBTERMUSED2;
2409 if ( diddotp == 0 ) {
2410 t = term+1;
while ( t < tstop && *t != DOTPRODUCT ) t += t[1];
2412 tfirst = 1; told = outfill;
2413 for ( i = 2; i < t[1]; i += 3 ) {
2415 if ( tfirst ) { *outfill++ = DOTPRODUCT; *outfill++ = 0; tfirst = 0; }
2416 *outfill++ = t[i]; *outfill++ = t[i+1]; *outfill++ = t[i+2];
2419 if ( outfill > told ) told[1] = outfill-told;
2422 if ( didsymbol == 0 ) {
2423 t = term+1;
while ( t < tstop && *t != SYMBOL ) t += t[1];
2425 tfirst = 1; told = outfill;
2426 for ( i = 2; i < t[1]; i += 2 ) {
2428 if ( tfirst ) { *outfill++ = SYMBOL; *outfill++ = 0; tfirst = 0; }
2429 *outfill++ = t[i]; *outfill++ = t[i+1];
2432 if ( outfill > told ) told[1] = outfill-told;
2438 if ( numsize < densize ) {
2439 for ( i = numsize; i < densize; i++ ) num[i] = 0;
2442 else if ( densize < numsize ) {
2443 for ( i = densize; i < numsize; i++ ) den[i] = 0;
2446 for ( i = 0; i < numsize; i++ ) *outfill++ = num[i];
2447 for ( i = 0; i < densize; i++ ) *outfill++ = den[i];
2448 csize = numsize+densize+1;
2449 if ( sign < 0 ) csize = -csize;
2451 *outb = outfill-outb;
2452 NumberFree(den,
"ContentMerge");
2453 NumberFree(num,
"ContentMerge");
2454 for ( i = 0; i < *outb; i++ ) content[i] = outb[i];
2455 TermFree(outb,
"ContentMerge");
2462 while ( t < tstop ) {
2463 if ( *t >= FUNCTION ) t[2] &= ~SUBTERMUSED1;
2468 MLOCK(ErrorMessageLock);
2469 MesCall(
"GetContent");
2470 MUNLOCK(ErrorMessageLock);
2479LONG TermsInExpression(WORD num)
2481 LONG x = Expressions[num].counter;
2482 if ( x >= 0 )
return(x);
2491LONG SizeOfExpression(WORD num)
2493 LONG x = (LONG)(DIVPOS(Expressions[num].size,
sizeof(WORD)));
2494 if ( x >= 0 )
return(x);
2503void UpdatePositions(
void)
2509 if ( NumExpressions > 0 &&
2510 ( AS.OldOnFile == 0 || AS.NumOldOnFile < NumExpressions ) ) {
2511 if ( AS.OldOnFile ) {
2513 AS.OldOnFile = (
POSITION *)Malloc1(NumExpressions*
sizeof(
POSITION),
"file pointers");
2514 for ( i = 0; i < AS.NumOldOnFile; i++ ) AS.OldOnFile[i] = old[i];
2515 AS.NumOldOnFile = NumExpressions;
2516 M_free(old,
"process file pointers");
2519 AS.OldOnFile = (
POSITION *)Malloc1(NumExpressions*
sizeof(
POSITION),
"file pointers");
2520 AS.NumOldOnFile = NumExpressions;
2523 if ( NumExpressions > 0 &&
2524 ( AS.OldNumFactors == 0 || AS.NumOldNumFactors < NumExpressions ) ) {
2525 if ( AS.OldNumFactors ) {
2526 oldw = AS.OldNumFactors;
2527 AS.OldNumFactors = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"numfactors pointers");
2528 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.OldNumFactors[i] = oldw[i];
2529 M_free(oldw,
"numfactors pointers");
2530 oldw = AS.Oldvflags;
2531 AS.Oldvflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"vflags pointers");
2532 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Oldvflags[i] = oldw[i];
2533 M_free(oldw,
"vflags pointers");
2534 oldw = AS.Olduflags;
2535 AS.Olduflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"uflags pointers");
2536 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Olduflags[i] = oldw[i];
2537 M_free(oldw,
"uflags pointers");
2538 AS.NumOldNumFactors = NumExpressions;
2541 AS.OldNumFactors = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"numfactors pointers");
2542 AS.Oldvflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"vflags pointers");
2543 AS.Olduflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"uflags pointers");
2544 AS.NumOldNumFactors = NumExpressions;
2547 for ( i = 0; i < NumExpressions; i++ ) {
2548 AS.OldOnFile[i] = e[i].onfile;
2549 AS.OldNumFactors[i] = e[i].numfactors;
2550 AS.Oldvflags[i] = e[i].vflags;
2551 AS.Olduflags[i] = e[i].uflags;
2563LONG CountTerms1(PHEAD0)
2566 POSITION oldposition, startposition;
2567 WORD *t, *m, *mstop, decr, i, *oldwork, retval;
2568 WORD *oldipointer = AR.CompressPointer;
2569 WORD oldGetOneFile = AR.GetOneFile, olddeferflag = AR.DeferFlag;
2572 oldwork = AT.WorkPointer;
2573 AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
2575 startposition = AR.DefPosition;
2579 if ( AR.infile->handle >= 0 ) {
2580 PUTZERO(oldposition);
2586 SETBASEPOSITION(oldposition,AR.infile->POfill-AR.infile->PObuffer);
2587 AR.infile->POfill = (WORD *)((UBYTE *)(AR.infile->PObuffer)
2588 +BASEPOSITION(startposition));
2593 t = m = AR.CompressBuffer;
2595 mstop = t - ABS(t[-1]);
2597 while ( *m != HAAKJE && m < mstop ) m += m[1];
2600 AR.DeferFlag = olddeferflag;
2601 AT.WorkPointer = oldwork;
2602 AR.GetOneFile = oldGetOneFile;
2606 decr = WORDDIF(mstop,AR.CompressBuffer)-1;
2608 m = AR.CompressBuffer;
2609 t = AR.CompressPointer;
2621 AR.CompressPointer = oldipointer;
2624 retval = GetOneTerm(BHEAD AT.WorkPointer,AR.infile,&startposition,0);
2625 if ( retval >= 0 ) AR.CompressPointer = oldipointer;
2626 if ( retval <= 0 )
break;
2627 t = AR.CompressPointer;
2628 if ( *t < (1 + decr + ABS(*(t+*t-1))) )
break;
2630 m = AR.CompressBuffer+1;
2631 while ( m < mstop ) {
2632 if ( *m != *t )
goto Thatsit;
2640 AT.WorkPointer = oldwork;
2641 if ( AR.infile->handle >= 0 ) {
2647 AR.infile->POfill = AR.infile->PObuffer + BASEPOSITION(oldposition);
2649 AR.DeferFlag = olddeferflag;
2650 AR.GetOneFile = oldGetOneFile;
2666#define CURRENTBRACKET 1
2667#define BRACKETCURRENTEXPR 2
2668#define BRACKETOTHEREXPR 3
2669#define NOBRACKETACTIVE 4
2671LONG TermsInBracket(PHEAD WORD *term, WORD level)
2673 WORD *t, *tstop, *b, *tt, *n1, *n2;
2674 int type = 0, i, num;
2676 WORD *bracketbuffer = AT.WorkPointer;
2677 t = term; GETSTOP(t,tstop);
2678 t++; b = bracketbuffer;
2679 while ( t < tstop ) {
2680 if ( *t != TERMSINBRACKET ) { t += t[1];
continue; }
2681 if ( t[1] == FUNHEAD || (
2683 && t[FUNHEAD] == -SNUMBER
2684 && t[FUNHEAD+1] == 0
2686 if ( AC.ComDefer == 0 ) {
2687 type = NOBRACKETACTIVE;
2690 type = CURRENTBRACKET;
2695 if ( t[FUNHEAD] == -EXPRESSION ) {
2696 if ( t[FUNHEAD+2] < 0 ) {
2697 if ( ( t[FUNHEAD+2] <= -FUNCTION ) && ( t[1] == FUNHEAD+3 ) ) {
2698 type = BRACKETOTHEREXPR;
2699 *b++ = FUNHEAD+4; *b++ = -t[FUNHEAD+2]; *b++ = FUNHEAD;
2700 for ( i = 2; i < FUNHEAD; i++ ) *b++ = 0;
2701 *b++ = 1; *b++ = 1; *b++ = 3;
2704 else if ( ( t[FUNHEAD+2] > -FUNCTION ) && ( t[1] == FUNHEAD+4 ) ) {
2705 type = BRACKETOTHEREXPR;
2709 *b++ = 8; *b++ = SYMBOL; *b++ = 4; *b++ = tt[1];
2710 *b++ = 1; *b++ = 1; *b++ = 1; *b++ = 3;
2714 *b++ = 4; *b++ = 1; *b++ = 1; *b++ = 3;
2716 else goto IllBraReq;
2724 else if ( ( t[FUNHEAD+2] == (t[1]-FUNHEAD-2) ) &&
2725 ( t[FUNHEAD+2+ARGHEAD] == (t[FUNHEAD+2]-ARGHEAD) ) ) {
2726 type = BRACKETOTHEREXPR;
2727 tt = t + FUNHEAD + ARGHEAD; num = *tt;
2728 for ( i = 0; i < num; i++ ) *b++ = *tt++;
2733 if ( t[FUNHEAD] < 0 ) {
2734 if ( ( t[FUNHEAD] <= -FUNCTION ) && ( t[1] == FUNHEAD+1 ) ) {
2735 type = BRACKETCURRENTEXPR;
2736 *b++ = FUNHEAD+4; *b++ = -t[FUNHEAD+2]; *b++ = FUNHEAD;
2737 for ( i = 2; i < FUNHEAD; i++ ) *b++ = 0;
2738 *b++ = 1; *b++ = 1; *b++ = 3; *b = 0;
2741 else if ( ( t[FUNHEAD] > -FUNCTION ) && ( t[1] == FUNHEAD+2 ) ) {
2742 type = BRACKETCURRENTEXPR;
2746 *b++ = 8; *b++ = SYMBOL; *b++ = 4; *b++ = tt[1];
2747 *b++ = 1; *b++ = 1; *b++ = 1; *b++ = 3;
2751 *b++ = 4; *b++ = 1; *b++ = 1; *b++ = 3;
2753 else goto IllBraReq;
2761 else if ( ( t[FUNHEAD] == (t[1]-FUNHEAD) ) &&
2762 ( t[FUNHEAD+ARGHEAD] == (t[FUNHEAD]-ARGHEAD) ) ) {
2763 type = BRACKETCURRENTEXPR;
2764 tt = t + FUNHEAD + ARGHEAD; num = *tt;
2765 for ( i = 0; i < num; i++ ) *b++ = *tt++;
2770 MLOCK(ErrorMessageLock);
2771 MesPrint(
"Illegal bracket request in termsinbracket_ function.");
2772 MUNLOCK(ErrorMessageLock);
2779 if ( AT.WorkPointer + *term +4 > AT.WorkTop ) {
2780 MLOCK(ErrorMessageLock);
2782 MesPrint(
"Called from termsinbracket_ function.");
2783 MUNLOCK(ErrorMessageLock);
2790 case CURRENTBRACKET:
2796 numterms = CountTerms1(BHEAD0);
2798 case BRACKETCURRENTEXPR:
2802 MLOCK(ErrorMessageLock);
2803 MesPrint(
"termsinbracket_ function currently only handles Keep Brackets.");
2804 MUNLOCK(ErrorMessageLock);
2806 case BRACKETOTHEREXPR:
2807 MLOCK(ErrorMessageLock);
2808 MesPrint(
"termsinbracket_ function currently only handles Keep Brackets.");
2809 MUNLOCK(ErrorMessageLock);
2811 case NOBRACKETACTIVE:
2818 n1 = term; n2 = AT.WorkPointer; tstop = n1 + *n1;
2819 while ( n1 < t ) *n2++ = *n1++;
2820 i = numterms >> BITSINWORD;
2822 *n2++ = LNUMBER; *n2++ = 4; *n2++ = 1; *n2++ = (WORD)(numterms & WORDMASK);
2825 *n2++ = LNUMBER; *n2++ = 5; *n2++ = 2;
2826 *n2++ = (WORD)(numterms & WORDMASK); *n2++ = i;
2829 while ( n1 < tstop ) *n2++ = *n1++;
2830 AT.WorkPointer[0] = n2 - AT.WorkPointer;
2831 AT.WorkPointer = n2;
2833 AT.WorkPointer = bracketbuffer;
2834 MLOCK(ErrorMessageLock);
2835 MesPrint(
"Called from termsinbracket_ function.");
2836 MUNLOCK(ErrorMessageLock);
2842 AT.WorkPointer = bracketbuffer;
WORD CompCoef(WORD *, WORD *)
int Generator(PHEAD WORD *, WORD)
int GetFirstTerm(WORD *term, int num, int pre)
int PF_BroadcastExpFlags(void)
int PF_BroadcastModifiedDollars(void)
int PF_BroadcastCBuf(int bufnum)
int PF_CollectModifiedDollars(void)
int PF_BroadcastExpr(EXPRESSIONS e, FILEHANDLE *file)