51 if ( AR.outfile->handle >= 0 ) {
52 SeekFile(AR.outfile->handle,&(AR.outfile->filesize),SEEK_SET);
53 AR.outfile->POposition = AR.outfile->filesize;
54 AR.outfile->POfill = AR.outfile->PObuffer;
65 *pos = fi->POposition;
66 ADDPOS(*pos,(TOLONG(fi->POfill)-TOLONG(fi->PObuffer)));
77 SETBASEPOSITION(*position,(f->POfull-f->PObuffer)*
sizeof(WORD));
79 else *position = f->filesize;
80 SetScratch(f,position);
91 SETBASEPOSITION(*position,(f->POfull-f->PObuffer)*
sizeof(WORD));
92 f->POfill = f->POfull;
98 SeekFile(f->
handle,&possize,SEEK_END);
99 MesPrint(
"SetEndHScratch: filesize(th) = %12p, filesize(ex) = %12p",&(f->filesize),
102 *position = f->filesize;
103 f->POposition = f->filesize;
104 f->POfill = f->POfull = f->PObuffer;
118 LONG size, *whichInInBuf;
119 if ( f == AR.hidefile ) whichInInBuf = &(AR.InHiBuf);
120 else whichInInBuf = &(AR.InInBuf);
122 if ( f == AR.hidefile ) MesPrint(
"In the hide file: %s", f->name);
123 else MesPrint(
"In the input file: %s", f->name);
124 MesPrint(
"SetScratch to position %15p",position);
125 MesPrint(
"POposition = %15p, full = %l, fill = %l"
126 ,&(f->POposition),(f->POfull-f->PObuffer)*
sizeof(WORD)
127 ,(f->POfill-f->PObuffer)*
sizeof(WORD));
129 if ( ISLESSPOS(*position,f->POposition) ||
130 ISGEPOSINC(*position,f->POposition,(f->POfull-f->PObuffer)*
sizeof(WORD)) ) {
132 if ( ISEQUALPOSINC(*position,f->POposition,
133 (f->POfull-f->PObuffer)*
sizeof(WORD)) )
goto endpos;
135 MesPrint(
"!>Illegal position in SetScratch");
141 SeekFile(f->
handle,&possize,SEEK_SET);
142 if ( ISNOTEQUALPOS(possize,*position) ) {
144 UNLOCK(AS.inputslock);
145 MesPrint(
"!>Cannot position file in SetScratch");
150 MesPrint(
"SetScratch1(%w): position = %12p, size = %l, address = %x",position,f->POsize,f->PObuffer);
152 if ( ( size = ReadFile(f->
handle,(UBYTE *)(f->PObuffer),f->POsize) ) < 0
153 || ( size & 1 ) != 0 ) {
155 UNLOCK(AS.inputslock);
156 MesPrint(
"!>Read error in SetScratch");
160 UNLOCK(AS.inputslock);
164 f->POfill = f->PObuffer;
165 f->POposition = *position;
167 *whichInInBuf = size >> 1;
169 *whichInInBuf = size / TABLESIZE(WORD,UBYTE);
171 f->POfull = f->PObuffer + *whichInInBuf;
173 MesPrint(
"SetScratch2: size = %l, InInBuf = %l, fill = %l, full = %l"
174 ,size,*whichInInBuf,(f->POfill-f->PObuffer)*
sizeof(WORD)
175 ,(f->POfull-f->PObuffer)*
sizeof(WORD));
180 DIFPOS(possize,*position,f->POposition);
181 f->POfill = (WORD *)(BASEPOSITION(possize)+(UBYTE *)(f->PObuffer));
182 *whichInInBuf = f->POfull-f->POfill;
195int RevertScratch(
void)
199 if ( AR.infile->handle >= 0 && AR.infile->handle != AR.outfile->handle ) {
200 CloseFile(AR.infile->handle);
201 AR.infile->handle = -1;
202 remove(AR.infile->name);
204 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
205 AR.infile->POfull = AR.infile->POfill;
206 AR.infile->POfill = AR.infile->PObuffer;
207 if ( AR.infile->handle >= 0 ) {
210 SeekFile(AR.infile->handle,&scrpos,SEEK_SET);
211 if ( ISNOTZEROPOS(scrpos) ) {
213 return(MesPrint(
"!>Error with scratch output."));
216 if ( ( AR.InInBuf = ReadFile(AR.infile->handle,(UBYTE *)(AR.infile->PObuffer)
217 ,AR.infile->POsize) ) < 0 || AR.InInBuf & 1 ) {
219 return(MesPrint(
"!>Error while reading from scratch file"));
223 AR.InInBuf /= TABLESIZE(WORD,UBYTE);
225 AR.infile->POfull = AR.infile->PObuffer + AR.InInBuf;
227 PUTZERO(AR.infile->POposition);
228 AR.outfile->POfill = AR.outfile->POfull = AR.outfile->PObuffer;
229 PUTZERO(AR.outfile->POposition);
230 PUTZERO(AR.outfile->filesize);
244int ResetScratch(
void)
248 if ( AR.infile->handle >= 0 ) {
249 CloseFile(AR.infile->handle); AR.infile->handle = -1;
250 remove(AR.infile->name);
251 PUTZERO(AR.infile->POposition);
252 AR.infile->POfill = AR.infile->POfull = AR.infile->PObuffer;
254 if ( AR.outfile->handle >= 0 ) {
257 SeekFile(AR.outfile->handle,&scrpos,SEEK_SET);
258 if ( ISNOTZEROPOS(scrpos) ) {
260 return(MesPrint(
"!>Error with scratch output."));
263 if ( ( AR.InInBuf = ReadFile(AR.outfile->handle,(UBYTE *)(AR.outfile->PObuffer)
264 ,AR.outfile->POsize) ) < 0 || AR.InInBuf & 1 ) {
266 return(MesPrint(
"!>Error while reading from scratch file"));
269 else AR.InInBuf /= TABLESIZE(WORD,UBYTE);
270 AR.outfile->POfull = AR.outfile->PObuffer + AR.InInBuf;
272 else AR.outfile->POfull = AR.outfile->POfill;
273 AR.outfile->POfill = AR.outfile->PObuffer;
274 PUTZERO(AR.outfile->POposition);
275 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
289 LONG l = BASEPOSITION(*length);
291 memcpy(buffer,fi->POfill,l);
294 SeekFile(fi->
handle,pos,SEEK_SET);
295 if ( ReadFile(fi->
handle,buffer,l) != l ) {
297 if ( fi == AR.hidefile )
298 MesPrint(
"!>Error reading from hide file.");
300 MesPrint(
"!>Error reading from scratch file.");
319 LONG l = BASEPOSITION(*length), avail;
321 fi->POfill = fi->POfull;
322 while ( fi->POfill+l/
sizeof(WORD) > fi->POstop ) {
323 avail = (fi->POstop-fi->POfill)*
sizeof(WORD);
325 memcpy(fi->POfill,buffer,avail);
326 l -= avail; buffer += avail;
329 if ( ( fi->
handle = (WORD)CreateFile(fi->name) ) < 0 ) {
330 if ( fi == AR.hidefile )
331 MesPrint(
"Cannot create hide file %s",fi->name);
333 MesPrint(
"Cannot create scratch file %s",fi->name);
336 PUTZERO(fi->POposition);
338 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
339 if ( WriteFile(fi->
handle,(UBYTE *)fi->PObuffer,fi->POsize) != fi->POsize )
341 ADDPOS(fi->POposition,fi->POsize);
342 fi->POfill = fi->POfull = fi->PObuffer;
345 memcpy(fi->POfill,buffer,l);
346 fi->POfill += l/
sizeof(WORD);
347 fi->POfull = fi->POfill;
349 if ( withflush && fi->
handle >= 0 && fi->POfill > fi->PObuffer ) {
350 l = (LONG)fi->POfill - (LONG)fi->PObuffer;
351 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
352 if ( WriteFile(fi->
handle,(UBYTE *)fi->PObuffer,l) != l )
goto writeerror;
353 ADDPOS(fi->POposition,fi->POsize);
354 fi->POfill = fi->POfull = fi->PObuffer;
356 if ( withflush && fi->
handle >= 0 )
357 SETBASEPOSITION(fi->filesize,TellFile(fi->
handle));
360 if ( fi == AR.hidefile )
361 MesPrint(
"Error writing to hide file. Disk full?");
363 MesPrint(
"Error writing to scratch file. Disk full?");
378int CoSave(UBYTE *inp)
383 WORD error = 0, type, number;
384 WORD exprInStorageFlag = 0;
385 LONG RetCode = 0, wSize;
389 WORD TMproto[SUBEXPSIZE];
391 int ii, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
393 while ( *inp ==
',' ) inp++;
397 if( PF.me != MASTER)
return(0);
400 if ( !*p )
return(MesPrint(
"No filename in save statement"));
401 if ( FG.cTable[*p] > 1 && ( *p !=
'.' ) && ( *p != SEPARATOR ) && ( *p != ALTSEPARATOR ) )
402 return(MesPrint(
"Illegal filename"));
403 while ( *++p && *p !=
',' ) {}
406 if ( !AP.preError ) {
407 if ( ( RetCode = CreateFile((
char *)inp) ) < 0 ) {
408 return(MesPrint(
"Cannot open file %s",inp));
411 AO.SaveData.Handle = (WORD)RetCode;
420 if (
WriteStoreHeader(AO.SaveData.Handle) )
return(MesPrint(
"Error writing storage file header"));
423 lo = (LONG *)(&AO.SaveData.Index);
424 for ( ii = 0; ii < j; ii++ ) *lo++ = 0;
425 SETBASEPOSITION(AO.SaveData.Position,(LONG)
sizeof(
STOREHEADER));
426 ind = AO.SaveData.Index.expression;
427 if ( !AP.preError && WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
429 SeekFile(AO.SaveData.Handle,&(filesize),SEEK_END);
433 if ( !FG.cTable[*p] || *p ==
'[' ) {
435 if ( p == 0 )
return(-1);
438 if ( GetVar(inp,&type,&number,CEXPRESSION,NOAUTO) != NAMENOTFOUND ) {
439 if ( e[number].status == STOREDEXPRESSION ) {
440 if ( StrLen(AC.exprnames->namebuffer+e[number].name) > MAXENAME ) {
442 snprintf(msg,
sizeof(msg),
"saved expr name over %d char: %s", MAXENAME, AC.exprnames->namebuffer+e[number].name);
450 if ( AP.preError )
goto NextExpr;
451 TMproto[0] = EXPRESSION;
452 TMproto[1] = SUBEXPSIZE;
455 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
457 if ( ( indold = FindInIndex(number,&AR.StoreData,0,0) ) != 0 ) {
462 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_END);
463 scrpos = AO.SaveData.Position;
464 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
465 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
466 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
470 AO.SaveData.Position = AO.SaveData.Index.next;
471 lo = (LONG *)(&AO.SaveData.Index);
472 for ( ii = 0; ii < j; ii++ ) *lo++ = 0;
473 ind = AO.SaveData.Index.expression;
474 scrpos = AO.SaveData.Position;
475 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
476 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
477 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
480 ADDPOS(filesize,
sizeof(
struct FiLeInDeX));
489 SeekFile(AR.StoreData.Handle,&(indold->
variables),SEEK_SET);
490 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
493 ADD2POS(filesize,scrpos);
494 SETBASEPOSITION(scrpos1,wSize);
496 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
497 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize)
500 MesPrint(
"!>ReadError");
505 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize)
506 != wSize )
goto SavWrt;
507 ADDPOS(scrpos,-wSize);
508 }
while ( ISPOSPOS(scrpos) );
509 ADDPOS(AO.SaveData.Index.number,1);
516 MesPrint(
"%s is not a stored expression",inp);
522 MesPrint(
"%s is not an expression",inp);
526 if ( c !=
',' && c ) {
527 MesComp(
"Illegal character",inp,p);
534 if ( !AP.preError ) {
535 scrpos = AO.SaveData.Position;
536 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
537 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
540 WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
543 else if ( !AP.preError ) {
546 if ( StrLen(AC.exprnames->namebuffer+e->name) > MAXENAME ) {
548 snprintf(msg,
sizeof(msg),
"saved expr name over %d char: %s", MAXENAME, AC.exprnames->namebuffer+e->name);
551 if ( e->status == STOREDEXPRESSION ) exprInStorageFlag = 1;
553 }
while ( --n > 0 ); }
554 if ( exprInStorageFlag ) {
555 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
557 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
558 scrpos = AR.StoreData.Fill;
559 SETBASEPOSITION(scrpos1,wSize);
561 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
562 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize) != wSize ) {
564 MesPrint(
"!>ReadError");
569 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize) != wSize )
571 ADDPOS(scrpos,-wSize);
572 }
while ( ISPOSPOS(scrpos) );
576 if ( !AP.preError ) {
577 CloseFile(AO.SaveData.Handle);
578 AO.SaveData.Handle = -1;
583 MesPrint(
"!>WriteError");
594int CoLoad(UBYTE *inp)
600 WORD num, i, error = 0;
601 WORD type, number, silentload = 0;
602 WORD TMproto[SUBEXPSIZE];
604 while ( *inp ==
',' ) inp++;
606 if ( ( *p ==
',' && p[1] ==
'-' ) || *p ==
'-' ) {
607 if ( *p ==
',' ) p++;
609 if ( *p ==
's' || *p ==
'S' ) {
611 while ( *p && ( *p !=
',' && *p !=
'-' && *p !=
'+'
612 && *p != SEPARATOR && *p != ALTSEPARATOR && *p !=
'.' ) ) p++;
614 else if ( *p !=
',' ) {
615 return(MesPrint(
"Illegal option in Load statement"));
617 while ( *p ==
',' ) p++;
620 if ( !*p )
return(MesPrint(
"No filename in load statement"));
621 if ( FG.cTable[*p] > 1 && ( *p !=
'.' ) && ( *p != SEPARATOR ) && ( *p != ALTSEPARATOR ) )
622 return(MesPrint(
"Illegal filename"));
623 while ( *++p && *p !=
',' ) {}
626 if ( ( RetCode = OpenFile((
char *)inp) ) < 0 ) {
627 return(MesPrint(
"Cannot open file %s",inp));
635 AO.SaveData.Handle = (WORD)(RetCode);
637#ifdef SYSDEPENDENTSAVE
638 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index)),
642 TELLFILE(AO.SaveData.Handle,&firstposition);
650 if ( !FG.cTable[*p] || *p ==
'[' ) {
652 if ( p == 0 )
return(-1);
655 if ( GetVar(inp,&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
656 MesPrint(
"Conflicting name: %s",inp);
660 if ( ( num = EntVar(CEXPRESSION,inp,STOREDEXPRESSION,0,0,0) ) >= 0 ) {
661 TMproto[0] = EXPRESSION;
662 TMproto[1] = SUBEXPSIZE;
665 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
667 SeekFile(AO.SaveData.Handle,&firstposition,SEEK_SET);
668 AO.SaveData.Position = firstposition;
670 if ( ( ind = FindInIndex(num,&AO.SaveData,1,0) ) != 0 ) {
672 if ( PutInStore(ind,num) ) error = -1;
673 else if ( !AM.silent && silentload == 0 )
674 MesPrint(
" %s loaded",ind->name);
679 Expressions[num].counter = -1;
682 MesPrint(
" %s not found",inp);
689 if ( c !=
',' && c ) {
690 MesComp(
"Illegal character",inp,p);
697 scrpos = AR.StoreData.Position;
698 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
699 if ( ISNOTEQUALPOS(scrpos,AR.StoreData.Position) )
goto LoadWrt;
700 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(AR.StoreData.Index))
704 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
705 ind = AO.SaveData.Index.expression;
706#ifdef SYSDEPENDENTSAVE
708 if ( GetVar((UBYTE *)(ind->name),&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
709 MesPrint(
"Conflicting name: %s",ind->name);
713 if ( ( num = EntVar(CEXPRESSION,(UBYTE *)(ind->name),STOREDEXPRESSION,0,0,0) ) >= 0 ) {
715 if ( PutInStore(ind,num) ) error = -1;
716 else if ( !AM.silent && silentload == 0 )
717 MesPrint(
" %s loaded",ind->name);
723 if ( i == 0 && ISNOTZEROPOS(AO.SaveData.Index.next) ) {
724 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_SET);
725 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index)),
727 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
728 ind = AO.SaveData.Index.expression;
735 if ( GetVar((UBYTE *)(ind->name),&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
736 MesPrint(
"Conflicting name: %s",ind->name);
740 if ( ( num = EntVar(CEXPRESSION,(UBYTE *)(ind->name),STOREDEXPRESSION,0,0,0) ) >= 0 ) {
742 if ( PutInStore(ind,num) ) error = -1;
743 else if ( !AM.silent && silentload == 0 )
744 MesPrint(
" %s loaded",ind->name);
750 if ( i == 0 && (ISNOTZEROPOS(AO.SaveData.Index.next) || AO.bufferedInd) ) {
751 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_SET);
753 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
754 ind = AO.SaveData.Index.expression;
762#ifndef SYSDEPENDENTSAVE
763 if ( AO.powerFlag ) {
764 MesPrint(
"WARNING: min-/maxpower had to be adjusted!");
766 if ( AO.resizeFlag ) {
767 MesPrint(
"ERROR: could not downsize data!");
771 CloseFile(AO.SaveData.Handle);
772 AO.SaveData.Handle = -1;
773 SeekFile(AR.StoreData.Handle,&(AC.StoreFileSize),SEEK_END);
777 MesPrint(
"!>WriteError");
783 MesPrint(
"!>ReadError");
798int DeleteStore(WORD par)
805 if ( AR.StoreData.Handle >= 0 ) {
809 e_in = e_out = Expressions;
811 if ( e_in->status == STOREDEXPRESSION ) {
813 AC.exprnames->namebuffer+e_in->name);
814 node->type = CDELETE;
818 if ( e_out != e_in ) {
820 node = GetNode(AC.exprnames,
821 AC.exprnames->namebuffer+e_in->name);
822 node->number = (WORD)(e_out - Expressions);
823 e_out->onfile = e_in->onfile;
824 e_out->prototype = e_in->prototype;
825 e_out->printflag = 0;
826 e_out->status = e_in->status;
827 e_out->name = e_in->name;
828 e_out->inmem = e_in->inmem;
829 e_out->counter = e_in->counter;
830 e_out->numfactors = e_in->numfactors;
831 e_out->numdummies = e_in->numdummies;
832 e_out->compression = e_in->compression;
833 e_out->namesize = e_in->namesize;
834 e_out->whichbuffer = e_in->whichbuffer;
835 e_out->hidelevel = e_in->hidelevel;
836 e_out->node = e_in->node;
837 e_out->replace = e_in->replace;
838 e_out->vflags = e_in->vflags;
839 e_out->uflags = e_in->uflags;
841 e_out->partodo = e_in->partodo;
848 }
while ( --n > 0 ); }
850 if ( DidClean ) CompactifyTree(AC.exprnames,EXPRNAMES);
852 AR.StoreData.Handle = -1;
853 CloseFile(AC.StoreHandle);
862 SETBASEPOSITION(st->position,-1);
863 SETBASEPOSITION(st->toppos,-1);
867 for ( j = 1; j < AM.totalnumberofthreads; j++ ) {
870 SETBASEPOSITION(st->position,-1);
871 SETBASEPOSITION(st->toppos,-1);
877 PUTZERO(AC.StoreFileSize);
878 s = FG.fname;
while ( *s ) s++;
880 *s =
';'; s[1] =
'*'; s[2] = 0;
884 return(AC.StoreHandle = CreateFile(FG.fname));
904#ifndef SYSDEPENDENTSAVE
909 newind = NextFileIndex(&(Expressions[num].onfile));
911#ifndef SYSDEPENDENTSAVE
912 SETBASEPOSITION(newind->length, 0);
914 newind->variables = AR.StoreData.Fill;
915 SeekFile(AR.StoreData.Handle,&(newind->variables),SEEK_SET);
916 if ( ISNOTEQUALPOS(newind->variables,AR.StoreData.Fill) )
goto PutErrS;
917 newind->position = newind->variables;
918#ifdef SYSDEPENDENTSAVE
923 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
924 if ( ISNOTEQUALPOS(scrpos,ind->
variables) )
goto PutErrS;
926 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
927#ifdef SYSDEPENDENTSAVE
930 ADD2POS(AR.StoreData.Fill,scrpos);
932 SETBASEPOSITION(scrpos1,wSize);
933#ifndef SYSDEPENDENTSAVE
936 AO.tensorList = (UBYTE *)Malloc1(MAXSAVEFUNCTION,
"PutInStore");
942 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
943 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
946 (UBYTE *)AT.WorkPointer, (UBYTE *)AT.WorkTop, &wSize, &wSizeOut, ind, &stage) ) {
949 if ( WriteFile(AR.StoreData.Handle, (UBYTE *)AT.WorkPointer, wSizeOut)
950 != wSizeOut )
goto PutErrS;
951 ADDPOS(scrpos,-wSize);
952 ADDPOS(newind->position, wSizeOut);
953 ADDPOS(AR.StoreData.Fill, wSizeOut);
954 }
while ( ISPOSPOS(scrpos) );
956 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
960 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
961 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
962#ifdef SYSDEPENDENTSAVE
963 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize)
964 != wSize )
goto PutErrS;
965 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize)
966 != wSize )
goto PutErrS;
967 ADDPOS(scrpos,-wSize);
971 if (
ReadSaveExpression((UBYTE *)AT.WorkPointer, (UBYTE *)AT.WorkTop, &wSize, &wSizeOut) ) {
975 if ( WriteFile(AR.StoreData.Handle, (UBYTE *)AT.WorkPointer, wSizeOut)
976 != wSizeOut )
goto PutErrS;
977 ADDPOS(scrpos,-wSize);
978 ADDPOS(AR.StoreData.Fill, wSizeOut);
979 ADDPOS(newind->length, wSizeOut);
981 }
while ( ISPOSPOS(scrpos) );
984 M_free(AO.tensorList,
"PutInStore");
986 scrpos = AR.StoreData.Position;
987 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
988 if ( ISNOTEQUALPOS(scrpos,AR.StoreData.Position) )
goto PutErrS;
989 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)
sizeof(
FILEINDEX))
993 return(MesPrint(
"!>File error"));
1020WORD GetTerm(PHEAD WORD *term)
1023 WORD *inp, i, j = 0, len;
1024 LONG InIn, *whichInInBuf;
1025 WORD *r, *m, *mstop = 0, minsiz = 0, *bra = 0, *from;
1026 WORD first, *start = 0, testing = 0;
1028 AN.deferskipped = 0;
1029 if ( AR.GetFile == 2 ) {
1031 whichInInBuf = &(AR.InHiBuf);
1035 whichInInBuf = &(AR.InInBuf);
1037 InIn = *whichInInBuf;
1039 if ( AR.KeptInHold ) {
1040 r = AR.CompressBuffer;
1043 if ( i <= 0 ) { *term = 0;
goto RegRet; }
1048 if ( AR.DeferFlag ) {
1049 m = AR.CompressBuffer;
1052 mstop -= ABS(mstop[-1]);
1054 while ( m < mstop ) {
1055 if ( *m == HAAKJE ) {
1058 bra = (WORD *)(((UBYTE *)(term)) + 2*AM.MaxTer);
1059 m = AR.CompressBuffer+1;
1061 while ( m < mstop ) *r++ = *m++;
1063 minsiz = WORDDIF(mstop,bra);
1072 bra = (WORD *)(((UBYTE *)(term)) + 2*AM.MaxTer);
1080 r = AR.CompressBuffer;
1083 ADDPOS(fi->POposition,(fi->POfull-fi->PObuffer)*
sizeof(WORD));
1084 LOCK(AS.inputslock);
1085 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1086 InIn = ReadFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize);
1087 UNLOCK(AS.inputslock);
1088 if ( ( InIn < 0 ) || ( InIn & 1 ) ) {
1094 InIn /= TABLESIZE(WORD,UBYTE);
1096 *whichInInBuf = InIn;
1097 if ( !InIn ) { *r = 0; *from = 0;
goto RegRet; }
1098 fi->POfill = fi->PObuffer;
1099 fi->POfull = fi->PObuffer + InIn;
1102 if ( ( len = i = *inp ) == 0 ) {
1115 while ( ++i <= 0 ) *term++ = *r++;
1120 *(AR.CompressBuffer) = len = *start;
1133 while ( --i >= 0 ) {
1134 *r++ = *term++ = *inp++;
1138 ADDPOS(fi->POposition,(fi->POfull-fi->PObuffer)*
sizeof(WORD));
1139 LOCK(AS.inputslock);
1140 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1141 InIn = ReadFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize);
1142 UNLOCK(AS.inputslock);
1143 if ( ( InIn <= 0 ) || ( InIn & 1 ) ) {
1149 InIn /= TABLESIZE(WORD,UBYTE);
1152 fi->POfull = inp + InIn;
1158 *(AR.CompressBuffer) = len = *start;
1161 while ( --j >= 0 ) { *r++ = *term++ = *inp++; }
1164 *whichInInBuf = InIn;
1165 AR.DefPosition = fi->POposition;
1166 ADDPOS(AR.DefPosition,((UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer)));
1170 if ( inp >= fi->POfull ) { *from = 0;
goto RegRet; }
1174 *term++ = *r++ = len = - j + 1 + *inp;
1175 while ( ++j <= 0 ) *term++ = *r++;
1178 else if ( !j ) j = 1;
1179 while ( --j >= 0 ) { *r++ = *term++ = *inp++; }
1182 SETBASEPOSITION(AR.DefPosition,((UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer)));
1183 if ( inp > fi->POfull ) {
1187 if ( r >= AR.ComprTop ) {
1188 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1191 AR.CompressPointer = r; *r = 0;
1196 if ( testing && *from != 0 ) {
1199 jj = *r - 1 - ABS(*(r+*r-1));
1200 if ( jj < minsiz )
goto strip;
1203 while ( m < mstop ) {
1207 mstop = m - ABS(m[-1]);
1209 while ( r < mstop ) {
1210 if ( *r == HAAKJE ) {
1214 len = WORDDIF(r,from);
1236 if ( ( AP.PreDebug & DUMPINTERMS ) == DUMPINTERMS ) {
1237 MLOCK(ErrorMessageLock);
1238 AO.OutFill = AO.OutputLine = OutBuf;
1243 TokenToLine((UBYTE *)(
"Input: "));
1245 TokenToLine((UBYTE *)
"zero");
1248 TokenToLine((UBYTE *)
"negative!!");
1251 while ( --i >= 0 ) {
1252 TalToLine((UWORD)(*r++)); TokenToLine((UBYTE *)
" ");
1256 MUNLOCK(ErrorMessageLock);
1265 MesPrint(
"!>Error while reading scratch file in GetTerm");
1302 WORD *r, *rr = AR.CompressPointer;
1317 if ( AT.identity > 0 ) par = 1;
1327 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,1L,pos);
1330 LOCK(AS.inputslock);
1331 SeekFile(fi->
handle,pos,SEEK_SET);
1332 siz = ReadFile(fi->
handle,(UBYTE *)term,
sizeof(WORD));
1333 UNLOCK(AS.inputslock);
1336 if ( siz ==
sizeof(WORD) ) {
1339 if ( ( i > AM.MaxTer/((WORD)
sizeof(WORD)) ) || ( -i >= AM.MaxTer/((WORD)
sizeof(WORD)) ) )
1347 while ( ++i <= 0 ) *term++ = *r++;
1349 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,1L,pos);
1352 LOCK(AS.inputslock);
1353 SeekFile(fi->
handle,pos,SEEK_SET);
1354 siz = ReadFile(fi->
handle,(UBYTE *)term,
sizeof(WORD));
1355 UNLOCK(AS.inputslock);
1356 ADDPOS(*pos,
sizeof(WORD));
1358 if ( siz !=
sizeof(WORD) ) {
1364 if ( ( j > AM.MaxTer/((WORD)
sizeof(WORD)) ) || ( j <= 0 ) )
1372 if ( !j )
return(0);
1378 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,j,pos);
1379 j *= TABLESIZE(WORD,UBYTE);
1382 j *= TABLESIZE(WORD,UBYTE);
1383 LOCK(AS.inputslock);
1384 SeekFile(fi->
handle,pos,SEEK_SET);
1385 siz = ReadFile(fi->
handle,(UBYTE *)term,j);
1386 UNLOCK(AS.inputslock);
1393 while ( --i >= 0 ) *r++ = *term++;
1394 if ( r >= AR.ComprTop ) {
1395 MLOCK(ErrorMessageLock);
1396 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1397 MUNLOCK(ErrorMessageLock);
1400 AR.CompressPointer = r; *r = 0;
1409 fi->POfill = (WORD *)((UBYTE *)(fi->PObuffer) + BASEPOSITION(*pos));
1411 if ( p >= fi->POfull ) { *term = 0;
return(0); }
1415 j = *r++ = *term++ = -i + 1 + *p;
1416 while ( ++i <= 0 ) *term++ = *r++;
1419 if ( i == 0 ) { i = 1; *r++ = 0; *term++ = 0; }
1420 else {
while ( --i >= 0 ) { *r++ = *term++ = *p++; } }
1422 SETBASEPOSITION(*pos,(UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer));
1423 if ( p <= fi->POfull ) {
1424 if ( r >= AR.ComprTop ) {
1425 MLOCK(ErrorMessageLock);
1426 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1427 MUNLOCK(ErrorMessageLock);
1430 AR.CompressPointer = r; *r = 0;
1437 MLOCK(ErrorMessageLock);
1438 MesPrint(
"!>Error while reading scratch file in GetOneTerm (%d)",error);
1439 MUNLOCK(ErrorMessageLock);
1457WORD GetMoreTerms(WORD *term)
1460 WORD *t, *r, *m, *h, *tstop, i, inc, same;
1466 extra = ((AM.MaxTer/
sizeof(WORD))*((LONG)100-AC.CollectPercentage))/100;
1467 if ( extra < 23 ) extra = 23;
1472 tstop = t - ABS(t[-1]);
1474 while ( *h != HAAKJE && h < tstop ) h += h[1];
1475 if ( h >= tstop )
return(retval);
1476 inc = FUNHEAD+ARGHEAD+1-h[1];
1477 same = WORDDIF(h,term) + h[1] - 1;
1480 while ( t > tstop ) *--r = *--t;
1483 while ( GetTerm(BHEAD m) > 0 ) {
1486 if ( same > ( i = ( *m - ABS(*t) -1 ) ) ) {
1487 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1492 while ( --i >= 0 ) {
1494 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1499 if ( ( WORDDIF(m,term) + i + extra ) > (WORD)(AM.MaxTer/
sizeof(WORD)) ) {
1501 if ( AS.CollectOverFlag == 0 && AC.AltCollectFun == 0 ) {
1502 Warning(
"Bracket contents too long in Collect statement");
1503 Warning(
"Contents spread over more than one term");
1504 Warning(
"If possible: increase MaxTermSize in setfile");
1505 AS.CollectOverFlag = 1;
1507 else if ( AC.AltCollectFun ) {
1508 AS.CollectOverFlag = 2;
1515 while ( r < tstop ) *m++ = *r++;
1517 if ( extra == 23 ) extra = ((AM.MaxTer/
sizeof(WORD))/6);
1520 h[1] = WORDDIF(m,h);
1521 if ( AS.CollectOverFlag > 1 ) {
1522 *h = AC.AltCollectFun;
1523 if ( AS.CollectOverFlag == 3 ) AS.CollectOverFlag = 1;
1525 else *h = AC.CollectFun;
1527 h[FUNHEAD] = h[1] - FUNHEAD;
1529 if ( ToFast(h+FUNHEAD,h+FUNHEAD) ) {
1530 if ( h[FUNHEAD] <= -FUNCTION ) {
1542 *term = WORDDIF(m,term);
1553int GetMoreFromMem(WORD *term, WORD **tpoin)
1556 WORD *t, *r, *m, *h, *tstop, i, j, inc, same;
1562 tstop = t - ABS(t[-1]);
1564 while ( *h != HAAKJE && h < tstop ) h += h[1];
1565 if ( h >= tstop )
return(0);
1566 inc = FUNHEAD+ARGHEAD+1-h[1];
1567 same = WORDDIF(h,term) + h[1] - 1;
1570 while ( t > tstop ) *--r = *--t;
1575 for ( i = 0; i < j; i++ ) m[i] = *r++;
1579 if ( same > ( i = ( *m - ABS(*t) -1 ) ) ) {
1580 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1585 while ( --i >= 0 ) {
1587 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1592 if ( ( WORDDIF(m,term) + i + extra ) > (LONG)(AM.MaxTer/(2*
sizeof(WORD))) ) {
1594 if ( AS.CollectOverFlag == 0 && AC.AltCollectFun == 0 ) {
1595 Warning(
"Bracket contents too long in Collect statement");
1596 Warning(
"Contents spread over more than one term");
1597 Warning(
"If possible: increase MaxTermSize in setfile");
1598 AS.CollectOverFlag = 1;
1600 else if ( AC.AltCollectFun ) {
1601 AS.CollectOverFlag = 2;
1608 while ( r < tstop ) *m++ = *r++;
1609 if ( extra == 23 ) extra = ((AM.MaxTer/
sizeof(WORD))/6);
1612 h[1] = WORDDIF(m,h);
1613 if ( AS.CollectOverFlag > 1 ) {
1614 *h = AC.AltCollectFun;
1615 if ( AS.CollectOverFlag == 3 ) AS.CollectOverFlag = 1;
1617 else *h = AC.CollectFun;
1619 h[FUNHEAD] = h[1] - FUNHEAD;
1621 if ( ToFast(h+FUNHEAD,h+FUNHEAD) ) {
1622 if ( h[FUNHEAD] <= -FUNCTION ) {
1634 *term = WORDDIF(m,term);
1660WORD GetFromStore(WORD *to,
POSITION *position,
RENUMBER renumber, WORD *InCompState, WORD nexpr)
1663 LONG RetCode, num, first = 0;
1668 WORD *r, *rr = AR.CompressPointer;
1671 sc.next = AT.StoreCache;
1678 if ( BASEPOSITION(s->position) == -1 )
break;
1679 if ( ISLESSPOS(*position,s->toppos) &&
1680 ISGEPOS(*position,s->position) ) {
1681 if ( AT.StoreCache != s ) {
1682 sold->next = s->next;
1683 s->next = AT.StoreCache->next;
1686 from = (WORD *)(((UBYTE *)(s->buffer)) + DIFBASE(*position,s->position));
1688 if ( !num ) {
return(*to = 0); }
1689 *InCompState = (WORD)num;
1693 ADDPOS(*position,
sizeof(WORD));
1694 *m++ = (WORD)(-num+1);
1696 while ( ++num <= 0 ) *m++ = *r++;
1697 if ( ISLESSPOS(*position,s->toppos) ) {
1700 ADDPOS(*position,
sizeof(WORD));
1701 *InCompState = (WORD)(num + 2);
1709 while ( num > 0 && ISLESSPOS(*position,s->toppos) ) {
1710 *r++ = *m++ = *from++; ADDPOS(*position,
sizeof(WORD)); num--;
1714 SETBASEPOSITION(s->position,-1);
1715 SETBASEPOSITION(s->toppos,-1);
1716 LOCK(AM.storefilelock);
1717 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1718 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)(s->buffer),AM.SizeStoreCache);
1719 UNLOCK(AM.storefilelock);
1720 if ( RetCode < 0 )
goto PastErr;
1721 if ( !RetCode )
return( *to = 0 );
1722 s->position = *position;
1723 s->toppos = *position;
1724 ADDPOS(s->toppos,RetCode);
1728 ADDPOS(*position,
sizeof(WORD));
1733 *InCompState = (WORD)(num + 2);
1740 if ( AT.StoreCache ) {
1741 s->position = *position;
1742 LOCK(AM.storefilelock);
1743 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1744 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)(s->buffer),AM.SizeStoreCache);
1745 UNLOCK(AM.storefilelock);
1746 if ( RetCode < 0 )
goto PastErr;
1747 if ( !RetCode )
return( *to = 0 );
1748 s->toppos = *position;
1749 ADDPOS(s->toppos,RetCode);
1750 if ( AT.StoreCache != s ) {
1751 sold->next = s->next;
1752 s->next = AT.StoreCache->next;
1758 if ( !num ) {
return( *to = 0 ); }
1759 *InCompState = (WORD)num;
1761 *m++ = (WORD)(-num+1);
1764 ADDPOS(*position,
sizeof(WORD));
1765 while ( ++num <= 0 ) *m++ = *r++;
1768 ADDPOS(*position,
sizeof(WORD));
1769 *InCompState = (WORD)(num+2);
1774 LOCK(AM.storefilelock);
1775 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1776 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)to,(LONG)
sizeof(WORD));
1777 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1778 UNLOCK(AM.storefilelock);
1779 if ( RetCode !=
sizeof(WORD) ) {
1781 return((WORD)RetCode);
1783 if ( !*to )
return(0);
1787 *to = *r++ = (WORD)(-num + 1);
1788 while ( ++num <= 0 ) *m++ = *r++;
1789 LOCK(AM.storefilelock);
1790 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1791 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)m,(LONG)
sizeof(WORD));
1792 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1793 UNLOCK(AM.storefilelock);
1794 if ( RetCode !=
sizeof(WORD) ) {
1796 MLOCK(ErrorMessageLock);
1797 MesPrint(
"!>Error in compression of store file");
1798 MUNLOCK(ErrorMessageLock);
1804 *InCompState = (WORD)(num + 2);
1808 num = *to - 1; m = to + 1; r = rr + 1;
1811 num *= wsizeof(WORD);
1814 MLOCK(ErrorMessageLock);
1815 MesPrint(
"!>Error in stored expressions file at position %9p",position);
1816 MUNLOCK(ErrorMessageLock);
1820 LOCK(AM.storefilelock);
1821 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1822 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)m,num);
1823 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1824 UNLOCK(AM.storefilelock);
1825 if ( RetCode != num ) {
1827 MLOCK(ErrorMessageLock);
1828 MesPrint(
"!>Error in stored expressions file at position %9p",position);
1829 MUNLOCK(ErrorMessageLock);
1836 if ( r >= AR.ComprTop ) {
1837 MLOCK(ErrorMessageLock);
1838 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1839 MUNLOCK(ErrorMessageLock);
1842 AR.CompressPointer = r; *r = 0;
1844 MarkDirty(to,DIRTYSYMFLAG);
1845 if ( AR.CurDum > AM.IndDum && Expressions[nexpr].numdummies > 0 )
1846 MoveDummies(BHEAD to,AR.CurDum - AM.IndDum);
1851 MLOCK(ErrorMessageLock);
1852 MesCall(
"!>GetFromStore");
1853 MUNLOCK(ErrorMessageLock);
1869void DetVars(WORD *term, WORD par)
1875 stopper = term + *term - 1;
1876 stopper = stopper - ABS(*stopper) + 1;
1880 if ( ( n = NumSymbols ) > 0 ) {
1884 (tt++)->flags &= ~INUSE;
1885 }
while ( --n > 0 );
1887 if ( ( n = NumIndices ) > 0 ) {
1891 (tt++)->flags &= ~INUSE;
1892 }
while ( --n > 0 );
1894 if ( ( n = NumVectors ) > 0 ) {
1898 (tt++)->flags &= ~INUSE;
1899 }
while ( --n > 0 );
1901 if ( ( n = NumFunctions ) > 0 ) {
1905 (tt++)->flags &= ~INUSE;
1906 }
while ( --n > 0 );
1909 while ( term < stopper ) {
1910 if ( *term == SYMTOSYM || *term == SYMTONUM ) {
1912 AN.UsedSymbol[*term] = 1;
1913 symbols[*term].flags |= INUSE;
1915 else if ( *term == VECTOVEC ) {
1917 AN.UsedVector[*term-AM.OffsetVector] = 1;
1918 vectors[*term-AM.OffsetVector].flags |= INUSE;
1920 else if ( *term == INDTOIND ) {
1922 sym = indices[*term - AM.OffsetIndex].dimension;
1923 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1924 AN.UsedIndex[(*term) - AM.OffsetIndex] = 1;
1925 sym = indices[*term-AM.OffsetIndex].nmin4;
1926 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1927 indices[*term-AM.OffsetIndex].flags |= INUSE;
1929 else if ( *term == FUNTOFUN ) {
1931 AN.UsedFunction[*term-FUNCTION] = 1;
1932 functions[*term-FUNCTION].flags |= INUSE;
1938 while ( term < stopper ) {
1940 if ( *term == SYMBOL ) {
1943 AN.UsedSymbol[*term] = 1;
1945 }
while ( term < t );
1947 else if ( *term == DOTPRODUCT ) {
1950 AN.UsedVector[(*term++) - AM.OffsetVector] = 1;
1951 AN.UsedVector[(*term) - AM.OffsetVector] = 1;
1953 }
while ( term < t );
1955 else if ( *term == VECTOR ) {
1958 AN.UsedVector[(*term++) - AM.OffsetVector] = 1;
1959 if ( *term >= AM.OffsetIndex && *term < AM.DumInd ) {
1960 sym = indices[*term - AM.OffsetIndex].dimension;
1961 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1962 AN.UsedIndex[*term - AM.OffsetIndex] = 1;
1963 sym = indices[(*term++)-AM.OffsetIndex].nmin4;
1964 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1967 }
while ( term < t );
1969 else if ( *term == INDEX || *term == LEVICIVITA || *term == GAMMA
1970 || *term == DELTA ) {
1975 if ( *term == INDEX || *term == DELTA ) term += 2;
1980 while ( term < t ) {
1981 if ( *term >= AM.OffsetIndex && *term < AM.DumInd ) {
1982 sym = indices[*term - AM.OffsetIndex].dimension;
1983 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1984 AN.UsedIndex[(*term) - AM.OffsetIndex] = 1;
1985 sym = indices[*term-AM.OffsetIndex].nmin4;
1986 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1988 else if ( *term < (WILDOFFSET+AM.OffsetVector) )
1989 AN.UsedVector[(*term) - AM.OffsetVector] = 1;
1993 else if ( *term == HAAKJE ) term = t;
1995 if ( *term > MAXBUILTINFUNCTION )
1996 AN.UsedFunction[(*term)-FUNCTION] = 1;
1997 if ( *term >= FUNCTION && functions[*term-FUNCTION].spec
1998 >= TENSORFUNCTION && term[1] > FUNHEAD )
goto Tensors;
2000 while ( term < t ) {
2004 sarg = term + *term;
2006 if ( term < sarg ) {
do {
2009 }
while ( term < sarg ); }
2012 if ( *term < -MAXBUILTINFUNCTION ) {
2013 AN.UsedFunction[-*term-FUNCTION] = 1;
2015 else if ( *term == -SYMBOL ) {
2016 AN.UsedSymbol[term[1]] = 1;
2018 else if ( *term == -INDEX ) {
2019 if ( term[1] < (WILDOFFSET+AM.OffsetVector) ) {
2020 AN.UsedVector[term[1]-AM.OffsetVector] = 1;
2022 else if ( term[1] >= AM.OffsetIndex && term[1] < AM.DumInd ) {
2023 sym = indices[term[1] - AM.OffsetIndex].dimension;
2024 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
2025 AN.UsedIndex[term[1] - AM.OffsetIndex] = 1;
2026 sym = indices[term[1]-AM.OffsetIndex].nmin4;
2027 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
2030 else if ( *term == -VECTOR || *term == -MINVECTOR ) {
2031 AN.UsedVector[term[1]-AM.OffsetVector] = 1;
2065 if ( ( indexent = NextFileIndex(&indexpos) ) == 0 ) {
2066 MesCall(
"ToStorage");
2070 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2071 if ( e->status == HIDDENGEXPRESSION ) {
2072 AR.InHiBuf = 0; f = AR.hidefile; AR.GetFile = 2;
2075 AR.InInBuf = 0; f = AR.infile; AR.GetFile = 0;
2079 SeekFile(f->
handle,&scrpos,SEEK_SET);
2080 if ( ISNOTEQUALPOS(scrpos,e->onfile) ) {
2082 MesPrint(
"!>Error in Scratch file");
2086 f->POposition = e->onfile;
2087 f->POfull = f->PObuffer;
2088 if ( e->status == HIDDENGEXPRESSION ) AR.InHiBuf = 0;
2089 else AR.InInBuf = 0;
2092 f->POfill = (WORD *)((UBYTE *)(f->PObuffer)+BASEPOSITION(e->onfile));
2095 AN.UsedSymbol = w; w += NumSymbols;
2096 AN.UsedVector = w; w += NumVectors;
2097 AN.UsedIndex = w; w += NumIndices;
2098 AN.UsedFunction = w; w += NumFunctions;
2100 w = (WORD *)(((UBYTE *)(w)) + AM.MaxTer);
2101 if ( w > AT.WorkTop ) {
2106 i = NumSymbols + NumVectors + NumIndices + NumFunctions;
2107 do { *w++ = 0; }
while ( --i > 0 );
2108 if ( GetTerm(BHEAD term) > 0 ) {
2110 if ( GetTerm(BHEAD term) ) {
2111 do { DetVars(term,0); }
while ( GetTerm(BHEAD term) > 0 );
2117 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2123 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2129 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2133 w = AN.UsedFunction;
2135 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2138 indexent->
length = *length;
2139 indexent->
variables = AR.StoreData.Fill;
2141 StrCopy(AC.exprnames->namebuffer+e->name,(UBYTE *)(indexent->
name));
2142 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2144 AO.wpos = (UBYTE *)Malloc1(AO.wlen,
"AO.wpos buffer");
2152 while ( --i >= 0 ) {
2153 while ( !*w ) { w++; a++; j++; }
2155 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct SyMbOl)),a->name,
2156 a->namesize) )
goto ErrToSto;
2166 while ( --i >= 0 ) {
2167 while ( !*w ) { w++; a++; j++; }
2169 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct InDeX)),a->name,
2170 a->namesize) )
goto ErrToSto;
2180 while ( --i >= 0 ) {
2181 while ( !*w ) { w++; a++; j++; }
2183 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct VeCtOr)),a->name,
2184 a->namesize) )
goto ErrToSto;
2190 w = AN.UsedFunction;
2194 while ( --i >= 0 ) {
2195 while ( !*w ) { w++; a++; j++; }
2197 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct FuNcTiOn)),a->name,
2198 a->namesize) )
goto ErrToSto;
2202 if ( VarStore((UBYTE *)0L,(WORD)0,(WORD)0,(WORD)0) )
goto ErrToSto;
2203 TELLFILE(AR.StoreData.Handle,&(indexent->
position));
2212 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->numdummies)),(LONG)
sizeof(WORD)) !=
2215 MesPrint(
"!>Error while writing storage file");
2219 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->numfactors)),(LONG)
sizeof(WORD)) !=
2222 MesPrint(
"!>Error while writing storage file");
2226 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->vflags)),(LONG)
sizeof(WORD)) !=
2229 MesPrint(
"!>Error while writing storage file");
2233 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->uflags)),(LONG)
sizeof(WORD)) !=
2236 MesPrint(
"!>Error while writing storage file");
2240 TELLFILE(AR.StoreData.Handle,&(indexent->
position));
2244 SeekFile(f->
handle,&(e->onfile),SEEK_SET);
2245 while ( ISPOSPOS(llength) ) {
2246 SETBASEPOSITION(scrpos,AO.wlen);
2247 if ( ISLESSPOS(llength,scrpos) ) size = BASEPOSITION(llength);
2248 else size = AO.wlen;
2249 if ( ReadFile(f->
handle,AO.wpos,size) != size ) {
2251 MesPrint(
"!>Error while reading scratch file");
2255 if ( WriteFile(AR.StoreData.Handle,AO.wpos,size) != size ) {
2257 MesPrint(
"!>Error while writing storage file");
2261 ADDPOS(llength,-size);
2266 ppp = (WORD *)((UBYTE *)(f->PObuffer) + BASEPOSITION(e->onfile));
2267 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ppp,BASEPOSITION(*length)) !=
2268 BASEPOSITION(*length) ) {
2270 MesPrint(
"!>Error while writing storage file");
2275 ADD2POS(*length,indexent->
position);
2276 e->onfile = indexpos;
2280 AR.StoreData.Fill = *length;
2281 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2282 scrpos = AR.StoreData.Position;
2284 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
2285 if ( WriteFile(AR.StoreData.Handle,((UBYTE *)&(AR.StoreData.Index.number))
2287 SeekFile(AR.StoreData.Handle,&indexpos,SEEK_SET);
2288 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)indexent,(LONG)(
sizeof(
INDEXENTRY))) !=
2290 FlushFile(AR.StoreData.Handle);
2291 SeekFile(AR.StoreData.Handle,&(AC.StoreFileSize),SEEK_END);
2292 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2293 if ( AO.wpos ) M_free(AO.wpos,
"AO.wpos buffer");
2294 AO.wpos = AO.wpoin = 0;
2298 MesPrint(
"!>Error while storing namelists");
2301 MesPrint(
"!>Error in storage");
2304 if ( AO.wpos ) M_free(AO.wpos,
"AO.wpos buffer");
2305 AO.wpos = AO.wpoin = 0;
2306 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2319 int i, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
2321 if ( AR.StoreData.Handle <= 0 ) {
2323 MesCall(
"NextFileIndex");
2326 SETBASEPOSITION(AR.StoreData.Index.number,1);
2327#ifdef SYSDEPENDENTSAVE
2328 SETBASEPOSITION(*indexpos,(2*
sizeof(
POSITION)));
2332 return(AR.StoreData.Index.expression);
2334 while ( BASEPOSITION(AR.StoreData.Index.number) >= (LONG)(
INFILEINDEX) ) {
2335 if ( ISNOTZEROPOS(AR.StoreData.Index.next) ) {
2336 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Index.next),SEEK_SET);
2337 AR.StoreData.Position = AR.StoreData.Index.next;
2338 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2339 (LONG)(
sizeof(
FILEINDEX)) )
goto ErrNextS;
2342 PUTZERO(AR.StoreData.Index.number);
2343 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Position),SEEK_SET);
2344 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(AR.StoreData.Fill)),(LONG)(
sizeof(
POSITION)))
2345 != (LONG)(
sizeof(
POSITION)) )
goto ErrNextS;
2346 PUTZERO(AR.StoreData.Index.next);
2347 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2348 AR.StoreData.Position = AR.StoreData.Fill;
2349 lo = (LONG *)(&AR.StoreData.Index);
2350 for ( i = 0; i < j; i++ ) *lo++ = 0;
2351 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2352 (LONG)(
sizeof(
FILEINDEX)) )
goto ErrNextS;
2353 ADDPOS(AR.StoreData.Fill,
sizeof(
FILEINDEX));
2356 *indexpos = AR.StoreData.Position;
2357 ADDPOS(*indexpos,(2*
sizeof(
POSITION)) +
2358 BASEPOSITION(AR.StoreData.Index.number) *
sizeof(
INDEXENTRY));
2359 ind = &AR.StoreData.Index.expression[BASEPOSITION(AR.StoreData.Index.number)];
2360 ADDPOS(AR.StoreData.Index.number,1);
2364 MesPrint(
"!>Error in storage file");
2383 int i, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
2385 if ( AR.StoreData.Handle < 0 ) {
2386 AR.StoreData.Handle = AC.StoreHandle;
2387 PUTZERO(AR.StoreData.Index.next);
2388 PUTZERO(AR.StoreData.Index.number);
2389#ifdef SYSDEPENDENTSAVE
2390 SETBASEPOSITION(AR.StoreData.Fill,
sizeof(
FILEINDEX));
2394 return(MesPrint(
"!>Error writing storage file header"));
2399 lo = (LONG *)(&AR.StoreData.Index);
2400 for ( i = 0; i < j; i++ ) *lo++ = 0;
2401 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2404 return(MesPrint(
"!>Error writing storage file"));
2410#ifdef SYSDEPENDENTSAVE
2413 SETBASEPOSITION(scrpos, (LONG)(
sizeof(
STOREHEADER)));
2415 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
2416 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2419 return(MesPrint(
"!>Error reading storage file"));
2423#ifdef SYSDEPENDENTSAVE
2424 PUTZERO(AR.StoreData.Position);
2426 SETBASEPOSITION(AR.StoreData.Position, (LONG)(
sizeof(
STOREHEADER)));
2441int VarStore(UBYTE *s, WORD n, WORD name, WORD namesize)
2447 t = (UBYTE *)AO.wpoin;
2451 u = AO.wpos+AO.wlen;
2452 while ( n > 0 && t < u ) { *t++ = *s++; n--; }
2454 if ( WriteFile(AR.StoreData.Handle,AO.wpos,AO.wlen) != AO.wlen )
return(-1);
2456 while ( n > 0 && t < u ) { *t++ = *s++; n--; }
2458 s = AC.varnames->namebuffer + name;
2460 n +=
sizeof(
void *)-1; n &= -(
sizeof(
void *));
2463 while ( n > 0 && t < u ) {
2464 if ( namesize > 0 ) { *t++ = *s++; namesize--; }
2469 if ( WriteFile(AR.StoreData.Handle,AO.wpos,AO.wlen) != AO.wlen )
return(-1);
2471 while ( n > 0 && t < u ) {
2472 if ( namesize > 0 ) { *t++ = *s++; namesize--; }
2481 size = AO.wpoin - AO.wpos;
2482 if ( WriteFile(AR.StoreData.Handle,AO.wpos,size) != size )
return(-1);
2507 stopper = term + *term - 1;
2508 stopper = stopper - ABS(*stopper) + 1;
2510 while ( term < stopper ) {
2514 if ( *term == SYMBOL ) {
2518 if ( ( n = FindrNumber(*term,&(renumber->
symb)) ) < 0 )
goto ErrR;
2519 *term = renumber->
symnum[n];
2521 }
while ( term < t );
2523 else if ( *term == DOTPRODUCT ) {
2527 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2529 *term++ = renumber->
vecnum[n];
2530 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2532 *term = renumber->
vecnum[n];
2534 }
while ( term < t );
2536 else if ( *term == VECTOR ) {
2540 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2542 *term++ = renumber->
vecnum[n];
2543 if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2544 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2546 *term++ = renumber->
indnum[n];
2549 }
while ( term < t );
2551 else if ( *term == INDEX || *term == LEVICIVITA || *term == GAMMA
2552 || *term == DELTA ) {
2555 if ( *term == INDEX || * term == DELTA ) term += 2;
2556 else term += FUNHEAD;
2560 while ( term < t ) {
2561 if ( *term >= AM.OffsetIndex + WILDOFFSET ) {
2566 else if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2567 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2569 *term = renumber->
indnum[n];
2571 else if ( *term < (WILDOFFSET+AM.OffsetVector) ) {
2572 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2574 *term = renumber->
vecnum[n];
2579 else if ( *term == HAAKJE ) term += term[1];
2581 if ( *term > MAXBUILTINFUNCTION ) {
2582 if ( ( n = FindrNumber(*term,&(renumber->
func)) )
2584 *term = renumber->
funnum[n];
2586 if ( *term >= FUNCTION && functions[*term-FUNCTION].spec
2587 >= TENSORFUNCTION && term[1] > FUNHEAD )
goto Tensors;
2590 while ( term < t ) {
2601 while ( term < sarg ) {
2607 if ( *term <= -MAXBUILTINFUNCTION ) {
2608 if ( ( n = FindrNumber(-*term,&(renumber->
func)) )
2610 *term = -renumber->
funnum[n];
2612 else if ( *term == -SYMBOL ) {
2614 if ( ( n = FindrNumber(*term,
2615 &(renumber->
symb)) ) < 0 )
goto ErrR;
2616 *term = renumber->
symnum[n];
2618 else if ( *term == -INDEX ) {
2620 if ( *term >= AM.OffsetIndex + WILDOFFSET ) {
2625 else if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2626 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2628 *term = renumber->
indnum[n];
2630 else if ( *term < (WILDOFFSET+AM.OffsetVector) ) {
2631 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2633 *term = renumber->
vecnum[n];
2636 else if ( *term == -VECTOR || *term == -MINVECTOR ) {
2638 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2640 *term = renumber->
vecnum[n];
2650 MesCall(
"TermRenumber");
2659WORD FindrNumber(WORD n,
VARRENUM *v)
2668 MesPrint(
"!>Serious problems coming up in FindrNumber");
2674 while ( *med != n ) {
2676 if ( med == hi )
goto ErrFindr;
2678 med = hi - ((WORDDIF(hi,med))/2);
2681 if ( med == lo )
goto ErrFindr;
2683 med = lo + ((WORDDIF(med,lo))/2);
2686 return(WORDDIF(med,v->
lo));
2694 i = WORDDIF(v->
hi,v->
lo);
2695 MesPrint(
"!>FindrNumber: n = %d, list has %d members",n,i);
2697 MesPrint(
"v->lo[%d] = %d",i,v->
lo[i]); i--;
2702 MesPrint(
"Start with %d,%d,%d",0,WORDDIF(med,v->
lo),WORDDIF(hi,v->
lo));
2703 while ( *med != n ) {
2705 if ( med == hi )
goto ErrFindr2;
2707 med = hi - ((WORDDIF(hi,med))/2);
2710 if ( med == lo )
goto ErrFindr2;
2712 med = ((WORDDIF(med,lo))/2) + lo;
2714 MesPrint(
"New: %d,%d,%d, *med = %d",WORDDIF(lo,v->
lo),WORDDIF(med,v->
lo),WORDDIF(hi,v->
lo),*med);
2717 return(WORDDIF(med,v->
lo));
2719 return(MesPrint(
"Renumbering problems"));
2745 WORD *start, *stop, *stop2, *m2, nomatch = 0;
2746 POSITION stindex, indexpos, scrpos;
2748 stindex = f->Position;
2753 while ( m < stop ) {
2754 if ( *m == FROMBRAC || *m == WILDCARDS )
break;
2758 if ( !par ) hand = AR.StoreData.Handle;
2759 else hand = AO.SaveData.Handle;
2761 if ( ( i = (WORD)BASEPOSITION(f->Index.
number) ) != 0 ) {
2762 indexpos = f->Position;
2763 ADDPOS(indexpos,(2*
sizeof(
POSITION)));
2766 if ( ( !par && ISEQUALPOS(indexpos,Expressions[expr].onfile) )
2767 || ( par && !StrCmp(EXPRNAME(expr),(UBYTE *)(ind->name)) ) ) {
2769 if ( par )
return(ind);
2770 scrpos = ind->position;
2771 SeekFile(hand,&scrpos,SEEK_SET);
2772 if ( ISNOTEQUALPOS(scrpos,ind->position) )
goto ErrGt2;
2773 if ( ReadFile(hand,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
2774 sizeof(WORD) || !*AT.WorkPointer )
goto ErrGt2;
2775 num = *AT.WorkPointer - 1;
2776 num *= wsizeof(WORD);
2777 if ( *AT.WorkPointer < 0 ||
2778 ReadFile(hand,(UBYTE *)(AT.WorkPointer+1),num) != num )
goto ErrGt2;
2780 m2 = AT.WorkPointer + 1;
2783 while ( m < stop && m2 < stop2 ) {
2784 if ( *m == SYMBOL ) {
2785 if ( *m2 != SYMTOSYM )
break;
2788 else if ( *m == INDEX ) {
2790 if ( *m2 != INDTOIND )
break;
2793 if ( *m2 != VECTOVEC )
break;
2797 else if ( *m >= FUNCTION ) {
2798 if ( *m2 != FUNTOFUN )
break;
2805 if ( ( m >= stop && m2 >= stop2 ) || mode == 0 ) {
2806 AT.WorkPointer = stop2;
2813 }
while ( --i > 0 );
2815 f->Position = f->Index.
next;
2816#ifndef SYSDEPENDENTSAVE
2817 if ( !ISNOTZEROPOS(f->Position) ) ADDPOS(f->Position,
sizeof(
STOREHEADER));
2820 if ( ISEQUALPOS(f->Position,stindex) && !AO.bufferedInd )
goto ErrGetTab;
2822 SeekFile(AR.StoreData.Handle,&(f->Position),SEEK_SET);
2823 if ( ISNOTEQUALPOS(f->Position,AR.StoreData.Position) )
goto ErrGt2;
2824#ifndef SYSDEPENDENTSAVE
2825 if ( ReadFile(f->Handle, (UBYTE *)(&(f->Index)),
number) !=
number )
goto ErrGt2;
2829 SeekFile(AO.SaveData.Handle,&(f->Position),SEEK_SET);
2830 if ( ISNOTEQUALPOS(f->Position,AO.SaveData.Position) )
goto ErrGt2;
2831#ifndef SYSDEPENDENTSAVE
2835#ifdef SYSDEPENDENTSAVE
2837 if ( ReadFile(f->Handle,(UBYTE *)(&(f->Index)),
number) !=
2843 MesPrint(
"Parameters of expression %s don't match."
2847 MesPrint(
"Cannot find expression %s",EXPRNAME(expr));
2852 MesPrint(
"!>Readerror in IndexSearch");
2899 LONG num, nsize, xx;
2900 WORD jsym, jind, jvec, jfun;
2901 WORD k, type, error = 0, *oldw, *neww, *oldwork = AT.WorkPointer;
2926 oldw = AT.WorkPointer + 1 + SUBEXPSIZE;
2932 LOCK(AM.storefilelock);
2933 if ( ( ind = FindInIndex(expr,&AR.StoreData,0,mode) ) == 0 ) {
2934 UNLOCK(AM.storefilelock);
2938 xx = ind->nsymbols+ind->nindices+ind->nvectors+ind->nfunctions;
2940 Expressions[expr].renumlists =
2941 w = AN.dummyrenumlist;
2949 w = (WORD *)Malloc1(
sizeof(WORD)*(xx*2),
"VarSpace");
2974 w += ind->nfunctions;
2979 SeekFile(AR.StoreData.Handle,&(ind->variables),SEEK_SET);
2980 *position = ind->position;
2981 jsym = ind->nsymbols;
2982 jvec = ind->nvectors;
2983 jind = ind->nindices;
2984 jfun = ind->nfunctions;
2990 w = r->
symb.
lo; j = jsym;
2991 for ( i = 0; i < j; i++ ) {
2992 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct SyMbOl)))
2993 !=
sizeof(
struct SyMbOl) )
goto ErrGt2;
2994 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
2995 nsize &= -
sizeof(
void *);
2996 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
2997 != nsize )
goto ErrGt2;
2999 if ( ( s->flags & INUSE ) != 0 ) {
3002 while ( *neww != SYMTOSYM || neww[2] != *w ) neww += neww[1];
3005 else if ( GetVar((UBYTE *)AT.WorkPointer,&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3006 if ( type != CSYMBOL ) {
3007 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3011 if ( ( s->complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) !=
3012 ( symbols[k].complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) ) {
3013 MesPrint(
"Warning: Conflicting complexity for %s",AT.WorkPointer);
3016 if ( ( s->complex & (VARTYPEROOTOFUNITY) ) !=
3017 ( symbols[k].complex & (VARTYPEROOTOFUNITY) ) ) {
3018 MesPrint(
"Warning: Conflicting root of unity properties for %s",AT.WorkPointer);
3021 if ( ( s->complex & VARTYPEROOTOFUNITY ) == VARTYPEROOTOFUNITY ) {
3022 if ( s->maxpower != symbols[k].maxpower ) {
3023 MesPrint(
"Warning: Conflicting n in n-th root of unity properties for %s",AT.WorkPointer);
3027 else if ( ( s->minpower !=
3028 symbols[k].minpower || s->maxpower !=
3029 symbols[k].maxpower ) && AC.WarnFlag ) {
3030 MesPrint(
"Warning: Conflicting power restrictions for %s",AT.WorkPointer);
3035 if ( ( k = EntVar(CSYMBOL,(UBYTE *)(AT.WorkPointer),s->complex,s->minpower,
3036 s->maxpower,s->dimension) ) < 0 )
goto GetTcall;
3048 w = r->
indi.
lo; j = jind;
3049 for ( i = 0; i < j; i++ ) {
3050 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct InDeX)))
3051 !=
sizeof(
struct InDeX) ) goto ErrGt2;
3052 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
3053 nsize &= -
sizeof(
void *);
3054 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
3055 != nsize )
goto ErrGt2;
3056 *w = s->number + AM.OffsetIndex;
3057 if ( s->dimension < 0 ) {
3058 s->dimension = -r->
symnum[FindrNumber(-s->dimension,&(r->
symb))];
3059 if ( s->nmin4 < -NMIN4SHIFT ) {
3060 s->nmin4 = -r->
symnum[FindrNumber(-s->nmin4-NMIN4SHIFT
3061 ,&(r->
symb))]-NMIN4SHIFT;
3064 if ( ( s->flags & INUSE ) != 0 ) {
3067 while ( *neww != INDTOIND || neww[2] != *w ) neww += neww[1];
3068 k = neww[3] - AM.OffsetIndex;
3070 else if ( s->type == DUMMY ) {
3075 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3076 if ( type != CINDEX ) {
3077 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3083 MesPrint(
"Warning: %s is also a dummy index",(AT.WorkPointer));
3087 if ( s->dimension != indices[k].dimension ) {
3088 MesPrint(
"Warning: Conflicting dimensions for %s",(AT.WorkPointer));
3095 if ( ( k = EntVar(CINDEX,(UBYTE *)(AT.WorkPointer),
3096 s->dimension,0,s->nmin4,0) ) < 0 )
goto GetTcall;
3099 *(w+j) = k + AM.OffsetIndex;
3109 w = r->
vect.
lo; j = jvec;
3110 for ( i = 0; i < j; i++ ) {
3111 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct VeCtOr)))
3112 !=
sizeof(
struct VeCtOr) )
goto ErrGt2;
3113 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
3114 nsize &= -
sizeof(
void *);
3115 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
3116 != nsize )
goto ErrGt2;
3117 *w = s->number + AM.OffsetVector;
3118 if ( ( s->flags & INUSE ) != 0 ) {
3121 while ( *neww != VECTOVEC || neww[2] != *w ) neww += neww[1];
3122 k = neww[3] - AM.OffsetVector;
3124 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3125 if ( type != CVECTOR ) {
3126 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3130 if ( ( s->complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) !=
3131 ( vectors[k].complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) ) {
3132 MesPrint(
"Warning: Conflicting complexity for %s",(AT.WorkPointer));
3138 if ( ( k = EntVar(CVECTOR,(UBYTE *)(AT.WorkPointer),
3139 s->complex,0,0,s->dimension) ) < 0 )
goto GetTcall;
3141 *(w+j) = k + AM.OffsetVector;
3151 w = r->
func.
lo; j = jfun;
3152 for ( i = 0; i < j; i++ ) {
3153 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct FuNcTiOn)))
3154 !=
sizeof(
struct FuNcTiOn) )
goto ErrGt2;
3155 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
3156 nsize &= -
sizeof(
void *);
3157 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
3158 != nsize )
goto ErrGt2;
3159 *w = s->number + FUNCTION;
3160 if ( ( s->flags & INUSE ) != 0 ) {
3163 while ( *neww != FUNTOFUN || neww[2] != *w ) neww += neww[1];
3164 k = neww[3] - FUNCTION;
3166 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3167 if ( type != CFUNCTION ) {
3168 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3172 if ( s->complex != functions[k].complex ) {
3173 MesPrint(
"Warning: Conflicting complexity for %s",(AT.WorkPointer));
3176 else if ( s->symmetric != functions[k].symmetric ) {
3177 MesPrint(
"Warning: Conflicting symmetry properties for %s",(AT.WorkPointer));
3180 else if ( ( s->maxnumargs != functions[k].maxnumargs )
3181 || ( s->minnumargs != functions[k].minnumargs ) ) {
3182 MesPrint(
"Warning: Conflicting argument restriction properties for %s",(AT.WorkPointer));
3188 if ( ( k = EntVar(CFUNCTION,(UBYTE *)(AT.WorkPointer),
3189 s->complex,s->commute,s->spec,s->dimension) ) < 0 )
goto GetTcall;
3190 functions[k].symmetric = s->symmetric;
3191 functions[k].maxnumargs = s->maxnumargs;
3192 functions[k].minnumargs = s->minnumargs;
3194 *(w+j) = k + FUNCTION;
3204 UNLOCK(AM.storefilelock);
3205 AT.WorkPointer = oldwork;
3224 TELLFILE(AR.StoreData.Handle,&pos);
3225 nummystery = DIFBASE(ind->position,pos);
3231 if ( nummystery > 0 ) {
3232 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3234 UNLOCK(AM.storefilelock);
3235 AT.WorkPointer = oldwork;
3238 Expressions[expr].numdummies = *AT.WorkPointer;
3242 nummystery -=
sizeof(WORD);
3245 Expressions[expr].numdummies = 0;
3247 if ( nummystery > 0 ) {
3248 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3250 UNLOCK(AM.storefilelock);
3251 AT.WorkPointer = oldwork;
3254 if ( ( AS.OldNumFactors == 0 ) || ( AS.NumOldNumFactors < NumExpressions ) ) {
3257 if (capacity < NumExpressions) capacity = NumExpressions * 2;
3259 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"numfactors pointers");
3260 if (AS.OldNumFactors) {
3261 WCOPY(buffer, AS.OldNumFactors, AS.NumOldNumFactors);
3262 M_free(AS.OldNumFactors,
"numfactors pointers");
3264 AS.OldNumFactors = buffer;
3266 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"vflags pointers");
3268 WCOPY(buffer, AS.Oldvflags, AS.NumOldNumFactors);
3269 M_free(AS.Oldvflags,
"vflags pointers");
3271 AS.Oldvflags = buffer;
3273 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"uflags pointers");
3275 WCOPY(buffer, AS.Olduflags, AS.NumOldNumFactors);
3276 M_free(AS.Olduflags,
"uflags pointers");
3278 AS.Olduflags = buffer;
3280 AS.NumOldNumFactors = capacity;
3283 AS.OldNumFactors[expr] =
3284 Expressions[expr].numfactors = *AT.WorkPointer;
3288 nummystery -=
sizeof(WORD);
3291 Expressions[expr].numfactors = 0;
3293 if ( nummystery > 0 ) {
3294 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3296 UNLOCK(AM.storefilelock);
3297 AT.WorkPointer = oldwork;
3300 AS.Oldvflags[expr] =
3301 Expressions[expr].vflags = *AT.WorkPointer;
3305 nummystery -=
sizeof(WORD);
3308 Expressions[expr].vflags = 0;
3310 if ( nummystery > 0 ) {
3311 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3313 UNLOCK(AM.storefilelock);
3314 AT.WorkPointer = oldwork;
3317 AS.Olduflags[expr] =
3318 Expressions[expr].uflags = *AT.WorkPointer;
3322 nummystery -=
sizeof(WORD);
3325 Expressions[expr].uflags = 0;
3329 SeekFile(AR.StoreData.Handle,&(ind->position),SEEK_SET);
3330 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3331 sizeof(WORD) || !*AT.WorkPointer ) {
3332 UNLOCK(AM.storefilelock);
3333 AT.WorkPointer = oldwork;
3336 num = *AT.WorkPointer - 1;
3337 num *=
sizeof(WORD);
3338 if ( *AT.WorkPointer < 0 ||
3339 ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer+1),num) != num ) {
3341 MesPrint(
"!>Error in stored expressions file at position %10p",*position);
3342 UNLOCK(AM.storefilelock);
3343 AT.WorkPointer = oldwork;
3347 UNLOCK(AM.storefilelock);
3348 ADDPOS(*position,num+
sizeof(WORD));
3349 r->startposition = *position;
3350 AT.WorkPointer = oldwork;
3354 UNLOCK(AM.storefilelock);
3355 AT.WorkPointer = oldwork;
3356 MesCall(
"GetTable");
3359 UNLOCK(AM.storefilelock);
3360 AT.WorkPointer = oldwork;
3361 MesPrint(
"!>Readerror in GetTable");
3385 SeekScratch(from,&posfrom);
3386 if ( from->
handle < 0 ) {
3387 fullsize = (BASEPOSITION(posfrom))/
sizeof(WORD);
3388 if ( ( to->POstop - to->POfull ) >= fullsize ) {
3392 t1 = from->PObuffer;
3394 NCOPY(t2,t1,fullsize)
3395 to->POfull = to->POfill = t2;
3399 if ( ( RetCode = CreateFile(to->name) ) >= 0 ) {
3400 to->
handle = (WORD)RetCode;
3401 PUTZERO(to->filesize);
3402 PUTZERO(to->POposition);
3405 MLOCK(ErrorMessageLock);
3406 MesPrint(
"Cannot create scratch file %s",to->name);
3407 MUNLOCK(ErrorMessageLock);
3411 t1 = from->PObuffer;
3412 while ( fullsize > 0 ) {
3413 i = to->POstop - to->POfull;
3414 if ( i > fullsize ) i = fullsize;
3418 if ( fullsize > 0 ) {
3419 SeekFile(to->
handle,&(to->POposition),SEEK_SET);
3420 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),to->POsize) != to->POsize ) {
3421 MLOCK(ErrorMessageLock);
3422 MesPrint(
"Error while writing to disk. Disk full?");
3423 MUNLOCK(ErrorMessageLock);
3426 ADDPOS(to->POposition,to->POsize);
3428 to->filesize = to->POposition;
3429 to->POfill = to->POfull = to->PObuffer;
3432 to->POfill = to->POfull = t2;
3441 if ( ((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)) > 0 ) {
3442 if ( WriteFile(from->
handle,((UBYTE *)(from->PObuffer)),((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)))
3443 != ((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)) ) {
3444 MLOCK(ErrorMessageLock);
3445 MesPrint(
"Error while writing to disk. Disk full?");
3446 MUNLOCK(ErrorMessageLock);
3449 SeekFile(from->
handle,&(from->POposition),SEEK_CUR);
3450 posfrom = from->filesize = from->POposition;
3451 from->POfill = from->POfull = from->PObuffer;
3457 SeekFile(from->
handle,&poscopy,SEEK_SET);
3458 while ( ISLESSPOS(poscopy,posfrom) ) {
3459 fullsize = ReadFile(from->
handle,((UBYTE *)(from->PObuffer)),from->POsize);
3460 if ( fullsize < 0 || ( fullsize %
sizeof(WORD) ) != 0 ) {
3462 MLOCK(ErrorMessageLock);
3463 MesPrint(
"!>Error while reading from disk while copying expression.");
3464 MUNLOCK(ErrorMessageLock);
3468 fullsize /=
sizeof(WORD);
3469 from->POfull = from->PObuffer + fullsize;
3470 t1 = from->PObuffer;
3472 if ( ( to->POstop - to->POfull ) >= fullsize ) {
3477 NCOPY(t2,t1,fullsize)
3478 to->POfill = to->POfull = t2;
3482 if ( ( RetCode = CreateFile(to->name) ) >= 0 ) {
3483 to->
handle = (WORD)RetCode;
3484 PUTZERO(to->POposition);
3485 PUTZERO(to->filesize);
3488 MLOCK(ErrorMessageLock);
3489 MesPrint(
"Cannot create scratch file %s",to->name);
3490 MUNLOCK(ErrorMessageLock);
3494 while ( fullsize > 0 ) {
3495 i = to->POstop - to->POfull;
3496 if ( i > fullsize ) i = fullsize;
3500 if ( fullsize > 0 ) {
3501 SeekFile(to->
handle,&(to->POposition),SEEK_SET);
3502 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),to->POsize) != to->POsize ) {
3503 MLOCK(ErrorMessageLock);
3504 MesPrint(
"Error while writing to disk. Disk full?");
3505 MUNLOCK(ErrorMessageLock);
3508 ADDPOS(to->POposition,to->POsize);
3510 to->filesize = to->POposition;
3511 to->POfill = to->POfull = to->PObuffer;
3514 to->POfill = to->POfull = t2;
3518 SeekFile(from->
handle,&poscopy,SEEK_CUR);
3521 if ( ( to->
handle >= 0 ) && ( to->POfill > to->PObuffer ) ) {
3522 fullsize = (UBYTE *)(to->POfill) - (UBYTE *)(to->PObuffer);
3527 SeekFile(to->
handle,&(to->filesize),SEEK_SET);
3528 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),fullsize) != fullsize ) {
3529 MLOCK(ErrorMessageLock);
3530 MesPrint(
"Error while writing to disk. Disk full?");
3531 MUNLOCK(ErrorMessageLock);
3534 ADDPOS(to->filesize,fullsize);
3535 to->POposition = to->filesize;
3536 to->POfill = to->POfull = to->PObuffer;
3549static UBYTE *statusexpr[] = {
3550 (UBYTE *)
"LOCALEXPRESSION"
3551 ,(UBYTE *)
"SKIPLEXPRESSION"
3552 ,(UBYTE *)
"DROPLEXPRESSION"
3553 ,(UBYTE *)
"DROPPEDEXPRESSION"
3554 ,(UBYTE *)
"GLOBALEXPRESSION"
3555 ,(UBYTE *)
"SKIPGEXPRESSION"
3556 ,(UBYTE *)
"DROPGEXPRESSION"
3558 ,(UBYTE *)
"STOREDEXPRESSION"
3559 ,(UBYTE *)
"HIDDENLEXPRESSION"
3560 ,(UBYTE *)
"HIDELEXPRESSION"
3561 ,(UBYTE *)
"DROPHLEXPRESSION"
3562 ,(UBYTE *)
"UNHIDELEXPRESSION"
3563 ,(UBYTE *)
"HIDDENGEXPRESSION"
3564 ,(UBYTE *)
"HIDEGEXPRESSION"
3565 ,(UBYTE *)
"DROPHGEXPRESSION"
3566 ,(UBYTE *)
"UNHIDEGEXPRESSION"
3567 ,(UBYTE *)
"INTOHIDELEXPRESSION"
3568 ,(UBYTE *)
"INTOHIDEGEXPRESSION"
3573 MesPrint(
"Expression %s(%d) has status %s(%d,%d). Buffer: %d, Position: %15p",
3574 AC.exprnames->namebuffer+e->name,(WORD)(e-Expressions),
3575 statusexpr[e->status],e->status,e->hidelevel,
3576 e->whichbuffer,&(e->onfile));
3606static void FlipN(UBYTE *p,
int length)
3612 buf = *p; *p = *q; *q = buf;
3613 }
while ( ++p != q );
3625static void Flip16(UBYTE *p)
3627 uint16_t in = *((uint16_t *)p);
3628 uint16_t out = (uint16_t)( (((in) >> 8) & UINT16_C(0x00FF)) | (((in) << 8) & UINT16_C(0xFF00)) );
3629 *((uint16_t *)p) = out;
3633static void Flip32(UBYTE *p)
3635 uint32_t in = *((uint32_t *)p);
3637 ( (((in) >> 24) & UINT32_C(0x000000FF)) | (((in) >> 8) & UINT32_C(0x0000FF00)) | \
3638 (((in) << 8) & UINT32_C(0x00FF0000)) | (((in) << 24) & UINT32_C(0xFF000000)) );
3639 *((uint32_t *)p) = out;
3644static void Flip64(UBYTE *p)
3646 uint64_t in = *((uint64_t *)p);
3648 ( (((in) >> 56) & UINT64_C(0x00000000000000FF)) | (((in) >> 40) & UINT64_C(0x000000000000FF00)) | \
3649 (((in) >> 24) & UINT64_C(0x0000000000FF0000)) | (((in) >> 8) & UINT64_C(0x00000000FF000000)) | \
3650 (((in) << 8) & UINT64_C(0x000000FF00000000)) | (((in) << 24) & UINT64_C(0x0000FF0000000000)) | \
3651 (((in) << 40) & UINT64_C(0x00FF000000000000)) | (((in) << 56) & UINT64_C(0xFF00000000000000)) );
3652 *((uint64_t *)p) = out;
3655static void Flip64(UBYTE *p) { FlipN(p, 8); }
3659static void Flip128(UBYTE *p) { FlipN(p, 16); }
3677static void ResizeDataBE(UBYTE *src,
int slen, UBYTE *dst,
int dlen)
3679 if ( slen > dlen ) {
3681 while ( dlen-- ) { *dst++ = *src++; }
3684 int i = dlen - slen;
3685 while ( i-- ) { *dst++ = 0; }
3686 while ( slen-- ) { *dst++ = *src++; }
3693static void ResizeDataLE(UBYTE *src,
int slen, UBYTE *dst,
int dlen)
3695 if ( slen > dlen ) {
3696 while ( dlen-- ) { *dst++ = *src++; }
3699 int i = dlen - slen;
3700 while ( slen-- ) { *dst++ = *src++; }
3701 while ( i-- ) { *dst++ = 0; }
3717static void Resize16t16(UBYTE *src, UBYTE *dst)
3719 *((int16_t *)dst) = *((int16_t *)src);
3723static void Resize16t32(UBYTE *src, UBYTE *dst)
3725 int16_t in = *((int16_t *)src);
3726 int32_t out = (int32_t)in;
3727 *((int32_t *)dst) = out;
3732static void Resize16t64(UBYTE *src, UBYTE *dst)
3734 int16_t in = *((int16_t *)src);
3735 int64_t out = (int64_t)in;
3736 *((int64_t *)dst) = out;
3739static void Resize16t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 2, dst, 8); }
3743static void Resize16t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 2, dst, 16); }
3746static void Resize32t32(UBYTE *src, UBYTE *dst)
3748 *((int32_t *)dst) = *((int32_t *)src);
3753static void Resize32t64(UBYTE *src, UBYTE *dst)
3755 int32_t in = *((int32_t *)src);
3756 int64_t out = (int64_t)in;
3757 *((int64_t *)dst) = out;
3760static void Resize32t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 4, dst, 8); }
3764static void Resize32t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 4, dst, 16); }
3768static void Resize64t64(UBYTE *src, UBYTE *dst)
3770 *((int64_t *)dst) = *((int64_t *)src);
3773static void Resize64t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 8); }
3777static void Resize64t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 16); }
3780static void Resize128t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 16); }
3783static void Resize32t16(UBYTE *src, UBYTE *dst)
3785 int32_t in = *((int32_t *)src);
3786 int16_t out = (int16_t)in;
3787 if ( in > (1<<15)-1 || in < -(1<<15)+1 ) AO.resizeFlag |= 1;
3788 *((int16_t *)dst) = out;
3797static void Resize32t16NC(UBYTE *src, UBYTE *dst)
3799 int32_t in = *((int32_t *)src);
3800 int16_t out = (int16_t)in;
3801 *((int16_t *)dst) = out;
3806static void Resize64t16(UBYTE *src, UBYTE *dst)
3808 int64_t in = *((int64_t *)src);
3809 int16_t out = (int16_t)in;
3810 if ( in > (1<<15)-1 || in < -(1<<15)+1 ) AO.resizeFlag |= 1;
3811 *((int16_t *)dst) = out;
3814static void Resize64t16NC(UBYTE *src, UBYTE *dst)
3816 int64_t in = *((int64_t *)src);
3817 int16_t out = (int16_t)in;
3818 *((int16_t *)dst) = out;
3822static void Resize64t16(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 2); }
3824static void Resize64t16NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 2); }
3829static void Resize64t32(UBYTE *src, UBYTE *dst)
3831 int64_t in = *((int64_t *)src);
3832 int32_t out = (int32_t)in;
3833 if ( in > (INT64_C(1)<<31)-1 || in < -(INT64_C(1)<<31)+1 ) AO.resizeFlag |= 1;
3834 *((int32_t *)dst) = out;
3837static void Resize64t32NC(UBYTE *src, UBYTE *dst)
3839 int64_t in = *((int64_t *)src);
3840 int32_t out = (int32_t)in;
3841 *((int32_t *)dst) = out;
3845static void Resize64t32(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 4); }
3847static void Resize64t32NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 4); }
3851static void Resize128t16(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 2); }
3854static void Resize128t16NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 2); }
3857static void Resize128t32(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 4); }
3860static void Resize128t32NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 4); }
3863static void Resize128t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 8); }
3866static void Resize128t64NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 8); }
3879static void CheckPower32(UBYTE *p)
3881 if ( *((int32_t *)p) < -MAXPOWER ) {
3882 AO.powerFlag |= 0x01;
3883 *((int32_t *)p) = -MAXPOWER;
3885 p +=
sizeof(int32_t);
3886 if ( *((int32_t *)p) > MAXPOWER ) {
3887 AO.powerFlag |= 0x02;
3888 *((int32_t *)p) = MAXPOWER;
3899static void RenumberVec32(UBYTE *p)
3902 void *dummy = (
void *)AO.SaveHeader.wildoffset;
3903 int32_t wildoffset = *(int32_t *)dummy;
3904 int32_t in = *((int32_t *)p);
3905 in = in + 2*wildoffset;
3906 in = in - 2*WILDOFFSET;
3907 *((int32_t *)p) = in;
3928static void ResizeCoeff32(UBYTE **bout, UBYTE *bend, UBYTE *top)
3933 int32_t *out = (int32_t *)*bout;
3934 int32_t *end = (int32_t *)bend;
3936 if (
sizeof(WORD) == 2 ) {
3938 int32_t len = (end - 1 - out) / 2;
3942 if ( *p & 0xFFFF0000 ) --zeros;
3944 if ( *p & 0xFFFF0000 ) --zeros;
3947 sign = ( *in-- > 0 ) ? 1 : -1;
3949 if ( zeros == 2 ) p -= 2;
3952 if ( zeros < 2 ) *p-- = *in >> 16;
3953 *p-- = *in-- & 0x0000FFFF;
3954 for ( i = 1; i < len; ++i ) {
3956 *p-- = *in-- & 0x0000FFFF;
3958 if ( zeros < 2 ) *p-- = *in >> 16;
3959 *p-- = *in-- & 0x0000FFFF;
3960 for ( i = 1; i < len; ++i ) {
3962 *p-- = *in-- & 0x0000FFFF;
3965 *out = (out - p) * sign;
3966 *bout = (UBYTE *)(out+1);
3971 int32_t len = (end - 1 - out) / 2;
3973 *out = *(uint16_t *)out;
3975 *out = *(uint16_t *)out;
3981 *out = *(uint16_t *)out;
3983 for ( i = 1; i < len; ++i ) {
3985 *out = (uint32_t)(*(uint16_t *)out)
3986 + ((uint32_t)(*(uint16_t *)in) << 16);
3988 if ( ++i == len )
break;
3991 *out = *(uint16_t *)in;
3995 *out = *(uint16_t *)in;
3997 for ( i = 1; i < len; ++i ) {
3999 *out = (uint32_t)(*(uint16_t *)out)
4000 + ((uint32_t)(*(uint16_t *)in) << 16);
4002 if ( ++i == len )
break;
4005 *out = *(uint16_t *)in;
4009 if ( *in < 0 ) *out = -(out - p + 1);
4010 else *out = out - p + 1;
4014 if ( out > (int32_t *)top ) {
4016 MesPrint(
"!>Error in resizing coefficient!");
4020 *bout = (UBYTE *)out;
4029#define SAVEREVISION 0x02
4044 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
4062 for ( i = 1; i < (int)
sizeof(
int); ++i ) {
4066 for ( i = 0; i < (int)
sizeof(
int); ++i ) sh.
endianness[i] = ((
char *)&endian)[i];
4078 for ( i = 0; i < 8; i++ ) dumw[i] = 0;
4079 dummy = (UBYTE *)dumw;
4080 dumw[0] = (WORD)MAXPOWER;
4081 for ( i = 0; i < 16; i++ ) sh.
maxpower[i] = dummy[i];
4082 dumw[0] = (WORD)WILDOFFSET;
4083 for ( i = 0; i < 16; i++ ) sh.
wildoffset[i] = dummy[i];
4087 return ( WriteFile(handle,(UBYTE *)(&sh),(LONG)(
sizeof(
STOREHEADER)))
4103static unsigned int CompactifySizeof(
unsigned int size)
4112 MesPrint(
"!>Error compactifying size.");
4139 static void (*flipJumpTable[4])(UBYTE *) =
4140 { Flip16, Flip32, Flip64, Flip128 };
4141 static void (*resizeJumpTable[4][4])(UBYTE *, UBYTE *) =
4142 { { Resize16t16, Resize32t16, Resize64t16, Resize128t16 },
4143 { Resize16t32, Resize32t32, Resize64t32, Resize128t32 },
4144 { Resize16t64, Resize32t64, Resize64t64, Resize128t64 },
4145 { Resize16t128, Resize32t128, Resize64t128, Resize128t128 } };
4146 static void (*resizeNCJumpTable[4][4])(UBYTE *, UBYTE *) =
4147 { { Resize16t16, Resize32t16NC, Resize64t16NC, Resize128t16NC },
4148 { Resize16t32, Resize32t32, Resize64t32NC, Resize128t32NC },
4149 { Resize16t64, Resize32t64, Resize64t64, Resize128t64NC },
4150 { Resize16t128, Resize32t128, Resize64t128, Resize128t128 } };
4153 WORD idxW = CompactifySizeof(
sizeof(WORD));
4154 WORD idxL = CompactifySizeof(
sizeof(LONG));
4155 WORD idxP = CompactifySizeof(
sizeof(
POSITION));
4156 WORD idxVP = CompactifySizeof(
sizeof(
void *));
4163 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&AO.SaveHeader),
4166 return(MesPrint(
"!>Error reading save file header"));
4173 for ( i = 0; i < 8; ++i ) {
4174 if ( AO.SaveHeader.headermark[i] != 0xFF ) {
4177 SeekFile(AO.SaveData.Handle, &p, SEEK_SET);
4182 if ( AO.SaveHeader.revision != SAVEREVISION ) {
4183 return(MesPrint(
"Save file header from an old version. Cannot read this file."));
4187 for ( i = 1; i < (int)
sizeof(
int); ++i ) {
4191 if ( ((
char *)&endian)[0] < ((
char *)&endian)[1] ) {
4193 AO.ResizeData = ResizeDataBE;
4197 AO.ResizeData = ResizeDataLE;
4201 if ( AO.SaveHeader.endianness[0] > AO.SaveHeader.endianness[1] ) {
4202 AO.transFlag = ( ((
char *)&endian)[0] < ((
char *)&endian)[1] );
4205 AO.transFlag = ( ((
char *)&endian)[0] > ((
char *)&endian)[1] );
4207 if ( (WORD)AO.SaveHeader.lenWORD !=
sizeof(WORD) ) AO.transFlag |= 0x02;
4208 if ( (WORD)AO.SaveHeader.lenLONG !=
sizeof(LONG) ) AO.transFlag |= 0x04;
4209 if ( (WORD)AO.SaveHeader.lenPOS !=
sizeof(
POSITION) ) AO.transFlag |= 0x08;
4210 if ( (WORD)AO.SaveHeader.lenPOINTER !=
sizeof(
void *) ) AO.transFlag |= 0x10;
4212 AO.FlipWORD = flipJumpTable[idxW];
4213 AO.FlipLONG = flipJumpTable[idxL];
4214 AO.FlipPOS = flipJumpTable[idxP];
4215 AO.FlipPOINTER = flipJumpTable[idxVP];
4218 AO.CheckPower = CheckPower32;
4219 AO.RenumberVec = RenumberVec32;
4221 AO.ResizeWORD = resizeJumpTable[idxW][CompactifySizeof(AO.SaveHeader.lenWORD)];
4222 AO.ResizeNCWORD = resizeNCJumpTable[idxW][CompactifySizeof(AO.SaveHeader.lenWORD)];
4223 AO.ResizeLONG = resizeJumpTable[idxL][CompactifySizeof(AO.SaveHeader.lenLONG)];
4224 AO.ResizePOS = resizeJumpTable[idxP][CompactifySizeof(AO.SaveHeader.lenPOS)];
4225 AO.ResizePOINTER = resizeJumpTable[idxVP][CompactifySizeof(AO.SaveHeader.lenPOINTER)];
4230 for ( i = 0; i < 8; i++ ) dumw[i] = 0;
4231 dummy = (UBYTE *)dumw;
4232 for ( i = 0; i < 16; i++ ) dummy[i] = AO.SaveHeader.maxpower[i];
4233 AO.mpower = dumw[0];
4260 if ( AO.transFlag ) {
4271 int lenW = AO.SaveHeader.lenWORD;
4272 int lenL = AO.SaveHeader.lenLONG;
4273 int lenP = AO.SaveHeader.lenPOS;
4276 if ( AO.bufferedInd ) {
4282 if ( ReadFile(AO.SaveData.Handle, (UBYTE *)fileind,
sizeof(
FILEINDEX))
4285 return ( MesPrint(
"!>Error(1) reading stored expression.") );
4290 if ( AO.transFlag & 1 ) {
4293 int padp = lenL - ((lenW*5+(MAXENAME + 1)) & (lenL-1));
4294 p = (UBYTE *)fileind;
4295 AO.FlipPOS(p); p += lenP;
4297 AO.ResizePOS(p, (UBYTE *)&
number);
4299 for ( i = 0; i <
number; ++i ) {
4300 AO.FlipPOS(p); p += lenP;
4301 AO.FlipPOS(p); p += lenP;
4302 AO.FlipPOS(p); p += lenP;
4303 AO.FlipLONG(p); p += lenL;
4304 AO.FlipWORD(p); p += lenW;
4305 AO.FlipWORD(p); p += lenW;
4306 AO.FlipWORD(p); p += lenW;
4307 AO.FlipWORD(p); p += lenW;
4308 AO.FlipWORD(p); p += lenW;
4314 if ( AO.transFlag > 1 ) {
4318 int padp = lenL - ((lenW*5+(MAXENAME + 1)) & (lenL-1));
4319 int padq =
sizeof(LONG) - ((
sizeof(WORD)*5+(MAXENAME + 1)) & (
sizeof(LONG)-1));
4321 p = (UBYTE *)fileind; q = (UBYTE *)&buffer;
4335 return ( MesPrint(
"Too many index entries.") );
4345 for ( i = 0; i < maxnumber; ++i ) {
4352 AO.ResizeLONG(p, q);
4353 p += lenL; q +=
sizeof(LONG);
4354 AO.ResizeWORD(p, q);
4355 p += lenW; q +=
sizeof(WORD);
4356 AO.ResizeWORD(p, q);
4357 p += lenW; q +=
sizeof(WORD);
4358 AO.ResizeWORD(p, q);
4359 p += lenW; q +=
sizeof(WORD);
4360 AO.ResizeWORD(p, q);
4361 p += lenW; q +=
sizeof(WORD);
4362 AO.ResizeWORD(p, q);
4363 p += lenW; q +=
sizeof(WORD);
4370 if ( AO.bufferedInd ) {
4372 SETBASEPOSITION(sbuffer.
number,AO.bufferedInd);
4373 q = (UBYTE *)&sbuffer +
sizeof(
POSITION) +
sizeof(LONG);
4374 for ( i = maxnumber; i <
number; ++i ) {
4381 AO.ResizeLONG(p, q);
4382 p += lenL; q +=
sizeof(LONG);
4383 AO.ResizeWORD(p, q);
4384 p += lenW; q +=
sizeof(WORD);
4385 AO.ResizeWORD(p, q);
4386 p += lenW; q +=
sizeof(WORD);
4387 AO.ResizeWORD(p, q);
4388 p += lenW; q +=
sizeof(WORD);
4389 AO.ResizeWORD(p, q);
4390 p += lenW; q +=
sizeof(WORD);
4391 AO.ResizeWORD(p, q);
4392 p += lenW; q +=
sizeof(WORD);
4400 p = (UBYTE *)fileind; q = (UBYTE *)&buffer; n =
sizeof(
FILEINDEX);
4405 return ( ReadFile(AO.SaveData.Handle, (UBYTE *)fileind,
sizeof(
FILEINDEX))
4449 if ( AO.transFlag ) {
4453 static WORD numReadSym;
4454 static WORD numReadInd;
4455 static WORD numReadVec;
4456 static WORD numReadFun;
4459 UBYTE *in, *out, *pp = 0, *end, *outbuf;
4461 WORD namelen, realnamelen;
4463 WORD lenW = AO.SaveHeader.lenWORD;
4464 WORD lenL = AO.SaveHeader.lenLONG;
4465 WORD lenP = AO.SaveHeader.lenPOINTER;
4466 WORD flip = AO.transFlag & 1;
4469 TELLFILE(AO.SaveData.Handle,&pos);
4477 if ( (lenW > (WORD)
sizeof(WORD))
4478 || ( (lenW == (WORD)
sizeof(WORD))
4479 && ( (lenL > (WORD)
sizeof(LONG))
4480 || ( (lenL == (WORD)
sizeof(LONG)) && lenP > (WORD)
sizeof(
void *))
4484 end = buffer + *size;
4491 LONG newsize = (top - buffer) / (1 +
sizeof(WORD)/lenW);
4495 if ( *size > newsize ) *size = newsize;
4498 if ( ( numread = ReadFile(AO.SaveData.Handle, in, *size) ) != *size ) {
4500 return ( MesPrint(
"!>Error(2) reading stored expression.") );
4508 if ( *stage == -1 ) {
4516 while ( in < end ) {
4518 if ( *stage == 0 ) {
4519 if ( ind->
nsymbols <= numReadSym ) {
4523 if ( end - in < AO.SaveHeader.sSym ) {
4528 AO.FlipLONG(pp); pp += lenL;
4529 while ( pp < in + AO.SaveHeader.sSym ) {
4530 AO.FlipWORD(pp); pp += lenW;
4533 pp = in + AO.SaveHeader.sSym;
4534 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4536 AO.ResizeWORD(in, out); in += lenW;
4537 if ( *((WORD *)out) == -AO.mpower ) *((WORD *)out) = -MAXPOWER;
4538 out +=
sizeof(WORD);
4539 AO.ResizeWORD(in, out); in += lenW;
4540 if ( *((WORD *)out) == AO.mpower ) *((WORD *)out) = MAXPOWER;
4541 out +=
sizeof(WORD);
4542 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4543 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4544 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4545 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4546 AO.ResizeWORD(in, out); in += lenW;
4547 realnamelen = *((WORD *)out);
4548 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4549 out +=
sizeof(WORD);
4550 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4552 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4554 namelen = *((WORD *)out-1);
4555 if ( end - in < namelen ) {
4558 *((WORD *)out-1) = realnamelen;
4559 *size += AO.SaveHeader.sSym + namelen;
4560 *outsize +=
sizeof(
struct SyMbOl) + realnamelen;
4561 if ( realnamelen > namelen ) {
4564 out += realnamelen - namelen;
4567 int j = realnamelen;
4569 in += namelen - realnamelen;
4575 if ( *stage == 1 ) {
4576 if ( ind->
nindices <= numReadInd ) {
4580 if ( end - in < AO.SaveHeader.sInd ) {
4585 AO.FlipLONG(pp); pp += lenL;
4586 while ( pp < in + AO.SaveHeader.sInd ) {
4587 AO.FlipWORD(pp); pp += lenW;
4590 pp = in + AO.SaveHeader.sInd;
4591 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4592 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4593 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4594 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4595 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4596 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4597 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4598 AO.ResizeWORD(in, out); in += lenW;
4599 realnamelen = *((WORD *)out);
4600 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4601 out +=
sizeof(WORD);
4603 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4605 namelen = *((WORD *)out-1);
4606 if ( end - in < namelen ) {
4609 *((WORD *)out-1) = realnamelen;
4610 *size += AO.SaveHeader.sInd + namelen;
4611 *outsize +=
sizeof(
struct InDeX) + realnamelen;
4612 if ( realnamelen > namelen ) {
4615 out += realnamelen - namelen;
4618 int j = realnamelen;
4620 in += namelen - realnamelen;
4626 if ( *stage == 2 ) {
4627 if ( ind->
nvectors <= numReadVec ) {
4631 if ( end - in < AO.SaveHeader.sVec ) {
4636 AO.FlipLONG(pp); pp += lenL;
4637 while ( pp < in + AO.SaveHeader.sVec ) {
4638 AO.FlipWORD(pp); pp += lenW;
4641 pp = in + AO.SaveHeader.sVec;
4642 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4643 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4644 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4645 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4646 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4647 AO.ResizeWORD(in, out); in += lenW;
4648 realnamelen = *((WORD *)out);
4649 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4650 out +=
sizeof(WORD);
4651 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4653 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4655 namelen = *((WORD *)out-1);
4656 if ( end - in < namelen ) {
4659 *((WORD *)out-1) = realnamelen;
4660 *size += AO.SaveHeader.sVec + namelen;
4661 *outsize +=
sizeof(
struct VeCtOr) + realnamelen;
4662 if ( realnamelen > namelen ) {
4665 out += realnamelen - namelen;
4668 int j = realnamelen;
4670 in += namelen - realnamelen;
4676 if ( *stage == 3 ) {
4681 if ( end - in < AO.SaveHeader.sFun ) {
4686 AO.FlipPOINTER(pp); pp += lenP;
4687 AO.FlipLONG(pp); pp += lenL;
4688 AO.FlipLONG(pp); pp += lenL;
4689 while ( pp < in + AO.SaveHeader.sFun ) {
4690 AO.FlipWORD(pp); pp += lenW;
4693 pp = in + AO.SaveHeader.sFun;
4695 AO.ResizePOINTER(in, out); in += lenP; out +=
sizeof(
void *);
4696 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4697 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4698 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4699 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4700 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4701 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4702 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4703 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4704 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4705 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4706 AO.ResizeWORD(in, out); in += lenW;
4707 realnamelen = *((WORD *)out);
4708 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4709 out +=
sizeof(WORD);
4710 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4712 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4714 namelen = *((WORD *)out-1);
4715 if ( end - in < namelen ) {
4718 *((WORD *)out-1) = realnamelen;
4719 *size += AO.SaveHeader.sFun + namelen;
4720 *outsize +=
sizeof(
struct FuNcTiOn) + realnamelen;
4721 if ( realnamelen > namelen ) {
4724 out += realnamelen - namelen;
4727 int j = realnamelen;
4729 in += namelen - realnamelen;
4733 AO.tensorList[((
FUNCTIONS)outbuf)->number+FUNCTION] =
4738 if ( end - in >= lenW ) {
4739 if ( flip ) AO.FlipWORD(in);
4740 AO.ResizeWORD(in, out);
4742 *outsize +=
sizeof(WORD);
4745 if ( end - in >= lenW ) {
4746 if ( flip ) AO.FlipWORD(in);
4747 AO.ResizeWORD(in, out);
4749 *outsize +=
sizeof(WORD);
4752 if ( end - in >= lenW ) {
4753 if ( flip ) AO.FlipWORD(in);
4754 AO.ResizeWORD(in, out);
4756 *outsize +=
sizeof(WORD);
4759 if ( end - in >= lenW ) {
4760 if ( flip ) AO.FlipWORD(in);
4761 AO.ResizeWORD(in, out);
4763 *outsize +=
sizeof(WORD);
4773 SeekFile(AO.SaveData.Handle, &pos, SEEK_SET);
4776 return ( ReadFile(AO.SaveData.Handle, buffer, *size) != *size );
4814ReadSaveTerm32(UBYTE *bin, UBYTE *binend, UBYTE **bout, UBYTE *boutend, UBYTE *top,
int terminbuf)
4820 int32_t *r, *t, *coeff, *end, *newtermsize, *rend;
4821 int32_t *newsubtermp;
4822 int32_t *in = (int32_t *)bin;
4823 int32_t *out = (int32_t *)*bout;
4832 rend = (int32_t *)boutend;
4833 coeff = end - ABS(*(end-1));
4834 newtermsize = (int32_t *)*bout;
4835 out = newtermsize + 1;
4841 r = (int32_t *)AR.CompressBuffer;
4847 if ( (UBYTE *)in >= binend ) {
4850 *out = len = -j + 1 + *in;
4852 if ( (UBYTE *)end >= top ) {
4857 while ( ++j <= 0 ) {
4863 else if ( j == 0 ) {
4865 while ( (UBYTE *)in < binend ) {
4867 if ( (UBYTE *)out > top ) {
4868 return ( (UBYTE *)bin );
4874 *bout = (UBYTE *)out;
4875 return ( (UBYTE *)in );
4879 if ( (UBYTE *)end >= top ) {
4883 if ( (UBYTE *)(in + j) >= binend ) {
4884 *(AR.CompressBuffer) = rbuf;
4887 if ( (UBYTE *)out + j >= top ) {
4891 while ( --j >= 0 ) {
4897 r = (int32_t *)AR.CompressBuffer + 1;
4898 coeff = end - ABS(*(end-1));
4899 newtermsize = (int32_t *)*bout;
4900 out = newtermsize + 1;
4904 while ( out < coeff ) {
4912 if (
id == SYMBOL ) {
4916 if ( ABS(*out) >= MAXPOWER ) {
4919 int32_t num = *(out-1);
4924 if ( (UBYTE *)end > top )
return ( bin );
4934 *out++ = ABS(exp) & 0x0000FFFF;
4935 *out++ = ABS(exp) >> 16;
4938 *out++ = ( exp < 0 ) ? -5 : 5;
4949 else if (
id == DOTPRODUCT ) {
4951 AO.RenumberVec((UBYTE *)out);
4953 AO.RenumberVec((UBYTE *)out);
4956 if ( ABS(*out) >= MAXPOWER ) {
4959 int32_t num1 = *(out-2);
4960 int32_t num2 = *(out-1);
4965 if ( (UBYTE *)end > top )
return ( bin );
4973 *out++ = DOTPRODUCT;
4984 *out++ = ABS(exp) & 0x0000FFFF;
4985 *out++ = ABS(exp) >> 16;
4988 *out++ = ( exp < 0 ) ? -5 : 5;
4999 else if (
id == VECTOR ) {
5001 AO.RenumberVec((UBYTE *)out);
5006 else if (
id == INDEX ) {
5008 void *dummy = (
void *)AO.SaveHeader.wildoffset;
5009 int32_t vectoroffset = -2 * *((int32_t *)dummy);
5012 if ( *out < vectoroffset ) {
5013 AO.RenumberVec((UBYTE *)out);
5018 else if (
id == SUBEXPRESSION ) {
5024 else if (
id == DELTA ) {
5029 else if (
id == HAAKJE ) {
5034 else if (
id == GAMMA ||
id == LEVICIVITA || (
id >= FUNCTION && AO.tensorList[
id]) ) {
5036 void *dummy = (
void *)AO.SaveHeader.wildoffset;
5037 int32_t vectoroffset = -2 * *((int32_t *)dummy);
5040 if ( *out < vectoroffset ) {
5041 AO.RenumberVec((UBYTE *)out);
5046 else if (
id >= FUNCTION ) {
5064 if (
sizeof(WORD) == 2 ) {
5066 if ( *out > (1<<15)-1 || *out < -(1<<15)+1 ) {
5074 if ( (UBYTE *)end > top )
return ( bin );
5079 *out++ = ABS(num) & 0x0000FFFF;
5080 *out++ = ABS(num) >> 16;
5083 *out++ = ( num < 0 ) ? -5 : 5;
5099 AO.RenumberVec((UBYTE *)out);
5108 AO.RenumberVec((UBYTE *)out);
5112 if ( -*out >= FUNCTION ) {
5117 MesPrint(
"!>short function code %d not implemented.", *out);
5118 return ( (UBYTE *)in );
5125 int32_t *newargsize = out;
5126 argEnd = out + *out;
5129 while ( out < argEnd ) {
5130 int32_t *keepsizep = out + *out;
5131 int32_t lenbuf = *out;
5132 int32_t **ppp = &out;
5134 newbin =
ReadSaveTerm32((UBYTE *)r, binend, (UBYTE **)ppp, (UBYTE *)rend, top, 1);
5136 if ( newbin == (UBYTE *)r ) {
5137 return ( (UBYTE *)in );
5141 if ( out > keepsizep ) {
5144 int32_t extention = out - keepsizep;
5151 argEnd += extention;
5154 else if ( out < keepsizep ) {
5157 int32_t extention = keepsizep - out;
5164 argEnd -= extention;
5168 *newargsize = out - newargsize;
5174 MesPrint(
"!>ID %d not recognized.",
id);
5175 return ( (UBYTE *)in );
5179 *newsubtermp = out - newsubtermp + 1;
5182 if ( (UBYTE *)end >= top ) {
5188 *bout = (UBYTE *)out;
5190 ResizeCoeff32(bout, (UBYTE *)end, top);
5192 if ( *bout >= top ) {
5197 *newtermsize = (int32_t *)*bout - newtermsize;
5199 return ( (UBYTE *)in );
5230 if ( AO.transFlag ) {
5231 UBYTE *in, *end, *out, *outend, *p;
5234 WORD lenW = AO.SaveHeader.lenWORD;
5238 TELLFILE(AO.SaveData.Handle,&pos);
5242 half = (top-buffer)/2;
5243 if ( *size > half ) *size = half;
5244 if ( lenW < (WORD)
sizeof(WORD) ) {
5245 if ( *size * (LONG)
sizeof(WORD)/lenW > half ) *size = half*lenW/(LONG)
sizeof(WORD);
5248 if ( *size > half ) *size = half;
5259 if ( lenW ==
sizeof(WORD) ) in += half;
5262 outend = out + *size;
5264 if ( ReadFile(AO.SaveData.Handle, in, *size) != *size ) {
5266 return ( MesPrint(
"!>Error(3) reading stored expression.") );
5270 if ( AO.transFlag & 1 ) {
5273 while ( p <= end ) {
5274 AO.FlipWORD(p); p += lenW;
5279 if ( lenW > (WORD)
sizeof(WORD) ) {
5283 if ( outend > top ) outend = top;
5285 if ( p == in )
break;
5287 }
while ( in <= end - lenW );
5289 *size = in - buffer;
5294 while ( in < end ) {
5296 AO.ResizeNCWORD(in, out);
5297 in += lenW; out +=
sizeof(WORD);
5301 if ( lenW < (WORD)
sizeof(WORD) ) {
5303 while ( in < end ) {
5304 AO.ResizeWORD(in, out);
5305 in += lenW; out +=
sizeof(WORD);
5314 if ( p == in )
break;
5316 }
while ( in <= end -
sizeof(WORD) );
5317 *size = (in - buffer - half) * lenW / (ULONG)
sizeof(WORD);
5319 *outsize = out - buffer;
5321 SeekFile(AO.SaveData.Handle, &pos, SEEK_SET);
5326 return ( ReadFile(AO.SaveData.Handle, buffer, *size) != *size );
UBYTE * SkipAName(UBYTE *s)
LONG ReadSaveIndex(FILEINDEX *fileind)
UBYTE * ReadSaveTerm32(UBYTE *bin, UBYTE *binend, UBYTE **bout, UBYTE *boutend, UBYTE *top, int terminbuf)
LONG ReadSaveExpression(UBYTE *buffer, UBYTE *top, LONG *size, LONG *outsize)
LONG WriteStoreHeader(WORD handle)
LONG ReadSaveVariables(UBYTE *buffer, UBYTE *top, LONG *size, LONG *outsize, INDEXENTRY *ind, LONG *stage)
int TermRenumber(WORD *term, RENUMBER renumber, WORD nexpr)
INDEXENTRY expression[INFILEINDEX]
struct FuNcTiOn * FUNCTIONS
struct ReNuMbEr * RENUMBER
struct FiLeInDeX FILEINDEX
struct StOrEcAcHe * STORECACHE