45static int iswarning = 0;
47static char hex[] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
48 'A',
'B',
'C',
'D',
'E',
'F'};
67VOID Error1(
char *s, UBYTE *t)
69 MesPrint(
"@%s %s",s,t);
78VOID Error2(
char *s1,
char *s2, UBYTE *t)
80 MesPrint(
"@%s%s %s",s1,s2,t);
91 MesPrint(
"=== Workspace overflow. %l bytes is not enough.",AM.WorkSize);
92 MesPrint(
"=== Change parameter WorkSpace in %s",setupfilename);
138MesPrint(
const char *fmt, ... )
145 char Out[MAXLINELENGTH+14], *stopper, *t, *s, *u, c, *carray;
146 UBYTE extrabuffer[MAXLINELENGTH+14];
147 int w, x, i, specialerror = 0;
150 UBYTE *oldoutfill = AO.OutputLine, *barray;
152 LONG (*OldWrite)(
int handle, UBYTE *buffer, LONG size) = WriteFile;
160 s = va_arg(ap,
char *);
170 if ( PF.me != MASTER && AS.printflag == 0 )
return(0);
171 if ( PF.me == MASTER || AS.printflag < 0 )
179 WriteFile = PF.me == MASTER || AS.printflag > 0 ? &
PF_WriteFileToFile : &WriteFileToFile;
181 WriteFile = &WriteFileToFile;
183 AO.OutputLine = extrabuffer;
185 stopper = Out + AC.LineLength;
187 if ( ( ( *s ==
'&' && AO.ErrorBlock == 0 ) || *s ==
'@' || *s ==
'#' ) && AC.CurrentStream != 0 ) {
188 u = (
char *)AC.CurrentStream->name;
191 if ( t >= stopper ) {
193 WriteString(ERROROUT,(UBYTE *)Out,num);
198 if ( t+20 >= stopper ) {
200 WriteString(ERROROUT,(UBYTE *)Out,num);
203 *t++ =
'L'; *t++ =
'i'; *t++ =
'n'; *t++ =
'e'; *t++ =
' ';
204 if ( *s ==
'&' ) y = AC.CurrentStream->prevline;
205 else y = AC.CurrentStream->linenumber;
207 if ( !iswarning && ( *s ==
'&' || *s ==
'@' ) ) {
208 for ( i = 0; i < NumDoLoops; i++ ) DoLoops[i].errorsinloop = 1;
211 if ( ( *s ==
'&' && AO.ErrorBlock == 0 ) ) {
212 *t++ =
' '; *t++ =
'-'; *t++ =
'-'; *t++ =
'>'; *t++ =
' '; s++;
214 else if ( *s ==
'@' || *s ==
'#' ) {
215 *t++ =
' '; *t++ =
'='; *t++ =
'='; *t++ =
'>'; *t++ =
' '; s++;
222 else if ( *s !=
'%' ) {
224 if ( t >= stopper ) {
226 WriteString(ERROROUT,(UBYTE *)Out,num);
233 if ( ( w = va_arg(ap,
int) ) < 0 ) { *t++ =
'-'; w = -w; }
234 t = (
char *)NumCopy(w,(UBYTE *)t);
236 else if ( *s ==
'l' ) {
237 if ( ( y = va_arg(ap, LONG) ) < 0 ) { *t++ =
'-'; y = -y; }
241 else if ( *s ==
'p' ) {
244 pp = va_arg(ap, POSITION *);
245 ly = BASEPOSITION(*pp);
246 if ( ly < 0 ) { *t++ =
'-'; ly = -ly; }
248 t = LongLongCopy(&(ly),t);
251 else if ( *s ==
'c' ) {
252 c = (char)(va_arg(ap,
int));
255 else if ( *s ==
'a' ) {
257 array = va_arg(ap,WORD *);
259 t = (
char *)NumCopy(*array,(UBYTE *)t);
260 if ( t >= stopper ) {
262 WriteString(ERROROUT,(UBYTE *)Out,num);
270 else if ( *s ==
'b' ) {
272 barray = va_arg(ap,UBYTE *);
274 *t++ = hex[((*barray)>>4)&0xF];
275 *t++ = hex[(*barray)&0xF];
277 if ( t >= stopper ) {
279 WriteString(ERROROUT,(UBYTE *)Out,num);
287 else if ( *s ==
'C' ) {
289 carray = va_arg(ap,
char *);
291 if ( *carray < 32 ) *t++ =
'^';
294 if ( t >= stopper ) {
296 WriteString(ERROROUT,(UBYTE *)Out,num);
303 else if ( *s ==
'I' ) {
306 iarray = va_arg(ap,
int *);
308 t = (
char *)LongCopy((LONG)(*iarray),(
char *)t);
309 if ( t >= stopper ) {
311 WriteString(ERROROUT,(UBYTE *)Out,num);
319 else if ( *s ==
'E' ) {
322 larray = va_arg(ap,LONG *);
324 t = (
char *)LongCopy(*larray,(
char *)t);
325 if ( t >= stopper ) {
327 WriteString(ERROROUT,(UBYTE *)Out,num);
335 else if ( *s ==
's' ) {
336 u = va_arg(ap,
char *);
338 if ( t >= stopper ) {
340 WriteString(ERROROUT,(UBYTE *)Out,num);
347 else if ( *s ==
't' || *s ==
'T' ) {
348 WORD oldskip = AO.OutSkip, noleadsign;
349 WORD oldmode = AC.OutputMode;
350 WORD oldbracket = AO.IsBracket;
351 WORD oldlength = AC.LineLength;
352 UBYTE *oldStop = AO.OutStop;
353 if ( AN.currentTerm ) {
354 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
358 AO.OutFill = AO.OutputLine;
359 AO.OutStop = AO.OutputLine + AC.LineLength;
361 AddToLine((UBYTE *)Out);
362 if ( *s ==
'T' ) noleadsign = 1;
364 if ( WriteInnerTerm(AN.currentTerm,noleadsign) ) Terminate(-1);
366 u = (
char *)AO.OutputLine;
368 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
370 AO.OutSkip = oldskip;
371 AC.OutputMode = oldmode;
372 AO.IsBracket = oldbracket;
373 AC.LineLength = oldlength;
374 AO.OutStop = oldStop;
377 else if ( *s ==
'r' ) {
378 WORD oldskip = AO.OutSkip;
379 WORD oldmode = AC.OutputMode;
380 WORD oldbracket = AO.IsBracket;
381 WORD oldlength = AC.LineLength;
382 UBYTE *oldStop = AO.OutStop;
383 if ( AN.currentTerm ) {
384 WORD *tt = AN.currentTerm;
385 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
389 AO.OutFill = AO.OutputLine;
390 AO.OutStop = AO.OutputLine + AC.LineLength;
394 t = (
char *)NumCopy(*tt,(UBYTE *)t);
396 if ( t >= stopper ) {
398 WriteString(ERROROUT,(UBYTE *)Out,num);
401 *t++ =
' '; *t++ =
' ';
404 AO.OutSkip = oldskip;
405 AC.OutputMode = oldmode;
406 AO.IsBracket = oldbracket;
407 AC.LineLength = oldlength;
408 AO.OutStop = oldStop;
411 else if ( *s ==
'$' ) {
415 WORD oldskip = AO.OutSkip;
416 WORD oldmode = AC.OutputMode;
417 WORD oldbracket = AO.IsBracket;
418 WORD oldlength = AC.LineLength;
419 UBYTE *oldStop = AO.OutStop;
420 WORD *term, indsubterm[3], *tt;
421 WORD value[5], first, num;
422 if ( *AN.listinprint != DOLLAREXPRESSION ) {
426 DOLLARS d = Dollars + AN.listinprint[1];
428 int nummodopt, dtype;
430 if ( AS.MultiThreaded ) {
431 for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
432 if ( AN.listinprint[1] == ModOptdollars[nummodopt].number )
break;
434 if ( nummodopt < NumModOptdollars ) {
435 dtype = ModOptdollars[nummodopt].type;
436 if ( dtype == MODLOCAL ) {
437 d = ModOptdollars[nummodopt].dstruct+AT.identity;
440 LOCK(d->pthreadslockread);
448 AO.OutFill = AO.OutputLine;
449 AO.OutStop = AO.OutputLine + AC.LineLength;
451 AddToLine((UBYTE *)Out);
452 if ( d->nfactors >= 1 && AN.listinprint[2] == DOLLAREXPR2 ) {
454 ( d->factors == 0 && d->nfactors != 1 ) )
goto dollarzero;
457 value[0] = 4; value[1] = d->nfactors; value[2] = 1; value[3] = 3; value[4] = 0;
458 term = value;
goto printterms;
460 if ( num == 1 && d->nfactors == 1 ) {
462 if ( *term == 0 )
goto dollarzero;
465 if ( num > d->nfactors ) {
466 MesPrint(
"\nFactor number for dollar is too large.");
469 term = d->factors[num-1].where;
471 if ( d->factors[num-1].value < 0 ) {
472 value[0] = 4; value[1] = -d->factors[num-1].value; value[2] = 1; value[3] = -3; value[4] = 0;
475 value[0] = 4; value[1] = d->factors[num-1].value; value[2] = 1; value[3] = 3; value[4] = 0;
481 if ( d->type == DOLTERMS || d->type == DOLNUMBER ) {
483printterms: first = 1;
485 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
489 AO.OutFill = AO.OutputLine;
490 AO.OutStop = AO.OutputLine + AC.LineLength;
492 AddToLine((UBYTE *)Out);
493 if ( WriteInnerTerm(term,first) ) {
495 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
501 u = (
char *)AO.OutputLine;
503 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
505 AO.OutSkip = oldskip;
506 AC.OutputMode = oldmode;
507 AO.IsBracket = oldbracket;
508 AC.LineLength = oldlength;
509 AO.OutStop = oldStop;
512 AO.OutSkip = oldskip;
514 else if ( d->type == DOLSUBTERM ) {
516dosubterm:
if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
520 AO.OutFill = AO.OutputLine;
521 AO.OutStop = AO.OutputLine + AC.LineLength;
523 AddToLine((UBYTE *)Out);
524 if ( WriteSubTerm(tt,1) ) {
526 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
531 u = (
char *)AO.OutputLine;
533 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
535 AO.OutSkip = oldskip;
536 AC.OutputMode = oldmode;
537 AO.IsBracket = oldbracket;
538 AC.LineLength = oldlength;
539 AO.OutStop = oldStop;
541 else if ( d->type == DOLUNDEFINED ) {
542 *t++ =
'*'; *t++ =
'*'; *t++ =
'*'; *t = 0;
544 else if ( d->type == DOLZERO ) {
545dollarzero: *t++ =
'0'; *t = 0;
547 else if ( d->type == DOLINDEX ) {
548 tt = indsubterm; *tt = INDEX;
549 tt[1] = 3; tt[2] = d->index;
552 else if ( d->type == DOLARGUMENT ) {
553 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
557 AO.OutFill = AO.OutputLine;
558 AO.OutStop = AO.OutputLine + AC.LineLength;
560 AddToLine((UBYTE *)Out);
561 WriteArgument(d->where);
563 u = (
char *)AO.OutputLine;
565 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
567 AO.OutSkip = oldskip;
568 AC.OutputMode = oldmode;
569 AO.IsBracket = oldbracket;
570 AC.LineLength = oldlength;
571 AO.OutStop = oldStop;
573 else if ( d->type == DOLWILDARGS ) {
575 if ( *tt == 0 ) { tt++;
577 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
581 AO.OutFill = AO.OutputLine;
582 AO.OutStop = AO.OutputLine + AC.LineLength;
584 AddToLine((UBYTE *)Out);
587 if ( *tt ) TokenToLine((UBYTE *)
",");
589 u = (
char *)AO.OutputLine;
591 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
593 AO.OutSkip = oldskip;
594 AC.OutputMode = oldmode;
595 AO.IsBracket = oldbracket;
596 AC.LineLength = oldlength;
597 AO.OutStop = oldStop;
600 else if ( *tt > 0 ) {
603 indsubterm[0] = INDEX;
605 indsubterm[2] = *tt++;
606 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
610 AO.OutFill = AO.OutputLine;
611 AO.OutStop = AO.OutputLine + AC.LineLength;
613 AddToLine((UBYTE *)Out);
614 if ( WriteSubTerm(indsubterm,1) ) Terminate(-1);
615 if ( i > 0 ) TokenToLine((UBYTE *)
",");
617 u = (
char *)AO.OutputLine;
619 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
621 AO.OutSkip = oldskip;
622 AC.OutputMode = oldmode;
623 AO.IsBracket = oldbracket;
624 AC.LineLength = oldlength;
625 AO.OutStop = oldStop;
630 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
633 while ( AN.listinprint[0] == DOLLAREXPR2 ) AN.listinprint += 2;
640 else if ( *s ==
'W' ) {
643 t = (
char *)NumCopy(identity,(UBYTE *)t);
645 timepart = (WORD)(millitime%1000);
649 t = (
char *)LongCopy(millitime,(
char *)t);
651 t = (
char *)NumCopy(timepart,(UBYTE *)t);
653 if ( t >= stopper ) {
655 WriteString(ERROROUT,(UBYTE *)Out,num);
659 else if ( *s ==
'w' ) {
660 t = (
char *)NumCopy(identity,(UBYTE *)t);
662#elif defined(WITHMPI)
663 else if ( *s ==
'W' ) {
666 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
668 timepart = (WORD)(millitime%1000);
672 t = (
char *)LongCopy(millitime,(
char *)t);
674 t = (
char *)NumCopy(timepart,(UBYTE *)t);
676 if ( t >= stopper ) {
678 WriteString(ERROROUT,(UBYTE *)Out,num);
682 else if ( *s ==
'w' ) {
683 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
686 else if ( *s ==
'w' ) { }
687 else if ( *s ==
'W' ) { }
689 else if ( FG.cTable[(
int)*s] == 1 ) {
691 while ( FG.cTable[(
int)*s] == 1 )
692 x = 10 * x + *s++ -
'0';
694 if ( *s ==
'l' || *s ==
'd' ) {
695 if ( *s ==
'l' ) { y = va_arg(ap,LONG); }
696 else { y = va_arg(ap,
int); }
697 if ( y < 0 ) { y = -y; w = 1; }
700 do { *--u = y%10+
'0'; y /= 10; }
while ( y && u > t );
701 if ( w && u > t ) *--u =
'-';
702 while ( --u >= t ) *u =
' ';
705 else if ( *s ==
's' ) {
706 u = va_arg(ap,
char *);
708 while ( *u ) { i++; u++; }
710 while ( x > i ) { *t++ =
' '; x--; }
712 while ( --i >= 0 ) { *--t = *--u; }
715 else if ( *s ==
'p' ) {
724 pp = va_arg(ap,POSITION *);
725 ly = BASEPOSITION(*pp);
727 do { *--u = ly%10+
'0'; ly /= 10; }
while ( ly && u > t );
728 while ( --u >= t ) *u =
' ';
731 else if ( *s ==
'i' ) {
734 do { *--u = (char)(w%10+
'0'); w /= 10; }
while ( u > t );
740 do { *--u = (char )(w%10+
'0'); w /= 10; }
while ( w && u > t );
741 while ( --u >= t ) *u =
' ';
745 else if ( *s ==
'x' ) {
747 y = va_arg(ap, LONG);
750 ccc = ( y >> (i*4) ) & 0xF;
754 ccc = ( y >> (i*4) ) & 0xF;
755 *t++ = hex[(int)ccc];
756 }
while ( --i >= 0 );
758 else if ( *s ==
'#' ) *t++ = *s;
759 else if ( *s ==
'%' ) *t++ = *s;
760 else if ( *s == 0 ) { *t++ = 0;
break; }
761 else if ( *s ==
'&' ) {
772 WriteString(ERROROUT,(UBYTE *)Out,num);
774 if ( specialerror == 1 ) {
775 MesPrint(
"!!!Wrong object in Print statement!!!");
776 MesPrint(
"!!!Object encountered is of a different type as in the format specifier");
778 AO.OutputLine = oldoutfill;
793 if ( AC.WarnFlag ) MesPrint(
"&Warning: %s",s);
802VOID HighWarning(
char *s)
805 if ( AC.WarnFlag >= 2 ) MesPrint(
"&Warning: %s",s);
816 return(MesPrint((
char *)
"Called from %s",s));
824WORD MesCerr(
char *s, UBYTE *t)
829 while ( *u && --i >= 0 ) u--;
833 MesPrint(
"&Illegal %s: %s",s,u);
843WORD MesComp(
char *s, UBYTE *p, UBYTE *q)
847 MesPrint(
"&%s: %s",s,p);
857VOID PrintTerm(WORD *term,
char *where)
862 AO.OutFill = AO.OutputLine = OutBuf;
866 TokenToLine((UBYTE *)where);
867 TokenToLine((UBYTE *)
": ");
873 TokenToLine((UBYTE *)
"-");
875 TalToLine((UWORD)(x));
876 TokenToLine((UBYTE *)
" ");
887VOID PrintTermC(WORD *term,
char *where)
893 PrintTerm(term,where);
896 AO.OutFill = AO.OutputLine = OutBuf;
900 TokenToLine((UBYTE *)where);
901 TokenToLine((UBYTE *)
": ");
907 TokenToLine((UBYTE *)
"-");
909 TalToLine((UWORD)(x));
910 TokenToLine((UBYTE *)
" ");
921VOID PrintSubTerm(WORD *term,
char *where)
926 AO.OutFill = AO.OutputLine = OutBuf;
930 TokenToLine((UBYTE *)where);
931 TokenToLine((UBYTE *)
": ");
933 while ( --i >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
943VOID PrintWords(WORD *buffer, LONG number)
947 AO.OutFill = AO.OutputLine = OutBuf;
951 while ( --number >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
961void PrintSeq(WORD *a,
char *text)
963 MesPrint(
" %s:",text);
965 MesPrint(
" %a",a[0],a);
WORD EvalDoLoopArg(PHEAD WORD *, WORD)
LONG PF_WriteFileToFile(int handle, UBYTE *buffer, LONG size)