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 ) {
910 for ( i = 0; i < AM.totalnumberofthreads; i++ ) {
911 if ( ModOptdollars[j].dstruct[i].size > 0 ) {
912 CleanDollarFactors(&(ModOptdollars[j].dstruct[i]));
913 M_free(ModOptdollars[j].dstruct[i].where,
"Local dollar value");
919 M_free(ModOptdollars[j].dstruct,
"Local DOLLARS");
920 ModOptdollars[j].dstruct = 0;
941 if ( ModOptdollars ) M_free(ModOptdollars,
"ModOptdollars pointer");
942 if ( PotModdollars ) M_free(PotModdollars,
"PotModdollars pointer");
945 AC.ModOptDolList.lijst = NULL;
947 AC.PotModDolList.lijst = NULL;
949 NumPotModdollars = 0;
950 NumModOptdollars = 0;
957if ( AC.SwitchInArray > 0 ) {
958 for ( i = 0; i < AC.SwitchInArray; i++ ) {
959 SWITCH *sw = AC.SwitchArray + i;
960 if ( sw->table ) M_free(sw->table,
"Switch table");
962 sw->defaultcase.ncase = 0;
963 sw->defaultcase.value = 0;
964 sw->defaultcase.compbuffer = 0;
965 sw->endswitch.ncase = 0;
966 sw->endswitch.value = 0;
967 sw->endswitch.compbuffer = 0;
978 AC.SwitchInArray = 0;
985 AC.PolyRatFunChanged = 0;
987 if ( par == STOREMODULE || par == CLEARMODULE ) {
989 if ( par == STOREMODULE && PopVariables() ) RetCode = -1;
990 if ( AR.infile->handle >= 0 ) {
991 CloseFile(AR.infile->handle);
992 remove(AR.infile->name);
993 AR.infile->handle = -1;
995 AR.infile->POfill = AR.infile->PObuffer;
996 PUTZERO(AR.infile->POposition);
997 AR.infile->POfull = AR.infile->PObuffer;
998 if ( AR.outfile->handle >= 0 ) {
999 CloseFile(AR.outfile->handle);
1000 remove(AR.outfile->name);
1001 AR.outfile->handle = -1;
1003 AR.outfile->POfull =
1004 AR.outfile->POfill = AR.outfile->PObuffer;
1005 PUTZERO(AR.outfile->POposition);
1006 if ( AR.hidefile->handle >= 0 ) {
1007 CloseFile(AR.hidefile->handle);
1008 remove(AR.hidefile->name);
1009 AR.hidefile->handle = -1;
1011 AR.hidefile->POfull =
1012 AR.hidefile->POfill = AR.hidefile->PObuffer;
1013 PUTZERO(AR.hidefile->POposition);
1015 if ( par == CLEARMODULE ) {
1016 if ( DeleteStore(0) < 0 ) {
1017 MesPrint(
"Cannot restart the storage file");
1023 AM.gProcessBucketSize = AM.hProcessBucketSize;
1024 AM.gparallelflag = PARALLELFLAG;
1025 AM.gnumextrasym = AM.ggnumextrasym;
1026 PruneExtraSymbols(AM.ggnumextrasym);
1029 ClearSpectators(par);
1032 if ( CleanExpr(0) ) RetCode = -1;
1033 if ( AC.DidClean ) CompactifyTree(AC.exprnames,EXPRNAMES);
1038 if ( AC.MultiBracketBuf != 0 ) {
1039 for ( i = 0; i < MAXMULTIBRACKETLEVELS; i++ ) {
1040 if ( AC.MultiBracketBuf[i] ) {
1041 M_free(AC.MultiBracketBuf[i],
"bracket buffer i");
1042 AC.MultiBracketBuf[i] = 0;
1045 AC.MultiBracketLevels = 0;
1046 M_free(AC.MultiBracketBuf,
"multi bracket buffer");
1047 AC.MultiBracketBuf = 0;
1050 if ( AC.SortReallocateFlag ) {
1054 M_free(S->lBuffer,
"SortReallocate lBuffer+sBuffer");
1055 S->lBuffer = Malloc1(
sizeof(*(S->lBuffer))*(S->LargeSize+S->SmallEsize),
"SortReallocate lBuffer+sBuffer");
1056 S->lTop = S->lBuffer+S->LargeSize;
1057 S->sBuffer = S->lTop;
1058 if ( S->LargeSize == 0 ) { S->lBuffer = 0; S->lTop = 0; }
1059 S->sTop = S->sBuffer + S->SmallSize;
1060 S->sTop2 = S->sBuffer + S->SmallEsize;
1061 S->sHalf = S->sBuffer + (LONG)((S->SmallSize+S->SmallEsize)>>1);
1065 UpdateSortBlocks(AM.totalnumberofthreads-1);
1069 for ( i = 1; i < AM.totalnumberofthreads; i++ ) {
1071 M_free(S->lBuffer,
"SortReallocate lBuffer+sBuffer");
1072 S->lBuffer = Malloc1(
sizeof(*(S->lBuffer))*(S->LargeSize+S->SmallEsize),
"SortReallocate lBuffer+sBuffer");
1073 S->lTop = S->lBuffer+S->LargeSize;
1074 S->sBuffer = S->lTop;
1075 if ( S->LargeSize == 0 ) { S->lBuffer = 0; S->lTop = 0; }
1076 S->sTop = S->sBuffer + S->SmallSize;
1077 S->sTop2 = S->sBuffer + S->SmallEsize;
1078 S->sHalf = S->sBuffer + (LONG)((S->SmallSize+S->SmallEsize)>>1);
1082 if ( AC.SortReallocateFlag == 2 ) {
1085 AC.SortReallocateFlag = 0;
1112int PutBracket(PHEAD WORD *termin)
1115 WORD *t, *t1, *b, i, j, *lastfun;
1117 WORD *bStop, *bb, *bf, *tStop;
1118 WORD *term1,*term2, *m1, *m2, *tStopa;
1119 WORD *bbb = 0, *bind, *binst = 0, bwild = 0, *bss = 0, *bns = 0, bset = 0;
1120 term1 = AT.WorkPointer+1;
1121 term2 = (WORD *)(((UBYTE *)(term1)) + AM.MaxTer);
1122 if ( ( (WORD *)(((UBYTE *)(term2)) + AM.MaxTer) ) > AT.WorkTop ) {
1125 if ( AR.BracketOn < 0 ) {
1126 t2 = term1; t1 = term2;
1129 t1 = term1; t2 = term2;
1131 b = AT.BrackBuf; bStop = b+*b; b++;
1132 while ( b < bStop ) {
1133 if ( *b == INDEX ) { bwild = 1; bbb = b+2; binst = b + b[1]; }
1134 if ( *b == SETSET ) { bset = 1; bss = b+2; bns = b + b[1]; }
1138 t = termin; tStopa = t + *t; i = *(t + *t -1); i = ABS(i);
1139 if ( AR.PolyFun && AT.PolyAct ) tStop = termin + AT.PolyAct;
1141 else if ( AT.FloatPos ) tStop = termin + AT.FloatPos;
1143 else tStop = tStopa - i;
1145 if ( AR.BracketOn < 0 ) {
1147 while ( t < tStop && *t >= FUNCTION
1148 && functions[*t-FUNCTION].commute ) {
1150 while ( b < bStop ) {
1153 while ( t < tStop && *t >= FUNCTION
1154 && functions[*t-FUNCTION].commute ) t += t[1];
1162 if ( b[1] == CFUNCTION ) {
1163 SETS set = Sets+b[0]; WORD i;
1164 for ( i = set->first; i < set->last; i++ ) {
1165 if ( SetElements[i] == *t ) {
1167 while ( t < tStop && *t >= FUNCTION
1168 && functions[*t-FUNCTION].commute ) t += t[1];
1176 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1181 while ( bind < binst ) {
1182 if ( *bind == *s2 ) {
1184 while ( t < tStop && *t >= FUNCTION
1185 && functions[*t-FUNCTION].commute ) t += t[1];
1198 while ( s1 < lastfun ) *t2++ = *s1++;
1199 while ( s1 < t ) *t1++ = *s1++;
1202 while ( s1 < t ) *t2++ = *s1++;
1208 while ( t < tStop && *t >= FUNCTION
1209 && functions[*t-FUNCTION].commute ) {
1211 while ( b < bStop ) {
1212 if ( *b == *t ) { lastfun = t + t[1];
goto NextNcom; }
1218 if ( b[1] == CFUNCTION ) {
1219 SETS set = Sets+b[0]; WORD i;
1220 for ( i = set->first; i < set->last; i++ ) {
1221 if ( SetElements[i] == *t ) {
1230 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1235 while ( bind < binst ) {
1236 if ( *bind == *s2 ) { lastfun = t + t[1];
goto NextNcom; }
1246 while ( s1 < lastfun ) *t1++ = *s1++;
1247 while ( s1 < t ) *t2++ = *s1++;
1252 b = AT.BrackBuf + 1;
1253 while ( b < bStop && *b >= FUNCTION
1254 && ( *b < FUNCTION || functions[*b-FUNCTION].commute ) ) {
1259 while ( t < tStop && ( bf < bStop || bwild || bset ) ) {
1261 while ( b < bStop && *b != *t ) { b += b[1]; }
1263 if ( *t >= FUNCTION ) {
1264 if ( b < bStop && *b == *t )
goto FunBrac;
1268 if ( b[1] == CFUNCTION ) {
1269 SETS set = Sets+b[0]; WORD i;
1270 for ( i = set->first; i < set->last; i++ ) {
1271 if ( SetElements[i] == *t )
goto FunBrac;
1277 if ( bwild && *t >= FUNCTION && functions[*t-FUNCTION].spec ) {
1282 while ( bind < binst ) {
1283 if ( *bind == *s2 )
goto FunBrac;
1291FunBrac: NCOPY(t1,t,i);
1297 if ( *t == DELTA ) {
1298 if ( b < bStop && *b == DELTA ) {
1302 else { NCOPY(t2,t,i); }
1304 else if ( *t == INDEX ) {
1307 *t1++ = *t; t1++; *t2++ = *t; t2++;
1311 while ( --j >= 0 ) {
1312 while ( *bind < *t && bind < binst ) bind++;
1313 if ( *bind == *t && bind < binst ) {
1318 while ( b3 < bns ) {
1319 if ( b3[1] == CVECTOR ) {
1320 SETS set = Sets+b3[0]; WORD i;
1321 for ( i = set->first; i < set->last; i++ ) {
1322 if ( SetElements[i] == *t ) {
1335 m1[1] = WORDDIF(t1,m1);
1336 if ( m1[1] == 2 ) t1 = m1;
1337 m2[1] = WORDDIF(t2,m2);
1338 if ( m2[1] == 2 ) t2 = m2;
1342 *t1++ = *t; t1++; *t2++ = *t; t2++;
1345 while ( --j >= 0 ) {
1347 while ( b3 < bns ) {
1348 if ( b3[1] == CVECTOR ) {
1349 SETS set = Sets+b3[0]; WORD i;
1350 for ( i = set->first; i < set->last; i++ ) {
1351 if ( SetElements[i] == *t ) {
1362 m1[1] = WORDDIF(t1,m1);
1363 if ( m1[1] == 2 ) t1 = m1;
1364 m2[1] = WORDDIF(t2,m2);
1365 if ( m2[1] == 2 ) t2 = m2;
1371 else if ( *t == VECTOR ) {
1372 if ( ( b < bStop && *b == VECTOR ) || bwild ) {
1373 if ( b < bStop && *b == VECTOR ) {
1374 bb = b + b[1]; b += 2;
1378 m1 = t1; m2 = t2; *t1++ = *t; *t2++ = *t; t1++; t2++; t += 2;
1381 while ( b < bb && ( *b < *t ||
1382 ( *b == *t && b[1] < t[1] ) ) ) b += 2;
1383 if ( b < bb && ( *t == *b && t[1] == b[1] ) ) {
1384 *t1++ = *t++; *t1++ = *t++;
goto nextvec;
1388 while ( bind < binst ) {
1389 if ( *t == *bind || t[1] == *bind ) {
1390 *t1++ = *t++; *t1++ = *t++;
1398 while ( b3 < bns ) {
1399 if ( b3[1] == CVECTOR ) {
1400 SETS set = Sets+b3[0]; WORD i;
1401 for ( i = set->first; i < set->last; i++ ) {
1402 if ( SetElements[i] == *t ) {
1403 *t1++ = *t++; *t1++ = *t++;
1411 *t2++ = *t++; *t2++ = *t++;
1414 m1[1] = WORDDIF(t1,m1);
1415 if ( m1[1] == 2 ) t1 = m1;
1416 m2[1] = WORDDIF(t2,m2);
1417 if ( m2[1] == 2 ) t2 = m2;
1420 m1 = t1; *t1++ = *t; t1++;
1421 m2 = t2; *t2++ = *t; t2++;
1425 while ( b3 < bns ) {
1426 if ( b3[1] == CVECTOR ) {
1427 SETS set = Sets+b3[0]; WORD i;
1428 for ( i = set->first; i < set->last; i++ ) {
1429 if ( SetElements[i] == *t ) {
1430 *t1++ = *t++; *t1++ = *t++;
1437 *t2++ = *t++; *t2++ = *t++;
1440 m1[1] = WORDDIF(t1,m1);
1441 if ( m1[1] == 2 ) t1 = m1;
1442 m2[1] = WORDDIF(t2,m2);
1443 if ( m2[1] == 2 ) t2 = m2;
1449 else if ( *t == DOTPRODUCT ) {
1450 if ( ( b < bStop && *b == *t ) || bwild ) {
1451 m1 = t1; *t1++ = *t; t1++;
1452 m2 = t2; *t2++ = *t; t2++;
1453 if ( b >= bStop || *b != *t ) { bb = b; s1 = b; }
1455 s1 = b + b[1]; bb = b + 2;
1458 while ( t < s2 && ( bb < s1 || bwild || bset ) ) {
1459 while ( bb < s1 && ( *bb < *t ||
1460 ( *bb == *t && bb[1] < t[1] ) ) ) bb += 3;
1461 if ( bb < s1 && *bb == *t && bb[1] == t[1] ) {
1462 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++; bb += 3;
1467 while ( bind < binst ) {
1468 if ( *bind == *t || *bind == t[1] ) {
1469 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1477 while ( b3 < bns ) {
1478 if ( b3[1] == CVECTOR ) {
1479 SETS set = Sets+b3[0]; WORD i;
1480 for ( i = set->first; i < set->last; i++ ) {
1481 if ( SetElements[i] == *t || SetElements[i] == t[1] ) {
1482 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1490 *t2++ = *t++; *t2++ = *t++; *t2++ = *t++;
1493 while ( t < s2 ) *t2++ = *t++;
1494 m1[1] = WORDDIF(t1,m1);
1495 if ( m1[1] == 2 ) t1 = m1;
1496 m2[1] = WORDDIF(t2,m2);
1497 if ( m2[1] == 2 ) t2 = m2;
1500 m1 = t1; *t1++ = *t; t1++;
1501 m2 = t2; *t2++ = *t; t2++;
1505 while ( b3 < bns ) {
1506 if ( b3[1] == CVECTOR ) {
1507 SETS set = Sets+b3[0]; WORD i;
1508 for ( i = set->first; i < set->last; i++ ) {
1509 if ( SetElements[i] == *t || SetElements[i] == t[1] ) {
1510 *t1++ = *t++; *t1++ = *t++; *t1++ = *t++;
1517 *t2++ = *t++; *t2++ = *t++; *t2++ = *t++;
1520 m1[1] = WORDDIF(t1,m1);
1521 if ( m1[1] == 2 ) t1 = m1;
1522 m2[1] = WORDDIF(t2,m2);
1523 if ( m2[1] == 2 ) t2 = m2;
1525 else { NCOPY(t2,t,i); }
1527 else if ( *t == SYMBOL ) {
1528 if ( b < bStop && *b == *t ) {
1529 m1 = t1; *t1++ = *t; t1++;
1530 m2 = t2; *t2++ = *t; t2++;
1531 s1 = b + b[1]; bb = b+2;
1533 while ( bb < s1 && t < s2 ) {
1534 while ( bb < s1 && *bb < *t ) bb += 2;
1536 if ( bset )
goto TrySymbolSet;
1539 if ( *bb == *t ) { *t1++ = *t++; *t1++ = *t++; }
1544 while ( bbb < bns ) {
1545 if ( bbb[1] == CSYMBOL ) {
1546 SETS set = Sets+bbb[0]; WORD i;
1547 for ( i = set->first; i < set->last; i++ ) {
1548 if ( SetElements[i] == *t ) {
1549 *t1++ = *t++; *t1++ = *t++;
1556 *t2++ = *t++; *t2++ = *t++;
1558 else { *t2++ = *t++; *t2++ = *t++; }
1561 while ( t < s2 ) *t2++ = *t++;
1562 m1[1] = WORDDIF(t1,m1);
1563 if ( m1[1] == 2 ) t1 = m1;
1564 m2[1] = WORDDIF(t2,m2);
1565 if ( m2[1] == 2 ) t2 = m2;
1569 m1 = t1; *t1++ = *t; t1++;
1570 m2 = t2; *t2++ = *t; t2++;
1574 while ( bbb < bns ) {
1575 if ( bbb[1] == CSYMBOL ) {
1576 SETS set = Sets+bbb[0]; WORD i;
1577 for ( i = set->first; i < set->last; i++ ) {
1578 if ( SetElements[i] == *t ) {
1579 *t1++ = *t++; *t1++ = *t++;
1586 *t2++ = *t++; *t2++ = *t++;
1589 m1[1] = WORDDIF(t1,m1);
1590 if ( m1[1] == 2 ) t1 = m1;
1591 m2[1] = WORDDIF(t2,m2);
1592 if ( m2[1] == 2 ) t2 = m2;
1594 else { NCOPY(t2,t,i); }
1600 if ( ( i = WORDDIF(tStop,t) ) > 0 ) NCOPY(t2,t,i);
1601 if ( AR.BracketOn < 0 ) {
1602 s1 = t1; t1 = t2; t2 = s1;
1604 do { *t2++ = *t++; }
while ( t < (WORD *)tStopa );
1606 i = WORDDIF(t1,term1);
1607 *t++ = 4 + i + WORDDIF(t2,term2);
1612 i = WORDDIF(t2,term2);
1614 if ( i > 0 ) NCOPY(t,t1,i);
1626void SpecialCleanup(PHEAD0)
1629 if ( AT.previousEfactor ) M_free(AT.previousEfactor,
"Efactor cache");
1630 AT.previousEfactor = 0;
1643 if ( AN.cmod != 0 ) M_free(AN.cmod,
"AN.cmod");
1645 AN.cmod = (UWORD *)Malloc1(
sizeof(WORD)*n,
"AN.cmod");
1646 for ( i = 0; i < n; i++ ) AN.cmod[i] = AC.cmod[i];
1660 if ( AN.cmod != 0 ) M_free(AN.cmod,
"AN.cmod");
1673void ExchangeExpressions(
int num1,
int num2)
1676 WORD node1, node2, namesize, TMproto[SUBEXPSIZE];
1682 e1 = Expressions + num1;
1683 e2 = Expressions + num2;
1686 AC.exprnames->namenode[node1].number = num2;
1687 AC.exprnames->namenode[node2].number = num1;
1688 a = e1->name; e1->name = e2->name; e2->name = a;
1689 namesize = e1->namesize; e1->namesize = e2->namesize; e2->namesize = namesize;
1692 if ( e1->status == STOREDEXPRESSION ) {
1696 TMproto[0] = EXPRESSION;
1697 TMproto[1] = SUBEXPSIZE;
1700 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1701 AT.TMaddr = TMproto;
1702 ind = FindInIndex(num1,&AR.StoreData,0,0);
1703 s1 = (SBYTE *)(AC.exprnames->namebuffer+e1->name);
1708 SeekFile(AR.StoreData.Handle,&(e1->onfile),SEEK_SET);
1709 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ind,
1711 MesPrint(
"File error while exchanging expressions");
1714 FlushFile(AR.StoreData.Handle);
1716 if ( e2->status == STOREDEXPRESSION ) {
1720 TMproto[0] = EXPRESSION;
1721 TMproto[1] = SUBEXPSIZE;
1724 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1725 AT.TMaddr = TMproto;
1726 ind = FindInIndex(num1,&AR.StoreData,0,0);
1727 s1 = (SBYTE *)(AC.exprnames->namebuffer+e2->name);
1732 SeekFile(AR.StoreData.Handle,&(e2->onfile),SEEK_SET);
1733 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ind,
1735 MesPrint(
"File error while exchanging expressions");
1738 FlushFile(AR.StoreData.Handle);
1747int GetFirstBracket(WORD *term,
int num)
1758 WORD type, *oldcomppointer, oldonefile, numword;
1761 oldcomppointer = AR.CompressPointer;
1762 type = Expressions[num].status;
1763 if ( type == STOREDEXPRESSION ) {
1764 WORD TMproto[SUBEXPSIZE];
1765 TMproto[0] = EXPRESSION;
1766 TMproto[1] = SUBEXPSIZE;
1769 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1770 AT.TMaddr = TMproto;
1772 if ( ( renumber = GetTable(num,&position,0) ) == 0 ) {
1773 MesCall(
"GetFirstBracket");
1776 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 ) {
1777 MesCall(
"GetFirstBracket");
1783 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1784 M_free(renumber->
symb.
lo,
"VarSpace");
1785 M_free(renumber,
"Renumber");
1791 oldonefile = AR.GetOneFile;
1792 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
1793 AR.GetOneFile = 2; fi = AR.hidefile;
1796 AR.GetOneFile = 0; fi = AR.infile;
1799 PUTZERO(oldposition);
1805 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
1807 position = AS.OldOnFile[num];
1808 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0
1809 || ( GetOneTerm(BHEAD term,fi,&position,1) < 0 ) ) {
1810 MLOCK(ErrorMessageLock);
1811 MesCall(
"GetFirstBracket");
1812 MUNLOCK(ErrorMessageLock);
1827 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
1829 AR.GetOneFile = oldonefile;
1831 AR.CompressPointer = oldcomppointer;
1833 tstop = term + *term; tstop -= ABS(tstop[-1]);
1835 while ( t < tstop ) {
1836 if ( *t == HAAKJE )
break;
1840 term[0] = 4; term[1] = 1; term[2] = 1; term[3] = 3;
1843 *t++ = 1; *t++ = 1; *t++ = 3; *term = t - term;
1847 term[0] = 4; term[1] = 1; term[2] = 1; term[3] = 3;
1872 WORD type, *oldcomppointer, oldonefile, numword;
1874 oldcomppointer = AR.CompressPointer;
1875 type = Expressions[num].status;
1876 if ( type == STOREDEXPRESSION ) {
1877 WORD TMproto[SUBEXPSIZE];
1878 TMproto[0] = EXPRESSION;
1879 TMproto[1] = SUBEXPSIZE;
1882 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
1883 AT.TMaddr = TMproto;
1885 if ( ( renumber = GetTable(num,&position,0) ) == 0 ) {
1886 MesCall(
"GetFirstTerm");
1889 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 ) {
1890 MesCall(
"GetFirstTerm");
1896 if ( renumber->
symb.
lo != AN.dummyrenumlist )
1897 M_free(renumber->
symb.
lo,
"VarSpace");
1898 M_free(renumber,
"Renumber");
1904 oldonefile = AR.GetOneFile;
1905 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
1906 AR.GetOneFile = 2; fi = AR.hidefile;
1910 if ( Expressions[num].replace == NEWLYDEFINEDEXPRESSION ) {
1914 if ( pre == 0 ) { fi = AR.outfile; }
1918 MesPrint(
"&isnumerical: expression is not yet defined!");
1925 if ( pre == 0 ) { fi = AR.infile; }
1929 else { fi = AR.outfile; }
1933 PUTZERO(oldposition);
1939 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
1941 position = AS.OldOnFile[num];
1942 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0
1943 || ( GetOneTerm(BHEAD term,fi,&position,1) < 0 ) ) {
1944 MLOCK(ErrorMessageLock);
1945 MesCall(
"GetFirstTerm");
1946 MUNLOCK(ErrorMessageLock);
1961 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
1963 AR.GetOneFile = oldonefile;
1965 AR.CompressPointer = oldcomppointer;
1974int GetContent(WORD *content,
int num)
1989 WORD type, *oldcomppointer, oldonefile, numword, *term, i;
1990 WORD *cbuffer = TermMalloc(
"GetContent");
1991 WORD *oldworkpointer = AT.WorkPointer;
1993 oldcomppointer = AR.CompressPointer;
1994 type = Expressions[num].status;
1995 if ( type == STOREDEXPRESSION ) {
1996 WORD TMproto[SUBEXPSIZE];
1997 TMproto[0] = EXPRESSION;
1998 TMproto[1] = SUBEXPSIZE;
2001 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
2002 AT.TMaddr = TMproto;
2004 if ( ( renumber = GetTable(num,&position,0) ) == 0 )
goto CalledFrom;
2005 if ( GetFromStore(cbuffer,&position,renumber,&numword,num) < 0 )
goto CalledFrom;
2007 term = oldworkpointer;
2008 AR.CompressPointer = oldcomppointer;
2009 if ( GetFromStore(term,&position,renumber,&numword,num) < 0 )
goto CalledFrom;
2010 if ( *term == 0 )
break;
2014 if ( ContentMerge(BHEAD cbuffer,term) < 0 )
goto CalledFrom;
2019 if ( renumber->
symb.
lo != AN.dummyrenumlist )
2020 M_free(renumber->
symb.
lo,
"VarSpace");
2021 M_free(renumber,
"Renumber");
2027 oldonefile = AR.GetOneFile;
2028 if ( type == HIDDENLEXPRESSION || type == HIDDENGEXPRESSION ) {
2029 AR.GetOneFile = 2; fi = AR.hidefile;
2033 if ( Expressions[num].replace == NEWLYDEFINEDEXPRESSION )
2035 else fi = AR.infile;
2038 PUTZERO(oldposition);
2044 SETBASEPOSITION(oldposition,fi->POfill-fi->PObuffer);
2046 position = AS.OldOnFile[num];
2047 if ( GetOneTerm(BHEAD cbuffer,fi,&position,1) < 0 )
goto CalledFrom;
2048 AR.CompressPointer = oldcomppointer;
2049 if ( GetOneTerm(BHEAD cbuffer,fi,&position,1) < 0 )
goto CalledFrom;
2058 term = oldworkpointer;
2059 AR.CompressPointer = oldcomppointer;
2060 if ( GetOneTerm(BHEAD term,fi,&position,1) < 0 )
goto CalledFrom;
2061 if ( *term == 0 )
break;
2065 if ( ContentMerge(BHEAD cbuffer,term) < 0 )
goto CalledFrom;
2068 fi->POfill = fi->PObuffer+BASEPOSITION(oldposition);
2070 AR.GetOneFile = oldonefile;
2072 AR.CompressPointer = oldcomppointer;
2073 for ( i = 0; i < *cbuffer; i++ ) content[i] = cbuffer[i];
2074 TermFree(cbuffer,
"GetContent");
2075 AT.WorkPointer = oldworkpointer;
2078 MLOCK(ErrorMessageLock);
2079 MesCall(
"GetContent");
2080 MUNLOCK(ErrorMessageLock);
2091int CleanupTerm(WORD *term)
2093 WORD *tstop, *t, *tfill, *tt;
2094 GETSTOP(term,tstop);
2096 while ( t < tstop ) {
2097 if ( *t >= FUNCTION && ( functions[*t-FUNCTION].commute || *t == DENOMINATOR ) ) {
2098 tfill = t; tt = t + t[1]; tstop = term + *term;
2099 while ( tt < tstop ) *tfill++ = *tt++;
2100 *term = tfill - term;
2101 tstop -= ABS(tfill[-1]);
2115WORD ContentMerge(PHEAD WORD *content, WORD *term)
2118 WORD *cstop, csize, crsize, sign = 1, numsize, densize, i, tnsize, tdsize;
2119 UWORD *num, *den, *tnum, *tden;
2120 WORD *outfill, *outb = TermMalloc(
"ContentMerge"), *ct;
2121 WORD *t, *tstop, tsize, trsize, *told;
2122 WORD *t1, *t2, *c1, *c2, i1, i2, *out1;
2123 WORD didsymbol = 0, diddotp = 0, tfirst;
2124 cstop = content + *content;
2126 if ( csize < 0 ) { sign = -sign; csize = -csize; }
2128 numsize = densize = crsize = (csize-1)/2;
2129 num = NumberMalloc(
"ContentMerge");
2130 den = NumberMalloc(
"ContentMerge");
2131 for ( i = 0; i < numsize; i++ ) num[i] = (UWORD)(cstop[i]);
2132 for ( i = 0; i < densize; i++ ) den[i] = (UWORD)(cstop[i+crsize]);
2133 while ( num[numsize-1] == 0 ) numsize--;
2134 while ( den[densize-1] == 0 ) densize--;
2138 tstop = term + *term;
2140 if ( tsize < 0 ) tsize = -tsize;
2142 tstop = tstop - tsize;
2143 tnsize = tdsize = trsize = (tsize-1)/2;
2144 tnum = (UWORD *)tstop; tden = (UWORD *)(tstop + trsize);
2145 while ( tnum[tnsize-1] == 0 ) tnsize--;
2146 while ( tden[tdsize-1] == 0 ) tdsize--;
2147 GcdLong(BHEAD num, numsize, tnum, tnsize, num, &numsize);
2148 if ( LcmLong(BHEAD den, densize, tden, tdsize, den, &densize) )
goto CalledFrom;
2152 while ( ct < cstop ) {
2157 while ( t < tstop && *t != *ct ) t += t[1];
2158 if ( t >= tstop )
break;
2159 t1 = t+2; t2 = t+t[1];
2160 c1 = ct+2; c2 = ct+ct[1];
2161 out1 = outfill; *outfill++ = *ct; outfill++;
2162 while ( c1 < c2 && t1 < t2 ) {
2164 if ( t1[1] <= c1[1] ) {
2165 *outfill++ = *t1++; *outfill++ = *t1++;
2169 *outfill++ = *c1++; *outfill++ = *c1++;
2173 else if ( *c1 < *t1 ) {
2175 *outfill++ = *c1++; *outfill++ = *c1++;
2181 *outfill++ = *t1++; *outfill++ = *t1++;
2187 if ( c1[1] < 0 ) { *outfill++ = c1[0]; *outfill++ = c1[1]; }
2191 if ( t1[1] < 0 ) { *outfill++ = t1[0]; *outfill++ = t1[1]; }
2194 out1[1] = outfill - out1;
2195 if ( out1[1] == 2 ) outfill = out1;
2200 while ( t < tstop && *t != *ct ) t += t[1];
2201 if ( t >= tstop )
break;
2202 t1 = t+2; t2 = t+t[1];
2203 c1 = ct+2; c2 = ct+ct[1];
2204 out1 = outfill; *outfill++ = *ct; outfill++;
2205 while ( c1 < c2 && t1 < t2 ) {
2206 if ( *c1 == *t1 && c1[1] == t1[1] ) {
2207 if ( t1[2] <= c1[2] ) {
2208 *outfill++ = *t1++; *outfill++ = *t1++; *outfill++ = *t1++;
2212 *outfill++ = *c1++; *outfill++ = *c1++; *outfill++ = *c1++;
2216 else if ( *c1 < *t1 || ( *c1 == *t1 && c1[1] < t1[1] ) ) {
2218 *outfill++ = *c1++; *outfill++ = *c1++; *outfill++ = *c1++;
2224 *outfill++ = *t1++; *outfill++ = *t1++; *outfill++ = *t1++;
2230 if ( c1[2] < 0 ) { *outfill++ = c1[0]; *outfill++ = c1[1]; *outfill++ = c1[1]; }
2234 if ( t1[2] < 0 ) { *outfill++ = t1[0]; *outfill++ = t1[1]; *outfill++ = t1[1]; }
2237 out1[1] = outfill - out1;
2238 if ( out1[1] == 2 ) outfill = out1;
2242 while ( t < tstop && *t != *ct ) t += t[1];
2243 if ( t >= tstop )
break;
2244 t1 = t+2; t2 = t+t[1];
2245 c1 = ct+2; c2 = ct+ct[1];
2246 out1 = outfill; *outfill++ = *ct; outfill++;
2247 while ( c1 < c2 && t1 < t2 ) {
2252 else if ( *c1 < *t1 ) { c1 += 1; }
2255 out1[1] = outfill - out1;
2256 if ( out1[1] == 2 ) outfill = out1;
2261 while ( t < tstop && *t != *ct ) t += t[1];
2262 if ( t >= tstop )
break;
2263 t1 = t+2; t2 = t+t[1];
2264 c1 = ct+2; c2 = ct+ct[1];
2265 out1 = outfill; *outfill++ = *ct; outfill++;
2266 while ( c1 < c2 && t1 < t2 ) {
2267 if ( *c1 == *t1 && c1[1] && t1[1] ) {
2268 *outfill++ = *c1++; *outfill++ = *c1++;
2271 else if ( *c1 < *t1 || ( *c1 == *t1 && c1[1] < t1[1] ) ) {
2278 out1[1] = outfill - out1;
2279 if ( out1[1] == 2 ) outfill = out1;
2285 while ( t < tstop ) {
2286 if ( *t != *ct ) { t += t[1];
continue; }
2287 if ( ct[1] != t[1] ) { t += t[1];
continue; }
2288 if ( ct[2] != t[2] ) { t += t[1];
continue; }
2289 t1 = t; t2 = ct; i1 = t1[1]; i2 = t2[1];
2291 if ( *t1 != *t2 )
break;
2294 if ( i1 != 0 ) { t += t[1];
continue; }
2296 for ( i = 0; i < i2; i++ ) { *outfill++ = *t++; }
2300 t1[2] |= SUBTERMUSED1;
2301 ct[2] |= SUBTERMUSED2;
2309 if ( diddotp == 0 ) {
2310 t = term+1;
while ( t < tstop && *t != DOTPRODUCT ) t += t[1];
2312 tfirst = 1; told = outfill;
2313 for ( i = 2; i < t[1]; i += 3 ) {
2315 if ( tfirst ) { *outfill++ = DOTPRODUCT; *outfill++ = 0; tfirst = 0; }
2316 *outfill++ = t[i]; *outfill++ = t[i+1]; *outfill++ = t[i+2];
2319 if ( outfill > told ) told[1] = outfill-told;
2322 if ( didsymbol == 0 ) {
2323 t = term+1;
while ( t < tstop && *t != SYMBOL ) t += t[1];
2325 tfirst = 1; told = outfill;
2326 for ( i = 2; i < t[1]; i += 2 ) {
2328 if ( tfirst ) { *outfill++ = SYMBOL; *outfill++ = 0; tfirst = 0; }
2329 *outfill++ = t[i]; *outfill++ = t[i+1];
2332 if ( outfill > told ) told[1] = outfill-told;
2338 if ( numsize < densize ) {
2339 for ( i = numsize; i < densize; i++ ) num[i] = 0;
2342 else if ( densize < numsize ) {
2343 for ( i = densize; i < numsize; i++ ) den[i] = 0;
2346 for ( i = 0; i < numsize; i++ ) *outfill++ = num[i];
2347 for ( i = 0; i < densize; i++ ) *outfill++ = den[i];
2348 csize = numsize+densize+1;
2349 if ( sign < 0 ) csize = -csize;
2351 *outb = outfill-outb;
2352 NumberFree(den,
"ContentMerge");
2353 NumberFree(num,
"ContentMerge");
2354 for ( i = 0; i < *outb; i++ ) content[i] = outb[i];
2355 TermFree(outb,
"ContentMerge");
2362 while ( t < tstop ) {
2363 if ( *t >= FUNCTION ) t[2] &= ~SUBTERMUSED1;
2368 MLOCK(ErrorMessageLock);
2369 MesCall(
"GetContent");
2370 MUNLOCK(ErrorMessageLock);
2379LONG TermsInExpression(WORD num)
2381 LONG x = Expressions[num].counter;
2382 if ( x >= 0 )
return(x);
2391LONG SizeOfExpression(WORD num)
2393 LONG x = (LONG)(DIVPOS(Expressions[num].size,
sizeof(WORD)));
2394 if ( x >= 0 )
return(x);
2403void UpdatePositions(
void)
2409 if ( NumExpressions > 0 &&
2410 ( AS.OldOnFile == 0 || AS.NumOldOnFile < NumExpressions ) ) {
2411 if ( AS.OldOnFile ) {
2413 AS.OldOnFile = (
POSITION *)Malloc1(NumExpressions*
sizeof(
POSITION),
"file pointers");
2414 for ( i = 0; i < AS.NumOldOnFile; i++ ) AS.OldOnFile[i] = old[i];
2415 AS.NumOldOnFile = NumExpressions;
2416 M_free(old,
"process file pointers");
2419 AS.OldOnFile = (
POSITION *)Malloc1(NumExpressions*
sizeof(
POSITION),
"file pointers");
2420 AS.NumOldOnFile = NumExpressions;
2423 if ( NumExpressions > 0 &&
2424 ( AS.OldNumFactors == 0 || AS.NumOldNumFactors < NumExpressions ) ) {
2425 if ( AS.OldNumFactors ) {
2426 oldw = AS.OldNumFactors;
2427 AS.OldNumFactors = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"numfactors pointers");
2428 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.OldNumFactors[i] = oldw[i];
2429 M_free(oldw,
"numfactors pointers");
2430 oldw = AS.Oldvflags;
2431 AS.Oldvflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"vflags pointers");
2432 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Oldvflags[i] = oldw[i];
2433 M_free(oldw,
"vflags pointers");
2434 oldw = AS.Olduflags;
2435 AS.Olduflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"uflags pointers");
2436 for ( i = 0; i < AS.NumOldNumFactors; i++ ) AS.Olduflags[i] = oldw[i];
2437 M_free(oldw,
"uflags pointers");
2438 AS.NumOldNumFactors = NumExpressions;
2441 AS.OldNumFactors = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"numfactors pointers");
2442 AS.Oldvflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"vflags pointers");
2443 AS.Olduflags = (WORD *)Malloc1(NumExpressions*
sizeof(WORD),
"uflags pointers");
2444 AS.NumOldNumFactors = NumExpressions;
2447 for ( i = 0; i < NumExpressions; i++ ) {
2448 AS.OldOnFile[i] = e[i].onfile;
2449 AS.OldNumFactors[i] = e[i].numfactors;
2450 AS.Oldvflags[i] = e[i].vflags;
2451 AS.Olduflags[i] = e[i].uflags;
2463LONG CountTerms1(PHEAD0)
2466 POSITION oldposition, startposition;
2467 WORD *t, *m, *mstop, decr, i, *oldwork, retval;
2468 WORD *oldipointer = AR.CompressPointer;
2469 WORD oldGetOneFile = AR.GetOneFile, olddeferflag = AR.DeferFlag;
2472 oldwork = AT.WorkPointer;
2473 AT.WorkPointer = (WORD *)(((UBYTE *)(AT.WorkPointer)) + AM.MaxTer);
2475 startposition = AR.DefPosition;
2479 if ( AR.infile->handle >= 0 ) {
2480 PUTZERO(oldposition);
2486 SETBASEPOSITION(oldposition,AR.infile->POfill-AR.infile->PObuffer);
2487 AR.infile->POfill = (WORD *)((UBYTE *)(AR.infile->PObuffer)
2488 +BASEPOSITION(startposition));
2493 t = m = AR.CompressBuffer;
2495 mstop = t - ABS(t[-1]);
2497 while ( *m != HAAKJE && m < mstop ) m += m[1];
2500 AR.DeferFlag = olddeferflag;
2501 AT.WorkPointer = oldwork;
2502 AR.GetOneFile = oldGetOneFile;
2506 decr = WORDDIF(mstop,AR.CompressBuffer)-1;
2508 m = AR.CompressBuffer;
2509 t = AR.CompressPointer;
2521 AR.CompressPointer = oldipointer;
2524 retval = GetOneTerm(BHEAD AT.WorkPointer,AR.infile,&startposition,0);
2525 if ( retval >= 0 ) AR.CompressPointer = oldipointer;
2526 if ( retval <= 0 )
break;
2527 t = AR.CompressPointer;
2528 if ( *t < (1 + decr + ABS(*(t+*t-1))) )
break;
2530 m = AR.CompressBuffer+1;
2531 while ( m < mstop ) {
2532 if ( *m != *t )
goto Thatsit;
2540 AT.WorkPointer = oldwork;
2541 if ( AR.infile->handle >= 0 ) {
2547 AR.infile->POfill = AR.infile->PObuffer + BASEPOSITION(oldposition);
2549 AR.DeferFlag = olddeferflag;
2550 AR.GetOneFile = oldGetOneFile;
2566#define CURRENTBRACKET 1
2567#define BRACKETCURRENTEXPR 2
2568#define BRACKETOTHEREXPR 3
2569#define NOBRACKETACTIVE 4
2571LONG TermsInBracket(PHEAD WORD *term, WORD level)
2573 WORD *t, *tstop, *b, *tt, *n1, *n2;
2574 int type = 0, i, num;
2576 WORD *bracketbuffer = AT.WorkPointer;
2577 t = term; GETSTOP(t,tstop);
2578 t++; b = bracketbuffer;
2579 while ( t < tstop ) {
2580 if ( *t != TERMSINBRACKET ) { t += t[1];
continue; }
2581 if ( t[1] == FUNHEAD || (
2583 && t[FUNHEAD] == -SNUMBER
2584 && t[FUNHEAD+1] == 0
2586 if ( AC.ComDefer == 0 ) {
2587 type = NOBRACKETACTIVE;
2590 type = CURRENTBRACKET;
2595 if ( t[FUNHEAD] == -EXPRESSION ) {
2596 if ( t[FUNHEAD+2] < 0 ) {
2597 if ( ( t[FUNHEAD+2] <= -FUNCTION ) && ( t[1] == FUNHEAD+3 ) ) {
2598 type = BRACKETOTHEREXPR;
2599 *b++ = FUNHEAD+4; *b++ = -t[FUNHEAD+2]; *b++ = FUNHEAD;
2600 for ( i = 2; i < FUNHEAD; i++ ) *b++ = 0;
2601 *b++ = 1; *b++ = 1; *b++ = 3;
2604 else if ( ( t[FUNHEAD+2] > -FUNCTION ) && ( t[1] == FUNHEAD+4 ) ) {
2605 type = BRACKETOTHEREXPR;
2609 *b++ = 8; *b++ = SYMBOL; *b++ = 4; *b++ = tt[1];
2610 *b++ = 1; *b++ = 1; *b++ = 1; *b++ = 3;
2614 *b++ = 4; *b++ = 1; *b++ = 1; *b++ = 3;
2616 else goto IllBraReq;
2624 else if ( ( t[FUNHEAD+2] == (t[1]-FUNHEAD-2) ) &&
2625 ( t[FUNHEAD+2+ARGHEAD] == (t[FUNHEAD+2]-ARGHEAD) ) ) {
2626 type = BRACKETOTHEREXPR;
2627 tt = t + FUNHEAD + ARGHEAD; num = *tt;
2628 for ( i = 0; i < num; i++ ) *b++ = *tt++;
2633 if ( t[FUNHEAD] < 0 ) {
2634 if ( ( t[FUNHEAD] <= -FUNCTION ) && ( t[1] == FUNHEAD+1 ) ) {
2635 type = BRACKETCURRENTEXPR;
2636 *b++ = FUNHEAD+4; *b++ = -t[FUNHEAD+2]; *b++ = FUNHEAD;
2637 for ( i = 2; i < FUNHEAD; i++ ) *b++ = 0;
2638 *b++ = 1; *b++ = 1; *b++ = 3; *b = 0;
2641 else if ( ( t[FUNHEAD] > -FUNCTION ) && ( t[1] == FUNHEAD+2 ) ) {
2642 type = BRACKETCURRENTEXPR;
2646 *b++ = 8; *b++ = SYMBOL; *b++ = 4; *b++ = tt[1];
2647 *b++ = 1; *b++ = 1; *b++ = 1; *b++ = 3;
2651 *b++ = 4; *b++ = 1; *b++ = 1; *b++ = 3;
2653 else goto IllBraReq;
2661 else if ( ( t[FUNHEAD] == (t[1]-FUNHEAD) ) &&
2662 ( t[FUNHEAD+ARGHEAD] == (t[FUNHEAD]-ARGHEAD) ) ) {
2663 type = BRACKETCURRENTEXPR;
2664 tt = t + FUNHEAD + ARGHEAD; num = *tt;
2665 for ( i = 0; i < num; i++ ) *b++ = *tt++;
2670 MLOCK(ErrorMessageLock);
2671 MesPrint(
"Illegal bracket request in termsinbracket_ function.");
2672 MUNLOCK(ErrorMessageLock);
2679 if ( AT.WorkPointer + *term +4 > AT.WorkTop ) {
2680 MLOCK(ErrorMessageLock);
2682 MesPrint(
"Called from termsinbracket_ function.");
2683 MUNLOCK(ErrorMessageLock);
2690 case CURRENTBRACKET:
2696 numterms = CountTerms1(BHEAD0);
2698 case BRACKETCURRENTEXPR:
2702 MLOCK(ErrorMessageLock);
2703 MesPrint(
"termsinbracket_ function currently only handles Keep Brackets.");
2704 MUNLOCK(ErrorMessageLock);
2706 case BRACKETOTHEREXPR:
2707 MLOCK(ErrorMessageLock);
2708 MesPrint(
"termsinbracket_ function currently only handles Keep Brackets.");
2709 MUNLOCK(ErrorMessageLock);
2711 case NOBRACKETACTIVE:
2718 n1 = term; n2 = AT.WorkPointer; tstop = n1 + *n1;
2719 while ( n1 < t ) *n2++ = *n1++;
2720 i = numterms >> BITSINWORD;
2722 *n2++ = LNUMBER; *n2++ = 4; *n2++ = 1; *n2++ = (WORD)(numterms & WORDMASK);
2725 *n2++ = LNUMBER; *n2++ = 5; *n2++ = 2;
2726 *n2++ = (WORD)(numterms & WORDMASK); *n2++ = i;
2729 while ( n1 < tstop ) *n2++ = *n1++;
2730 AT.WorkPointer[0] = n2 - AT.WorkPointer;
2731 AT.WorkPointer = n2;
2733 AT.WorkPointer = bracketbuffer;
2734 MLOCK(ErrorMessageLock);
2735 MesPrint(
"Called from termsinbracket_ function.");
2736 MUNLOCK(ErrorMessageLock);
2742 AT.WorkPointer = bracketbuffer;
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)