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");
123 else MesPrint(
"In the input file");
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;
134 MesPrint(
"Illegal position in SetScratch");
139 SeekFile(f->
handle,&possize,SEEK_SET);
140 if ( ISNOTEQUALPOS(possize,*position) ) {
141 UNLOCK(AS.inputslock);
142 MesPrint(
"Cannot position file in SetScratch");
146 MesPrint(
"SetScratch1(%w): position = %12p, size = %l, address = %x",position,f->POsize,f->PObuffer);
148 if ( ( size = ReadFile(f->
handle,(UBYTE *)(f->PObuffer),f->POsize) ) < 0
149 || ( size & 1 ) != 0 ) {
150 UNLOCK(AS.inputslock);
151 MesPrint(
"Read error in SetScratch");
154 UNLOCK(AS.inputslock);
158 f->POfill = f->PObuffer;
159 f->POposition = *position;
161 *whichInInBuf = size >> 1;
163 *whichInInBuf = size / TABLESIZE(WORD,UBYTE);
165 f->POfull = f->PObuffer + *whichInInBuf;
167 MesPrint(
"SetScratch2: size = %l, InInBuf = %l, fill = %l, full = %l"
168 ,size,*whichInInBuf,(f->POfill-f->PObuffer)*
sizeof(WORD)
169 ,(f->POfull-f->PObuffer)*
sizeof(WORD));
174 DIFPOS(possize,*position,f->POposition);
175 f->POfill = (WORD *)(BASEPOSITION(possize)+(UBYTE *)(f->PObuffer));
176 *whichInInBuf = f->POfull-f->POfill;
189int RevertScratch(
void)
193 if ( AR.infile->handle >= 0 && AR.infile->handle != AR.outfile->handle ) {
194 CloseFile(AR.infile->handle);
195 AR.infile->handle = -1;
196 remove(AR.infile->name);
198 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
199 AR.infile->POfull = AR.infile->POfill;
200 AR.infile->POfill = AR.infile->PObuffer;
201 if ( AR.infile->handle >= 0 ) {
204 SeekFile(AR.infile->handle,&scrpos,SEEK_SET);
205 if ( ISNOTZEROPOS(scrpos) ) {
206 return(MesPrint(
"Error with scratch output."));
208 if ( ( AR.InInBuf = ReadFile(AR.infile->handle,(UBYTE *)(AR.infile->PObuffer)
209 ,AR.infile->POsize) ) < 0 || AR.InInBuf & 1 ) {
210 return(MesPrint(
"Error while reading from scratch file"));
213 AR.InInBuf /= TABLESIZE(WORD,UBYTE);
215 AR.infile->POfull = AR.infile->PObuffer + AR.InInBuf;
217 PUTZERO(AR.infile->POposition);
218 AR.outfile->POfill = AR.outfile->POfull = AR.outfile->PObuffer;
219 PUTZERO(AR.outfile->POposition);
220 PUTZERO(AR.outfile->filesize);
234int ResetScratch(
void)
238 if ( AR.infile->handle >= 0 ) {
239 CloseFile(AR.infile->handle); AR.infile->handle = -1;
240 remove(AR.infile->name);
241 PUTZERO(AR.infile->POposition);
242 AR.infile->POfill = AR.infile->POfull = AR.infile->PObuffer;
244 if ( AR.outfile->handle >= 0 ) {
247 SeekFile(AR.outfile->handle,&scrpos,SEEK_SET);
248 if ( ISNOTZEROPOS(scrpos) ) {
249 return(MesPrint(
"Error with scratch output."));
251 if ( ( AR.InInBuf = ReadFile(AR.outfile->handle,(UBYTE *)(AR.outfile->PObuffer)
252 ,AR.outfile->POsize) ) < 0 || AR.InInBuf & 1 ) {
253 return(MesPrint(
"Error while reading from scratch file"));
255 else AR.InInBuf /= TABLESIZE(WORD,UBYTE);
256 AR.outfile->POfull = AR.outfile->PObuffer + AR.InInBuf;
258 else AR.outfile->POfull = AR.outfile->POfill;
259 AR.outfile->POfill = AR.outfile->PObuffer;
260 PUTZERO(AR.outfile->POposition);
261 f = AR.outfile; AR.outfile = AR.infile; AR.infile = f;
275 LONG l = BASEPOSITION(*length);
277 memcpy(buffer,fi->POfill,l);
280 SeekFile(fi->
handle,pos,SEEK_SET);
281 if ( ReadFile(fi->
handle,buffer,l) != l ) {
282 if ( fi == AR.hidefile )
283 MesPrint(
"Error reading from hide file.");
285 MesPrint(
"Error reading from scratch file.");
303 LONG l = BASEPOSITION(*length), avail;
305 fi->POfill = fi->POfull;
306 while ( fi->POfill+l/
sizeof(WORD) > fi->POstop ) {
307 avail = (fi->POstop-fi->POfill)*
sizeof(WORD);
309 memcpy(fi->POfill,buffer,avail);
310 l -= avail; buffer += avail;
313 if ( ( fi->
handle = (WORD)CreateFile(fi->name) ) < 0 ) {
314 if ( fi == AR.hidefile )
315 MesPrint(
"Cannot create hide file %s",fi->name);
317 MesPrint(
"Cannot create scratch file %s",fi->name);
320 PUTZERO(fi->POposition);
322 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
323 if ( WriteFile(fi->
handle,(UBYTE *)fi->PObuffer,fi->POsize) != fi->POsize )
325 ADDPOS(fi->POposition,fi->POsize);
326 fi->POfill = fi->POfull = fi->PObuffer;
329 memcpy(fi->POfill,buffer,l);
330 fi->POfill += l/
sizeof(WORD);
331 fi->POfull = fi->POfill;
333 if ( withflush && fi->
handle >= 0 && fi->POfill > fi->PObuffer ) {
334 l = (LONG)fi->POfill - (LONG)fi->PObuffer;
335 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
336 if ( WriteFile(fi->
handle,(UBYTE *)fi->PObuffer,l) != l )
goto writeerror;
337 ADDPOS(fi->POposition,fi->POsize);
338 fi->POfill = fi->POfull = fi->PObuffer;
340 if ( withflush && fi->
handle >= 0 )
341 SETBASEPOSITION(fi->filesize,TellFile(fi->
handle));
344 if ( fi == AR.hidefile )
345 MesPrint(
"Error writing to hide file. Disk full?");
347 MesPrint(
"Error writing to scratch file. Disk full?");
362int CoSave(UBYTE *inp)
367 WORD error = 0, type, number;
368 WORD exprInStorageFlag = 0;
369 LONG RetCode = 0, wSize;
373 WORD TMproto[SUBEXPSIZE];
375 int ii, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
377 while ( *inp ==
',' ) inp++;
381 if( PF.me != MASTER)
return(0);
384 if ( !*p )
return(MesPrint(
"No filename in save statement"));
385 if ( FG.cTable[*p] > 1 && ( *p !=
'.' ) && ( *p != SEPARATOR ) && ( *p != ALTSEPARATOR ) )
386 return(MesPrint(
"Illegal filename"));
387 while ( *++p && *p !=
',' ) {}
390 if ( !AP.preError ) {
391 if ( ( RetCode = CreateFile((
char *)inp) ) < 0 ) {
392 return(MesPrint(
"Cannot open file %s",inp));
395 AO.SaveData.Handle = (WORD)RetCode;
404 if (
WriteStoreHeader(AO.SaveData.Handle) )
return(MesPrint(
"Error writing storage file header"));
407 lo = (LONG *)(&AO.SaveData.Index);
408 for ( ii = 0; ii < j; ii++ ) *lo++ = 0;
409 SETBASEPOSITION(AO.SaveData.Position,(LONG)
sizeof(
STOREHEADER));
410 ind = AO.SaveData.Index.expression;
411 if ( !AP.preError && WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
413 SeekFile(AO.SaveData.Handle,&(filesize),SEEK_END);
417 if ( !FG.cTable[*p] || *p ==
'[' ) {
419 if ( p == 0 )
return(-1);
422 if ( GetVar(inp,&type,&number,CEXPRESSION,NOAUTO) != NAMENOTFOUND ) {
423 if ( e[number].status == STOREDEXPRESSION ) {
424 if ( StrLen(AC.exprnames->namebuffer+e[number].name) > MAXENAME ) {
426 snprintf(msg,
sizeof(msg),
"saved expr name over %d char: %s", MAXENAME, AC.exprnames->namebuffer+e[number].name);
434 if ( AP.preError )
goto NextExpr;
435 TMproto[0] = EXPRESSION;
436 TMproto[1] = SUBEXPSIZE;
439 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
441 if ( ( indold = FindInIndex(number,&AR.StoreData,0,0) ) != 0 ) {
446 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_END);
447 scrpos = AO.SaveData.Position;
448 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
449 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
450 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
454 AO.SaveData.Position = AO.SaveData.Index.next;
455 lo = (LONG *)(&AO.SaveData.Index);
456 for ( ii = 0; ii < j; ii++ ) *lo++ = 0;
457 ind = AO.SaveData.Index.expression;
458 scrpos = AO.SaveData.Position;
459 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
460 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
461 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
464 ADDPOS(filesize,
sizeof(
struct FiLeInDeX));
473 SeekFile(AR.StoreData.Handle,&(indold->
variables),SEEK_SET);
474 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
477 ADD2POS(filesize,scrpos);
478 SETBASEPOSITION(scrpos1,wSize);
480 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
481 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize)
483 MesPrint(
"ReadError");
487 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize)
488 != wSize )
goto SavWrt;
489 ADDPOS(scrpos,-wSize);
490 }
while ( ISPOSPOS(scrpos) );
491 ADDPOS(AO.SaveData.Index.number,1);
498 MesPrint(
"%s is not a stored expression",inp);
504 MesPrint(
"%s is not an expression",inp);
508 if ( c !=
',' && c ) {
509 MesComp(
"Illegal character",inp,p);
516 if ( !AP.preError ) {
517 scrpos = AO.SaveData.Position;
518 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
519 if ( ISNOTEQUALPOS(scrpos,AO.SaveData.Position) )
goto SavWrt;
522 WriteFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index))
525 else if ( !AP.preError ) {
528 if ( StrLen(AC.exprnames->namebuffer+e->name) > MAXENAME ) {
530 snprintf(msg,
sizeof(msg),
"saved expr name over %d char: %s", MAXENAME, AC.exprnames->namebuffer+e->name);
533 if ( e->status == STOREDEXPRESSION ) exprInStorageFlag = 1;
535 }
while ( --n > 0 ); }
536 if ( exprInStorageFlag ) {
537 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
539 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
540 scrpos = AR.StoreData.Fill;
541 SETBASEPOSITION(scrpos1,wSize);
543 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
544 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize) != wSize ) {
545 MesPrint(
"ReadError");
549 if ( WriteFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize) != wSize )
551 ADDPOS(scrpos,-wSize);
552 }
while ( ISPOSPOS(scrpos) );
556 if ( !AP.preError ) {
557 CloseFile(AO.SaveData.Handle);
558 AO.SaveData.Handle = -1;
562 MesPrint(
"WriteError");
572int CoLoad(UBYTE *inp)
578 WORD num, i, error = 0;
579 WORD type, number, silentload = 0;
580 WORD TMproto[SUBEXPSIZE];
582 while ( *inp ==
',' ) inp++;
584 if ( ( *p ==
',' && p[1] ==
'-' ) || *p ==
'-' ) {
585 if ( *p ==
',' ) p++;
587 if ( *p ==
's' || *p ==
'S' ) {
589 while ( *p && ( *p !=
',' && *p !=
'-' && *p !=
'+'
590 && *p != SEPARATOR && *p != ALTSEPARATOR && *p !=
'.' ) ) p++;
592 else if ( *p !=
',' ) {
593 return(MesPrint(
"Illegal option in Load statement"));
595 while ( *p ==
',' ) p++;
598 if ( !*p )
return(MesPrint(
"No filename in load statement"));
599 if ( FG.cTable[*p] > 1 && ( *p !=
'.' ) && ( *p != SEPARATOR ) && ( *p != ALTSEPARATOR ) )
600 return(MesPrint(
"Illegal filename"));
601 while ( *++p && *p !=
',' ) {}
604 if ( ( RetCode = OpenFile((
char *)inp) ) < 0 ) {
605 return(MesPrint(
"Cannot open file %s",inp));
613 AO.SaveData.Handle = (WORD)(RetCode);
615#ifdef SYSDEPENDENTSAVE
616 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index)),
620 TELLFILE(AO.SaveData.Handle,&firstposition);
628 if ( !FG.cTable[*p] || *p ==
'[' ) {
630 if ( p == 0 )
return(-1);
633 if ( GetVar(inp,&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
634 MesPrint(
"Conflicting name: %s",inp);
638 if ( ( num = EntVar(CEXPRESSION,inp,STOREDEXPRESSION,0,0,0) ) >= 0 ) {
639 TMproto[0] = EXPRESSION;
640 TMproto[1] = SUBEXPSIZE;
643 {
int ie;
for ( ie = 4; ie < SUBEXPSIZE; ie++ ) TMproto[ie] = 0; }
645 SeekFile(AO.SaveData.Handle,&firstposition,SEEK_SET);
646 AO.SaveData.Position = firstposition;
648 if ( ( ind = FindInIndex(num,&AO.SaveData,1,0) ) != 0 ) {
650 if ( PutInStore(ind,num) ) error = -1;
651 else if ( !AM.silent && silentload == 0 )
652 MesPrint(
" %s loaded",ind->name);
657 Expressions[num].counter = -1;
660 MesPrint(
" %s not found",inp);
667 if ( c !=
',' && c ) {
668 MesComp(
"Illegal character",inp,p);
675 scrpos = AR.StoreData.Position;
676 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
677 if ( ISNOTEQUALPOS(scrpos,AR.StoreData.Position) )
goto LoadWrt;
678 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(AR.StoreData.Index))
682 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
683 ind = AO.SaveData.Index.expression;
684#ifdef SYSDEPENDENTSAVE
686 if ( GetVar((UBYTE *)(ind->name),&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
687 MesPrint(
"Conflicting name: %s",ind->name);
691 if ( ( num = EntVar(CEXPRESSION,(UBYTE *)(ind->name),STOREDEXPRESSION,0,0,0) ) >= 0 ) {
693 if ( PutInStore(ind,num) ) error = -1;
694 else if ( !AM.silent && silentload == 0 )
695 MesPrint(
" %s loaded",ind->name);
701 if ( i == 0 && ISNOTZEROPOS(AO.SaveData.Index.next) ) {
702 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_SET);
703 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&(AO.SaveData.Index)),
705 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
706 ind = AO.SaveData.Index.expression;
713 if ( GetVar((UBYTE *)(ind->name),&type,&number,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
714 MesPrint(
"Conflicting name: %s",ind->name);
718 if ( ( num = EntVar(CEXPRESSION,(UBYTE *)(ind->name),STOREDEXPRESSION,0,0,0) ) >= 0 ) {
720 if ( PutInStore(ind,num) ) error = -1;
721 else if ( !AM.silent && silentload == 0 )
722 MesPrint(
" %s loaded",ind->name);
728 if ( i == 0 && (ISNOTZEROPOS(AO.SaveData.Index.next) || AO.bufferedInd) ) {
729 SeekFile(AO.SaveData.Handle,&(AO.SaveData.Index.next),SEEK_SET);
731 i = (WORD)BASEPOSITION(AO.SaveData.Index.number);
732 ind = AO.SaveData.Index.expression;
740#ifndef SYSDEPENDENTSAVE
741 if ( AO.powerFlag ) {
742 MesPrint(
"WARNING: min-/maxpower had to be adjusted!");
744 if ( AO.resizeFlag ) {
745 MesPrint(
"ERROR: could not downsize data!");
749 CloseFile(AO.SaveData.Handle);
750 AO.SaveData.Handle = -1;
751 SeekFile(AR.StoreData.Handle,&(AC.StoreFileSize),SEEK_END);
754 MesPrint(
"WriteError");
758 MesPrint(
"ReadError");
772int DeleteStore(WORD par)
779 if ( AR.StoreData.Handle >= 0 ) {
783 e_in = e_out = Expressions;
785 if ( e_in->status == STOREDEXPRESSION ) {
787 AC.exprnames->namebuffer+e_in->name);
788 node->type = CDELETE;
792 if ( e_out != e_in ) {
794 node = GetNode(AC.exprnames,
795 AC.exprnames->namebuffer+e_in->name);
796 node->number = (WORD)(e_out - Expressions);
797 e_out->onfile = e_in->onfile;
798 e_out->prototype = e_in->prototype;
799 e_out->printflag = 0;
800 e_out->status = e_in->status;
801 e_out->name = e_in->name;
802 e_out->inmem = e_in->inmem;
803 e_out->counter = e_in->counter;
804 e_out->numfactors = e_in->numfactors;
805 e_out->numdummies = e_in->numdummies;
806 e_out->compression = e_in->compression;
807 e_out->namesize = e_in->namesize;
808 e_out->whichbuffer = e_in->whichbuffer;
809 e_out->hidelevel = e_in->hidelevel;
810 e_out->node = e_in->node;
811 e_out->replace = e_in->replace;
812 e_out->vflags = e_in->vflags;
813 e_out->uflags = e_in->uflags;
815 e_out->partodo = e_in->partodo;
822 }
while ( --n > 0 ); }
824 if ( DidClean ) CompactifyTree(AC.exprnames,EXPRNAMES);
826 AR.StoreData.Handle = -1;
827 CloseFile(AC.StoreHandle);
836 SETBASEPOSITION(st->position,-1);
837 SETBASEPOSITION(st->toppos,-1);
841 for ( j = 1; j < AM.totalnumberofthreads; j++ ) {
844 SETBASEPOSITION(st->position,-1);
845 SETBASEPOSITION(st->toppos,-1);
851 PUTZERO(AC.StoreFileSize);
852 s = FG.fname;
while ( *s ) s++;
854 *s =
';'; s[1] =
'*'; s[2] = 0;
858 return(AC.StoreHandle = CreateFile(FG.fname));
878#ifndef SYSDEPENDENTSAVE
883 newind = NextFileIndex(&(Expressions[num].onfile));
885#ifndef SYSDEPENDENTSAVE
886 SETBASEPOSITION(newind->length, 0);
888 newind->variables = AR.StoreData.Fill;
889 SeekFile(AR.StoreData.Handle,&(newind->variables),SEEK_SET);
890 if ( ISNOTEQUALPOS(newind->variables,AR.StoreData.Fill) )
goto PutErrS;
891 newind->position = newind->variables;
892#ifdef SYSDEPENDENTSAVE
897 SeekFile(AO.SaveData.Handle,&scrpos,SEEK_SET);
898 if ( ISNOTEQUALPOS(scrpos,ind->
variables) )
goto PutErrS;
900 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
901#ifdef SYSDEPENDENTSAVE
904 ADD2POS(AR.StoreData.Fill,scrpos);
906 SETBASEPOSITION(scrpos1,wSize);
907#ifndef SYSDEPENDENTSAVE
910 AO.tensorList = (UBYTE *)Malloc1(MAXSAVEFUNCTION,
"PutInStore");
916 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
917 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
920 (UBYTE *)AT.WorkPointer, (UBYTE *)AT.WorkTop, &wSize, &wSizeOut, ind, &stage) ) {
923 if ( WriteFile(AR.StoreData.Handle, (UBYTE *)AT.WorkPointer, wSizeOut)
924 != wSizeOut )
goto PutErrS;
925 ADDPOS(scrpos,-wSize);
926 ADDPOS(newind->position, wSizeOut);
927 ADDPOS(AR.StoreData.Fill, wSizeOut);
928 }
while ( ISPOSPOS(scrpos) );
930 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
934 wSize = TOLONG(AT.WorkTop) - TOLONG(AT.WorkPointer);
935 if ( ISLESSPOS(scrpos,scrpos1) ) wSize = BASEPOSITION(scrpos);
936#ifdef SYSDEPENDENTSAVE
937 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)AT.WorkPointer,wSize)
938 != wSize )
goto PutErrS;
939 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,wSize)
940 != wSize )
goto PutErrS;
941 ADDPOS(scrpos,-wSize);
945 if (
ReadSaveExpression((UBYTE *)AT.WorkPointer, (UBYTE *)AT.WorkTop, &wSize, &wSizeOut) ) {
949 if ( WriteFile(AR.StoreData.Handle, (UBYTE *)AT.WorkPointer, wSizeOut)
950 != wSizeOut )
goto PutErrS;
951 ADDPOS(scrpos,-wSize);
952 ADDPOS(AR.StoreData.Fill, wSizeOut);
953 ADDPOS(newind->length, wSizeOut);
955 }
while ( ISPOSPOS(scrpos) );
958 M_free(AO.tensorList,
"PutInStore");
960 scrpos = AR.StoreData.Position;
961 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
962 if ( ISNOTEQUALPOS(scrpos,AR.StoreData.Position) )
goto PutErrS;
963 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)
sizeof(
FILEINDEX))
966 return(MesPrint(
"File error"));
992WORD GetTerm(PHEAD WORD *term)
995 WORD *inp, i, j = 0, len;
996 LONG InIn, *whichInInBuf;
997 WORD *r, *m, *mstop = 0, minsiz = 0, *bra = 0, *from;
998 WORD first, *start = 0, testing = 0;
1000 AN.deferskipped = 0;
1001 if ( AR.GetFile == 2 ) {
1003 whichInInBuf = &(AR.InHiBuf);
1007 whichInInBuf = &(AR.InInBuf);
1009 InIn = *whichInInBuf;
1011 if ( AR.KeptInHold ) {
1012 r = AR.CompressBuffer;
1015 if ( i <= 0 ) { *term = 0;
goto RegRet; }
1020 if ( AR.DeferFlag ) {
1021 m = AR.CompressBuffer;
1024 mstop -= ABS(mstop[-1]);
1026 while ( m < mstop ) {
1027 if ( *m == HAAKJE ) {
1030 bra = (WORD *)(((UBYTE *)(term)) + 2*AM.MaxTer);
1031 m = AR.CompressBuffer+1;
1033 while ( m < mstop ) *r++ = *m++;
1035 minsiz = WORDDIF(mstop,bra);
1044 bra = (WORD *)(((UBYTE *)(term)) + 2*AM.MaxTer);
1052 r = AR.CompressBuffer;
1055 ADDPOS(fi->POposition,(fi->POfull-fi->PObuffer)*
sizeof(WORD));
1056 LOCK(AS.inputslock);
1057 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1058 InIn = ReadFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize);
1059 UNLOCK(AS.inputslock);
1060 if ( ( InIn < 0 ) || ( InIn & 1 ) ) {
1066 InIn /= TABLESIZE(WORD,UBYTE);
1068 *whichInInBuf = InIn;
1069 if ( !InIn ) { *r = 0; *from = 0;
goto RegRet; }
1070 fi->POfill = fi->PObuffer;
1071 fi->POfull = fi->PObuffer + InIn;
1074 if ( ( len = i = *inp ) == 0 ) {
1087 while ( ++i <= 0 ) *term++ = *r++;
1092 *(AR.CompressBuffer) = len = *start;
1105 while ( --i >= 0 ) {
1106 *r++ = *term++ = *inp++;
1110 ADDPOS(fi->POposition,(fi->POfull-fi->PObuffer)*
sizeof(WORD));
1111 LOCK(AS.inputslock);
1112 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1113 InIn = ReadFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize);
1114 UNLOCK(AS.inputslock);
1115 if ( ( InIn <= 0 ) || ( InIn & 1 ) ) {
1121 InIn /= TABLESIZE(WORD,UBYTE);
1124 fi->POfull = inp + InIn;
1130 *(AR.CompressBuffer) = len = *start;
1133 while ( --j >= 0 ) { *r++ = *term++ = *inp++; }
1136 *whichInInBuf = InIn;
1137 AR.DefPosition = fi->POposition;
1138 ADDPOS(AR.DefPosition,((UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer)));
1142 if ( inp >= fi->POfull ) { *from = 0;
goto RegRet; }
1146 *term++ = *r++ = len = - j + 1 + *inp;
1147 while ( ++j <= 0 ) *term++ = *r++;
1150 else if ( !j ) j = 1;
1151 while ( --j >= 0 ) { *r++ = *term++ = *inp++; }
1154 SETBASEPOSITION(AR.DefPosition,((UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer)));
1155 if ( inp > fi->POfull ) {
1159 if ( r >= AR.ComprTop ) {
1160 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1163 AR.CompressPointer = r; *r = 0;
1168 if ( testing && *from != 0 ) {
1171 jj = *r - 1 - ABS(*(r+*r-1));
1172 if ( jj < minsiz )
goto strip;
1175 while ( m < mstop ) {
1179 mstop = m - ABS(m[-1]);
1181 while ( r < mstop ) {
1182 if ( *r == HAAKJE ) {
1186 len = WORDDIF(r,from);
1208 if ( ( AP.PreDebug & DUMPINTERMS ) == DUMPINTERMS ) {
1209 MLOCK(ErrorMessageLock);
1210 AO.OutFill = AO.OutputLine = OutBuf;
1215 TokenToLine((UBYTE *)(
"Input: "));
1217 TokenToLine((UBYTE *)
"zero");
1220 TokenToLine((UBYTE *)
"negative!!");
1223 while ( --i >= 0 ) {
1224 TalToLine((UWORD)(*r++)); TokenToLine((UBYTE *)
" ");
1228 MUNLOCK(ErrorMessageLock);
1236 MesPrint(
"Error while reading scratch file in GetTerm");
1272 WORD *r, *rr = AR.CompressPointer;
1287 if ( AT.identity > 0 ) par = 1;
1297 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,1L,pos);
1300 LOCK(AS.inputslock);
1301 SeekFile(fi->
handle,pos,SEEK_SET);
1302 siz = ReadFile(fi->
handle,(UBYTE *)term,
sizeof(WORD));
1303 UNLOCK(AS.inputslock);
1306 if ( siz ==
sizeof(WORD) ) {
1309 if ( ( i > AM.MaxTer/((WORD)
sizeof(WORD)) ) || ( -i >= AM.MaxTer/((WORD)
sizeof(WORD)) ) )
1317 while ( ++i <= 0 ) *term++ = *r++;
1319 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,1L,pos);
1322 LOCK(AS.inputslock);
1323 SeekFile(fi->
handle,pos,SEEK_SET);
1324 siz = ReadFile(fi->
handle,(UBYTE *)term,
sizeof(WORD));
1325 UNLOCK(AS.inputslock);
1326 ADDPOS(*pos,
sizeof(WORD));
1328 if ( siz !=
sizeof(WORD) ) {
1334 if ( ( j > AM.MaxTer/((WORD)
sizeof(WORD)) ) || ( j <= 0 ) )
1342 if ( !j )
return(0);
1348 siz = ReadPosFile(BHEAD fi,(UBYTE *)term,j,pos);
1349 j *= TABLESIZE(WORD,UBYTE);
1352 j *= TABLESIZE(WORD,UBYTE);
1353 LOCK(AS.inputslock);
1354 SeekFile(fi->
handle,pos,SEEK_SET);
1355 siz = ReadFile(fi->
handle,(UBYTE *)term,j);
1356 UNLOCK(AS.inputslock);
1363 while ( --i >= 0 ) *r++ = *term++;
1364 if ( r >= AR.ComprTop ) {
1365 MLOCK(ErrorMessageLock);
1366 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1367 MUNLOCK(ErrorMessageLock);
1370 AR.CompressPointer = r; *r = 0;
1379 fi->POfill = (WORD *)((UBYTE *)(fi->PObuffer) + BASEPOSITION(*pos));
1381 if ( p >= fi->POfull ) { *term = 0;
return(0); }
1385 j = *r++ = *term++ = -i + 1 + *p;
1386 while ( ++i <= 0 ) *term++ = *r++;
1389 if ( i == 0 ) { i = 1; *r++ = 0; *term++ = 0; }
1390 else {
while ( --i >= 0 ) { *r++ = *term++ = *p++; } }
1392 SETBASEPOSITION(*pos,(UBYTE *)(fi->POfill)-(UBYTE *)(fi->PObuffer));
1393 if ( p <= fi->POfull ) {
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;
1406 MLOCK(ErrorMessageLock);
1407 MesPrint(
"Error while reading scratch file in GetOneTerm (%d)",error);
1408 MUNLOCK(ErrorMessageLock);
1425WORD GetMoreTerms(WORD *term)
1428 WORD *t, *r, *m, *h, *tstop, i, inc, same;
1434 extra = ((AM.MaxTer/
sizeof(WORD))*((LONG)100-AC.CollectPercentage))/100;
1435 if ( extra < 23 ) extra = 23;
1440 tstop = t - ABS(t[-1]);
1442 while ( *h != HAAKJE && h < tstop ) h += h[1];
1443 if ( h >= tstop )
return(retval);
1444 inc = FUNHEAD+ARGHEAD+1-h[1];
1445 same = WORDDIF(h,term) + h[1] - 1;
1448 while ( t > tstop ) *--r = *--t;
1451 while ( GetTerm(BHEAD m) > 0 ) {
1454 if ( same > ( i = ( *m - ABS(*t) -1 ) ) ) {
1455 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1460 while ( --i >= 0 ) {
1462 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1467 if ( ( WORDDIF(m,term) + i + extra ) > (WORD)(AM.MaxTer/
sizeof(WORD)) ) {
1469 if ( AS.CollectOverFlag == 0 && AC.AltCollectFun == 0 ) {
1470 Warning(
"Bracket contents too long in Collect statement");
1471 Warning(
"Contents spread over more than one term");
1472 Warning(
"If possible: increase MaxTermSize in setfile");
1473 AS.CollectOverFlag = 1;
1475 else if ( AC.AltCollectFun ) {
1476 AS.CollectOverFlag = 2;
1483 while ( r < tstop ) *m++ = *r++;
1485 if ( extra == 23 ) extra = ((AM.MaxTer/
sizeof(WORD))/6);
1488 h[1] = WORDDIF(m,h);
1489 if ( AS.CollectOverFlag > 1 ) {
1490 *h = AC.AltCollectFun;
1491 if ( AS.CollectOverFlag == 3 ) AS.CollectOverFlag = 1;
1493 else *h = AC.CollectFun;
1495 h[FUNHEAD] = h[1] - FUNHEAD;
1497 if ( ToFast(h+FUNHEAD,h+FUNHEAD) ) {
1498 if ( h[FUNHEAD] <= -FUNCTION ) {
1510 *term = WORDDIF(m,term);
1521int GetMoreFromMem(WORD *term, WORD **tpoin)
1524 WORD *t, *r, *m, *h, *tstop, i, j, inc, same;
1530 tstop = t - ABS(t[-1]);
1532 while ( *h != HAAKJE && h < tstop ) h += h[1];
1533 if ( h >= tstop )
return(0);
1534 inc = FUNHEAD+ARGHEAD+1-h[1];
1535 same = WORDDIF(h,term) + h[1] - 1;
1538 while ( t > tstop ) *--r = *--t;
1543 for ( i = 0; i < j; i++ ) m[i] = *r++;
1547 if ( same > ( i = ( *m - ABS(*t) -1 ) ) ) {
1548 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1553 while ( --i >= 0 ) {
1555 if ( AC.AltCollectFun && AS.CollectOverFlag == 2 ) AS.CollectOverFlag = 3;
1560 if ( ( WORDDIF(m,term) + i + extra ) > (LONG)(AM.MaxTer/(2*
sizeof(WORD))) ) {
1562 if ( AS.CollectOverFlag == 0 && AC.AltCollectFun == 0 ) {
1563 Warning(
"Bracket contents too long in Collect statement");
1564 Warning(
"Contents spread over more than one term");
1565 Warning(
"If possible: increase MaxTermSize in setfile");
1566 AS.CollectOverFlag = 1;
1568 else if ( AC.AltCollectFun ) {
1569 AS.CollectOverFlag = 2;
1576 while ( r < tstop ) *m++ = *r++;
1577 if ( extra == 23 ) extra = ((AM.MaxTer/
sizeof(WORD))/6);
1580 h[1] = WORDDIF(m,h);
1581 if ( AS.CollectOverFlag > 1 ) {
1582 *h = AC.AltCollectFun;
1583 if ( AS.CollectOverFlag == 3 ) AS.CollectOverFlag = 1;
1585 else *h = AC.CollectFun;
1587 h[FUNHEAD] = h[1] - FUNHEAD;
1589 if ( ToFast(h+FUNHEAD,h+FUNHEAD) ) {
1590 if ( h[FUNHEAD] <= -FUNCTION ) {
1602 *term = WORDDIF(m,term);
1628WORD GetFromStore(WORD *to,
POSITION *position,
RENUMBER renumber, WORD *InCompState, WORD nexpr)
1631 LONG RetCode, num, first = 0;
1636 WORD *r, *rr = AR.CompressPointer;
1639 sc.next = AT.StoreCache;
1646 if ( BASEPOSITION(s->position) == -1 )
break;
1647 if ( ISLESSPOS(*position,s->toppos) &&
1648 ISGEPOS(*position,s->position) ) {
1649 if ( AT.StoreCache != s ) {
1650 sold->next = s->next;
1651 s->next = AT.StoreCache->next;
1654 from = (WORD *)(((UBYTE *)(s->buffer)) + DIFBASE(*position,s->position));
1656 if ( !num ) {
return(*to = 0); }
1657 *InCompState = (WORD)num;
1661 ADDPOS(*position,
sizeof(WORD));
1662 *m++ = (WORD)(-num+1);
1664 while ( ++num <= 0 ) *m++ = *r++;
1665 if ( ISLESSPOS(*position,s->toppos) ) {
1668 ADDPOS(*position,
sizeof(WORD));
1669 *InCompState = (WORD)(num + 2);
1677 while ( num > 0 && ISLESSPOS(*position,s->toppos) ) {
1678 *r++ = *m++ = *from++; ADDPOS(*position,
sizeof(WORD)); num--;
1682 SETBASEPOSITION(s->position,-1);
1683 SETBASEPOSITION(s->toppos,-1);
1684 LOCK(AM.storefilelock);
1685 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1686 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)(s->buffer),AM.SizeStoreCache);
1687 UNLOCK(AM.storefilelock);
1688 if ( RetCode < 0 )
goto PastErr;
1689 if ( !RetCode )
return( *to = 0 );
1690 s->position = *position;
1691 s->toppos = *position;
1692 ADDPOS(s->toppos,RetCode);
1696 ADDPOS(*position,
sizeof(WORD));
1701 *InCompState = (WORD)(num + 2);
1708 if ( AT.StoreCache ) {
1709 s->position = *position;
1710 LOCK(AM.storefilelock);
1711 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1712 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)(s->buffer),AM.SizeStoreCache);
1713 UNLOCK(AM.storefilelock);
1714 if ( RetCode < 0 )
goto PastErr;
1715 if ( !RetCode )
return( *to = 0 );
1716 s->toppos = *position;
1717 ADDPOS(s->toppos,RetCode);
1718 if ( AT.StoreCache != s ) {
1719 sold->next = s->next;
1720 s->next = AT.StoreCache->next;
1726 if ( !num ) {
return( *to = 0 ); }
1727 *InCompState = (WORD)num;
1729 *m++ = (WORD)(-num+1);
1732 ADDPOS(*position,
sizeof(WORD));
1733 while ( ++num <= 0 ) *m++ = *r++;
1736 ADDPOS(*position,
sizeof(WORD));
1737 *InCompState = (WORD)(num+2);
1742 LOCK(AM.storefilelock);
1743 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1744 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)to,(LONG)
sizeof(WORD));
1745 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1746 UNLOCK(AM.storefilelock);
1747 if ( RetCode !=
sizeof(WORD) ) {
1749 return((WORD)RetCode);
1751 if ( !*to )
return(0);
1755 *to = *r++ = (WORD)(-num + 1);
1756 while ( ++num <= 0 ) *m++ = *r++;
1757 LOCK(AM.storefilelock);
1758 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1759 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)m,(LONG)
sizeof(WORD));
1760 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1761 UNLOCK(AM.storefilelock);
1762 if ( RetCode !=
sizeof(WORD) ) {
1763 MLOCK(ErrorMessageLock);
1764 MesPrint(
"@Error in compression of store file");
1765 MUNLOCK(ErrorMessageLock);
1770 *InCompState = (WORD)(num + 2);
1774 num = *to - 1; m = to + 1; r = rr + 1;
1777 num *= wsizeof(WORD);
1779 MLOCK(ErrorMessageLock);
1780 MesPrint(
"@Error in stored expressions file at position %9p",position);
1781 MUNLOCK(ErrorMessageLock);
1784 LOCK(AM.storefilelock);
1785 SeekFile(AR.StoreData.Handle,position,SEEK_SET);
1786 RetCode = ReadFile(AR.StoreData.Handle,(UBYTE *)m,num);
1787 SeekFile(AR.StoreData.Handle,position,SEEK_CUR);
1788 UNLOCK(AM.storefilelock);
1789 if ( RetCode != num ) {
1790 MLOCK(ErrorMessageLock);
1791 MesPrint(
"@Error in stored expressions file at position %9p",position);
1792 MUNLOCK(ErrorMessageLock);
1798 if ( r >= AR.ComprTop ) {
1799 MLOCK(ErrorMessageLock);
1800 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1801 MUNLOCK(ErrorMessageLock);
1804 AR.CompressPointer = r; *r = 0;
1806 MarkDirty(to,DIRTYSYMFLAG);
1807 if ( AR.CurDum > AM.IndDum && Expressions[nexpr].numdummies > 0 )
1808 MoveDummies(BHEAD to,AR.CurDum - AM.IndDum);
1812 MLOCK(ErrorMessageLock);
1813 MesCall(
"GetFromStore");
1814 MUNLOCK(ErrorMessageLock);
1829void DetVars(WORD *term, WORD par)
1835 stopper = term + *term - 1;
1836 stopper = stopper - ABS(*stopper) + 1;
1840 if ( ( n = NumSymbols ) > 0 ) {
1844 (tt++)->flags &= ~INUSE;
1845 }
while ( --n > 0 );
1847 if ( ( n = NumIndices ) > 0 ) {
1851 (tt++)->flags &= ~INUSE;
1852 }
while ( --n > 0 );
1854 if ( ( n = NumVectors ) > 0 ) {
1858 (tt++)->flags &= ~INUSE;
1859 }
while ( --n > 0 );
1861 if ( ( n = NumFunctions ) > 0 ) {
1865 (tt++)->flags &= ~INUSE;
1866 }
while ( --n > 0 );
1869 while ( term < stopper ) {
1870 if ( *term == SYMTOSYM || *term == SYMTONUM ) {
1872 AN.UsedSymbol[*term] = 1;
1873 symbols[*term].flags |= INUSE;
1875 else if ( *term == VECTOVEC ) {
1877 AN.UsedVector[*term-AM.OffsetVector] = 1;
1878 vectors[*term-AM.OffsetVector].flags |= INUSE;
1880 else if ( *term == INDTOIND ) {
1882 sym = indices[*term - AM.OffsetIndex].dimension;
1883 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1884 AN.UsedIndex[(*term) - AM.OffsetIndex] = 1;
1885 sym = indices[*term-AM.OffsetIndex].nmin4;
1886 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1887 indices[*term-AM.OffsetIndex].flags |= INUSE;
1889 else if ( *term == FUNTOFUN ) {
1891 AN.UsedFunction[*term-FUNCTION] = 1;
1892 functions[*term-FUNCTION].flags |= INUSE;
1898 while ( term < stopper ) {
1900 if ( *term == SYMBOL ) {
1903 AN.UsedSymbol[*term] = 1;
1905 }
while ( term < t );
1907 else if ( *term == DOTPRODUCT ) {
1910 AN.UsedVector[(*term++) - AM.OffsetVector] = 1;
1911 AN.UsedVector[(*term) - AM.OffsetVector] = 1;
1913 }
while ( term < t );
1915 else if ( *term == VECTOR ) {
1918 AN.UsedVector[(*term++) - AM.OffsetVector] = 1;
1919 if ( *term >= AM.OffsetIndex && *term < AM.DumInd ) {
1920 sym = indices[*term - AM.OffsetIndex].dimension;
1921 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1922 AN.UsedIndex[*term - AM.OffsetIndex] = 1;
1923 sym = indices[(*term++)-AM.OffsetIndex].nmin4;
1924 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1927 }
while ( term < t );
1929 else if ( *term == INDEX || *term == LEVICIVITA || *term == GAMMA
1930 || *term == DELTA ) {
1935 if ( *term == INDEX || *term == DELTA ) term += 2;
1940 while ( term < t ) {
1941 if ( *term >= AM.OffsetIndex && *term < AM.DumInd ) {
1942 sym = indices[*term - AM.OffsetIndex].dimension;
1943 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1944 AN.UsedIndex[(*term) - AM.OffsetIndex] = 1;
1945 sym = indices[*term-AM.OffsetIndex].nmin4;
1946 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1948 else if ( *term < (WILDOFFSET+AM.OffsetVector) )
1949 AN.UsedVector[(*term) - AM.OffsetVector] = 1;
1953 else if ( *term == HAAKJE ) term = t;
1955 if ( *term > MAXBUILTINFUNCTION )
1956 AN.UsedFunction[(*term)-FUNCTION] = 1;
1957 if ( *term >= FUNCTION && functions[*term-FUNCTION].spec
1958 >= TENSORFUNCTION && term[1] > FUNHEAD )
goto Tensors;
1960 while ( term < t ) {
1964 sarg = term + *term;
1966 if ( term < sarg ) {
do {
1969 }
while ( term < sarg ); }
1972 if ( *term < -MAXBUILTINFUNCTION ) {
1973 AN.UsedFunction[-*term-FUNCTION] = 1;
1975 else if ( *term == -SYMBOL ) {
1976 AN.UsedSymbol[term[1]] = 1;
1978 else if ( *term == -INDEX ) {
1979 if ( term[1] < (WILDOFFSET+AM.OffsetVector) ) {
1980 AN.UsedVector[term[1]-AM.OffsetVector] = 1;
1982 else if ( term[1] >= AM.OffsetIndex && term[1] < AM.DumInd ) {
1983 sym = indices[term[1] - AM.OffsetIndex].dimension;
1984 if ( sym < 0 ) AN.UsedSymbol[-sym] = 1;
1985 AN.UsedIndex[term[1] - AM.OffsetIndex] = 1;
1986 sym = indices[term[1]-AM.OffsetIndex].nmin4;
1987 if ( sym < -NMIN4SHIFT ) AN.UsedSymbol[-sym-NMIN4SHIFT] = 1;
1990 else if ( *term == -VECTOR || *term == -MINVECTOR ) {
1991 AN.UsedVector[term[1]-AM.OffsetVector] = 1;
2025 if ( ( indexent = NextFileIndex(&indexpos) ) == 0 ) {
2026 MesCall(
"ToStorage");
2030 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2031 if ( e->status == HIDDENGEXPRESSION ) {
2032 AR.InHiBuf = 0; f = AR.hidefile; AR.GetFile = 2;
2035 AR.InInBuf = 0; f = AR.infile; AR.GetFile = 0;
2039 SeekFile(f->
handle,&scrpos,SEEK_SET);
2040 if ( ISNOTEQUALPOS(scrpos,e->onfile) ) {
2041 MesPrint(
":::Error in Scratch file");
2044 f->POposition = e->onfile;
2045 f->POfull = f->PObuffer;
2046 if ( e->status == HIDDENGEXPRESSION ) AR.InHiBuf = 0;
2047 else AR.InInBuf = 0;
2050 f->POfill = (WORD *)((UBYTE *)(f->PObuffer)+BASEPOSITION(e->onfile));
2053 AN.UsedSymbol = w; w += NumSymbols;
2054 AN.UsedVector = w; w += NumVectors;
2055 AN.UsedIndex = w; w += NumIndices;
2056 AN.UsedFunction = w; w += NumFunctions;
2058 w = (WORD *)(((UBYTE *)(w)) + AM.MaxTer);
2059 if ( w > AT.WorkTop ) {
2064 i = NumSymbols + NumVectors + NumIndices + NumFunctions;
2065 do { *w++ = 0; }
while ( --i > 0 );
2066 if ( GetTerm(BHEAD term) > 0 ) {
2068 if ( GetTerm(BHEAD term) ) {
2069 do { DetVars(term,0); }
while ( GetTerm(BHEAD term) > 0 );
2075 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2081 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2087 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2091 w = AN.UsedFunction;
2093 while ( --i >= 0 ) {
if ( *w++ ) j++; }
2096 indexent->
length = *length;
2097 indexent->
variables = AR.StoreData.Fill;
2099 StrCopy(AC.exprnames->namebuffer+e->name,(UBYTE *)(indexent->
name));
2100 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2102 AO.wpos = (UBYTE *)Malloc1(AO.wlen,
"AO.wpos buffer");
2110 while ( --i >= 0 ) {
2111 while ( !*w ) { w++; a++; j++; }
2113 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct SyMbOl)),a->name,
2114 a->namesize) )
goto ErrToSto;
2124 while ( --i >= 0 ) {
2125 while ( !*w ) { w++; a++; j++; }
2127 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct InDeX)),a->name,
2128 a->namesize) )
goto ErrToSto;
2138 while ( --i >= 0 ) {
2139 while ( !*w ) { w++; a++; j++; }
2141 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct VeCtOr)),a->name,
2142 a->namesize) )
goto ErrToSto;
2148 w = AN.UsedFunction;
2152 while ( --i >= 0 ) {
2153 while ( !*w ) { w++; a++; j++; }
2155 if ( VarStore((UBYTE *)a,(WORD)(
sizeof(
struct FuNcTiOn)),a->name,
2156 a->namesize) )
goto ErrToSto;
2160 if ( VarStore((UBYTE *)0L,(WORD)0,(WORD)0,(WORD)0) )
goto ErrToSto;
2161 TELLFILE(AR.StoreData.Handle,&(indexent->
position));
2170 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->numdummies)),(LONG)
sizeof(WORD)) !=
2172 MesPrint(
"Error while writing storage file");
2175 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->numfactors)),(LONG)
sizeof(WORD)) !=
2177 MesPrint(
"Error while writing storage file");
2180 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->vflags)),(LONG)
sizeof(WORD)) !=
2182 MesPrint(
"Error while writing storage file");
2185 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(e->uflags)),(LONG)
sizeof(WORD)) !=
2187 MesPrint(
"Error while writing storage file");
2190 TELLFILE(AR.StoreData.Handle,&(indexent->
position));
2194 SeekFile(f->
handle,&(e->onfile),SEEK_SET);
2195 while ( ISPOSPOS(llength) ) {
2196 SETBASEPOSITION(scrpos,AO.wlen);
2197 if ( ISLESSPOS(llength,scrpos) ) size = BASEPOSITION(llength);
2198 else size = AO.wlen;
2199 if ( ReadFile(f->
handle,AO.wpos,size) != size ) {
2200 MesPrint(
"Error while reading scratch file");
2203 if ( WriteFile(AR.StoreData.Handle,AO.wpos,size) != size ) {
2204 MesPrint(
"Error while writing storage file");
2207 ADDPOS(llength,-size);
2212 ppp = (WORD *)((UBYTE *)(f->PObuffer) + BASEPOSITION(e->onfile));
2213 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)ppp,BASEPOSITION(*length)) !=
2214 BASEPOSITION(*length) ) {
2215 MesPrint(
"Error while writing storage file");
2219 ADD2POS(*length,indexent->
position);
2220 e->onfile = indexpos;
2224 AR.StoreData.Fill = *length;
2225 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2226 scrpos = AR.StoreData.Position;
2228 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
2229 if ( WriteFile(AR.StoreData.Handle,((UBYTE *)&(AR.StoreData.Index.number))
2231 SeekFile(AR.StoreData.Handle,&indexpos,SEEK_SET);
2232 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)indexent,(LONG)(
sizeof(
INDEXENTRY))) !=
2234 FlushFile(AR.StoreData.Handle);
2235 SeekFile(AR.StoreData.Handle,&(AC.StoreFileSize),SEEK_END);
2236 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2237 if ( AO.wpos ) M_free(AO.wpos,
"AO.wpos buffer");
2238 AO.wpos = AO.wpoin = 0;
2241 MesPrint(
"---Error while storing namelists");
2244 MesPrint(
"Error in storage");
2246 if ( AO.wpos ) M_free(AO.wpos,
"AO.wpos buffer");
2247 AO.wpos = AO.wpoin = 0;
2248 f = AR.infile; AR.infile = AR.outfile; AR.outfile = f;
2261 int i, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
2263 if ( AR.StoreData.Handle <= 0 ) {
2265 MesCall(
"NextFileIndex");
2268 SETBASEPOSITION(AR.StoreData.Index.number,1);
2269#ifdef SYSDEPENDENTSAVE
2270 SETBASEPOSITION(*indexpos,(2*
sizeof(
POSITION)));
2274 return(AR.StoreData.Index.expression);
2276 while ( BASEPOSITION(AR.StoreData.Index.number) >= (LONG)(
INFILEINDEX) ) {
2277 if ( ISNOTZEROPOS(AR.StoreData.Index.next) ) {
2278 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Index.next),SEEK_SET);
2279 AR.StoreData.Position = AR.StoreData.Index.next;
2280 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2281 (LONG)(
sizeof(
FILEINDEX)) )
goto ErrNextS;
2284 PUTZERO(AR.StoreData.Index.number);
2285 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Position),SEEK_SET);
2286 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&(AR.StoreData.Fill)),(LONG)(
sizeof(
POSITION)))
2287 != (LONG)(
sizeof(
POSITION)) )
goto ErrNextS;
2288 PUTZERO(AR.StoreData.Index.next);
2289 SeekFile(AR.StoreData.Handle,&(AR.StoreData.Fill),SEEK_SET);
2290 AR.StoreData.Position = AR.StoreData.Fill;
2291 lo = (LONG *)(&AR.StoreData.Index);
2292 for ( i = 0; i < j; i++ ) *lo++ = 0;
2293 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2294 (LONG)(
sizeof(
FILEINDEX)) )
goto ErrNextS;
2295 ADDPOS(AR.StoreData.Fill,
sizeof(
FILEINDEX));
2298 *indexpos = AR.StoreData.Position;
2299 ADDPOS(*indexpos,(2*
sizeof(
POSITION)) +
2300 BASEPOSITION(AR.StoreData.Index.number) *
sizeof(
INDEXENTRY));
2301 ind = &AR.StoreData.Index.expression[BASEPOSITION(AR.StoreData.Index.number)];
2302 ADDPOS(AR.StoreData.Index.number,1);
2305 MesPrint(
"Error in storage file");
2323 int i, j =
sizeof(
FILEINDEX)/(
sizeof(LONG));
2325 if ( AR.StoreData.Handle < 0 ) {
2326 AR.StoreData.Handle = AC.StoreHandle;
2327 PUTZERO(AR.StoreData.Index.next);
2328 PUTZERO(AR.StoreData.Index.number);
2329#ifdef SYSDEPENDENTSAVE
2330 SETBASEPOSITION(AR.StoreData.Fill,
sizeof(
FILEINDEX));
2332 if (
WriteStoreHeader(AR.StoreData.Handle) )
return(MesPrint(
"Error writing storage file header"));
2335 lo = (LONG *)(&AR.StoreData.Index);
2336 for ( i = 0; i < j; i++ ) *lo++ = 0;
2337 if ( WriteFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2338 (LONG)(
sizeof(
FILEINDEX)) )
return(MesPrint(
"Error writing storage file"));
2342#ifdef SYSDEPENDENTSAVE
2345 SETBASEPOSITION(scrpos, (LONG)(
sizeof(
STOREHEADER)));
2347 SeekFile(AR.StoreData.Handle,&scrpos,SEEK_SET);
2348 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(&AR.StoreData.Index),(LONG)(
sizeof(
FILEINDEX))) !=
2349 (LONG)(
sizeof(
FILEINDEX)) )
return(MesPrint(
"Error reading storage file"));
2351#ifdef SYSDEPENDENTSAVE
2352 PUTZERO(AR.StoreData.Position);
2354 SETBASEPOSITION(AR.StoreData.Position, (LONG)(
sizeof(
STOREHEADER)));
2369int VarStore(UBYTE *s, WORD n, WORD name, WORD namesize)
2375 t = (UBYTE *)AO.wpoin;
2379 u = AO.wpos+AO.wlen;
2380 while ( n > 0 && t < u ) { *t++ = *s++; n--; }
2382 if ( WriteFile(AR.StoreData.Handle,AO.wpos,AO.wlen) != AO.wlen )
return(-1);
2384 while ( n > 0 && t < u ) { *t++ = *s++; n--; }
2386 s = AC.varnames->namebuffer + name;
2388 n +=
sizeof(
void *)-1; n &= -(
sizeof(
void *));
2391 while ( n > 0 && t < u ) {
2392 if ( namesize > 0 ) { *t++ = *s++; namesize--; }
2397 if ( WriteFile(AR.StoreData.Handle,AO.wpos,AO.wlen) != AO.wlen )
return(-1);
2399 while ( n > 0 && t < u ) {
2400 if ( namesize > 0 ) { *t++ = *s++; namesize--; }
2409 size = AO.wpoin - AO.wpos;
2410 if ( WriteFile(AR.StoreData.Handle,AO.wpos,size) != size )
return(-1);
2435 stopper = term + *term - 1;
2436 stopper = stopper - ABS(*stopper) + 1;
2438 while ( term < stopper ) {
2442 if ( *term == SYMBOL ) {
2446 if ( ( n = FindrNumber(*term,&(renumber->
symb)) ) < 0 )
goto ErrR;
2447 *term = renumber->
symnum[n];
2449 }
while ( term < t );
2451 else if ( *term == DOTPRODUCT ) {
2455 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2457 *term++ = renumber->
vecnum[n];
2458 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2460 *term = renumber->
vecnum[n];
2462 }
while ( term < t );
2464 else if ( *term == VECTOR ) {
2468 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2470 *term++ = renumber->
vecnum[n];
2471 if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2472 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2474 *term++ = renumber->
indnum[n];
2477 }
while ( term < t );
2479 else if ( *term == INDEX || *term == LEVICIVITA || *term == GAMMA
2480 || *term == DELTA ) {
2483 if ( *term == INDEX || * term == DELTA ) term += 2;
2484 else term += FUNHEAD;
2488 while ( term < t ) {
2489 if ( *term >= AM.OffsetIndex + WILDOFFSET ) {
2494 else if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2495 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2497 *term = renumber->
indnum[n];
2499 else if ( *term < (WILDOFFSET+AM.OffsetVector) ) {
2500 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2502 *term = renumber->
vecnum[n];
2507 else if ( *term == HAAKJE ) term += term[1];
2509 if ( *term > MAXBUILTINFUNCTION ) {
2510 if ( ( n = FindrNumber(*term,&(renumber->
func)) )
2512 *term = renumber->
funnum[n];
2514 if ( *term >= FUNCTION && functions[*term-FUNCTION].spec
2515 >= TENSORFUNCTION && term[1] > FUNHEAD )
goto Tensors;
2518 while ( term < t ) {
2529 while ( term < sarg ) {
2535 if ( *term <= -MAXBUILTINFUNCTION ) {
2536 if ( ( n = FindrNumber(-*term,&(renumber->
func)) )
2538 *term = -renumber->
funnum[n];
2540 else if ( *term == -SYMBOL ) {
2542 if ( ( n = FindrNumber(*term,
2543 &(renumber->
symb)) ) < 0 )
goto ErrR;
2544 *term = renumber->
symnum[n];
2546 else if ( *term == -INDEX ) {
2548 if ( *term >= AM.OffsetIndex + WILDOFFSET ) {
2553 else if ( ( *term >= AM.OffsetIndex ) && ( *term < AM.IndDum ) ) {
2554 if ( ( n = FindrNumber(*term,&(renumber->
indi)) )
2556 *term = renumber->
indnum[n];
2558 else if ( *term < (WILDOFFSET+AM.OffsetVector) ) {
2559 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2561 *term = renumber->
vecnum[n];
2564 else if ( *term == -VECTOR || *term == -MINVECTOR ) {
2566 if ( ( n = FindrNumber(*term,&(renumber->
vect)) )
2568 *term = renumber->
vecnum[n];
2578 MesCall(
"TermRenumber");
2587WORD FindrNumber(WORD n,
VARRENUM *v)
2595 MesPrint(
"Serious problems coming up in FindrNumber");
2600 while ( *med != n ) {
2602 if ( med == hi )
goto ErrFindr;
2604 med = hi - ((WORDDIF(hi,med))/2);
2607 if ( med == lo )
goto ErrFindr;
2609 med = lo + ((WORDDIF(med,lo))/2);
2612 return(WORDDIF(med,v->
lo));
2619 i = WORDDIF(v->
hi,v->
lo);
2620 MesPrint(
"FindrNumber: n = %d, list has %d members",n,i);
2622 MesPrint(
"v->lo[%d] = %d",i,v->
lo[i]); i--;
2627 MesPrint(
"Start with %d,%d,%d",0,WORDDIF(med,v->
lo),WORDDIF(hi,v->
lo));
2628 while ( *med != n ) {
2630 if ( med == hi )
goto ErrFindr2;
2632 med = hi - ((WORDDIF(hi,med))/2);
2635 if ( med == lo )
goto ErrFindr2;
2637 med = ((WORDDIF(med,lo))/2) + lo;
2639 MesPrint(
"New: %d,%d,%d, *med = %d",WORDDIF(lo,v->
lo),WORDDIF(med,v->
lo),WORDDIF(hi,v->
lo),*med);
2642 return(WORDDIF(med,v->
lo));
2644 return(MesPrint(
"Renumbering problems"));
2669 WORD *start, *stop, *stop2, *m2, nomatch = 0;
2670 POSITION stindex, indexpos, scrpos;
2672 stindex = f->Position;
2677 while ( m < stop ) {
2678 if ( *m == FROMBRAC || *m == WILDCARDS )
break;
2682 if ( !par ) hand = AR.StoreData.Handle;
2683 else hand = AO.SaveData.Handle;
2685 if ( ( i = (WORD)BASEPOSITION(f->Index.
number) ) != 0 ) {
2686 indexpos = f->Position;
2687 ADDPOS(indexpos,(2*
sizeof(
POSITION)));
2690 if ( ( !par && ISEQUALPOS(indexpos,Expressions[expr].onfile) )
2691 || ( par && !StrCmp(EXPRNAME(expr),(UBYTE *)(ind->name)) ) ) {
2703 if ( par )
return(ind);
2704 scrpos = ind->position;
2705 SeekFile(hand,&scrpos,SEEK_SET);
2706 if ( ISNOTEQUALPOS(scrpos,ind->position) )
goto ErrGt2;
2707 if ( ReadFile(hand,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
2708 sizeof(WORD) || !*AT.WorkPointer )
goto ErrGt2;
2709 num = *AT.WorkPointer - 1;
2710 num *= wsizeof(WORD);
2711 if ( *AT.WorkPointer < 0 ||
2712 ReadFile(hand,(UBYTE *)(AT.WorkPointer+1),num) != num )
goto ErrGt2;
2714 m2 = AT.WorkPointer + 1;
2717 while ( m < stop && m2 < stop2 ) {
2718 if ( *m == SYMBOL ) {
2719 if ( *m2 != SYMTOSYM )
break;
2722 else if ( *m == INDEX ) {
2724 if ( *m2 != INDTOIND )
break;
2727 if ( *m2 != VECTOVEC )
break;
2731 else if ( *m >= FUNCTION ) {
2732 if ( *m2 != FUNTOFUN )
break;
2739 if ( ( m >= stop && m2 >= stop2 ) || mode == 0 ) {
2740 AT.WorkPointer = stop2;
2747 }
while ( --i > 0 );
2749 f->Position = f->Index.
next;
2750#ifndef SYSDEPENDENTSAVE
2751 if ( !ISNOTZEROPOS(f->Position) ) ADDPOS(f->Position,
sizeof(
STOREHEADER));
2754 if ( ISEQUALPOS(f->Position,stindex) && !AO.bufferedInd )
goto ErrGetTab;
2756 SeekFile(AR.StoreData.Handle,&(f->Position),SEEK_SET);
2757 if ( ISNOTEQUALPOS(f->Position,AR.StoreData.Position) )
goto ErrGt2;
2758#ifndef SYSDEPENDENTSAVE
2759 if ( ReadFile(f->Handle, (UBYTE *)(&(f->Index)),
number) !=
number )
goto ErrGt2;
2763 SeekFile(AO.SaveData.Handle,&(f->Position),SEEK_SET);
2764 if ( ISNOTEQUALPOS(f->Position,AO.SaveData.Position) )
goto ErrGt2;
2765#ifndef SYSDEPENDENTSAVE
2769#ifdef SYSDEPENDENTSAVE
2771 if ( ReadFile(f->Handle,(UBYTE *)(&(f->Index)),
number) !=
2777 MesPrint(
"Parameters of expression %s don't match."
2781 MesPrint(
"Cannot find expression %s",EXPRNAME(expr));
2785 MesPrint(
"Readerror in IndexSearch");
2831 LONG num, nsize, xx;
2832 WORD jsym, jind, jvec, jfun;
2833 WORD k, type, error = 0, *oldw, *neww, *oldwork = AT.WorkPointer;
2858 oldw = AT.WorkPointer + 1 + SUBEXPSIZE;
2864 LOCK(AM.storefilelock);
2865 if ( ( ind = FindInIndex(expr,&AR.StoreData,0,mode) ) == 0 ) {
2866 UNLOCK(AM.storefilelock);
2870 xx = ind->nsymbols+ind->nindices+ind->nvectors+ind->nfunctions;
2872 Expressions[expr].renumlists =
2873 w = AN.dummyrenumlist;
2881 w = (WORD *)Malloc1(
sizeof(WORD)*(xx*2),
"VarSpace");
2906 w += ind->nfunctions;
2911 SeekFile(AR.StoreData.Handle,&(ind->variables),SEEK_SET);
2912 *position = ind->position;
2913 jsym = ind->nsymbols;
2914 jvec = ind->nvectors;
2915 jind = ind->nindices;
2916 jfun = ind->nfunctions;
2922 w = r->
symb.
lo; j = jsym;
2923 for ( i = 0; i < j; i++ ) {
2924 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct SyMbOl)))
2925 !=
sizeof(
struct SyMbOl) )
goto ErrGt2;
2926 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
2927 nsize &= -
sizeof(
void *);
2928 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
2929 != nsize )
goto ErrGt2;
2931 if ( ( s->flags & INUSE ) != 0 ) {
2934 while ( *neww != SYMTOSYM || neww[2] != *w ) neww += neww[1];
2937 else if ( GetVar((UBYTE *)AT.WorkPointer,&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
2938 if ( type != CSYMBOL ) {
2939 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
2943 if ( ( s->complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) !=
2944 ( symbols[k].complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) ) {
2945 MesPrint(
"Warning: Conflicting complexity for %s",AT.WorkPointer);
2948 if ( ( s->complex & (VARTYPEROOTOFUNITY) ) !=
2949 ( symbols[k].complex & (VARTYPEROOTOFUNITY) ) ) {
2950 MesPrint(
"Warning: Conflicting root of unity properties for %s",AT.WorkPointer);
2953 if ( ( s->complex & VARTYPEROOTOFUNITY ) == VARTYPEROOTOFUNITY ) {
2954 if ( s->maxpower != symbols[k].maxpower ) {
2955 MesPrint(
"Warning: Conflicting n in n-th root of unity properties for %s",AT.WorkPointer);
2959 else if ( ( s->minpower !=
2960 symbols[k].minpower || s->maxpower !=
2961 symbols[k].maxpower ) && AC.WarnFlag ) {
2962 MesPrint(
"Warning: Conflicting power restrictions for %s",AT.WorkPointer);
2967 if ( ( k = EntVar(CSYMBOL,(UBYTE *)(AT.WorkPointer),s->complex,s->minpower,
2968 s->maxpower,s->dimension) ) < 0 )
goto GetTcall;
2980 w = r->
indi.
lo; j = jind;
2981 for ( i = 0; i < j; i++ ) {
2982 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct InDeX)))
2983 !=
sizeof(
struct InDeX) ) goto ErrGt2;
2984 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
2985 nsize &= -
sizeof(
void *);
2986 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
2987 != nsize )
goto ErrGt2;
2988 *w = s->number + AM.OffsetIndex;
2989 if ( s->dimension < 0 ) {
2990 s->dimension = -r->
symnum[FindrNumber(-s->dimension,&(r->
symb))];
2991 if ( s->nmin4 < -NMIN4SHIFT ) {
2992 s->nmin4 = -r->
symnum[FindrNumber(-s->nmin4-NMIN4SHIFT
2993 ,&(r->
symb))]-NMIN4SHIFT;
2996 if ( ( s->flags & INUSE ) != 0 ) {
2999 while ( *neww != INDTOIND || neww[2] != *w ) neww += neww[1];
3000 k = neww[3] - AM.OffsetIndex;
3002 else if ( s->type == DUMMY ) {
3007 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3008 if ( type != CINDEX ) {
3009 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3015 MesPrint(
"Warning: %s is also a dummy index",(AT.WorkPointer));
3019 if ( s->dimension != indices[k].dimension ) {
3020 MesPrint(
"Warning: Conflicting dimensions for %s",(AT.WorkPointer));
3027 if ( ( k = EntVar(CINDEX,(UBYTE *)(AT.WorkPointer),
3028 s->dimension,0,s->nmin4,0) ) < 0 )
goto GetTcall;
3031 *(w+j) = k + AM.OffsetIndex;
3041 w = r->
vect.
lo; j = jvec;
3042 for ( i = 0; i < j; i++ ) {
3043 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct VeCtOr)))
3044 !=
sizeof(
struct VeCtOr) )
goto ErrGt2;
3045 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
3046 nsize &= -
sizeof(
void *);
3047 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
3048 != nsize )
goto ErrGt2;
3049 *w = s->number + AM.OffsetVector;
3050 if ( ( s->flags & INUSE ) != 0 ) {
3053 while ( *neww != VECTOVEC || neww[2] != *w ) neww += neww[1];
3054 k = neww[3] - AM.OffsetVector;
3056 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3057 if ( type != CVECTOR ) {
3058 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3062 if ( ( s->complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) !=
3063 ( vectors[k].complex & (VARTYPEIMAGINARY|VARTYPECOMPLEX) ) ) {
3064 MesPrint(
"Warning: Conflicting complexity for %s",(AT.WorkPointer));
3070 if ( ( k = EntVar(CVECTOR,(UBYTE *)(AT.WorkPointer),
3071 s->complex,0,0,s->dimension) ) < 0 )
goto GetTcall;
3073 *(w+j) = k + AM.OffsetVector;
3083 w = r->
func.
lo; j = jfun;
3084 for ( i = 0; i < j; i++ ) {
3085 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)s,(LONG)(
sizeof(
struct FuNcTiOn)))
3086 !=
sizeof(
struct FuNcTiOn) )
goto ErrGt2;
3087 nsize = s->namesize; nsize +=
sizeof(
void *)-1;
3088 nsize &= -
sizeof(
void *);
3089 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer),nsize)
3090 != nsize )
goto ErrGt2;
3091 *w = s->number + FUNCTION;
3092 if ( ( s->flags & INUSE ) != 0 ) {
3095 while ( *neww != FUNTOFUN || neww[2] != *w ) neww += neww[1];
3096 k = neww[3] - FUNCTION;
3098 else if ( GetVar((UBYTE *)(AT.WorkPointer),&type,&k,ALLVARIABLES,NOAUTO) != NAMENOTFOUND ) {
3099 if ( type != CFUNCTION ) {
3100 MesPrint(
"Error: Conflicting types for %s",(AT.WorkPointer));
3104 if ( s->complex != functions[k].complex ) {
3105 MesPrint(
"Warning: Conflicting complexity for %s",(AT.WorkPointer));
3108 else if ( s->symmetric != functions[k].symmetric ) {
3109 MesPrint(
"Warning: Conflicting symmetry properties for %s",(AT.WorkPointer));
3112 else if ( ( s->maxnumargs != functions[k].maxnumargs )
3113 || ( s->minnumargs != functions[k].minnumargs ) ) {
3114 MesPrint(
"Warning: Conflicting argument restriction properties for %s",(AT.WorkPointer));
3120 if ( ( k = EntVar(CFUNCTION,(UBYTE *)(AT.WorkPointer),
3121 s->complex,s->commute,s->spec,s->dimension) ) < 0 )
goto GetTcall;
3122 functions[k].symmetric = s->symmetric;
3123 functions[k].maxnumargs = s->maxnumargs;
3124 functions[k].minnumargs = s->minnumargs;
3126 *(w+j) = k + FUNCTION;
3136 UNLOCK(AM.storefilelock);
3137 AT.WorkPointer = oldwork;
3156 TELLFILE(AR.StoreData.Handle,&pos);
3157 nummystery = DIFBASE(ind->position,pos);
3163 if ( nummystery > 0 ) {
3164 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3166 UNLOCK(AM.storefilelock);
3167 AT.WorkPointer = oldwork;
3170 Expressions[expr].numdummies = *AT.WorkPointer;
3174 nummystery -=
sizeof(WORD);
3177 Expressions[expr].numdummies = 0;
3179 if ( nummystery > 0 ) {
3180 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3182 UNLOCK(AM.storefilelock);
3183 AT.WorkPointer = oldwork;
3186 if ( ( AS.OldNumFactors == 0 ) || ( AS.NumOldNumFactors < NumExpressions ) ) {
3189 if (capacity < NumExpressions) capacity = NumExpressions * 2;
3191 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"numfactors pointers");
3192 if (AS.OldNumFactors) {
3193 WCOPY(buffer, AS.OldNumFactors, AS.NumOldNumFactors);
3194 M_free(AS.OldNumFactors,
"numfactors pointers");
3196 AS.OldNumFactors = buffer;
3198 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"vflags pointers");
3200 WCOPY(buffer, AS.Oldvflags, AS.NumOldNumFactors);
3201 M_free(AS.Oldvflags,
"vflags pointers");
3203 AS.Oldvflags = buffer;
3205 buffer = (WORD *)Malloc1(capacity *
sizeof(WORD),
"uflags pointers");
3207 WCOPY(buffer, AS.Olduflags, AS.NumOldNumFactors);
3208 M_free(AS.Olduflags,
"uflags pointers");
3210 AS.Olduflags = buffer;
3212 AS.NumOldNumFactors = capacity;
3215 AS.OldNumFactors[expr] =
3216 Expressions[expr].numfactors = *AT.WorkPointer;
3220 nummystery -=
sizeof(WORD);
3223 Expressions[expr].numfactors = 0;
3225 if ( nummystery > 0 ) {
3226 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3228 UNLOCK(AM.storefilelock);
3229 AT.WorkPointer = oldwork;
3232 AS.Oldvflags[expr] =
3233 Expressions[expr].vflags = *AT.WorkPointer;
3237 nummystery -=
sizeof(WORD);
3240 Expressions[expr].vflags = 0;
3242 if ( nummystery > 0 ) {
3243 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3245 UNLOCK(AM.storefilelock);
3246 AT.WorkPointer = oldwork;
3249 AS.Olduflags[expr] =
3250 Expressions[expr].uflags = *AT.WorkPointer;
3254 nummystery -=
sizeof(WORD);
3257 Expressions[expr].uflags = 0;
3261 SeekFile(AR.StoreData.Handle,&(ind->position),SEEK_SET);
3262 if ( ReadFile(AR.StoreData.Handle,(UBYTE *)AT.WorkPointer,(LONG)
sizeof(WORD)) !=
3263 sizeof(WORD) || !*AT.WorkPointer ) {
3264 UNLOCK(AM.storefilelock);
3265 AT.WorkPointer = oldwork;
3268 num = *AT.WorkPointer - 1;
3269 num *=
sizeof(WORD);
3270 if ( *AT.WorkPointer < 0 ||
3271 ReadFile(AR.StoreData.Handle,(UBYTE *)(AT.WorkPointer+1),num) != num ) {
3272 MesPrint(
"@Error in stored expressions file at position %10p",*position);
3273 UNLOCK(AM.storefilelock);
3274 AT.WorkPointer = oldwork;
3277 UNLOCK(AM.storefilelock);
3278 ADDPOS(*position,num+
sizeof(WORD));
3279 r->startposition = *position;
3280 AT.WorkPointer = oldwork;
3283 UNLOCK(AM.storefilelock);
3284 AT.WorkPointer = oldwork;
3285 MesCall(
"GetTable");
3288 UNLOCK(AM.storefilelock);
3289 AT.WorkPointer = oldwork;
3290 MesPrint(
"Readerror in GetTable");
3313 SeekScratch(from,&posfrom);
3314 if ( from->
handle < 0 ) {
3315 fullsize = (BASEPOSITION(posfrom))/
sizeof(WORD);
3316 if ( ( to->POstop - to->POfull ) >= fullsize ) {
3320 t1 = from->PObuffer;
3322 NCOPY(t2,t1,fullsize)
3323 to->POfull = to->POfill = t2;
3327 if ( ( RetCode = CreateFile(to->name) ) >= 0 ) {
3328 to->
handle = (WORD)RetCode;
3329 PUTZERO(to->filesize);
3330 PUTZERO(to->POposition);
3333 MLOCK(ErrorMessageLock);
3334 MesPrint(
"Cannot create scratch file %s",to->name);
3335 MUNLOCK(ErrorMessageLock);
3339 t1 = from->PObuffer;
3340 while ( fullsize > 0 ) {
3341 i = to->POstop - to->POfull;
3342 if ( i > fullsize ) i = fullsize;
3346 if ( fullsize > 0 ) {
3347 SeekFile(to->
handle,&(to->POposition),SEEK_SET);
3348 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),to->POsize) != to->POsize ) {
3349 MLOCK(ErrorMessageLock);
3350 MesPrint(
"Error while writing to disk. Disk full?");
3351 MUNLOCK(ErrorMessageLock);
3354 ADDPOS(to->POposition,to->POsize);
3356 to->filesize = to->POposition;
3357 to->POfill = to->POfull = to->PObuffer;
3360 to->POfill = to->POfull = t2;
3369 if ( ((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)) > 0 ) {
3370 if ( WriteFile(from->
handle,((UBYTE *)(from->PObuffer)),((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)))
3371 != ((UBYTE *)(from->POfill)-(UBYTE *)(from->PObuffer)) ) {
3372 MLOCK(ErrorMessageLock);
3373 MesPrint(
"Error while writing to disk. Disk full?");
3374 MUNLOCK(ErrorMessageLock);
3377 SeekFile(from->
handle,&(from->POposition),SEEK_CUR);
3378 posfrom = from->filesize = from->POposition;
3379 from->POfill = from->POfull = from->PObuffer;
3385 SeekFile(from->
handle,&poscopy,SEEK_SET);
3386 while ( ISLESSPOS(poscopy,posfrom) ) {
3387 fullsize = ReadFile(from->
handle,((UBYTE *)(from->PObuffer)),from->POsize);
3388 if ( fullsize < 0 || ( fullsize %
sizeof(WORD) ) != 0 ) {
3389 MLOCK(ErrorMessageLock);
3390 MesPrint(
"Error while reading from disk while copying expression.");
3391 MUNLOCK(ErrorMessageLock);
3394 fullsize /=
sizeof(WORD);
3395 from->POfull = from->PObuffer + fullsize;
3396 t1 = from->PObuffer;
3398 if ( ( to->POstop - to->POfull ) >= fullsize ) {
3403 NCOPY(t2,t1,fullsize)
3404 to->POfill = to->POfull = t2;
3408 if ( ( RetCode = CreateFile(to->name) ) >= 0 ) {
3409 to->
handle = (WORD)RetCode;
3410 PUTZERO(to->POposition);
3411 PUTZERO(to->filesize);
3414 MLOCK(ErrorMessageLock);
3415 MesPrint(
"Cannot create scratch file %s",to->name);
3416 MUNLOCK(ErrorMessageLock);
3420 while ( fullsize > 0 ) {
3421 i = to->POstop - to->POfull;
3422 if ( i > fullsize ) i = fullsize;
3426 if ( fullsize > 0 ) {
3427 SeekFile(to->
handle,&(to->POposition),SEEK_SET);
3428 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),to->POsize) != to->POsize ) {
3429 MLOCK(ErrorMessageLock);
3430 MesPrint(
"Error while writing to disk. Disk full?");
3431 MUNLOCK(ErrorMessageLock);
3434 ADDPOS(to->POposition,to->POsize);
3436 to->filesize = to->POposition;
3437 to->POfill = to->POfull = to->PObuffer;
3440 to->POfill = to->POfull = t2;
3444 SeekFile(from->
handle,&poscopy,SEEK_CUR);
3447 if ( ( to->
handle >= 0 ) && ( to->POfill > to->PObuffer ) ) {
3448 fullsize = (UBYTE *)(to->POfill) - (UBYTE *)(to->PObuffer);
3453 SeekFile(to->
handle,&(to->filesize),SEEK_SET);
3454 if ( WriteFile(to->
handle,((UBYTE *)(to->PObuffer)),fullsize) != fullsize ) {
3455 MLOCK(ErrorMessageLock);
3456 MesPrint(
"Error while writing to disk. Disk full?");
3457 MUNLOCK(ErrorMessageLock);
3460 ADDPOS(to->filesize,fullsize);
3461 to->POposition = to->filesize;
3462 to->POfill = to->POfull = to->PObuffer;
3475static UBYTE *statusexpr[] = {
3476 (UBYTE *)
"LOCALEXPRESSION"
3477 ,(UBYTE *)
"SKIPLEXPRESSION"
3478 ,(UBYTE *)
"DROPLEXPRESSION"
3479 ,(UBYTE *)
"DROPPEDEXPRESSION"
3480 ,(UBYTE *)
"GLOBALEXPRESSION"
3481 ,(UBYTE *)
"SKIPGEXPRESSION"
3482 ,(UBYTE *)
"DROPGEXPRESSION"
3484 ,(UBYTE *)
"STOREDEXPRESSION"
3485 ,(UBYTE *)
"HIDDENLEXPRESSION"
3486 ,(UBYTE *)
"HIDELEXPRESSION"
3487 ,(UBYTE *)
"DROPHLEXPRESSION"
3488 ,(UBYTE *)
"UNHIDELEXPRESSION"
3489 ,(UBYTE *)
"HIDDENGEXPRESSION"
3490 ,(UBYTE *)
"HIDEGEXPRESSION"
3491 ,(UBYTE *)
"DROPHGEXPRESSION"
3492 ,(UBYTE *)
"UNHIDEGEXPRESSION"
3493 ,(UBYTE *)
"INTOHIDELEXPRESSION"
3494 ,(UBYTE *)
"INTOHIDEGEXPRESSION"
3499 MesPrint(
"Expression %s(%d) has status %s(%d,%d). Buffer: %d, Position: %15p",
3500 AC.exprnames->namebuffer+e->name,(WORD)(e-Expressions),
3501 statusexpr[e->status],e->status,e->hidelevel,
3502 e->whichbuffer,&(e->onfile));
3532static void FlipN(UBYTE *p,
int length)
3538 buf = *p; *p = *q; *q = buf;
3539 }
while ( ++p != q );
3551static void Flip16(UBYTE *p)
3553 uint16_t in = *((uint16_t *)p);
3554 uint16_t out = (uint16_t)( (((in) >> 8) & UINT16_C(0x00FF)) | (((in) << 8) & UINT16_C(0xFF00)) );
3555 *((uint16_t *)p) = out;
3559static void Flip32(UBYTE *p)
3561 uint32_t in = *((uint32_t *)p);
3563 ( (((in) >> 24) & UINT32_C(0x000000FF)) | (((in) >> 8) & UINT32_C(0x0000FF00)) | \
3564 (((in) << 8) & UINT32_C(0x00FF0000)) | (((in) << 24) & UINT32_C(0xFF000000)) );
3565 *((uint32_t *)p) = out;
3570static void Flip64(UBYTE *p)
3572 uint64_t in = *((uint64_t *)p);
3574 ( (((in) >> 56) & UINT64_C(0x00000000000000FF)) | (((in) >> 40) & UINT64_C(0x000000000000FF00)) | \
3575 (((in) >> 24) & UINT64_C(0x0000000000FF0000)) | (((in) >> 8) & UINT64_C(0x00000000FF000000)) | \
3576 (((in) << 8) & UINT64_C(0x000000FF00000000)) | (((in) << 24) & UINT64_C(0x0000FF0000000000)) | \
3577 (((in) << 40) & UINT64_C(0x00FF000000000000)) | (((in) << 56) & UINT64_C(0xFF00000000000000)) );
3578 *((uint64_t *)p) = out;
3581static void Flip64(UBYTE *p) { FlipN(p, 8); }
3585static void Flip128(UBYTE *p) { FlipN(p, 16); }
3603static void ResizeDataBE(UBYTE *src,
int slen, UBYTE *dst,
int dlen)
3605 if ( slen > dlen ) {
3607 while ( dlen-- ) { *dst++ = *src++; }
3610 int i = dlen - slen;
3611 while ( i-- ) { *dst++ = 0; }
3612 while ( slen-- ) { *dst++ = *src++; }
3619static void ResizeDataLE(UBYTE *src,
int slen, UBYTE *dst,
int dlen)
3621 if ( slen > dlen ) {
3622 while ( dlen-- ) { *dst++ = *src++; }
3625 int i = dlen - slen;
3626 while ( slen-- ) { *dst++ = *src++; }
3627 while ( i-- ) { *dst++ = 0; }
3643static void Resize16t16(UBYTE *src, UBYTE *dst)
3645 *((int16_t *)dst) = *((int16_t *)src);
3649static void Resize16t32(UBYTE *src, UBYTE *dst)
3651 int16_t in = *((int16_t *)src);
3652 int32_t out = (int32_t)in;
3653 *((int32_t *)dst) = out;
3658static void Resize16t64(UBYTE *src, UBYTE *dst)
3660 int16_t in = *((int16_t *)src);
3661 int64_t out = (int64_t)in;
3662 *((int64_t *)dst) = out;
3665static void Resize16t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 2, dst, 8); }
3669static void Resize16t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 2, dst, 16); }
3672static void Resize32t32(UBYTE *src, UBYTE *dst)
3674 *((int32_t *)dst) = *((int32_t *)src);
3679static void Resize32t64(UBYTE *src, UBYTE *dst)
3681 int32_t in = *((int32_t *)src);
3682 int64_t out = (int64_t)in;
3683 *((int64_t *)dst) = out;
3686static void Resize32t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 4, dst, 8); }
3690static void Resize32t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 4, dst, 16); }
3694static void Resize64t64(UBYTE *src, UBYTE *dst)
3696 *((int64_t *)dst) = *((int64_t *)src);
3699static void Resize64t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 8); }
3703static void Resize64t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 16); }
3706static void Resize128t128(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 16); }
3709static void Resize32t16(UBYTE *src, UBYTE *dst)
3711 int32_t in = *((int32_t *)src);
3712 int16_t out = (int16_t)in;
3713 if ( in > (1<<15)-1 || in < -(1<<15)+1 ) AO.resizeFlag |= 1;
3714 *((int16_t *)dst) = out;
3723static void Resize32t16NC(UBYTE *src, UBYTE *dst)
3725 int32_t in = *((int32_t *)src);
3726 int16_t out = (int16_t)in;
3727 *((int16_t *)dst) = out;
3732static void Resize64t16(UBYTE *src, UBYTE *dst)
3734 int64_t in = *((int64_t *)src);
3735 int16_t out = (int16_t)in;
3736 if ( in > (1<<15)-1 || in < -(1<<15)+1 ) AO.resizeFlag |= 1;
3737 *((int16_t *)dst) = out;
3740static void Resize64t16NC(UBYTE *src, UBYTE *dst)
3742 int64_t in = *((int64_t *)src);
3743 int16_t out = (int16_t)in;
3744 *((int16_t *)dst) = out;
3748static void Resize64t16(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 2); }
3750static void Resize64t16NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 2); }
3755static void Resize64t32(UBYTE *src, UBYTE *dst)
3757 int64_t in = *((int64_t *)src);
3758 int32_t out = (int32_t)in;
3759 if ( in > (INT64_C(1)<<31)-1 || in < -(INT64_C(1)<<31)+1 ) AO.resizeFlag |= 1;
3760 *((int32_t *)dst) = out;
3763static void Resize64t32NC(UBYTE *src, UBYTE *dst)
3765 int64_t in = *((int64_t *)src);
3766 int32_t out = (int32_t)in;
3767 *((int32_t *)dst) = out;
3771static void Resize64t32(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 4); }
3773static void Resize64t32NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 8, dst, 4); }
3777static void Resize128t16(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 2); }
3780static void Resize128t16NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 2); }
3783static void Resize128t32(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 4); }
3786static void Resize128t32NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 4); }
3789static void Resize128t64(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 8); }
3792static void Resize128t64NC(UBYTE *src, UBYTE *dst) { AO.ResizeData(src, 16, dst, 8); }
3805static void CheckPower32(UBYTE *p)
3807 if ( *((int32_t *)p) < -MAXPOWER ) {
3808 AO.powerFlag |= 0x01;
3809 *((int32_t *)p) = -MAXPOWER;
3811 p +=
sizeof(int32_t);
3812 if ( *((int32_t *)p) > MAXPOWER ) {
3813 AO.powerFlag |= 0x02;
3814 *((int32_t *)p) = MAXPOWER;
3825static void RenumberVec32(UBYTE *p)
3828 void *dummy = (
void *)AO.SaveHeader.wildoffset;
3829 int32_t wildoffset = *(int32_t *)dummy;
3830 int32_t in = *((int32_t *)p);
3831 in = in + 2*wildoffset;
3832 in = in - 2*WILDOFFSET;
3833 *((int32_t *)p) = in;
3854static void ResizeCoeff32(UBYTE **bout, UBYTE *bend, UBYTE *top)
3859 int32_t *out = (int32_t *)*bout;
3860 int32_t *end = (int32_t *)bend;
3862 if (
sizeof(WORD) == 2 ) {
3864 int32_t len = (end - 1 - out) / 2;
3868 if ( *p & 0xFFFF0000 ) --zeros;
3870 if ( *p & 0xFFFF0000 ) --zeros;
3873 sign = ( *in-- > 0 ) ? 1 : -1;
3875 if ( zeros == 2 ) p -= 2;
3878 if ( zeros < 2 ) *p-- = *in >> 16;
3879 *p-- = *in-- & 0x0000FFFF;
3880 for ( i = 1; i < len; ++i ) {
3882 *p-- = *in-- & 0x0000FFFF;
3884 if ( zeros < 2 ) *p-- = *in >> 16;
3885 *p-- = *in-- & 0x0000FFFF;
3886 for ( i = 1; i < len; ++i ) {
3888 *p-- = *in-- & 0x0000FFFF;
3891 *out = (out - p) * sign;
3892 *bout = (UBYTE *)(out+1);
3897 int32_t len = (end - 1 - out) / 2;
3899 *out = *(uint16_t *)out;
3901 *out = *(uint16_t *)out;
3907 *out = *(uint16_t *)out;
3909 for ( i = 1; i < len; ++i ) {
3911 *out = (uint32_t)(*(uint16_t *)out)
3912 + ((uint32_t)(*(uint16_t *)in) << 16);
3914 if ( ++i == len )
break;
3917 *out = *(uint16_t *)in;
3921 *out = *(uint16_t *)in;
3923 for ( i = 1; i < len; ++i ) {
3925 *out = (uint32_t)(*(uint16_t *)out)
3926 + ((uint32_t)(*(uint16_t *)in) << 16);
3928 if ( ++i == len )
break;
3931 *out = *(uint16_t *)in;
3935 if ( *in < 0 ) *out = -(out - p + 1);
3936 else *out = out - p + 1;
3940 if ( out > (int32_t *)top ) {
3941 MesPrint(
"Error in resizing coefficient!");
3944 *bout = (UBYTE *)out;
3953#define SAVEREVISION 0x02
3968 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
3986 for ( i = 1; i < (int)
sizeof(
int); ++i ) {
3990 for ( i = 0; i < (int)
sizeof(
int); ++i ) sh.
endianness[i] = ((
char *)&endian)[i];
4002 for ( i = 0; i < 8; i++ ) dumw[i] = 0;
4003 dummy = (UBYTE *)dumw;
4004 dumw[0] = (WORD)MAXPOWER;
4005 for ( i = 0; i < 16; i++ ) sh.
maxpower[i] = dummy[i];
4006 dumw[0] = (WORD)WILDOFFSET;
4007 for ( i = 0; i < 16; i++ ) sh.
wildoffset[i] = dummy[i];
4011 return ( WriteFile(handle,(UBYTE *)(&sh),(LONG)(
sizeof(
STOREHEADER)))
4027static unsigned int CompactifySizeof(
unsigned int size)
4034 default: MesPrint(
"Error compactifying size.");
4060 static void (*flipJumpTable[4])(UBYTE *) =
4061 { Flip16, Flip32, Flip64, Flip128 };
4062 static void (*resizeJumpTable[4][4])(UBYTE *, UBYTE *) =
4063 { { Resize16t16, Resize32t16, Resize64t16, Resize128t16 },
4064 { Resize16t32, Resize32t32, Resize64t32, Resize128t32 },
4065 { Resize16t64, Resize32t64, Resize64t64, Resize128t64 },
4066 { Resize16t128, Resize32t128, Resize64t128, Resize128t128 } };
4067 static void (*resizeNCJumpTable[4][4])(UBYTE *, UBYTE *) =
4068 { { Resize16t16, Resize32t16NC, Resize64t16NC, Resize128t16NC },
4069 { Resize16t32, Resize32t32, Resize64t32NC, Resize128t32NC },
4070 { Resize16t64, Resize32t64, Resize64t64, Resize128t64NC },
4071 { Resize16t128, Resize32t128, Resize64t128, Resize128t128 } };
4074 WORD idxW = CompactifySizeof(
sizeof(WORD));
4075 WORD idxL = CompactifySizeof(
sizeof(LONG));
4076 WORD idxP = CompactifySizeof(
sizeof(
POSITION));
4077 WORD idxVP = CompactifySizeof(
sizeof(
void *));
4084 if ( ReadFile(AO.SaveData.Handle,(UBYTE *)(&AO.SaveHeader),
4086 return(MesPrint(
"Error reading save file header"));
4091 for ( i = 0; i < 8; ++i ) {
4092 if ( AO.SaveHeader.headermark[i] != 0xFF ) {
4095 SeekFile(AO.SaveData.Handle, &p, SEEK_SET);
4100 if ( AO.SaveHeader.revision != SAVEREVISION ) {
4101 return(MesPrint(
"Save file header from an old version. Cannot read this file."));
4105 for ( i = 1; i < (int)
sizeof(
int); ++i ) {
4109 if ( ((
char *)&endian)[0] < ((
char *)&endian)[1] ) {
4111 AO.ResizeData = ResizeDataBE;
4115 AO.ResizeData = ResizeDataLE;
4119 if ( AO.SaveHeader.endianness[0] > AO.SaveHeader.endianness[1] ) {
4120 AO.transFlag = ( ((
char *)&endian)[0] < ((
char *)&endian)[1] );
4123 AO.transFlag = ( ((
char *)&endian)[0] > ((
char *)&endian)[1] );
4125 if ( (WORD)AO.SaveHeader.lenWORD !=
sizeof(WORD) ) AO.transFlag |= 0x02;
4126 if ( (WORD)AO.SaveHeader.lenLONG !=
sizeof(LONG) ) AO.transFlag |= 0x04;
4127 if ( (WORD)AO.SaveHeader.lenPOS !=
sizeof(
POSITION) ) AO.transFlag |= 0x08;
4128 if ( (WORD)AO.SaveHeader.lenPOINTER !=
sizeof(
void *) ) AO.transFlag |= 0x10;
4130 AO.FlipWORD = flipJumpTable[idxW];
4131 AO.FlipLONG = flipJumpTable[idxL];
4132 AO.FlipPOS = flipJumpTable[idxP];
4133 AO.FlipPOINTER = flipJumpTable[idxVP];
4136 AO.CheckPower = CheckPower32;
4137 AO.RenumberVec = RenumberVec32;
4139 AO.ResizeWORD = resizeJumpTable[idxW][CompactifySizeof(AO.SaveHeader.lenWORD)];
4140 AO.ResizeNCWORD = resizeNCJumpTable[idxW][CompactifySizeof(AO.SaveHeader.lenWORD)];
4141 AO.ResizeLONG = resizeJumpTable[idxL][CompactifySizeof(AO.SaveHeader.lenLONG)];
4142 AO.ResizePOS = resizeJumpTable[idxP][CompactifySizeof(AO.SaveHeader.lenPOS)];
4143 AO.ResizePOINTER = resizeJumpTable[idxVP][CompactifySizeof(AO.SaveHeader.lenPOINTER)];
4148 for ( i = 0; i < 8; i++ ) dumw[i] = 0;
4149 dummy = (UBYTE *)dumw;
4150 for ( i = 0; i < 16; i++ ) dummy[i] = AO.SaveHeader.maxpower[i];
4151 AO.mpower = dumw[0];
4178 if ( AO.transFlag ) {
4189 int lenW = AO.SaveHeader.lenWORD;
4190 int lenL = AO.SaveHeader.lenLONG;
4191 int lenP = AO.SaveHeader.lenPOS;
4194 if ( AO.bufferedInd ) {
4200 if ( ReadFile(AO.SaveData.Handle, (UBYTE *)fileind,
sizeof(
FILEINDEX))
4202 return ( MesPrint(
"Error(1) reading stored expression.") );
4206 if ( AO.transFlag & 1 ) {
4209 int padp = lenL - ((lenW*5+(MAXENAME + 1)) & (lenL-1));
4210 p = (UBYTE *)fileind;
4211 AO.FlipPOS(p); p += lenP;
4213 AO.ResizePOS(p, (UBYTE *)&
number);
4215 for ( i = 0; i <
number; ++i ) {
4216 AO.FlipPOS(p); p += lenP;
4217 AO.FlipPOS(p); p += lenP;
4218 AO.FlipPOS(p); p += lenP;
4219 AO.FlipLONG(p); p += lenL;
4220 AO.FlipWORD(p); p += lenW;
4221 AO.FlipWORD(p); p += lenW;
4222 AO.FlipWORD(p); p += lenW;
4223 AO.FlipWORD(p); p += lenW;
4224 AO.FlipWORD(p); p += lenW;
4230 if ( AO.transFlag > 1 ) {
4234 int padp = lenL - ((lenW*5+(MAXENAME + 1)) & (lenL-1));
4235 int padq =
sizeof(LONG) - ((
sizeof(WORD)*5+(MAXENAME + 1)) & (
sizeof(LONG)-1));
4237 p = (UBYTE *)fileind; q = (UBYTE *)&buffer;
4251 return ( MesPrint(
"Too many index entries.") );
4261 for ( i = 0; i < maxnumber; ++i ) {
4268 AO.ResizeLONG(p, q);
4269 p += lenL; q +=
sizeof(LONG);
4270 AO.ResizeWORD(p, q);
4271 p += lenW; q +=
sizeof(WORD);
4272 AO.ResizeWORD(p, q);
4273 p += lenW; q +=
sizeof(WORD);
4274 AO.ResizeWORD(p, q);
4275 p += lenW; q +=
sizeof(WORD);
4276 AO.ResizeWORD(p, q);
4277 p += lenW; q +=
sizeof(WORD);
4278 AO.ResizeWORD(p, q);
4279 p += lenW; q +=
sizeof(WORD);
4286 if ( AO.bufferedInd ) {
4288 SETBASEPOSITION(sbuffer.
number,AO.bufferedInd);
4289 q = (UBYTE *)&sbuffer +
sizeof(
POSITION) +
sizeof(LONG);
4290 for ( i = maxnumber; i <
number; ++i ) {
4297 AO.ResizeLONG(p, q);
4298 p += lenL; q +=
sizeof(LONG);
4299 AO.ResizeWORD(p, q);
4300 p += lenW; q +=
sizeof(WORD);
4301 AO.ResizeWORD(p, q);
4302 p += lenW; q +=
sizeof(WORD);
4303 AO.ResizeWORD(p, q);
4304 p += lenW; q +=
sizeof(WORD);
4305 AO.ResizeWORD(p, q);
4306 p += lenW; q +=
sizeof(WORD);
4307 AO.ResizeWORD(p, q);
4308 p += lenW; q +=
sizeof(WORD);
4316 p = (UBYTE *)fileind; q = (UBYTE *)&buffer; n =
sizeof(
FILEINDEX);
4321 return ( ReadFile(AO.SaveData.Handle, (UBYTE *)fileind,
sizeof(
FILEINDEX))
4365 if ( AO.transFlag ) {
4369 static WORD numReadSym;
4370 static WORD numReadInd;
4371 static WORD numReadVec;
4372 static WORD numReadFun;
4375 UBYTE *in, *out, *pp = 0, *end, *outbuf;
4377 WORD namelen, realnamelen;
4379 WORD lenW = AO.SaveHeader.lenWORD;
4380 WORD lenL = AO.SaveHeader.lenLONG;
4381 WORD lenP = AO.SaveHeader.lenPOINTER;
4382 WORD flip = AO.transFlag & 1;
4385 TELLFILE(AO.SaveData.Handle,&pos);
4393 if ( (lenW > (WORD)
sizeof(WORD))
4394 || ( (lenW == (WORD)
sizeof(WORD))
4395 && ( (lenL > (WORD)
sizeof(LONG))
4396 || ( (lenL == (WORD)
sizeof(LONG)) && lenP > (WORD)
sizeof(
void *))
4400 end = buffer + *size;
4407 LONG newsize = (top - buffer) / (1 +
sizeof(WORD)/lenW);
4411 if ( *size > newsize ) *size = newsize;
4414 if ( ( numread = ReadFile(AO.SaveData.Handle, in, *size) ) != *size ) {
4415 return ( MesPrint(
"Error(2) reading stored expression.") );
4422 if ( *stage == -1 ) {
4430 while ( in < end ) {
4432 if ( *stage == 0 ) {
4433 if ( ind->
nsymbols <= numReadSym ) {
4437 if ( end - in < AO.SaveHeader.sSym ) {
4442 AO.FlipLONG(pp); pp += lenL;
4443 while ( pp < in + AO.SaveHeader.sSym ) {
4444 AO.FlipWORD(pp); pp += lenW;
4447 pp = in + AO.SaveHeader.sSym;
4448 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4450 AO.ResizeWORD(in, out); in += lenW;
4451 if ( *((WORD *)out) == -AO.mpower ) *((WORD *)out) = -MAXPOWER;
4452 out +=
sizeof(WORD);
4453 AO.ResizeWORD(in, out); in += lenW;
4454 if ( *((WORD *)out) == AO.mpower ) *((WORD *)out) = MAXPOWER;
4455 out +=
sizeof(WORD);
4456 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4457 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4458 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4459 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4460 AO.ResizeWORD(in, out); in += lenW;
4461 realnamelen = *((WORD *)out);
4462 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4463 out +=
sizeof(WORD);
4464 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4466 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4468 namelen = *((WORD *)out-1);
4469 if ( end - in < namelen ) {
4472 *((WORD *)out-1) = realnamelen;
4473 *size += AO.SaveHeader.sSym + namelen;
4474 *outsize +=
sizeof(
struct SyMbOl) + realnamelen;
4475 if ( realnamelen > namelen ) {
4478 out += realnamelen - namelen;
4481 int j = realnamelen;
4483 in += namelen - realnamelen;
4489 if ( *stage == 1 ) {
4490 if ( ind->
nindices <= numReadInd ) {
4494 if ( end - in < AO.SaveHeader.sInd ) {
4499 AO.FlipLONG(pp); pp += lenL;
4500 while ( pp < in + AO.SaveHeader.sInd ) {
4501 AO.FlipWORD(pp); pp += lenW;
4504 pp = in + AO.SaveHeader.sInd;
4505 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4506 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4507 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4508 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4509 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4510 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4511 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4512 AO.ResizeWORD(in, out); in += lenW;
4513 realnamelen = *((WORD *)out);
4514 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4515 out +=
sizeof(WORD);
4517 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4519 namelen = *((WORD *)out-1);
4520 if ( end - in < namelen ) {
4523 *((WORD *)out-1) = realnamelen;
4524 *size += AO.SaveHeader.sInd + namelen;
4525 *outsize +=
sizeof(
struct InDeX) + realnamelen;
4526 if ( realnamelen > namelen ) {
4529 out += realnamelen - namelen;
4532 int j = realnamelen;
4534 in += namelen - realnamelen;
4540 if ( *stage == 2 ) {
4541 if ( ind->
nvectors <= numReadVec ) {
4545 if ( end - in < AO.SaveHeader.sVec ) {
4550 AO.FlipLONG(pp); pp += lenL;
4551 while ( pp < in + AO.SaveHeader.sVec ) {
4552 AO.FlipWORD(pp); pp += lenW;
4555 pp = in + AO.SaveHeader.sVec;
4556 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4557 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4558 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4559 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4560 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4561 AO.ResizeWORD(in, out); in += lenW;
4562 realnamelen = *((WORD *)out);
4563 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4564 out +=
sizeof(WORD);
4565 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4567 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4569 namelen = *((WORD *)out-1);
4570 if ( end - in < namelen ) {
4573 *((WORD *)out-1) = realnamelen;
4574 *size += AO.SaveHeader.sVec + namelen;
4575 *outsize +=
sizeof(
struct VeCtOr) + realnamelen;
4576 if ( realnamelen > namelen ) {
4579 out += realnamelen - namelen;
4582 int j = realnamelen;
4584 in += namelen - realnamelen;
4590 if ( *stage == 3 ) {
4595 if ( end - in < AO.SaveHeader.sFun ) {
4600 AO.FlipPOINTER(pp); pp += lenP;
4601 AO.FlipLONG(pp); pp += lenL;
4602 AO.FlipLONG(pp); pp += lenL;
4603 while ( pp < in + AO.SaveHeader.sFun ) {
4604 AO.FlipWORD(pp); pp += lenW;
4607 pp = in + AO.SaveHeader.sFun;
4609 AO.ResizePOINTER(in, out); in += lenP; out +=
sizeof(
void *);
4610 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4611 AO.ResizeLONG(in, out); in += lenL; out +=
sizeof(LONG);
4612 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4613 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4614 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4615 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4616 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4617 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4618 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4619 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4620 AO.ResizeWORD(in, out); in += lenW;
4621 realnamelen = *((WORD *)out);
4622 realnamelen +=
sizeof(
void *)-1; realnamelen &= -(
sizeof(
void *));
4623 out +=
sizeof(WORD);
4624 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4626 AO.ResizeWORD(in, out); in += lenW; out +=
sizeof(WORD);
4628 namelen = *((WORD *)out-1);
4629 if ( end - in < namelen ) {
4632 *((WORD *)out-1) = realnamelen;
4633 *size += AO.SaveHeader.sFun + namelen;
4634 *outsize +=
sizeof(
struct FuNcTiOn) + realnamelen;
4635 if ( realnamelen > namelen ) {
4638 out += realnamelen - namelen;
4641 int j = realnamelen;
4643 in += namelen - realnamelen;
4647 AO.tensorList[((
FUNCTIONS)outbuf)->number+FUNCTION] =
4652 if ( end - in >= lenW ) {
4653 if ( flip ) AO.FlipWORD(in);
4654 AO.ResizeWORD(in, out);
4656 *outsize +=
sizeof(WORD);
4659 if ( end - in >= lenW ) {
4660 if ( flip ) AO.FlipWORD(in);
4661 AO.ResizeWORD(in, out);
4663 *outsize +=
sizeof(WORD);
4666 if ( end - in >= lenW ) {
4667 if ( flip ) AO.FlipWORD(in);
4668 AO.ResizeWORD(in, out);
4670 *outsize +=
sizeof(WORD);
4673 if ( end - in >= lenW ) {
4674 if ( flip ) AO.FlipWORD(in);
4675 AO.ResizeWORD(in, out);
4677 *outsize +=
sizeof(WORD);
4687 SeekFile(AO.SaveData.Handle, &pos, SEEK_SET);
4690 return ( ReadFile(AO.SaveData.Handle, buffer, *size) != *size );
4728ReadSaveTerm32(UBYTE *bin, UBYTE *binend, UBYTE **bout, UBYTE *boutend, UBYTE *top,
int terminbuf)
4734 int32_t *r, *t, *coeff, *end, *newtermsize, *rend;
4735 int32_t *newsubtermp;
4736 int32_t *in = (int32_t *)bin;
4737 int32_t *out = (int32_t *)*bout;
4746 rend = (int32_t *)boutend;
4747 coeff = end - ABS(*(end-1));
4748 newtermsize = (int32_t *)*bout;
4749 out = newtermsize + 1;
4755 r = (int32_t *)AR.CompressBuffer;
4761 if ( (UBYTE *)in >= binend ) {
4764 *out = len = -j + 1 + *in;
4766 if ( (UBYTE *)end >= top ) {
4771 while ( ++j <= 0 ) {
4777 else if ( j == 0 ) {
4779 while ( (UBYTE *)in < binend ) {
4781 if ( (UBYTE *)out > top ) {
4782 return ( (UBYTE *)bin );
4788 *bout = (UBYTE *)out;
4789 return ( (UBYTE *)in );
4793 if ( (UBYTE *)end >= top ) {
4797 if ( (UBYTE *)(in + j) >= binend ) {
4798 *(AR.CompressBuffer) = rbuf;
4801 if ( (UBYTE *)out + j >= top ) {
4805 while ( --j >= 0 ) {
4811 r = (int32_t *)AR.CompressBuffer + 1;
4812 coeff = end - ABS(*(end-1));
4813 newtermsize = (int32_t *)*bout;
4814 out = newtermsize + 1;
4818 while ( out < coeff ) {
4826 if (
id == SYMBOL ) {
4830 if ( ABS(*out) >= MAXPOWER ) {
4833 int32_t num = *(out-1);
4838 if ( (UBYTE *)end > top )
return ( bin );
4848 *out++ = ABS(exp) & 0x0000FFFF;
4849 *out++ = ABS(exp) >> 16;
4852 *out++ = ( exp < 0 ) ? -5 : 5;
4863 else if (
id == DOTPRODUCT ) {
4865 AO.RenumberVec((UBYTE *)out);
4867 AO.RenumberVec((UBYTE *)out);
4870 if ( ABS(*out) >= MAXPOWER ) {
4873 int32_t num1 = *(out-2);
4874 int32_t num2 = *(out-1);
4879 if ( (UBYTE *)end > top )
return ( bin );
4887 *out++ = DOTPRODUCT;
4898 *out++ = ABS(exp) & 0x0000FFFF;
4899 *out++ = ABS(exp) >> 16;
4902 *out++ = ( exp < 0 ) ? -5 : 5;
4913 else if (
id == VECTOR ) {
4915 AO.RenumberVec((UBYTE *)out);
4920 else if (
id == INDEX ) {
4922 void *dummy = (
void *)AO.SaveHeader.wildoffset;
4923 int32_t vectoroffset = -2 * *((int32_t *)dummy);
4926 if ( *out < vectoroffset ) {
4927 AO.RenumberVec((UBYTE *)out);
4932 else if (
id == SUBEXPRESSION ) {
4938 else if (
id == DELTA ) {
4943 else if (
id == HAAKJE ) {
4948 else if (
id == GAMMA ||
id == LEVICIVITA || (
id >= FUNCTION && AO.tensorList[
id]) ) {
4950 void *dummy = (
void *)AO.SaveHeader.wildoffset;
4951 int32_t vectoroffset = -2 * *((int32_t *)dummy);
4954 if ( *out < vectoroffset ) {
4955 AO.RenumberVec((UBYTE *)out);
4960 else if (
id >= FUNCTION ) {
4978 if (
sizeof(WORD) == 2 ) {
4980 if ( *out > (1<<15)-1 || *out < -(1<<15)+1 ) {
4988 if ( (UBYTE *)end > top )
return ( bin );
4993 *out++ = ABS(num) & 0x0000FFFF;
4994 *out++ = ABS(num) >> 16;
4997 *out++ = ( num < 0 ) ? -5 : 5;
5013 AO.RenumberVec((UBYTE *)out);
5022 AO.RenumberVec((UBYTE *)out);
5026 if ( -*out >= FUNCTION ) {
5030 MesPrint(
"short function code %d not implemented.", *out);
5031 return ( (UBYTE *)in );
5037 int32_t *newargsize = out;
5038 argEnd = out + *out;
5041 while ( out < argEnd ) {
5042 int32_t *keepsizep = out + *out;
5043 int32_t lenbuf = *out;
5044 int32_t **ppp = &out;
5046 newbin =
ReadSaveTerm32((UBYTE *)r, binend, (UBYTE **)ppp, (UBYTE *)rend, top, 1);
5048 if ( newbin == (UBYTE *)r ) {
5049 return ( (UBYTE *)in );
5053 if ( out > keepsizep ) {
5056 int32_t extention = out - keepsizep;
5063 argEnd += extention;
5066 else if ( out < keepsizep ) {
5069 int32_t extention = keepsizep - out;
5076 argEnd -= extention;
5080 *newargsize = out - newargsize;
5085 MesPrint(
"ID %d not recognized.",
id);
5086 return ( (UBYTE *)in );
5089 *newsubtermp = out - newsubtermp + 1;
5092 if ( (UBYTE *)end >= top ) {
5098 *bout = (UBYTE *)out;
5100 ResizeCoeff32(bout, (UBYTE *)end, top);
5102 if ( *bout >= top ) {
5107 *newtermsize = (int32_t *)*bout - newtermsize;
5109 return ( (UBYTE *)in );
5140 if ( AO.transFlag ) {
5141 UBYTE *in, *end, *out, *outend, *p;
5144 WORD lenW = AO.SaveHeader.lenWORD;
5148 TELLFILE(AO.SaveData.Handle,&pos);
5152 half = (top-buffer)/2;
5153 if ( *size > half ) *size = half;
5154 if ( lenW < (WORD)
sizeof(WORD) ) {
5155 if ( *size * (LONG)
sizeof(WORD)/lenW > half ) *size = half*lenW/(LONG)
sizeof(WORD);
5158 if ( *size > half ) *size = half;
5169 if ( lenW ==
sizeof(WORD) ) in += half;
5172 outend = out + *size;
5174 if ( ReadFile(AO.SaveData.Handle, in, *size) != *size ) {
5175 return ( MesPrint(
"Error(3) reading stored expression.") );
5178 if ( AO.transFlag & 1 ) {
5181 while ( p <= end ) {
5182 AO.FlipWORD(p); p += lenW;
5187 if ( lenW > (WORD)
sizeof(WORD) ) {
5191 if ( outend > top ) outend = top;
5193 if ( p == in )
break;
5195 }
while ( in <= end - lenW );
5197 *size = in - buffer;
5202 while ( in < end ) {
5204 AO.ResizeNCWORD(in, out);
5205 in += lenW; out +=
sizeof(WORD);
5209 if ( lenW < (WORD)
sizeof(WORD) ) {
5211 while ( in < end ) {
5212 AO.ResizeWORD(in, out);
5213 in += lenW; out +=
sizeof(WORD);
5222 if ( p == in )
break;
5224 }
while ( in <= end -
sizeof(WORD) );
5225 *size = (in - buffer - half) * lenW / (ULONG)
sizeof(WORD);
5227 *outsize = out - buffer;
5229 SeekFile(AO.SaveData.Handle, &pos, SEEK_SET);
5234 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