45static int iswarning = 0;
47static char hex[] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
48 'A',
'B',
'C',
'D',
'E',
'F'};
56NORETURN
void Error0(
char *s)
67NORETURN
void Error1(
char *s, UBYTE *t)
69 MesPrint(
"@%s %s",s,t);
78NORETURN
void Error2(
char *s1,
char *s2, UBYTE *t)
80 MesPrint(
"@%s%s %s",s1,s2,t);
89NORETURN
void MesWork(
void)
91 MesPrint(
"=== Workspace overflow. %l bytes is not enough.",AM.WorkSize);
92 MesPrint(
"=== Change parameter WorkSpace in %s",setupfilename);
136int MesPrint(
const char *fmt, ... )
139 char Out[MAXLINELENGTH+14], *stopper, *t, *s, *u, c, *carray;
140 UBYTE extrabuffer[MAXLINELENGTH+14];
141 int w, x, i, specialerror = 0;
144 UBYTE *oldoutfill = AO.OutputLine, *barray;
146 LONG (*OldWrite)(
int handle, UBYTE *buffer, LONG size) = WriteFile;
159 if ( PF.me != MASTER && AS.printflag == 0 )
return(0);
160 if ( PF.me == MASTER || AS.printflag < 0 )
168 WriteFile = PF.me == MASTER || AS.printflag > 0 ? &
PF_WriteFileToFile : &WriteFileToFile;
170 WriteFile = &WriteFileToFile;
172 AO.OutputLine = extrabuffer;
174 stopper = Out + AC.LineLength;
176 if ( ( *s ==
'&' || *s ==
'@' || *s ==
'#' || ( *s ==
'!' && s[1] ==
'>' ) ) && AO.ErrorBlock == 0 && AC.CurrentStream != 0 ) {
177 u = (
char *)AC.CurrentStream->name;
180 if ( t >= stopper ) {
182 WriteString(ERROROUT,(UBYTE *)Out,num);
187 if ( t+20 >= stopper ) {
189 WriteString(ERROROUT,(UBYTE *)Out,num);
192 *t++ =
'L'; *t++ =
'i'; *t++ =
'n'; *t++ =
'e'; *t++ =
' ';
193 if ( *s ==
'&' ) y = AC.CurrentStream->prevline;
194 else y = AC.CurrentStream->linenumber;
196 if ( !iswarning && ( *s ==
'&' || *s ==
'@' ) ) {
197 for ( i = 0; i < NumDoLoops; i++ ) DoLoops[i].errorsinloop = 1;
200 if ( ( *s ==
'&' && AO.ErrorBlock == 0 ) ) {
201 *t++ =
' '; *t++ =
'-'; *t++ =
'-'; *t++ =
'>'; *t++ =
' '; s++;
203 else if ( ( *s ==
'@' || *s ==
'#' ) && AO.ErrorBlock == 0 ) {
204 *t++ =
' '; *t++ =
'='; *t++ =
'='; *t++ =
'>'; *t++ =
' '; s++;
206 else if ( *s ==
'!' && s[1] ==
'>' && AO.ErrorBlock == 0 ) {
207 const char *m =
" ~~> Internal error, please report with the following message:";
210 if ( t >= stopper ) {
212 WriteString(ERROROUT,(UBYTE *)Out,num);
217 WriteString(ERROROUT,(UBYTE *)Out,num);
226 else if ( *s !=
'%' ) {
228 if ( t >= stopper ) {
230 WriteString(ERROROUT,(UBYTE *)Out,num);
237 if ( ( w = va_arg(ap,
int) ) < 0 ) { *t++ =
'-'; w = -w; }
238 t = (
char *)NumCopy(w,(UBYTE *)t);
240 else if ( *s ==
'l' ) {
241 if ( ( y = va_arg(ap, LONG) ) < 0 ) { *t++ =
'-'; y = -y; }
245 else if ( *s ==
'p' ) {
249 ly = BASEPOSITION(*pp);
250 if ( ly < 0 ) { *t++ =
'-'; ly = -ly; }
252 t = LongLongCopy(&(ly),t);
255 else if ( *s ==
'c' ) {
256 c = (char)(va_arg(ap,
int));
259 else if ( *s ==
'a' ) {
261 array = va_arg(ap,WORD *);
263 t = (
char *)NumCopy(*array,(UBYTE *)t);
264 if ( t >= stopper ) {
266 WriteString(ERROROUT,(UBYTE *)Out,num);
274 else if ( *s ==
'b' ) {
276 barray = va_arg(ap,UBYTE *);
278 *t++ = hex[((*barray)>>4)&0xF];
279 *t++ = hex[(*barray)&0xF];
281 if ( t >= stopper ) {
283 WriteString(ERROROUT,(UBYTE *)Out,num);
291 else if ( *s ==
'C' ) {
293 carray = va_arg(ap,
char *);
295 if ( *carray < 32 ) *t++ =
'^';
298 if ( t >= stopper ) {
300 WriteString(ERROROUT,(UBYTE *)Out,num);
307 else if ( *s ==
'I' ) {
310 iarray = va_arg(ap,
int *);
312 t = (
char *)LongCopy((LONG)(*iarray),(
char *)t);
313 if ( t >= stopper ) {
315 WriteString(ERROROUT,(UBYTE *)Out,num);
323 else if ( *s ==
'E' ) {
326 larray = va_arg(ap,LONG *);
328 t = (
char *)LongCopy(*larray,(
char *)t);
329 if ( t >= stopper ) {
331 WriteString(ERROROUT,(UBYTE *)Out,num);
339 else if ( *s ==
's' ) {
340 u = va_arg(ap,
char *);
342 if ( t >= stopper ) {
344 WriteString(ERROROUT,(UBYTE *)Out,num);
351 else if ( *s ==
't' || *s ==
'T' ) {
352 WORD oldskip = AO.OutSkip, noleadsign;
353 WORD oldmode = AC.OutputMode;
354 WORD oldbracket = AO.IsBracket;
355 WORD oldlength = AC.LineLength;
356 UBYTE *oldStop = AO.OutStop;
357 if ( AN.currentTerm ) {
358 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
362 AO.OutFill = AO.OutputLine;
363 AO.OutStop = AO.OutputLine + AC.LineLength;
365 AddToLine((UBYTE *)Out);
366 if ( *s ==
'T' ) noleadsign = 1;
368 if ( WriteInnerTerm(AN.currentTerm,noleadsign) ) Terminate(-1);
370 u = (
char *)AO.OutputLine;
372 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
374 AO.OutSkip = oldskip;
375 AC.OutputMode = oldmode;
376 AO.IsBracket = oldbracket;
377 AC.LineLength = oldlength;
378 AO.OutStop = oldStop;
381 else if ( *s ==
'r' ) {
382 WORD oldskip = AO.OutSkip;
383 WORD oldmode = AC.OutputMode;
384 WORD oldbracket = AO.IsBracket;
385 WORD oldlength = AC.LineLength;
386 UBYTE *oldStop = AO.OutStop;
387 if ( AN.currentTerm ) {
388 WORD *tt = AN.currentTerm;
389 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
393 AO.OutFill = AO.OutputLine;
394 AO.OutStop = AO.OutputLine + AC.LineLength;
398 t = (
char *)NumCopy(*tt,(UBYTE *)t);
400 if ( t >= stopper ) {
402 WriteString(ERROROUT,(UBYTE *)Out,num);
405 *t++ =
' '; *t++ =
' ';
408 AO.OutSkip = oldskip;
409 AC.OutputMode = oldmode;
410 AO.IsBracket = oldbracket;
411 AC.LineLength = oldlength;
412 AO.OutStop = oldStop;
415 else if ( *s ==
'$' ) {
419 WORD oldskip = AO.OutSkip;
420 WORD oldmode = AC.OutputMode;
421 WORD oldbracket = AO.IsBracket;
422 WORD oldlength = AC.LineLength;
423 UBYTE *oldStop = AO.OutStop;
424 WORD *term, indsubterm[3], *tt;
425 WORD value[5], first, num;
426 if ( *AN.listinprint != DOLLAREXPRESSION ) {
430 DOLLARS d = Dollars + AN.listinprint[1];
432 int nummodopt, dtype;
434 if ( AS.MultiThreaded ) {
435 for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
436 if ( AN.listinprint[1] == ModOptdollars[nummodopt].number )
break;
438 if ( nummodopt < NumModOptdollars ) {
439 dtype = ModOptdollars[nummodopt].type;
440 if ( DollarLocalCopy(dtype) ) {
441 d = ModOptdollars[nummodopt].dstruct+AT.identity;
444 LOCK(d->pthreadslock);
452 AO.OutFill = AO.OutputLine;
453 AO.OutStop = AO.OutputLine + AC.LineLength;
455 AddToLine((UBYTE *)Out);
456 if ( d->nfactors >= 1 && AN.listinprint[2] == DOLLAREXPR2 ) {
458 ( d->factors == 0 && d->nfactors != 1 ) )
goto dollarzero;
461 value[0] = 4; value[1] = d->nfactors; value[2] = 1; value[3] = 3; value[4] = 0;
462 term = value;
goto printterms;
464 if ( num == 1 && d->nfactors == 1 ) {
466 if ( *term == 0 )
goto dollarzero;
469 if ( num > d->nfactors ) {
470 MesPrint(
"\nFactor number for dollar is too large.");
473 term = d->factors[num-1].where;
475 if ( d->factors[num-1].value < 0 ) {
476 value[0] = 4; value[1] = -d->factors[num-1].value; value[2] = 1; value[3] = -3; value[4] = 0;
479 value[0] = 4; value[1] = d->factors[num-1].value; value[2] = 1; value[3] = 3; value[4] = 0;
485 if ( d->type == DOLTERMS || d->type == DOLNUMBER ) {
487printterms: first = 1;
489 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
493 AO.OutFill = AO.OutputLine;
494 AO.OutStop = AO.OutputLine + AC.LineLength;
496 AddToLine((UBYTE *)Out);
497 if ( WriteInnerTerm(term,first) ) {
499 if ( dtype > 0 && ! DollarLocalCopy(dtype) ) { UNLOCK(d->pthreadslock); }
505 u = (
char *)AO.OutputLine;
507 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
509 AO.OutSkip = oldskip;
510 AC.OutputMode = oldmode;
511 AO.IsBracket = oldbracket;
512 AC.LineLength = oldlength;
513 AO.OutStop = oldStop;
516 AO.OutSkip = oldskip;
518 else if ( d->type == DOLSUBTERM ) {
520dosubterm:
if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
524 AO.OutFill = AO.OutputLine;
525 AO.OutStop = AO.OutputLine + AC.LineLength;
527 AddToLine((UBYTE *)Out);
528 if ( WriteSubTerm(tt,1) ) {
530 if ( dtype > 0 && ! DollarLocalCopy(dtype) ) { UNLOCK(d->pthreadslock); }
535 u = (
char *)AO.OutputLine;
537 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
539 AO.OutSkip = oldskip;
540 AC.OutputMode = oldmode;
541 AO.IsBracket = oldbracket;
542 AC.LineLength = oldlength;
543 AO.OutStop = oldStop;
545 else if ( d->type == DOLUNDEFINED ) {
546 *t++ =
'*'; *t++ =
'*'; *t++ =
'*'; *t = 0;
548 else if ( d->type == DOLZERO ) {
549dollarzero: *t++ =
'0'; *t = 0;
551 else if ( d->type == DOLINDEX ) {
552 tt = indsubterm; *tt = INDEX;
553 tt[1] = 3; tt[2] = d->index;
556 else if ( d->type == DOLARGUMENT ) {
557 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
561 AO.OutFill = AO.OutputLine;
562 AO.OutStop = AO.OutputLine + AC.LineLength;
564 AddToLine((UBYTE *)Out);
565 WriteArgument(d->where);
567 u = (
char *)AO.OutputLine;
569 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
571 AO.OutSkip = oldskip;
572 AC.OutputMode = oldmode;
573 AO.IsBracket = oldbracket;
574 AC.LineLength = oldlength;
575 AO.OutStop = oldStop;
577 else if ( d->type == DOLWILDARGS ) {
579 if ( *tt == 0 ) { tt++;
581 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
585 AO.OutFill = AO.OutputLine;
586 AO.OutStop = AO.OutputLine + AC.LineLength;
588 AddToLine((UBYTE *)Out);
591 if ( *tt ) TokenToLine((UBYTE *)
",");
593 u = (
char *)AO.OutputLine;
595 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
597 AO.OutSkip = oldskip;
598 AC.OutputMode = oldmode;
599 AO.IsBracket = oldbracket;
600 AC.LineLength = oldlength;
601 AO.OutStop = oldStop;
604 else if ( *tt > 0 ) {
607 indsubterm[0] = INDEX;
609 indsubterm[2] = *tt++;
610 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
614 AO.OutFill = AO.OutputLine;
615 AO.OutStop = AO.OutputLine + AC.LineLength;
617 AddToLine((UBYTE *)Out);
618 if ( WriteSubTerm(indsubterm,1) ) Terminate(-1);
619 if ( i > 0 ) TokenToLine((UBYTE *)
",");
621 u = (
char *)AO.OutputLine;
623 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
625 AO.OutSkip = oldskip;
626 AC.OutputMode = oldmode;
627 AO.IsBracket = oldbracket;
628 AC.LineLength = oldlength;
629 AO.OutStop = oldStop;
634 if ( dtype > 0 && ! DollarLocalCopy(dtype) ) { UNLOCK(d->pthreadslock); }
637 while ( AN.listinprint[0] == DOLLAREXPR2 ) AN.listinprint += 2;
644 else if ( *s ==
'W' ) {
647 t = (
char *)NumCopy(identity,(UBYTE *)t);
649 timepart = (WORD)(millitime%1000);
653 t = (
char *)LongCopy(millitime,(
char *)t);
655 t = (
char *)NumCopy(timepart,(UBYTE *)t);
657 if ( t >= stopper ) {
659 WriteString(ERROROUT,(UBYTE *)Out,num);
663 else if ( *s ==
'w' ) {
664 t = (
char *)NumCopy(identity,(UBYTE *)t);
666#elif defined(WITHMPI)
667 else if ( *s ==
'W' ) {
670 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
672 timepart = (WORD)(millitime%1000);
676 t = (
char *)LongCopy(millitime,(
char *)t);
678 t = (
char *)NumCopy(timepart,(UBYTE *)t);
680 if ( t >= stopper ) {
682 WriteString(ERROROUT,(UBYTE *)Out,num);
686 else if ( *s ==
'w' ) {
687 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
690 else if ( *s ==
'w' ) { }
691 else if ( *s ==
'W' ) { }
693 else if ( FG.cTable[(
int)*s] == 1 ) {
695 while ( FG.cTable[(
int)*s] == 1 )
696 x = 10 * x + *s++ -
'0';
698 if ( *s ==
'l' || *s ==
'd' ) {
699 if ( *s ==
'l' ) { y = va_arg(ap,LONG); }
700 else { y = va_arg(ap,
int); }
701 if ( y < 0 ) { y = -y; w = 1; }
704 do { *--u = y%10+
'0'; y /= 10; }
while ( y && u > t );
705 if ( w && u > t ) *--u =
'-';
706 while ( --u >= t ) *u =
' ';
709 else if ( *s ==
's' ) {
710 u = va_arg(ap,
char *);
712 while ( *u ) { i++; u++; }
714 while ( x > i ) { *t++ =
' '; x--; }
716 while ( --i >= 0 ) { *--t = *--u; }
719 else if ( *s ==
'p' ) {
729 ly = BASEPOSITION(*pp);
731 do { *--u = ly%10+
'0'; ly /= 10; }
while ( ly && u > t );
732 while ( --u >= t ) *u =
' ';
735 else if ( *s ==
'i' ) {
738 do { *--u = (char)(w%10+
'0'); w /= 10; }
while ( u > t );
744 do { *--u = (char )(w%10+
'0'); w /= 10; }
while ( w && u > t );
745 while ( --u >= t ) *u =
' ';
749 else if ( *s ==
'x' ) {
751 y = va_arg(ap, LONG);
754 ccc = ( y >> (i*4) ) & 0xF;
758 ccc = ( y >> (i*4) ) & 0xF;
759 *t++ = hex[(int)ccc];
760 }
while ( --i >= 0 );
762 else if ( *s ==
'#' ) *t++ = *s;
763 else if ( *s ==
'%' ) *t++ = *s;
764 else if ( *s == 0 ) { *t++ = 0;
break; }
765 else if ( *s ==
'&' ) {
776 WriteString(ERROROUT,(UBYTE *)Out,num);
778 if ( specialerror == 1 ) {
779 MesPrint(
"!!!Wrong object in Print statement!!!");
780 MesPrint(
"!!!Object encountered is of a different type as in the format specifier");
782 AO.OutputLine = oldoutfill;
797 if ( AC.WarnFlag ) MesPrint(
"&Warning: %s",s);
806void HighWarning(
char *s)
809 if ( AC.WarnFlag >= 2 ) MesPrint(
"&Warning: %s",s);
820 return(MesPrint((
char *)
"Called from %s",s));
828int MesCerr(
char *s, UBYTE *t)
833 while ( *u && --i >= 0 ) u--;
837 MesPrint(
"&Illegal %s: %s",s,u);
847int MesComp(
char *s, UBYTE *p, UBYTE *q)
851 MesPrint(
"&%s: %s",s,p);
861void PrintTerm(WORD *term,
char *where)
866 AO.OutFill = AO.OutputLine = OutBuf;
870 TokenToLine((UBYTE *)where);
871 TokenToLine((UBYTE *)
": ");
877 TokenToLine((UBYTE *)
"-");
879 TalToLine((UWORD)(x));
880 TokenToLine((UBYTE *)
" ");
891void PrintTermC(WORD *term,
char *where)
897 PrintTerm(term,where);
900 AO.OutFill = AO.OutputLine = OutBuf;
904 TokenToLine((UBYTE *)where);
905 TokenToLine((UBYTE *)
": ");
911 TokenToLine((UBYTE *)
"-");
913 TalToLine((UWORD)(x));
914 TokenToLine((UBYTE *)
" ");
925void PrintSubTerm(WORD *term,
char *where)
930 AO.OutFill = AO.OutputLine = OutBuf;
934 TokenToLine((UBYTE *)where);
935 TokenToLine((UBYTE *)
": ");
937 while ( --i >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
947void PrintWords(WORD *buffer, LONG number)
951 AO.OutFill = AO.OutputLine = OutBuf;
955 while ( --number >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
965void PrintSeq(WORD *a,
char *text)
967 MesPrint(
" %s:",text);
969 MesPrint(
" %a",a[0],a);
WORD EvalDoLoopArg(PHEAD WORD *, WORD)
LONG PF_WriteFileToFile(int handle, UBYTE *buffer, LONG size)