138 if ( AT.SS == AT.S0 && AC.StatsFlag ) {
140 if ( AC.ThreadStats == 0 && identity > 0 )
return;
141#elif defined(WITHMPI)
142 if ( AC.OldParallelStats )
return;
143 if ( ! AC.ProcessStats && PF.me != MASTER )
return;
145 if ( Expressions == 0 )
return;
147 if ( par == STATSSPLITMERGE ) {
148 if ( AC.ShortStatsMax == 0 )
return;
150 if ( AR.ShortSortCount < AC.ShortStatsMax )
return;
152 AR.ShortSortCount = 0;
156 char humanGenTermsText[HUMANSTRLEN] =
"";
157 char humanTermsLeftText[HUMANSTRLEN] =
"";
158 char humanBytesText[HUMANSTRLEN] =
"";
159 char humanUnsortedBytesText[HUMANSTRLEN] =
"";
160 char humanComparisonsText[HUMANSTRLEN] =
"";
161 if ( AC.HumanStatsFlag ) {
162 HumanString(humanGenTermsText, (
float)(S->GenTerms), humanTermsSuffix);
163 HumanString(humanTermsLeftText, (
float)(S->TermsLeft), humanTermsSuffix);
164 HumanString(humanBytesText, (
float)(BASEPOSITION(*plspace)), humanBytesSuffix);
165 HumanString(humanUnsortedBytesText, (
float)(S->verbUnsortedSize), humanBytesSuffix);
166 HumanString(humanComparisonsText, (
float)(S->verbComparisons), humanTermsSuffix);
169 MLOCK(ErrorMessageLock);
174 const WORD oldLogHandle = AC.LogHandle;
175 if ( checkLogType && AM.LogType ) {
179 if ( AC.ShortStats ) {}
182 if ( identity > 0 ) {
183 MesPrint(
" Thread %d reporting",identity);
188#elif defined(WITHMPI)
189 if ( PF.me != MASTER ) {
190 MesPrint(
" Process %d reporting",PF.me);
205 use_wtime = AC.WTimeStatsFlag;
206#if defined(WITHPTHREADS)
207 if ( use_wtime && identity > 0 ) use_wtime = 0;
208#elif defined(WITHMPI)
209 if ( use_wtime && PF.me != MASTER ) use_wtime = 0;
211 char *wpref = use_wtime ?
"W" :
"";
212 char *wspac = use_wtime ?
"" :
" ";
214 timepart = (WORD)(millitime%1000);
218 if ( AC.ShortStats ) {
219#if defined(WITHPTHREADS) || defined(WITHMPI)
221 if ( identity > 0 ) {
223 if ( PF.me != MASTER ) {
224 const int identity = PF.me;
226 if ( par == STATSSPLITMERGE || par == STATSPOSTSORT ) {
227 snprintf(buf,
sizeof(buf),
228 "%d: %7ld.%02us %8ld>%10ld%3s%10ld:%10ld %s %s",identity,
229 millitime,timepart,AN.ninterms,S->GenTerms,toterms[par],
230 S->TermsLeft,BASEPOSITION(*plspace),EXPRNAME(AR.CurExpr),
234 else if ( par == STATSMERGETOFILE ) {
235 snprintf(buf,
sizeof(buf),
236 "%d: %7ld.%02us %10ld:%10ld",identity,millitime,timepart,
237 S->TermsLeft,BASEPOSITION(*plspace));
244 if ( par == STATSSPLITMERGE || par == STATSPOSTSORT ) {
245 snprintf(buf,
sizeof(buf),
246 "%7ld.%02us %8ld>%10ld%3s%10ld:%10ld %s %s",
247 millitime,timepart,AN.ninterms,S->GenTerms,toterms[par],
248 S->TermsLeft,BASEPOSITION(*plspace),EXPRNAME(AR.CurExpr),
252 else if ( par == STATSMERGETOFILE ) {
253 snprintf(buf,
sizeof(buf),
254 "%7ld.%02us %10ld:%10ld",millitime,timepart,
255 S->TermsLeft,BASEPOSITION(*plspace));
261 if ( par == STATSMERGETOFILE ) {
262 snprintf(buf,
sizeof(buf),
263 "%sTime = %7ld.%02u sec",wpref,millitime,timepart);
267 snprintf(buf,
sizeof(buf),
268 "%sTime = %7ld.%02u sec %sGenerated terms = %10ld%s",
269 wpref,millitime,timepart,wspac,S->GenTerms,humanGenTermsText);
273 if ( par == STATSSPLITMERGE ) {
274 snprintf(buf,
sizeof(buf),
275 "%16s%8ld Terms %s = %10ld%s",
276 EXPRNAME(AR.CurExpr),AN.ninterms,FG.swmes[par],S->TermsLeft,
282 if ( identity > 0 && par == STATSPOSTSORT ) {
283 snprintf(buf,
sizeof(buf),
284 "%16s Terms in thread = %10ld%s",
285 EXPRNAME(AR.CurExpr),S->TermsLeft,humanTermsLeftText);
289#elif defined(WITHMPI)
290 if ( PF.me != MASTER && par == STATSPOSTSORT ) {
291 snprintf(buf,
sizeof(buf),
292 "%16s Terms in process= %10ld%s",
293 EXPRNAME(AR.CurExpr),S->TermsLeft,humanTermsLeftText);
299 snprintf(buf,
sizeof(buf),
300 "%16s Terms %s = %10ld%s",
301 EXPRNAME(AR.CurExpr),FG.swmes[par],S->TermsLeft,
307 const WORD dig = DigitsIn(BASEPOSITION(*plspace));
308 snprintf(buf,
sizeof(buf),
"%24s Bytes used%*s=%11ld%s",
309 AC.Commercial,MiN(6,17-dig),
"",BASEPOSITION(*plspace),
314 if ( par == STATSPOSTSORT ) {
315 if ( AC.SortVerbose ) {
316 snprintf(buf,
sizeof(buf),
"%24s Unsorted bytes =%11ld%s",
317 "",S->verbUnsortedSize,humanUnsortedBytesText);
319 snprintf(buf,
sizeof(buf),
"%24s Small Buffer =%5ld,%5ld",
320 "",S->verbSBsortTerms,S->verbSBsortCap);
322 snprintf(buf,
sizeof(buf),
"%24s Large Buffer =%5ld,%5ld",
323 "",S->verbLBsortPatches,S->verbLBsortCap);
325 snprintf(buf,
sizeof(buf),
"%24s Comparisons =%11ld%s",
326 "",S->verbComparisons,humanComparisonsText);
332 MesPrint(
"Total number of writes: %l, reads: %l, seeks, %l"
333 ,numwrites,numreads,numseeks);
334 MesPrint(
"Total number of mallocs: %l, frees: %l"
335 ,nummallocs,numfrees);
339 AC.LogHandle = oldLogHandle;
341 MUNLOCK(ErrorMessageLock);
458 WORD j, **ss, *to, *t;
459 LONG sSpace, over, tover, spare, retval = 0;
462 FILEHANDLE *fout = 0, *oldoutfile = 0, *newout = 0;
464 if ( AM.exitflag && AR.sLevel == 0 )
return(0);
467 oldoutfile = AR.outfile;
477 oldoutfile = AR.outfile;
496 PrintTime((UBYTE *)
"EndSort, before SplitMerge");
498 S->sPointer[
SplitMerge(BHEAD S->sPointer,S->sTerms)] = 0;
500 PrintTime((UBYTE *)
"Endsort, after SplitMerge");
503 tover = over = S->sTerms;
506 if ( S->lPatch > 0 || S->file.handle >= 0 ) {
509 S->TermsLeft -= over - spare;
510 if ( par == 1 ) { AR.outfile = newout = AllocFileHandle(0,(
char *)0); }
512 else if ( S != AT.S0 ) {
516 while ( ( t = *ss++ ) != 0 ) { sSpace += *t; }
517 if ( AN.tryterm > 0 && ( (sSpace+1)*
sizeof(WORD) < (
size_t)(AM.MaxTer) ) ) {
518 to = TermMalloc(
"$-sort space");
521 LONG allocsp = sSpace+1;
522 if ( allocsp < MINALLOC ) allocsp = MINALLOC;
523 allocsp = ((allocsp+7)/8)*8;
524 to = (WORD *)Malloc1(allocsp*
sizeof(WORD),
"$-sort space");
525 if ( AN.tryterm > 0 ) AN.tryterm = 0;
527 *((WORD **)buffer) = to;
529 while ( ( t = *ss++ ) != 0 ) {
530 j = *t;
while ( --j >= 0 ) *to++ = *t++;
538 while ( ( t = *ss++ ) != 0 ) {
540 if ( ( sSpace += j ) > AM.MaxTer/((LONG)
sizeof(WORD)) ) {
542 while ( ( t = *ss++ ) != 0 ) {
545 MLOCK(ErrorMessageLock);
546 MesPrint(
"Sorted function argument too long (%d words). Increase MaxTermSize (%l words).", sSpace, AM.MaxTer/((LONG)
sizeof(WORD)));
547 MUNLOCK(ErrorMessageLock);
548 retval = -1;
goto RetRetval;
550 while ( --j >= 0 ) *to++ = *t++;
553 retval = to - buffer;
561 *AR.CompressPointer = 0;
562 SeekScratch(AR.outfile,&position);
574 {
int oldgzipCompress = AR.gzipCompress;
579 while ( ( t = *ss++ ) != 0 ) {
580 if ( *t ) S->TermsLeft++;
582 if ( AS.MasterSort && ( fout == AR.outfile ) ) { PutToMaster(BHEAD t); }
585 if (
PutOut(BHEAD t,&position,fout,1) < 0 ) {
586 retval = -1;
goto RetRetval;
591 if ( AS.MasterSort && ( fout == AR.outfile ) ) { PutToMaster(BHEAD 0); }
595 retval = -1;
goto RetRetval;
598 AR.gzipCompress = oldgzipCompress;
602 if ( AS.MasterSort && ( fout == AR.outfile ) )
goto RetRetval;
605 if ( PF.me != MASTER && PF.exprtodo < 0 )
goto RetRetval;
607 DIFPOS(oldpos,position,oldpos);
608 S->SpaceLeft = BASEPOSITION(oldpos);
609 WriteStats(&oldpos,STATSPOSTSORT,NOCHECKLOGTYPE);
614 else if ( par == 1 && newout == 0 ) { AR.outfile = newout = AllocFileHandle(0,(
char *)0); }
616 lSpace = sSpace + (S->lFill - S->lBuffer) - (LONG)S->lPatch*(AM.MaxTer/
sizeof(WORD));
619 SETBASEPOSITION(pp,lSpace);
620 MULPOS(pp,
sizeof(WORD));
621 if ( S->file.handle >= 0 ) {
622 ADD2POS(pp,S->fPatches[S->fPatchN]);
625 if ( S->lPatch > 0 || S->file.handle >= 0 ) {
629 if ( par == 2 ) { AR.outfile = newout = AllocFileHandle(0,(
char *)0); }
630 if ( S->lPatch > 0 ) {
631 if ( ( S->lPatch >= S->MaxPatches ) ||
632 ( ( (WORD *)(((UBYTE *)(S->lFill + sSpace)) + 2*AM.MaxTer) ) >= S->lTop ) ) {
637 if ( S->lPatch >= S->MaxPatches ) S->verbLBsortPatches++;
638 else S->verbLBsortCap++;
641 MLOCK(ErrorMessageLock);
642 MesPrint(
"%w EndSort: lPatch = %d, MaxPatches = %d,lFill = %x, sSpace = %ld, MaxTer = %d, lTop = %x"
643 ,S->lPatch,S->MaxPatches,S->lFill,sSpace,AM.MaxTer/
sizeof(WORD),S->lTop);
644 MUNLOCK(ErrorMessageLock);
648 MLOCK(ErrorMessageLock);
650 MUNLOCK(ErrorMessageLock);
651 retval = -1;
goto RetRetval;
654 pp = S->SizeInFile[1];
655 MULPOS(pp,
sizeof(WORD));
661 SETBASEPOSITION(pppp,0);
662 SeekFile(S->file.handle,&pppp,SEEK_CUR);
663 SeekFile(S->file.handle,&pp,SEEK_END);
664 SeekFile(S->file.handle,&pppp,SEEK_SET);
665 WriteStats(&pp,STATSMERGETOFILE,CHECKLOGTYPE);
670 S->Patches[S->lPatch++] = S->lFill;
671 to = (WORD *)(((UBYTE *)(S->lFill)) + AM.MaxTer);
674 while ( ( t = *ss++ ) != 0 ) {
676 if ( j < 0 ) j = t[1] + 2;
677 while ( --j >= 0 ) *to++ = *t++;
682 if ( S->file.handle < 0 ) {
684 MLOCK(ErrorMessageLock);
686 MUNLOCK(ErrorMessageLock);
687 retval = -1;
goto RetRetval;
690 pp = S->SizeInFile[2];
691 MULPOS(pp,
sizeof(WORD));
693 if ( AS.MasterSort && ( fout == AR.outfile ) )
goto RetRetval;
699 if ( par == 2 && newout->handle >= 0 ) {
703 LOCK(newout->pthreadslock);
705 SeekFile(newout->handle,&zeropos,SEEK_SET);
706 to = (WORD *)Malloc1(BASEPOSITION(newout->filesize)+
sizeof(WORD)*2
707 ,
"$-buffer reading");
708 if ( AN.tryterm > 0 ) AN.tryterm = 0;
709 if ( ( retval = ReadFile(newout->handle,(UBYTE *)to,BASEPOSITION(newout->filesize)) ) !=
710 BASEPOSITION(newout->filesize) ) {
711 MLOCK(ErrorMessageLock);
712 MesPrint(
"Error reading information for $ variable");
713 MUNLOCK(ErrorMessageLock);
714 M_free(to,
"$-buffer reading");
718 *((WORD **)buffer) = to;
719 retval /=
sizeof(WORD);
722 UNLOCK(newout->pthreadslock);
725 else if ( newout->handle >= 0 ) {
732 MLOCK(ErrorMessageLock);
733 MesPrint(
"(1)Output should fit inside a single term. Increase MaxTermSize?");
735 MUNLOCK(ErrorMessageLock);
736 retval = -1;
goto RetRetval;
739 t = newout->PObuffer;
742 j = newout->POfill - t;
744 if ( to >= AT.WorkSpace && to < AT.WorkTop && to+j > AT.WorkTop )
746 if ( j > AM.MaxTer ) {
747 MLOCK(ErrorMessageLock);
748 MesPrint(
"Encountered term of size: %d words.", j/(LONG)
sizeof(WORD) );
749 MUNLOCK(ErrorMessageLock);
753 retval = to - buffer - 1;
760 MLOCK(ErrorMessageLock);
762 MUNLOCK(ErrorMessageLock);
763 retval = -1;
goto RetRetval;
766 pp = S->SizeInFile[1];
767 MULPOS(pp,
sizeof(WORD));
773 SETBASEPOSITION(pppp,0);
774 SeekFile(S->file.handle,&pppp,SEEK_CUR);
775 SeekFile(S->file.handle,&pp,SEEK_END);
776 SeekFile(S->file.handle,&pppp,SEEK_SET);
777 WriteStats(&pp,STATSMERGETOFILE,CHECKLOGTYPE);
785 if ( newout->handle >= 0 )
goto TooLarge;
786 t = newout->PObuffer;
787 j = newout->POfill - t;
789 if ( to >= AT.WorkSpace && to < AT.WorkTop && to+j > AT.WorkTop )
791 if ( j > AM.MaxTer )
goto TooLarge;
798 if ( S->file.handle >= 0 ) {
800 MLOCK(ErrorMessageLock);
801 MesPrint(
"%w EndSort: fPatchN = %d, lPatch = %d, position = %12p"
802 ,S->fPatchN,S->lPatch,&(S->fPatches[S->fPatchN]));
803 MUNLOCK(ErrorMessageLock);
805 if ( S->lPatch <= 0 ) {
807 position = S->fPatches[S->fPatchN];
810 *AR.CompressPointer = 0;
812 if ( S == AT.S0 && AR.NoCompress == 0 && AR.gzipCompress > 0 )
813 S->fpcompressed[S->fPatchN] = 1;
815 S->fpcompressed[S->fPatchN] = 0;
816 SetupOutputGZIP(&(S->file));
818 while ( ( t = *ss++ ) != 0 ) {
819 if (
PutOut(BHEAD t,&position,&(S->file),1) < 0 ) {
820 retval = -1;
goto RetRetval;
823 if (
FlushOut(&position,&(S->file),1) ) {
824 retval = -1;
goto RetRetval;
827 S->fPatches[S->fPatchN] = position;
830 MLOCK(ErrorMessageLock);
831 MesPrint(
"%w EndSort+: fPatchN = %d, lPatch = %d, position = %12p"
832 ,S->fPatchN,S->lPatch,&(S->fPatches[S->fPatchN]));
833 MUNLOCK(ErrorMessageLock);
839 if ( AS.MasterSort && AC.ThreadSortFileSynch ) {
840 if ( S->file.handle >= 0 ) {
841 SynchFile(S->file.handle);
847 MLOCK(ErrorMessageLock);
849 MUNLOCK(ErrorMessageLock);
850 retval = -1;
goto RetRetval;
854 if ( AS.MasterSort && ( fout == AR.outfile ) )
goto RetRetval;
856 pp = S->SizeInFile[0];
857 MULPOS(pp,
sizeof(WORD));
865 if ( AR.sLevel == 0 && (PF.me == MASTER || PF.exprtodo >= 0) ) {
866 Expressions[AR.CurExpr].counter = S->TermsLeft;
867 Expressions[AR.CurExpr].size = pp;
870 if ( AR.sLevel == 0 ) {
871 Expressions[AR.CurExpr].counter = S->TermsLeft;
872 Expressions[AR.CurExpr].size = pp;
876 if ( S->file.handle >= 0 && ( par != 1 ) && ( par != 2 ) ) {
880 ClearSortGZIP(&(S->file));
882 CloseFile(S->file.handle);
884 remove(S->file.name);
886 MLOCK(ErrorMessageLock);
887 MesPrint(
"%wEndSort: sortfile %s removed",S->file.name);
888 MUNLOCK(ErrorMessageLock);
891 AR.outfile = oldoutfile;
893 if ( AR.sLevel >= 0 ) AT.SS = AN.FunSorts[AR.sLevel];
898 DeAllocFileHandle(newout);
903 if ( newout->handle >= 0 ) {
904 MLOCK(ErrorMessageLock);
905 MesPrint(
"(2)Output should fit inside a single term. Increase MaxTermSize?");
907 MUNLOCK(ErrorMessageLock);
910 else if ( newout->POfill > newout->PObuffer ) {
916 j = newout->POfill-newout->PObuffer;
917 if ( buffer >= AT.WorkSpace && buffer < AT.WorkTop && buffer+j > AT.WorkTop )
920 to = buffer; t = newout->PObuffer;
921 while ( j-- > 0 ) *to++ = *t++;
925 DeAllocFileHandle(newout);
929 else if ( par == 2 ) {
932 if ( newout->handle >= 0 ) {
940 LOCK(newout->pthreadslock);
942 SeekFile(newout->handle,&position,SEEK_END);
944 SeekFile(newout->handle,&zeropos,SEEK_SET);
945 to = (WORD *)Malloc1(BASEPOSITION(position)+
sizeof(WORD)*3
946 ,
"$-buffer reading");
947 if ( AN.tryterm > 0 ) AN.tryterm = 0;
948 if ( ( retval = ReadFile(newout->handle,(UBYTE *)to,BASEPOSITION(position)) ) !=
949 BASEPOSITION(position) ) {
950 MLOCK(ErrorMessageLock);
951 MesPrint(
"Error reading information for $ variable");
952 MUNLOCK(ErrorMessageLock);
953 M_free(to,
"$-buffer reading");
957 *((WORD **)buffer) = to;
958 retval /=
sizeof(WORD);
961 UNLOCK(newout->pthreadslock);
968 LONG wsiz = newout->POfill - newout->PObuffer;
969 if ( AN.tryterm > 0 && ( (wsiz+2)*
sizeof(WORD) < (
size_t)(AM.MaxTer) ) ) {
970 to = TermMalloc(
"$-sort space");
973 LONG allocsp = wsiz+2;
974 if ( allocsp < MINALLOC ) allocsp = MINALLOC;
975 allocsp = ((allocsp+7)/8)*8;
976 to = (WORD *)Malloc1(allocsp*
sizeof(WORD),
"$-buffer reading");
977 if ( AN.tryterm > 0 ) AN.tryterm = 0;
979 *((WORD **)buffer) = to; t = newout->PObuffer;
985 DeAllocFileHandle(newout);
991 DeAllocFileHandle(newout);
998 MLOCK(ErrorMessageLock);
1001 MUNLOCK(ErrorMessageLock);
1174 WORD i, *p, ret, *r, *rr, j, k, first;
1175 int dobracketindex = 0;
1178 if ( AT.SS != AT.S0 ) {
1182 if ( ( i = *term ) <= 0 )
return(0);
1184 ADDPOS(*position,i*
sizeof(WORD));
1187 if ( p >= fi->POstop ) {
1189 if ( ( RetCode = CreateFile(fi->name) ) >= 0 ) {
1191 MLOCK(ErrorMessageLock);
1192 MesPrint(
"%w PutOut created sortfile %s",fi->name);
1193 MUNLOCK(ErrorMessageLock);
1195 fi->
handle = (WORD)RetCode;
1196 PUTZERO(fi->filesize);
1197 PUTZERO(fi->POposition);
1206 MLOCK(ErrorMessageLock);
1207 MesPrint(
"Cannot create scratch file %s",fi->name);
1208 MUNLOCK(ErrorMessageLock);
1213 LOCK(fi->pthreadslock);
1215 if ( fi == AR.hidefile ) {
1216 LOCK(AS.inputslock);
1218 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1219 if ( ( RetCode = WriteFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize) ) != fi->POsize ) {
1220 if ( fi == AR.hidefile ) {
1221 UNLOCK(AS.inputslock);
1224 UNLOCK(fi->pthreadslock);
1226 MLOCK(ErrorMessageLock);
1227 MesPrint(
"Write error during sort. Disk full?");
1228 MesPrint(
"Attempt to write %l bytes on file %d at position %15p",
1229 fi->POsize,fi->
handle,&(fi->POposition));
1230 MesPrint(
"RetCode = %l, Buffer address = %l",RetCode,(LONG)(fi->PObuffer));
1231 MUNLOCK(ErrorMessageLock);
1234 ADDPOS(fi->filesize,fi->POsize);
1236 ADDPOS(fi->POposition,fi->POsize);
1237 if ( fi == AR.hidefile ) {
1238 UNLOCK(AS.inputslock);
1241 UNLOCK(fi->pthreadslock);
1244 if ( AS.MasterSort && AC.ThreadSortFileSynch ) {
1250 }
while ( --i > 0 );
1251 fi->POfull = fi->POfill = p;
1254 if ( ( AP.PreDebug & DUMPOUTTERMS ) == DUMPOUTTERMS ) {
1255 MLOCK(ErrorMessageLock);
1257 snprintf((
char *)(THRbuf),100,
"PutOut(%d)",AT.identity);
1258 PrintTerm(term,(
char *)(THRbuf));
1260 PrintTerm(term,
"PutOut");
1262 MesPrint(
"ncomp = %d, AR.NoCompress = %d, AR.sLevel = %d",ncomp,AR.NoCompress,AR.sLevel);
1263 MesPrint(
"File %s, position %p",fi->name,position);
1264 MUNLOCK(ErrorMessageLock);
1267 if ( AR.sLevel <= 0 && Expressions[AR.CurExpr].newbracketinfo
1268 && ( fi == AR.outfile || fi == AR.hidefile ) ) dobracketindex = 1;
1269 r = rr = AR.CompressPointer;
1270 first = j = k = ret = 0;
1271 if ( ( i = *term ) != 0 ) {
1274 if ( fi == AR.outfile || fi == AR.hidefile ) {
1275 MLOCK(ErrorMessageLock);
1276 MesPrint(
"Ran into precompressed term");
1277 MUNLOCK(ErrorMessageLock);
1282 else if ( !AR.NoCompress && ( ncomp > 0 ) && AR.sLevel <= 0 ) {
1283 if ( dobracketindex ) {
1284 PutBracketInIndex(BHEAD term,position);
1290 WORD *polystop, *sa;
1294 while ( polystop < sa && *polystop != AR.PolyFun ) {
1295 polystop += polystop[1];
1297 if ( polystop < sa ) {
1298 if ( AR.PolyFunType == 2 ) polystop[2] &= ~MUSTCLEANPRF;
1299 while ( i > 0 && j > 0 && *p == *r && p < polystop ) {
1300 i--; j--; k--; p++; r++;
1304 while ( i > 0 && j > 0 && *p == *r && p < sa ) { i--; j--; k--; p++; r++; }
1308 else if ( AT.aux_ != 0 ) {
1309 WORD *floatstop, *sa;
1313 while ( floatstop < sa && *floatstop != FLOATFUN ) {
1314 floatstop += floatstop[1];
1316 if ( floatstop < sa ) {
1317 while ( i > 0 && j > 0 && *p == *r && p < floatstop ) {
1318 i--; j--; k--; p++; r++;
1322 while ( i > 0 && j > 0 && *p == *r && p < sa ) { i--; j--; k--; p++; r++; }
1330 while ( i > 0 && j > 0 && *p == *r && p < sa ) { i--; j--; k--; p++; r++; }
1350 r[-(ABS(r[-1]))] = 0;
1351 if ( r >= AR.ComprTop ) {
1352 MLOCK(ErrorMessageLock);
1353 MesPrint(
"CompressSize of %10l is insufficient",AM.CompressSize);
1354 MUNLOCK(ErrorMessageLock);
1359 else if ( !AR.NoCompress && ( ncomp < 0 ) && AR.sLevel <= 0 ) {
1361 if ( dobracketindex ) {
1362 PutBracketInIndex(BHEAD term,position);
1368 WORD *polystop, *sa;
1372 while ( polystop < sa && *polystop != AR.PolyFun ) {
1373 polystop += polystop[1];
1375 if ( polystop < sa ) {
1376 if ( AR.PolyFunType == 2 ) polystop[2] &= ~MUSTCLEANPRF;
1377 while ( i > 0 && j > 0 && *p == *r && p < polystop ) {
1378 i--; j--; k--; p++; r++;
1382 while ( i > 0 && j > 0 && *p == *r ) { i--; j--; k--; p++; r++; }
1386 while ( i > 0 && j > 0 && *p == *r ) { i--; j--; k--; p++; r++; }
1391 if ( AR.PolyFunType == 2 ) {
1393 tstop = term + *term;
1394 tstop -= ABS(tstop[-1]);
1396 while ( t < tstop ) {
1397 if ( *t == AR.PolyFun ) {
1398 t[2] &= ~MUSTCLEANPRF;
1403 if ( dobracketindex ) {
1404 PutBracketInIndex(BHEAD term,position);
1408 ADDPOS(*position,i*
sizeof(WORD));
1411 if ( p >= fi->POstop ) {
1413 if ( PF.me != MASTER && AR.sLevel <= 0 && (fi == AR.outfile || fi == AR.hidefile) && PF.parallel && PF.exprtodo < 0 ) {
1415 sbuf->fill[sbuf->active] = fi->POstop;
1417 p = fi->PObuffer = fi->POfill = fi->POfull =
1418 sbuf->buff[sbuf->active];
1419 fi->POstop = sbuf->stop[sbuf->active];
1425 if ( ( RetCode = CreateFile(fi->name) ) >= 0 ) {
1427 MLOCK(ErrorMessageLock);
1428 MesPrint(
"%w PutOut created sortfile %s",fi->name);
1429 MUNLOCK(ErrorMessageLock);
1431 fi->
handle = (WORD)RetCode;
1432 PUTZERO(fi->filesize);
1433 PUTZERO(fi->POposition);
1442 MLOCK(ErrorMessageLock);
1443 MesPrint(
"Cannot create scratch file %s",fi->name);
1444 MUNLOCK(ErrorMessageLock);
1449 if ( !AR.NoCompress && ncomp > 0 && AR.gzipCompress > 0
1450 && dobracketindex == 0 && fi->zsp != 0 ) {
1452 if ( PutOutputGZIP(fi) )
return(-1);
1459 LOCK(fi->pthreadslock);
1461 if ( fi == AR.hidefile ) {
1462 LOCK(AS.inputslock);
1464 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1465 if ( ( RetCode = WriteFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize) ) != fi->POsize ) {
1466 if ( fi == AR.hidefile ) {
1467 UNLOCK(AS.inputslock);
1470 UNLOCK(fi->pthreadslock);
1472 MLOCK(ErrorMessageLock);
1473 MesPrint(
"Write error during sort. Disk full?");
1474 MesPrint(
"Attempt to write %l bytes on file %d at position %15p",
1475 fi->POsize,fi->
handle,&(fi->POposition));
1476 MesPrint(
"RetCode = %l, Buffer address = %l",RetCode,(LONG)(fi->PObuffer));
1477 MUNLOCK(ErrorMessageLock);
1480 ADDPOS(fi->filesize,fi->POsize);
1482 ADDPOS(fi->POposition,fi->POsize);
1483 if ( fi == AR.hidefile ) {
1484 UNLOCK(AS.inputslock);
1487 UNLOCK(fi->pthreadslock);
1490 if ( AS.MasterSort && AC.ThreadSortFileSynch ) {
1498 if ( first == 2 ) *p++ = k;
1502 else *p++ = *term++;
1508 }
while ( --i > 0 );
1509 fi->POfull = fi->POfill = p;
1537 int dobracketindex = 0;
1541 if ( AR.sLevel <= 0 && Expressions[AR.CurExpr].newbracketinfo
1542 && ( fi == AR.outfile || fi == AR.hidefile ) ) dobracketindex = 1;
1544 if ( PF.me != MASTER && AR.sLevel <= 0 && (fi == AR.outfile || fi == AR.hidefile) && PF.parallel && PF.exprtodo < 0 ) {
1546 if ( fi->POfill >= fi->POstop ){
1547 sbuf->fill[sbuf->active] = fi->POstop;
1549 fi->POfull = fi->POfill = fi->PObuffer = sbuf->buff[sbuf->active];
1550 fi->POstop = sbuf->stop[sbuf->active];
1552 *(fi->POfill)++ = 0;
1553 sbuf->fill[sbuf->active] = fi->POfill;
1555 fi->PObuffer = fi->POfill = fi->POfull = sbuf->buff[sbuf->active];
1556 fi->POstop = sbuf->stop[sbuf->active];
1560 if ( fi->POfill >= fi->POstop ) {
1562 if ( ( RetCode = CreateFile(fi->name) ) >= 0 ) {
1564 MLOCK(ErrorMessageLock);
1565 MesPrint(
"%w FlushOut created scratch file %s",fi->name);
1566 MUNLOCK(ErrorMessageLock);
1568 PUTZERO(fi->filesize);
1569 PUTZERO(fi->POposition);
1570 fi->
handle = (WORD)RetCode;
1579 MLOCK(ErrorMessageLock);
1580 MesPrint(
"Cannot create scratch file %s",fi->name);
1581 MUNLOCK(ErrorMessageLock);
1586 if ( AT.SS == AT.S0 && !AR.NoCompress && AR.gzipCompress > 0
1587 && dobracketindex == 0 && ( compr > 0 ) && fi->zsp != 0 ) {
1588 if ( PutOutputGZIP(fi) )
return(-1);
1589 fi->POfill = fi->PObuffer;
1595 LOCK(fi->pthreadslock);
1597 if ( fi == AR.hidefile ) {
1598 LOCK(AS.inputslock);
1600 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1601 if ( ( RetCode = WriteFile(fi->
handle,(UBYTE *)(fi->PObuffer),fi->POsize) ) != fi->POsize ) {
1603 UNLOCK(fi->pthreadslock);
1605 if ( fi == AR.hidefile ) {
1606 UNLOCK(AS.inputslock);
1608 MLOCK(ErrorMessageLock);
1609 MesPrint(
"Write error while sorting. Disk full?");
1610 MesPrint(
"Attempt to write %l bytes on file %d at position %15p",
1611 fi->POsize,fi->
handle,&(fi->POposition));
1612 MesPrint(
"RetCode = %l, Buffer address = %l",RetCode,(LONG)(fi->PObuffer));
1613 MUNLOCK(ErrorMessageLock);
1616 ADDPOS(fi->filesize,fi->POsize);
1617 fi->POfill = fi->PObuffer;
1618 ADDPOS(fi->POposition,fi->POsize);
1619 if ( fi == AR.hidefile ) {
1620 UNLOCK(AS.inputslock);
1623 UNLOCK(fi->pthreadslock);
1626 if ( AS.MasterSort && AC.ThreadSortFileSynch && fi != AR.hidefile ) {
1632 *(fi->POfill)++ = 0;
1633 fi->POfull = fi->POfill;
1646 size = (fi->POfill-fi->PObuffer)*
sizeof(WORD);
1649 if ( AT.SS == AT.S0 && !AR.NoCompress && AR.gzipCompress > 0
1650 && dobracketindex == 0 && ( compr > 0 ) && fi->zsp != 0 ) {
1651 if ( FlushOutputGZIP(fi) )
return(-1);
1652 fi->POfill = fi->PObuffer;
1658 LOCK(fi->pthreadslock);
1660 if ( fi == AR.hidefile ) {
1661 LOCK(AS.inputslock);
1663 SeekFile(fi->
handle,&(fi->POposition),SEEK_SET);
1667 if ( ( RetCode = WriteFile(fi->
handle,(UBYTE *)(fi->PObuffer),size) ) != size ) {
1669 UNLOCK(fi->pthreadslock);
1671 if ( fi == AR.hidefile ) {
1672 UNLOCK(AS.inputslock);
1674 MLOCK(ErrorMessageLock);
1675 MesPrint(
"Write error while finishing sorting. Disk full?");
1676 MesPrint(
"Attempt to write %l bytes on file %d at position %15p",
1677 size,fi->
handle,&(fi->POposition));
1678 MesPrint(
"RetCode = %l, Buffer address = %l",RetCode,(LONG)(fi->PObuffer));
1679 MUNLOCK(ErrorMessageLock);
1682 ADDPOS(fi->filesize,size);
1683 ADDPOS(fi->POposition,size);
1684 fi->POfill = fi->PObuffer;
1685 if ( fi == AR.hidefile ) {
1686 UNLOCK(AS.inputslock);
1689 UNLOCK(fi->pthreadslock);
1692 if ( AS.MasterSort && AC.ThreadSortFileSynch ) {
1698 if ( dobracketindex ) {
1699 BRACKETINFO *b = Expressions[AR.CurExpr].newbracketinfo;
1700 if ( b->indexfill > 0 ) {
1701 DIFPOS(b->
indexbuffer[b->indexfill-1].next,*position,Expressions[AR.CurExpr].onfile);
1705 if ( AT.SS == AT.S0 && !AR.NoCompress && AR.gzipCompress > 0
1706 && dobracketindex == 0 && ( compr > 0 ) && fi->zsp != 0 ) {
1710 LOCK(fi->pthreadslock);
1712 SeekFile(fi->
handle,position,SEEK_END);
1714 UNLOCK(fi->pthreadslock);
1718 ADDPOS(*position,((UBYTE *)fi->POfill-(UBYTE *)fi->PObuffer));
1724 ADDPOS(*position,
sizeof(WORD));
1881 WORD *s1, *s2, *m, *w, *t, oldpw = S->PolyWise;
1882 s1 = *ps1 + S->PolyWise;
1883 s2 = *ps2 + S->PolyWise;
1888 if ( S->PolyFlag == 2 && AR.PolyFunExp != 2 && AR.PolyFunExp != 3 ) {
1889 WORD **oldSplitScratch = AN.SplitScratch;
1890 LONG oldSplitScratchSize = AN.SplitScratchSize;
1891 LONG oldInScratch = AN.InScratch;
1892 WORD oldtype = AR.SortType;
1893 if ( (WORD *)((UBYTE *)w + AM.MaxTer) >= AT.WorkTop ) {
1894 MLOCK(ErrorMessageLock);
1895 MesPrint(
"Program was adding polyratfun arguments");
1897 MUNLOCK(ErrorMessageLock);
1899 AR.SortType = SORTHIGHFIRST;
1901 AN.SplitScratch = AN.SplitScratch1;
1902 AN.SplitScratchSize = AN.SplitScratchSize1;
1903 AN.InScratch = AN.InScratch1;
1905 S->PolyWise = oldpw;
1906 AN.SplitScratch1 = AN.SplitScratch;
1907 AN.SplitScratchSize1 = AN.SplitScratchSize;
1908 AN.InScratch1 = AN.InScratch;
1909 AN.SplitScratch = oldSplitScratch;
1910 AN.SplitScratchSize = oldSplitScratchSize;
1911 AN.InScratch = oldInScratch;
1913 AR.SortType = oldtype;
1914 if ( w[1] <= FUNHEAD ||
1915 ( w[FUNHEAD] == -SNUMBER && w[FUNHEAD+1] == 0 ) ) {
1916 *ps1 = *ps2 = 0;
return(0);
1920 if ( w + s1[1] + s2[1] + 12 + ARGHEAD >= AT.WorkTop ) {
1921 MLOCK(ErrorMessageLock);
1922 MesPrint(
"Program was adding polyfun arguments");
1924 MUNLOCK(ErrorMessageLock);
1931 if ( w[1] <= FUNHEAD ) { *ps1 = *ps2 = 0;
return(0); }
1932 if ( w[1] <= s1[1] || w[1] <= s2[1] ) {
1933 if ( w[1] > s1[1] ) {
1942 while ( t < m ) *s1++ = *t++;
1943 **ps1 = WORDDIF(s1,(*ps1));
1952 if ( (S->sFill + (**ps1 + w[1] - s1[1])) >= S->sTop2 ) {
1954 MesPrint(
"------Garbage collection-------");
1956 AT.WorkPointer += w[1];
1960 if ( (S->sFill + (**ps1 + w[1] - s1[1])) >= S->sTop2 ) {
1963 MLOCK(ErrorMessageLock);
1964 AO.OutFill = AO.OutputLine = OutBuf;
1968 while ( --i >= 0 ) {
1969 TalToLine((UWORD)(*s2++)); TokenToLine((UBYTE *)
" ");
1972 AO.OutFill = AO.OutputLine = OutBuf;
1977 while ( --i >= 0 ) {
1978 TalToLine((UWORD)(*s2++)); TokenToLine((UBYTE *)
" ");
1981 AO.OutFill = AO.OutputLine = OutBuf;
1986 while ( --i >= 0 ) {
1987 TalToLine((UWORD)(*s2++)); TokenToLine((UBYTE *)
" ");
1990 if ( AR.sLevel > 0 ) {
1991 MesPrint(
"Please increase SubSmallExtension setup parameter.");
1994 MesPrint(
"Please increase SmallExtension setup parameter.");
1996 MUNLOCK(ErrorMessageLock);
1998 MLOCK(ErrorMessageLock);
1999 if ( AR.sLevel > 0 ) {
2000 MesPrint(
"Please increase SubSmallExtension setup parameter.");
2003 MesPrint(
"Please increase SmallExtension setup parameter.");
2005 MUNLOCK(ErrorMessageLock);
2019 while ( t < w ) *s2++ = *t++;
2023 if ( *m > AM.MaxTer/((LONG)
sizeof(WORD)) ) {
2024 MLOCK(ErrorMessageLock);
2025 MesPrint(
"Term too complex after polynomial addition. MaxTermSize = %10l",
2026 AM.MaxTer/
sizeof(WORD));
2027 MUNLOCK(ErrorMessageLock);
2052 WORD *w = m, *mm, *t, *t1, *t2, *tstop1, *tstop2;
2053 WORD tempterm[8+FUNHEAD];
2055 *m++ = AR.PolyFun; *m++ = 0; FILLFUN(m)
2056 *m++ = 0; *m++ = 0; FILLARG(m)
2057 if ( s1[FUNHEAD] < 0 || s2[FUNHEAD] < 0 ) {
2058 if ( s1[FUNHEAD] < 0 ) {
2059 if ( s2[FUNHEAD] < 0 ) {
2060 if ( s1[FUNHEAD] <= -FUNCTION ) {
2061 if ( s2[FUNHEAD] == s1[FUNHEAD] ) {
2062 *m++ = 4+FUNHEAD; *m++ = -s1[FUNHEAD]; *m++ = FUNHEAD;
2064 *m++ = 2; *m++ = 1; *m++ = 3;
2065 INSLENGTH(4+FUNHEAD)
2067 else if ( s2[FUNHEAD] <= -FUNCTION ) {
2068 i1 = functions[-FUNCTION-s1[FUNHEAD]].commute != 0;
2069 i2 = functions[-FUNCTION-s2[FUNHEAD]].commute != 0;
2070 if ( ( !i1 && i2 ) || ( i1 == i2 && i1 > i2 ) ) {
2072 s2[FUNHEAD] = s1[FUNHEAD];
2075 *m++ = 4+FUNHEAD; *m++ = -s1[FUNHEAD]; *m++ = FUNHEAD;
2077 *m++ = 1; *m++ = 1; *m++ = 3;
2078 *m++ = 4+FUNHEAD; *m++ = -s2[FUNHEAD]; *m++ = FUNHEAD;
2080 *m++ = 1; *m++ = 1; *m++ = 3;
2081 INSLENGTH(8+2*FUNHEAD)
2083 else if ( s2[FUNHEAD] == -SYMBOL ) {
2084 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = s2[FUNHEAD+1]; *m++ = 1;
2085 *m++ = 1; *m++ = 1; *m++ = 3;
2086 *m++ = 4+FUNHEAD; *m++ = -s1[FUNHEAD]; *m++ = FUNHEAD;
2088 *m++ = 1; *m++ = 1; *m++ = 3;
2089 INSLENGTH(12+FUNHEAD)
2093 *m++ = ABS(s2[FUNHEAD+1]); *m++ = 1; *m++ = s2[FUNHEAD+1] < 0 ? -3: 3;
2094 *m++ = 4+FUNHEAD; *m++ = -s1[FUNHEAD]; *m++ = FUNHEAD;
2096 *m++ = 1; *m++ = 1; *m++ = 3;
2097 INSLENGTH(8+FUNHEAD)
2100 else if ( s1[FUNHEAD] == -SYMBOL ) {
2101 if ( s2[FUNHEAD] == s1[FUNHEAD] ) {
2102 if ( s1[FUNHEAD+1] == s2[FUNHEAD+1] ) {
2103 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = s1[FUNHEAD+1];
2104 *m++ = 1; *m++ = 2; *m++ = 1; *m++ = 3;
2108 if ( s1[FUNHEAD+1] > s2[FUNHEAD+1] )
2109 { i1 = s2[FUNHEAD+1]; i2 = s1[FUNHEAD+1]; }
2110 else { i1 = s1[FUNHEAD+1]; i2 = s2[FUNHEAD+1]; }
2111 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = i1;
2112 *m++ = 1; *m++ = 1; *m++ = 1; *m++ = 3;
2113 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = i2;
2114 *m++ = 1; *m++ = 1; *m++ = 1; *m++ = 3;
2118 else if ( s2[FUNHEAD] <= -FUNCTION ) {
2119 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = s1[FUNHEAD+1]; *m++ = 1;
2120 *m++ = 1; *m++ = 1; *m++ = 3;
2121 *m++ = 4+FUNHEAD; *m++ = -s2[FUNHEAD]; *m++ = FUNHEAD;
2123 *m++ = 1; *m++ = 1; *m++ = 3;
2124 INSLENGTH(12+FUNHEAD)
2128 *m++ = ABS(s2[FUNHEAD+1]); *m++ = 1; *m++ = s2[FUNHEAD+1] < 0 ? -3: 3;
2129 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = s1[FUNHEAD+1]; *m++ = 1;
2130 *m++ = 1; *m++ = 1; *m++ = 3;
2135 if ( s2[FUNHEAD] <= -FUNCTION ) {
2137 *m++ = ABS(s1[FUNHEAD+1]); *m++ = 1; *m++ = s1[FUNHEAD+1] < 0 ? -3: 3;
2138 *m++ = 4+FUNHEAD; *m++ = -s2[FUNHEAD]; *m++ = FUNHEAD;
2140 *m++ = 1; *m++ = 1; *m++ = 3;
2141 INSLENGTH(8+FUNHEAD)
2143 else if ( s2[FUNHEAD] == -SYMBOL ) {
2145 *m++ = ABS(s1[FUNHEAD+1]); *m++ = 1; *m++ = s1[FUNHEAD+1] < 0 ? -3: 3;
2146 *m++ = 8; *m++ = SYMBOL; *m++ = 4; *m++ = s2[FUNHEAD+1]; *m++ = 1;
2147 *m++ = 1; *m++ = 1; *m++ = 3;
2152 x1 = (LONG)s1[FUNHEAD+1] + (LONG)s2[FUNHEAD+1];
2153 if ( x1 < 0 ) { i1 = (WORD)(-x1); i2 = -3; }
2154 else { i1 = (WORD)x1; i2 = 3; }
2155 if ( x1 && AN.ncmod != 0 ) {
2160 if ( Modulus(m) ) Terminate(-1);
2161 if ( *m == 0 ) w[1] = 0;
2163 if ( *m == 4 && ( m[1] & MAXPOSITIVE ) == m[1]
2181 else if ( ( i1 & MAXPOSITIVE ) == i1 ) {
2188 *m++ = 4; *m++ = i1; *m++ = 1; *m++ = i2;
2201 if ( s1[FUNHEAD] <= -FUNCTION ) {
2202 *t++ = 4+FUNHEAD; *t++ = -s1[FUNHEAD]; *t++ = FUNHEAD;
2204 *t++ = 1; *t++ = 1; *t++ = 3;
2206 else if ( s1[FUNHEAD] == -SYMBOL ) {
2207 *t++ = 8; *t++ = SYMBOL; *t++ = 4;
2208 *t++ = s1[FUNHEAD+1]; *t++ = 1;
2209 *t++ = 1; *t++ = 1; *t++ = 3;
2212 *t++ = 4; *t++ = ABS(s1[FUNHEAD+1]);
2213 *t++ = 1; *t++ = s1[FUNHEAD+1] < 0 ? -3: 3;
2229 tstop1 = s1 + s1[1];
2230 s1 += FUNHEAD+ARGHEAD;
2232 tstop2 = s2 + s2[1];
2233 s2 += FUNHEAD+ARGHEAD;
2237 oldPolyFlag = AT.SS->PolyFlag;
2238 AT.SS->PolyFlag = 0;
2239 while ( s1 < tstop1 && s2 < tstop2 ) {
2240 i1 = CompareTerms(BHEAD s1,s2,(WORD)(-1));
2245 else if ( i1 < 0 ) {
2268 if ( AddRat(BHEAD (UWORD *)t1,i1,(UWORD *)t2,i2,(UWORD *)m,&i) ) {
2269 MLOCK(ErrorMessageLock);
2270 MesPrint(
"Addition of coefficients of PolyFun");
2271 MUNLOCK(ErrorMessageLock);
2281 *mm = WORDDIF(m,mm);
2282 if ( AN.ncmod != 0 ) {
2283 if ( Modulus(mm) ) Terminate(-1);
2290 while ( s1 < tstop1 ) *m++ = *s1++;
2291 while ( s2 < tstop2 ) *m++ = *s2++;
2292 w[1] = WORDDIF(m,w);
2293 w[FUNHEAD] = w[1] - FUNHEAD;
2294 if ( ToFast(w+FUNHEAD,w+FUNHEAD) ) {
2295 if ( w[FUNHEAD] <= -FUNCTION ) w[1] = FUNHEAD+1;
2296 else w[1] = FUNHEAD+2;
2297 if ( w[FUNHEAD] == -SNUMBER && w[FUNHEAD+1] == 0 ) w[1] = FUNHEAD;
2300 AT.SS->PolyFlag = oldPolyFlag;
2341WORD
Compare1(PHEAD WORD *term1, WORD *term2, WORD level)
2344 WORD *stopper1, *stopper2, *t2;
2346 WORD *stopex1, *stopex2;
2349 WORD count = -1, localPoly, polyhit = -1;
2352 S->verbComparisons++;
2354 if ( S->PolyFlag ) {
2362 count = 0; localPoly = 1; S->PolyWise = polyhit = 0;
2363 S->PolyFlag = AR.PolyFunType;
2364 if ( AR.PolyFunType == 2 &&
2365 ( AR.PolyFunExp == 2 || AR.PolyFunExp == 3 ) ) S->PolyFlag = 1;
2367 else { localPoly = 0; }
2369 AT.SortFloatMode = 0;
2374 GETSTOP(term2,stopper2);
2377 while ( t1 < stopper1 && t2 < stopper2 ) {
2379 if ( *t1 == HAAKJE )
return(PREV(-1));
2380 if ( *t2 == HAAKJE )
return(PREV(1));
2381 if ( *t1 >= (FUNCTION-1) ) {
2382 if ( *t2 < (FUNCTION-1) )
return(PREV(-1));
2383 if ( *t1 < FUNCTION && *t2 < FUNCTION )
return(PREV(*t2-*t1));
2384 if ( *t1 < FUNCTION )
return(PREV(1));
2385 if ( *t2 < FUNCTION )
return(PREV(-1));
2386 c1 = functions[*t1-FUNCTION].commute;
2387 c2 = functions[*t2-FUNCTION].commute;
2389 if ( c2 )
return(PREV(1));
2390 else return(PREV(*t2-*t1));
2393 if ( !c2 )
return(PREV(-1));
2394 else return(PREV(*t2-*t1));
2397 else return(PREV(*t2-*t1));
2404 if ( localPoly && c1 < FUNCTION ) {
2407 if ( c1 <= (FUNCTION-1)
2408 || ( c1 >= FUNCTION && functions[c1-FUNCTION].spec > 0 ) ) {
2409 if ( c1 == SYMBOL ) {
2410 if ( *s1 == FACTORSYMBOL && *s2 == FACTORSYMBOL
2411 && s1[-1] == 4 && s2[-1] == 4
2412 && ( ( t1 < stopper1 && *t1 == HAAKJE )
2413 || ( t1 == stopper1 && AT.fromindex ) ) ) {
2420 if ( s1[1] != s2[1] )
return(s2[1]-s1[1]);
2423 else if ( AR.SortType >= SORTPOWERFIRST ) {
2426 while ( s1 < t1 ) { i1 += s1[1]; s1 += 2; }
2428 while ( s2 < t2 ) { i1 -= s2[1]; s2 += 2; }
2431 if ( AR.SortType >= SORTANTIPOWER ) i1 = -i1;
2438 if ( AR.SortType==SORTLOWFIRST ) {
2439 return(PREV((s1[1]>0?-1:1)));
2442 return(PREV((s1[1]<0?-1:1)));
2447 if ( AR.SortType==SORTLOWFIRST ) {
2449 return(PREV((s1[1]<0?1:-1)));
2452 return(PREV((s2[1]<0?-1:1)));
2457 return(PREV((s1[1]<0?-1:1)));
2460 return(PREV((s2[1]<0?1:-1)));
2465 if ( *s1 != *s2 )
return(
2466 PREV((AR.SortType==SORTLOWFIRST?*s2-*s1:*s1-*s2)));
2471 if ( AR.SortType==SORTLOWFIRST ) {
2472 return(PREV((s2[1]<0?-1:1)));
2475 return(PREV((s2[1]<0?1:-1)));
2479 else if ( c1 == DOTPRODUCT ) {
2480 if ( AR.SortType >= SORTPOWERFIRST ) {
2483 while ( s1 < t1 ) { i1 += s1[2]; s1 += 3; }
2485 while ( s2 < t2 ) { i1 -= s2[2]; s2 += 3; }
2488 if ( AR.SortType >= SORTANTIPOWER ) i1 = -i1;
2493 if ( s2 >= t2 )
return(PREV(1));
2494 if ( *s1 != *s2 )
return(PREV(*s2-*s1));
2496 if ( *s1 != *s2 )
return(PREV(*s2-*s1));
2498 if ( *s1 != *s2 )
return(
2499 PREV((AR.SortType==SORTLOWFIRST?*s2-*s1:*s1-*s2)));
2502 if ( s2 < t2 )
return(PREV(-1));
2506 if ( s2 >= t2 )
return(PREV(1));
2507 if ( *s1 != *s2 )
return(PREV(*s2-*s1));
2510 if ( s2 < t2 )
return(PREV(-1));
2518 if ( localPoly && c1 == AR.PolyFun ) {
2520 if ( S->PolyFlag == 1 ) {
2522 if ( *s1 > 0 ) i1 = *s1;
2523 else if ( *s1 <= -FUNCTION ) i1 = 1;
2525 if ( *s2 > 0 ) i2 = *s2;
2526 else if ( *s2 <= -FUNCTION ) i2 = 1;
2528 if ( s1+i1 == t1 && s2+i2 == t2 ) {
2533 WORD *u1, *u2, *ustop;
2535 if ( *s1 != -SNUMBER && *s1 != -SYMBOL && *s1 > -FUNCTION )
2542 ustop = u2 - ABS(u2[-1]);
2544 while ( u1 < ustop ) {
2545 if ( *u1 == INDEX )
goto NoPoly;
2552 if ( *s2 != -SNUMBER && *s2 != -SYMBOL && *s2 > -FUNCTION )
2559 ustop = u2 - ABS(u2[-1]);
2561 while ( u1 < ustop ) {
2562 if ( *u1 == INDEX )
goto NoPoly;
2569 S->PolyWise = WORDDIF(s1,term1);
2570 S->PolyWise -= FUNHEAD;
2576 S->PolyWise = localPoly = 0;
2579 else if ( AR.PolyFunType == 2 ) {
2580 WORD i1, i2, i1a, i2a;
2581 if ( *s1 > 0 ) i1 = *s1;
2582 else if ( *s1 <= -FUNCTION ) i1 = 1;
2584 if ( *s2 > 0 ) i2 = *s2;
2585 else if ( *s2 <= -FUNCTION ) i2 = 1;
2587 if ( s1[i1] > 0 ) i1a = s1[i1];
2588 else if ( s1[i1] <= -FUNCTION ) i1a = 1;
2590 if ( s2[i2] > 0 ) i2a = s2[i2];
2591 else if ( s2[i2] <= -FUNCTION ) i2a = 1;
2593 if ( s1+i1+i1a == t1 && s2+i2+i2a == t2 ) {
2598 WORD *u1, *u2, *ustop;
2600 if ( *s1 != -SNUMBER && *s1 != -SYMBOL && *s1 > -FUNCTION )
2605 while ( u1 < s1+i1 ) {
2607 ustop = u2 - ABS(u2[-1]);
2609 while ( u1 < ustop ) {
2610 if ( *u1 == INDEX )
goto NoPoly;
2617 if ( s1[i1] != -SNUMBER && s1[i1] != -SYMBOL && s1[i1] > -FUNCTION )
2621 u1 = s1 +i1 + ARGHEAD;
2624 ustop = u2 - ABS(u2[-1]);
2626 while ( u1 < ustop ) {
2627 if ( *u1 == INDEX )
goto NoPoly;
2634 if ( *s2 != -SNUMBER && *s2 != -SYMBOL && *s2 > -FUNCTION )
2639 while ( u1 < s2+i2 ) {
2641 ustop = u2 - ABS(u2[-1]);
2643 while ( u1 < ustop ) {
2644 if ( *u1 == INDEX )
goto NoPoly;
2651 if ( s2[i2] != -SNUMBER && s2[i2] != -SYMBOL && s2[i2] > -FUNCTION )
2655 u1 = s2 + i2 + ARGHEAD;
2658 ustop = u2 - ABS(u2[-1]);
2660 while ( u1 < ustop ) {
2661 if ( *u1 == INDEX )
goto NoPoly;
2668 S->PolyWise = WORDDIF(s1,term1);
2669 S->PolyWise -= FUNHEAD;
2674 S->PolyWise = localPoly = 0;
2678 S->PolyWise = localPoly = 0;
2682 t1 = term1 + S->PolyWise;
2683 t2 = term2 + S->PolyWise;
2690 if ( level == 0 && c1 == FLOATFUN && t1 == stopper1 && t2 == stopper2 && AT.aux_ != 0 ) {
2694 if ( TestFloat(s1-FUNHEAD) ) {
2695 if ( TestFloat(s2-FUNHEAD) ) { AT.SortFloatMode = 3;
return(0); }
2698 else if ( TestFloat(s2-FUNHEAD) ) {
return(-1); }
2705 if ( s2 >= t2 )
return(PREV(-1));
2712 if ( AC.properorderflag ) {
2714 oldpolyflag = S->PolyFlag;
2716 if ( ( c2 = -CompArg(s1,s2) ) != 0 ) {
2717 S->PolyFlag = oldpolyflag;
return(PREV(c2));
2719 S->PolyFlag = oldpolyflag;
2728 if ( s2 >= t2 )
return(PREV(-1));
2730 s1 += ARGHEAD; s2 += ARGHEAD;
2731 oldpolyflag = S->PolyFlag;
2733 while ( s1 < stopex1 ) {
2734 if ( s2 >= stopex2 ) {
2735 S->PolyFlag = oldpolyflag;
return(PREV(-1));
2737 if ( ( c2 = CompareTerms(BHEAD s1,s2,(WORD)1) ) != 0 ) {
2738 S->PolyFlag = oldpolyflag;
return(PREV(c2));
2743 S->PolyFlag = oldpolyflag;
2744 if ( s2 < stopex2 )
return(PREV(1));
2746 else return(PREV(1));
2749 if ( *s2 > 0 )
return(PREV(-1));
2750 if ( *s1 != *s2 ) {
return(PREV(*s1-*s2)); }
2751 if ( *s1 > -FUNCTION ) {
2752 if ( *++s1 != *++s2 ) {
return(PREV(*s2-*s1)); }
2758 if ( s2 < t2 )
return(PREV(1));
2762 if ( level == 0 && t1 < stopper1 && *t1 == FLOATFUN && t1+t1[1] == stopper1
2763 && TestFloat(t1) && AT.aux_ != 0 ) {
2764 AT.SortFloatMode = 1;
return(0);
2766 else if ( level == 0 && t2 < stopper2 && *t2 == FLOATFUN && t2+t2[1] == stopper2
2767 && TestFloat(t2) && AT.aux_ != 0 ) {
2768 AT.SortFloatMode = 2;
return(0);
2772 if ( AR.SortType != SORTLOWFIRST ) {
2773 if ( t1 < stopper1 )
return(PREV(1));
2774 if ( t2 < stopper2 )
return(PREV(-1));
2777 if ( t1 < stopper1 )
return(PREV(-1));
2778 if ( t2 < stopper2 )
return(PREV(1));
2781 if ( level == 3 )
return(
CompCoef(term1,term2));
3070 WORD **pp3, **pp1, **pp2, **pptop;
3071 LONG i, newleft, newright, split;
3073#ifdef SPLITMERGEDEBUG
3075 printf(
"%4ld: ", number);
3076 for (
int ii = 0; ii < S->sTerms; ii++) {
3077 if ( (S->sPointer)[ii] ) {
3078 printf(
"%4d ", (
unsigned)(S->sPointer[ii]-S->sBuffer));
3088 if ( number < 2 )
return(number);
3089 if ( number == 2 ) {
3090 pp1 = Pointer; pp2 = pp1 + 1;
3091 if ( ( i = CompareTerms(BHEAD *pp1,*pp2,(WORD)0) ) < 0 ) {
3092 pp3 = (WORD **)(*pp1); *pp1 = *pp2; *pp2 = (WORD *)pp3;
3094 else if ( i == 0 ) {
3096 if ( S->PolyWise ) {
if (
AddPoly(BHEAD pp1,pp2) == 0 ) number = 0; }
3097 else {
if (
AddCoef(BHEAD pp1,pp2) == 0 ) number = 0; }
3101 pptop = Pointer + number;
3104 newright =
SplitMerge(BHEAD Pointer+split,number-split);
3105 if ( newright == 0 )
return(newleft);
3113 if ( newleft > 0 && newright > 0 &&
3114 ( i = CompareTerms(BHEAD Pointer[newleft-1],Pointer[split],(WORD)0) ) >= 0 ) {
3115 pp2 = Pointer+split; pp1 = Pointer+newleft-1;
3117 if ( S->PolyWise ) {
3118 if (
AddPoly(BHEAD pp1,pp2) > 0 ) pp1++;
3122 if (
AddCoef(BHEAD pp1,pp2) > 0 ) pp1++;
3125 *pp2++ = 0; newright--;
3128 newleft += newright;
3130 while ( --newright >= 0 ) *pp1++ = *pp2++;
3131 while ( pp1 < pptop ) *pp1++ = 0;
3136 if ( split >= AN.SplitScratchSize ) {
3137 AN.SplitScratchSize = (split*3)/2+100;
3138 if ( AN.SplitScratchSize > S->Terms2InSmall/2 )
3139 AN.SplitScratchSize = S->Terms2InSmall/2;
3140 if ( AN.SplitScratch ) M_free(AN.SplitScratch,
"AN.SplitScratch");
3141 AN.SplitScratch = (WORD **)Malloc1(AN.SplitScratchSize*
sizeof(WORD *),
"AN.SplitScratch");
3144 pp3 = AN.SplitScratch; pp1 = Pointer;
3146 for ( i = 0; i < newleft; i++ ) { *pp3++ = *pp1; *pp1++ = 0; }
3147 AN.InScratch = newleft;
3148 pp1 = AN.SplitScratch; pp2 = Pointer + split; pp3 = Pointer;
3150#ifdef NEWSPLITMERGETIMSORT
3154 while ( newleft > 8 ) {
3156 LONG nnleft = newleft/2;
3157 if ( ( i = CompareTerms(BHEAD pp1[nnleft],*pp2,(WORD)0) ) < 0 ) {
3163 for (
int iii = 0; iii < nnleft; iii++) {
3169 if ( S->PolyWise ) { i =
AddPoly(BHEAD pp1,pp2); }
3170 else { i =
AddCoef(BHEAD pp1,pp2); }
3188 while ( newleft > 0 && newright > 0 ) {
3189 if ( ( i = CompareTerms(BHEAD *pp1,*pp2,(WORD)0) ) < 0 ) {
3200 if ( S->PolyWise ) {
if (
AddPoly(BHEAD pp1,pp2) > 0 ) *pp3++ = *pp1; }
3201 else {
if (
AddCoef(BHEAD pp1,pp2) > 0 ) *pp3++ = *pp1; }
3202 *pp1++ = 0; *pp2++ = 0; newleft--; newright--;
3205 for ( i = 0; i < newleft; i++ ) { *pp3++ = *pp1; *pp1++ = 0; }
3209 for ( i = 0; i < newright; i++ ) { *pp3++ = *pp2++; }
3211 newleft = pp3 - Pointer;
3212 while ( pp3 < pptop ) *pp3++ = 0;
3465 WORD **poin, **poin2, ul, k, i, im, *m1;
3466 WORD *p, lpat, mpat, level, l1, l2, r1, r2, r3, c;
3467 WORD *m2, *m3, r31, r33, ki, *rr;
3477 int oldgzipCompress = AR.gzipCompress;
3479 AR.gzipCompress = 0;
3483 fout = &(AR.FoStage4[0]);
3486 poin = S->poina; poin2 = S->poin2a;
3487 rr = AR.CompressPointer;
3494 if ( fout->
handle < 0 ) {
3496 PUTZERO(AN.OldPosOut);
3497 if ( ( fhandle = CreateFile(fout->name) ) < 0 ) {
3498 MLOCK(ErrorMessageLock);
3499 MesPrint(
"Cannot create file %s",fout->name);
3500 MUNLOCK(ErrorMessageLock);
3504 MLOCK(ErrorMessageLock);
3505 MesPrint(
"%w MergePatches created output file %s",fout->name);
3506 MUNLOCK(ErrorMessageLock);
3509 PUTZERO(fout->filesize);
3510 PUTZERO(fout->POposition);
3518 LOCK(fout->pthreadslock);
3520 SeekFile(fout->
handle,&(fout->filesize),SEEK_SET);
3522 UNLOCK(fout->pthreadslock);
3525 PUTZERO(S->fPatches[0]);
3526 fout->POfill = fout->PObuffer;
3527 PUTZERO(fout->POposition);
3532 if ( S == AT.S0 && AR.NoCompress == 0 && AR.gzipCompress > 0 )
3533 S->fpcompressed[S->fPatchN] = 1;
3535 S->fpcompressed[S->fPatchN] = 0;
3536 SetupOutputGZIP(fout);
3539 else if ( par == 0 && S->stage4 > 0 ) {
3551 S->iPatches = S->fPatches;
3552 S->fPatches = S->inPatches;
3553 S->inPatches = S->iPatches;
3554 (S->inNum) = S->fPatchN;
3555 AN.OldPosIn = AN.OldPosOut;
3557 m1 = S->fpincompressed;
3558 S->fpincompressed = S->fpcompressed;
3559 S->fpcompressed = m1;
3560 for ( i = 0; i < S->inNum; i++ ) {
3561 S->fPatchesStop[i] = S->iPatches[i+1];
3563 MLOCK(ErrorMessageLock);
3564 MesPrint(
"%w fPatchesStop[%d] = %10p",i,&(S->fPatchesStop[i]));
3565 MUNLOCK(ErrorMessageLock);
3577 AR.gzipCompress = 0;
3580 S->iPatches = S->fPatches;
3581 S->inNum = S->fPatchN;
3583 m1 = S->fpincompressed;
3584 S->fpincompressed = S->fpcompressed;
3585 S->fpcompressed = m1;
3586 for ( i = 0; i < S->inNum; i++ ) {
3587 S->fPatchesStop[i] = S->fPatches[i+1];
3589 MLOCK(ErrorMessageLock);
3590 MesPrint(
"%w fPatchesStop[%d] = %10p",i,&(S->fPatchesStop[i]));
3591 MUNLOCK(ErrorMessageLock);
3599 S->Patches[S->lPatch] = S->lFill;
3600 for ( i = 0; i < S->lPatch; i++ ) {
3601 S->pStop[i] = S->Patches[i+1]-1;
3602 S->Patches[i] = (WORD *)(((UBYTE *)(S->Patches[i])) + AM.MaxTer);
3606 S->lPatch = (S->inNum);
3608 if ( S->lPatch > 1 || ( (PF.exprtodo <0) && (fout == AR.outfile || fout == AR.hidefile ) ) ) {
3610 if ( S->lPatch > 1 ) {
3613 SetupAllInputGZIP(S);
3616 for ( i = 0; i < S->lPatch; i++ ) {
3617 p = (WORD *)(((UBYTE *)p)+2*AM.MaxTer+COMPINC*
sizeof(WORD));
3619 p = (WORD *)(((UBYTE *)p) + fin->POsize);
3620 S->pStop[i] = m2 = p;
3622 PutIn(fin,&(S->iPatches[i]),S->Patches[i],&m2,i);
3624 ADDPOS(S->iPatches[i],
PutIn(fin,&(S->iPatches[i]),S->Patches[i],&m2,i));
3629 if ( fout->
handle >= 0 ) {
3632 LOCK(fout->pthreadslock);
3634 SeekFile(fout->
handle,&position,SEEK_END);
3635 ADDPOS(position,((fout->POfill-fout->PObuffer)*
sizeof(WORD)));
3637 UNLOCK(fout->pthreadslock);
3641 SETBASEPOSITION(position,(fout->POfill-fout->PObuffer)*
sizeof(WORD));
3650 if ( S->lPatch == 1 ) {
3653 if ( fout->
handle < 0 )
if (
Sflush(fout) )
goto PatCall;
3659 m2 = m1 = *S->Patches;
3662 i = -(*m1++); m2 += i; im = *m1+i+1;
3663 while ( i > 0 ) { *m1-- = *m2--; i--; }
3674 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
3675 im = PutToMaster(BHEAD m1);
3679 if ( ( im =
PutOut(BHEAD m1,&position,fout,1) ) < 0 )
goto ReturnError;
3680 ADDPOS(S->SizeInFile[par],im);
3685 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
3686 PutToMaster(BHEAD 0);
3690 if (
FlushOut(&position,fout,1) )
goto ReturnError;
3691 ADDPOS(S->SizeInFile[par],1);
3694 length = (LONG)(*S->pStop)-(LONG)(*S->Patches)+
sizeof(WORD);
3695 if ( WriteFile(fout->
handle,(UBYTE *)(*S->Patches),length) != length )
3697 ADDPOS(position,length);
3698 ADDPOS(fout->POposition,length);
3699 ADDPOS(fout->filesize,length);
3700 ADDPOS(S->SizeInFile[par],length/
sizeof(WORD));
3710 #define FRONTSIZE (2*AM.MaxTer)
3711 WORD *copybuf = (WORD *)(((UBYTE *)(S->sBuffer)) + FRONTSIZE);
3713 SetupAllInputGZIP(S);
3715 position2 = S->iPatches[0];
3716 while ( ( length = FillInputGZIP(fin,&position2,
3718 (S->SmallEsize*
sizeof(WORD)-FRONTSIZE),0) ) > 0 ) {
3719 copytop = (WORD *)(((UBYTE *)copybuf)+length);
3720 while ( *m1 && ( ( *m1 > 0 && m1+*m1 < copytop ) ||
3721 ( *m1 < 0 && ( m1+1 < copytop ) && ( m1+m1[1]+1 < copytop ) ) ) )
3729 i = -(*m1++); m2 += i; im = *m1+i+1;
3730 while ( i > 0 ) { *m1-- = *m2--; i--; }
3734 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
3735 im = PutToMaster(BHEAD m1);
3739 if ( ( im =
PutOut(BHEAD m1,&position,fout,1) ) < 0 )
goto ReturnError;
3740 ADDPOS(S->SizeInFile[par],im);
3744 if ( m1 < copytop && *m1 == 0 )
break;
3750 while ( m1 > m2 ) *--m3 = *--m1;
3755 MLOCK(ErrorMessageLock);
3756 MesPrint(
"Readerror");
3760 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
3761 PutToMaster(BHEAD 0);
3765 if (
FlushOut(&position,fout,1) )
goto ReturnError;
3766 ADDPOS(S->SizeInFile[par],1);
3769 SeekFile(fin->
handle,&(S->iPatches[0]),SEEK_SET);
3770 while ( ( length = ReadFile(fin->
handle,
3771 (UBYTE *)(S->sBuffer),S->SmallEsize*
sizeof(WORD)) ) > 0 ) {
3772 if ( WriteFile(fout->
handle,(UBYTE *)(S->sBuffer),length) != length )
3774 ADDPOS(position,length);
3775 ADDPOS(fout->POposition,length);
3776 ADDPOS(fout->filesize,length);
3777 ADDPOS(S->SizeInFile[par],length/
sizeof(WORD));
3780 MLOCK(ErrorMessageLock);
3781 MesPrint(
"Readerror");
3788 else if ( S->lPatch > 0 ) {
3793 do { lpat *= 2; }
while ( lpat < S->lPatch );
3794 mpat = ( lpat >> 1 ) - 1;
3795 k = lpat - S->lPatch;
3800 for ( i = 1; i < lpat; i++ ) {
3803 for ( i = 1; i <= k; i++ ) {
3805 poin[im] = S->Patches[i-1];
3806 poin2[im] = poin[im] + *(poin[im]);
3809 S->tree[mpat+i] = 0;
3810 poin[im-1] = poin2[im-1] = 0;
3812 for ( i = (k*2)+1; i <= lpat; i++ ) {
3815 poin[i] = S->Patches[i-k-1];
3816 poin2[i] = poin[i] + *(poin[i]);
3836 if ( !*(poin[k]) ) {
3837 do {
if ( !( i >>= 1 ) )
goto EndOfMerge; }
while ( !S->tree[i] );
3838 if ( S->tree[i] == -1 ) {
3851 if ( S->tree[i] > 0 ) {
3852 if ( ( c = CompareTerms(BHEAD poin[S->tree[i]],poin[k],(WORD)0) ) > 0 ) {
3856 S->used[level] = S->tree[i];
3866 l1 = *( m1 = poin[S->tree[i]] );
3867 l2 = *( m2 = poin[k] );
3868 if ( S->PolyWise ) {
3873 if ( S->PolyFlag == 2 ) {
3875 if ( *tt1 + w[1] - m1[1] > AM.MaxTer/((LONG)
sizeof(WORD)) ) {
3876 MLOCK(ErrorMessageLock);
3877 MesPrint(
"Term too complex in PolyRatFun addition. MaxTermSize of %10l is too small",AM.MaxTer);
3878 MUNLOCK(ErrorMessageLock);
3885 if ( w + m1[1] + m2[1] > AT.WorkTop ) {
3886 MLOCK(ErrorMessageLock);
3887 MesPrint(
"A WorkSpace of %10l is too small",AM.WorkSize);
3888 MUNLOCK(ErrorMessageLock);
3895 || ( w[FUNHEAD] == -SNUMBER && w[FUNHEAD+1] == 0 ) )
3897 if ( r1 == m1[1] ) {
3900 else if ( r1 < m1[1] ) {
3904 while ( --r1 >= 0 ) *--m1 = *--m2;
3907 while ( --r1 >= 0 ) *--m1 = *--m2;
3909 poin[S->tree[i]] = m1;
3917 poin[S->tree[i]] = m2;
3924 else if ( AT.SortFloatMode ) {
3925 WORD *term1, *term2;
3926 term1 = poin[S->tree[i]];
3928 if ( MergeWithFloat(BHEAD &term1,&term2) == 0 )
3930 poin[S->tree[i]] = term1;
3934 r1 = *( m1 += l1 - 1 );
3936 r1 = ( ( r1 > 0 ) ? (r1-1) : (r1+1) ) >> 1;
3937 r2 = *( m2 += l2 - 1 );
3939 r2 = ( ( r2 > 0 ) ? (r2-1) : (r2+1) ) >> 1;
3941 if ( AddRat(BHEAD (UWORD *)m1,r1,(UWORD *)m2,r2,coef,&r3) ) {
3942 MLOCK(ErrorMessageLock);
3943 MesCall(
"MergePatches");
3944 MUNLOCK(ErrorMessageLock);
3948 if ( AN.ncmod != 0 ) {
3949 if ( ( AC.modmode & POSNEG ) != 0 ) {
3952 else if ( BigLong(coef,r3,(UWORD *)AC.cmod,ABS(AN.ncmod)) >= 0 ) {
3954 SubPLon(coef,r3,(UWORD *)AC.cmod,ABS(AN.ncmod),coef,&r3);
3956 for ( ii = 1; ii < r3; ii++ ) coef[r3+ii] = 0;
3960 r33 = ( r3 > 0 ) ? ( r3 + 1 ) : ( r3 - 1 );
3961 if ( r3 < 0 ) r3 = -r3;
3962 if ( r1 < 0 ) r1 = -r1;
3967 ul = S->used[level] = S->tree[i];
3974 r1 = poin2[ul][1] - im + 1;
3976 m2 = poin[ul] - im + 1;
3977 while ( ++im <= 0 ) *--m1 = *--m2;
3982 poin[ul] = poin2[ul];
3984 if ( !par && (poin[ul] + im + COMPINC) >= S->pStop[ki]
3987 PutIn(fin,&(S->iPatches[ki]),S->Patches[ki],&(poin[ul]),ki);
3989 ADDPOS(S->iPatches[ki],
PutIn(fin,&(S->iPatches[ki]),
3990 S->Patches[ki],&(poin[ul]),ki));
3992 poin2[ul] = poin[ul] + im;
3997 S->used[++level] = k;
4003 else if ( r31 < 0 ) {
4012 if( (poin[S->tree[i]]+l1+r31) >= poin2[S->tree[i]] ) {
4018 if ( (l1 + r31) > AM.MaxTer/((LONG)
sizeof(WORD)) ) {
4019 MLOCK(ErrorMessageLock);
4020 MesPrint(
"Coefficient overflow during sort");
4021 MUNLOCK(ErrorMessageLock);
4024 m2 = poin[S->tree[i]];
4025 m3 = ( poin[S->tree[i]] -= r31 );
4026 do { *m3++ = *m2++; }
while ( m2 < m1 );
4030 *(poin[S->tree[i]]) += r31;
4032 m2 = (WORD *)coef; im = r3;
4043 r1 = poin2[k][1] - im + 1;
4045 m2 = poin[k] - im + 1;
4046 while ( ++im <= 0 ) *--m1 = *--m2;
4053 if ( !par && ( (poin[k] + im + COMPINC) >= S->pStop[ki] )
4056 PutIn(fin,&(S->iPatches[ki]),S->Patches[ki],&(poin[k]),ki);
4058 ADDPOS(S->iPatches[ki],
PutIn(fin,&(S->iPatches[ki]),
4059 S->Patches[ki],&(poin[k]),ki));
4061 poin2[k] = poin[k] + im;
4069 else if ( S->tree[i] < 0 ) {
4080 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
4081 im = PutToMaster(BHEAD poin[k]);
4085 if ( ( im =
PutOut(BHEAD poin[k],&position,fout,1) ) < 0 ) {
4086 MLOCK(ErrorMessageLock);
4087 MesPrint(
"Called from MergePatches with k = %d (stream %d)",k,S->ktoi[k]);
4088 MUNLOCK(ErrorMessageLock);
4091 ADDPOS(S->SizeInFile[par],im);
4099 if ( AS.MasterSort && ( fout == AR.outfile ) && S == AT.S0 ) {
4100 PutToMaster(BHEAD 0);
4104 if (
FlushOut(&position,fout,1) )
goto ReturnError;
4105 ADDPOS(S->SizeInFile[par],1);
4109 SeekFile(fout->
handle,&position,SEEK_CUR);
4112 S->fPatches[S->fPatchN] = position;
4114 if ( par == 0 && fout != AR.outfile ) {
4123 S->fPatches[S->fPatchN] = position;
4124 if ( ISNOTZEROPOS(AN.OldPosIn) ) {
4126 SeekFile(fin->
handle,&(AN.OldPosIn),SEEK_SET);
4132 if ( (ULONG)ReadFile(fin->
handle,(UBYTE *)(&(S->inNum)),(LONG)
sizeof(WORD)) !=
4134 || (ULONG)ReadFile(fin->
handle,(UBYTE *)(&AN.OldPosIn),(LONG)
sizeof(
POSITION)) !=
4136 || (ULONG)ReadFile(fin->
handle,(UBYTE *)S->iPatches,(LONG)((S->inNum)+1)
4138 MLOCK(ErrorMessageLock);
4139 MesPrint(
"Read error fourth stage sorting");
4140 MUNLOCK(ErrorMessageLock);
4145 for ( i = 0; i < S->inNum; i++ ) {
4146 S->fPatchesStop[i] = S->iPatches[i+1];
4148 MLOCK(ErrorMessageLock);
4149 MesPrint(
"%w fPatchesStop[%d] = %10p",i,&(S->fPatchesStop[i]));
4150 MUNLOCK(ErrorMessageLock);
4172 MLOCK(ErrorMessageLock);
4173 MesPrint(
"%w MergePatches removed in file %s",fin->name);
4174 MUNLOCK(ErrorMessageLock);
4184 {
FILEHANDLE *ff = fin; fin = fout; fout = ff; }
4185 PUTZERO(S->SizeInFile[0]);
4199 MLOCK(ErrorMessageLock);
4200 MesPrint(
"%w MergePatches removed in file %s",fin->name);
4201 MUNLOCK(ErrorMessageLock);
4206 AR.gzipCompress = oldgzipCompress;
4211 AR.gzipCompress = oldgzipCompress;
4216 MLOCK(ErrorMessageLock);
4217 MesPrint(
"Error while writing to file.");
4221 MLOCK(ErrorMessageLock);
4223 MesCall(
"MergePatches");
4224 MUNLOCK(ErrorMessageLock);
4226 AR.gzipCompress = oldgzipCompress;