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);
135int MesPrint(
const char *fmt, ... )
138 char Out[MAXLINELENGTH+14], *stopper, *t, *s, *u, c, *carray;
139 UBYTE extrabuffer[MAXLINELENGTH+14];
140 int w, x, i, specialerror = 0;
143 UBYTE *oldoutfill = AO.OutputLine, *barray;
145 LONG (*OldWrite)(
int handle, UBYTE *buffer, LONG size) = WriteFile;
158 if ( PF.me != MASTER && AS.printflag == 0 )
return(0);
159 if ( PF.me == MASTER || AS.printflag < 0 )
167 WriteFile = PF.me == MASTER || AS.printflag > 0 ? &
PF_WriteFileToFile : &WriteFileToFile;
169 WriteFile = &WriteFileToFile;
171 AO.OutputLine = extrabuffer;
173 stopper = Out + AC.LineLength;
175 if ( ( ( *s ==
'&' && AO.ErrorBlock == 0 ) || *s ==
'@' || *s ==
'#' ) && AC.CurrentStream != 0 ) {
176 u = (
char *)AC.CurrentStream->name;
179 if ( t >= stopper ) {
181 WriteString(ERROROUT,(UBYTE *)Out,num);
186 if ( t+20 >= stopper ) {
188 WriteString(ERROROUT,(UBYTE *)Out,num);
191 *t++ =
'L'; *t++ =
'i'; *t++ =
'n'; *t++ =
'e'; *t++ =
' ';
192 if ( *s ==
'&' ) y = AC.CurrentStream->prevline;
193 else y = AC.CurrentStream->linenumber;
195 if ( !iswarning && ( *s ==
'&' || *s ==
'@' ) ) {
196 for ( i = 0; i < NumDoLoops; i++ ) DoLoops[i].errorsinloop = 1;
199 if ( ( *s ==
'&' && AO.ErrorBlock == 0 ) ) {
200 *t++ =
' '; *t++ =
'-'; *t++ =
'-'; *t++ =
'>'; *t++ =
' '; s++;
202 else if ( *s ==
'@' || *s ==
'#' ) {
203 *t++ =
' '; *t++ =
'='; *t++ =
'='; *t++ =
'>'; *t++ =
' '; s++;
210 else if ( *s !=
'%' ) {
212 if ( t >= stopper ) {
214 WriteString(ERROROUT,(UBYTE *)Out,num);
221 if ( ( w = va_arg(ap,
int) ) < 0 ) { *t++ =
'-'; w = -w; }
222 t = (
char *)NumCopy(w,(UBYTE *)t);
224 else if ( *s ==
'l' ) {
225 if ( ( y = va_arg(ap, LONG) ) < 0 ) { *t++ =
'-'; y = -y; }
229 else if ( *s ==
'p' ) {
233 ly = BASEPOSITION(*pp);
234 if ( ly < 0 ) { *t++ =
'-'; ly = -ly; }
236 t = LongLongCopy(&(ly),t);
239 else if ( *s ==
'c' ) {
240 c = (char)(va_arg(ap,
int));
243 else if ( *s ==
'a' ) {
245 array = va_arg(ap,WORD *);
247 t = (
char *)NumCopy(*array,(UBYTE *)t);
248 if ( t >= stopper ) {
250 WriteString(ERROROUT,(UBYTE *)Out,num);
258 else if ( *s ==
'b' ) {
260 barray = va_arg(ap,UBYTE *);
262 *t++ = hex[((*barray)>>4)&0xF];
263 *t++ = hex[(*barray)&0xF];
265 if ( t >= stopper ) {
267 WriteString(ERROROUT,(UBYTE *)Out,num);
275 else if ( *s ==
'C' ) {
277 carray = va_arg(ap,
char *);
279 if ( *carray < 32 ) *t++ =
'^';
282 if ( t >= stopper ) {
284 WriteString(ERROROUT,(UBYTE *)Out,num);
291 else if ( *s ==
'I' ) {
294 iarray = va_arg(ap,
int *);
296 t = (
char *)LongCopy((LONG)(*iarray),(
char *)t);
297 if ( t >= stopper ) {
299 WriteString(ERROROUT,(UBYTE *)Out,num);
307 else if ( *s ==
'E' ) {
310 larray = va_arg(ap,LONG *);
312 t = (
char *)LongCopy(*larray,(
char *)t);
313 if ( t >= stopper ) {
315 WriteString(ERROROUT,(UBYTE *)Out,num);
323 else if ( *s ==
's' ) {
324 u = va_arg(ap,
char *);
326 if ( t >= stopper ) {
328 WriteString(ERROROUT,(UBYTE *)Out,num);
335 else if ( *s ==
't' || *s ==
'T' ) {
336 WORD oldskip = AO.OutSkip, noleadsign;
337 WORD oldmode = AC.OutputMode;
338 WORD oldbracket = AO.IsBracket;
339 WORD oldlength = AC.LineLength;
340 UBYTE *oldStop = AO.OutStop;
341 if ( AN.currentTerm ) {
342 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
346 AO.OutFill = AO.OutputLine;
347 AO.OutStop = AO.OutputLine + AC.LineLength;
349 AddToLine((UBYTE *)Out);
350 if ( *s ==
'T' ) noleadsign = 1;
352 if ( WriteInnerTerm(AN.currentTerm,noleadsign) ) Terminate(-1);
354 u = (
char *)AO.OutputLine;
356 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
358 AO.OutSkip = oldskip;
359 AC.OutputMode = oldmode;
360 AO.IsBracket = oldbracket;
361 AC.LineLength = oldlength;
362 AO.OutStop = oldStop;
365 else if ( *s ==
'r' ) {
366 WORD oldskip = AO.OutSkip;
367 WORD oldmode = AC.OutputMode;
368 WORD oldbracket = AO.IsBracket;
369 WORD oldlength = AC.LineLength;
370 UBYTE *oldStop = AO.OutStop;
371 if ( AN.currentTerm ) {
372 WORD *tt = AN.currentTerm;
373 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
377 AO.OutFill = AO.OutputLine;
378 AO.OutStop = AO.OutputLine + AC.LineLength;
382 t = (
char *)NumCopy(*tt,(UBYTE *)t);
384 if ( t >= stopper ) {
386 WriteString(ERROROUT,(UBYTE *)Out,num);
389 *t++ =
' '; *t++ =
' ';
392 AO.OutSkip = oldskip;
393 AC.OutputMode = oldmode;
394 AO.IsBracket = oldbracket;
395 AC.LineLength = oldlength;
396 AO.OutStop = oldStop;
399 else if ( *s ==
'$' ) {
403 WORD oldskip = AO.OutSkip;
404 WORD oldmode = AC.OutputMode;
405 WORD oldbracket = AO.IsBracket;
406 WORD oldlength = AC.LineLength;
407 UBYTE *oldStop = AO.OutStop;
408 WORD *term, indsubterm[3], *tt;
409 WORD value[5], first, num;
410 if ( *AN.listinprint != DOLLAREXPRESSION ) {
414 DOLLARS d = Dollars + AN.listinprint[1];
416 int nummodopt, dtype;
418 if ( AS.MultiThreaded ) {
419 for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
420 if ( AN.listinprint[1] == ModOptdollars[nummodopt].number )
break;
422 if ( nummodopt < NumModOptdollars ) {
423 dtype = ModOptdollars[nummodopt].type;
424 if ( dtype == MODLOCAL ) {
425 d = ModOptdollars[nummodopt].dstruct+AT.identity;
428 LOCK(d->pthreadslock);
436 AO.OutFill = AO.OutputLine;
437 AO.OutStop = AO.OutputLine + AC.LineLength;
439 AddToLine((UBYTE *)Out);
440 if ( d->nfactors >= 1 && AN.listinprint[2] == DOLLAREXPR2 ) {
442 ( d->factors == 0 && d->nfactors != 1 ) )
goto dollarzero;
445 value[0] = 4; value[1] = d->nfactors; value[2] = 1; value[3] = 3; value[4] = 0;
446 term = value;
goto printterms;
448 if ( num == 1 && d->nfactors == 1 ) {
450 if ( *term == 0 )
goto dollarzero;
453 if ( num > d->nfactors ) {
454 MesPrint(
"\nFactor number for dollar is too large.");
457 term = d->factors[num-1].where;
459 if ( d->factors[num-1].value < 0 ) {
460 value[0] = 4; value[1] = -d->factors[num-1].value; value[2] = 1; value[3] = -3; value[4] = 0;
463 value[0] = 4; value[1] = d->factors[num-1].value; value[2] = 1; value[3] = 3; value[4] = 0;
469 if ( d->type == DOLTERMS || d->type == DOLNUMBER ) {
471printterms: first = 1;
473 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
477 AO.OutFill = AO.OutputLine;
478 AO.OutStop = AO.OutputLine + AC.LineLength;
480 AddToLine((UBYTE *)Out);
481 if ( WriteInnerTerm(term,first) ) {
483 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslock); }
489 u = (
char *)AO.OutputLine;
491 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
493 AO.OutSkip = oldskip;
494 AC.OutputMode = oldmode;
495 AO.IsBracket = oldbracket;
496 AC.LineLength = oldlength;
497 AO.OutStop = oldStop;
500 AO.OutSkip = oldskip;
502 else if ( d->type == DOLSUBTERM ) {
504dosubterm:
if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
508 AO.OutFill = AO.OutputLine;
509 AO.OutStop = AO.OutputLine + AC.LineLength;
511 AddToLine((UBYTE *)Out);
512 if ( WriteSubTerm(tt,1) ) {
514 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslock); }
519 u = (
char *)AO.OutputLine;
521 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
523 AO.OutSkip = oldskip;
524 AC.OutputMode = oldmode;
525 AO.IsBracket = oldbracket;
526 AC.LineLength = oldlength;
527 AO.OutStop = oldStop;
529 else if ( d->type == DOLUNDEFINED ) {
530 *t++ =
'*'; *t++ =
'*'; *t++ =
'*'; *t = 0;
532 else if ( d->type == DOLZERO ) {
533dollarzero: *t++ =
'0'; *t = 0;
535 else if ( d->type == DOLINDEX ) {
536 tt = indsubterm; *tt = INDEX;
537 tt[1] = 3; tt[2] = d->index;
540 else if ( d->type == DOLARGUMENT ) {
541 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
545 AO.OutFill = AO.OutputLine;
546 AO.OutStop = AO.OutputLine + AC.LineLength;
548 AddToLine((UBYTE *)Out);
549 WriteArgument(d->where);
551 u = (
char *)AO.OutputLine;
553 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
555 AO.OutSkip = oldskip;
556 AC.OutputMode = oldmode;
557 AO.IsBracket = oldbracket;
558 AC.LineLength = oldlength;
559 AO.OutStop = oldStop;
561 else if ( d->type == DOLWILDARGS ) {
563 if ( *tt == 0 ) { tt++;
565 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
569 AO.OutFill = AO.OutputLine;
570 AO.OutStop = AO.OutputLine + AC.LineLength;
572 AddToLine((UBYTE *)Out);
575 if ( *tt ) TokenToLine((UBYTE *)
",");
577 u = (
char *)AO.OutputLine;
579 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
581 AO.OutSkip = oldskip;
582 AC.OutputMode = oldmode;
583 AO.IsBracket = oldbracket;
584 AC.LineLength = oldlength;
585 AO.OutStop = oldStop;
588 else if ( *tt > 0 ) {
591 indsubterm[0] = INDEX;
593 indsubterm[2] = *tt++;
594 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
598 AO.OutFill = AO.OutputLine;
599 AO.OutStop = AO.OutputLine + AC.LineLength;
601 AddToLine((UBYTE *)Out);
602 if ( WriteSubTerm(indsubterm,1) ) Terminate(-1);
603 if ( i > 0 ) TokenToLine((UBYTE *)
",");
605 u = (
char *)AO.OutputLine;
607 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
609 AO.OutSkip = oldskip;
610 AC.OutputMode = oldmode;
611 AO.IsBracket = oldbracket;
612 AC.LineLength = oldlength;
613 AO.OutStop = oldStop;
618 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslock); }
621 while ( AN.listinprint[0] == DOLLAREXPR2 ) AN.listinprint += 2;
628 else if ( *s ==
'W' ) {
631 t = (
char *)NumCopy(identity,(UBYTE *)t);
633 timepart = (WORD)(millitime%1000);
637 t = (
char *)LongCopy(millitime,(
char *)t);
639 t = (
char *)NumCopy(timepart,(UBYTE *)t);
641 if ( t >= stopper ) {
643 WriteString(ERROROUT,(UBYTE *)Out,num);
647 else if ( *s ==
'w' ) {
648 t = (
char *)NumCopy(identity,(UBYTE *)t);
650#elif defined(WITHMPI)
651 else if ( *s ==
'W' ) {
654 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
656 timepart = (WORD)(millitime%1000);
660 t = (
char *)LongCopy(millitime,(
char *)t);
662 t = (
char *)NumCopy(timepart,(UBYTE *)t);
664 if ( t >= stopper ) {
666 WriteString(ERROROUT,(UBYTE *)Out,num);
670 else if ( *s ==
'w' ) {
671 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
674 else if ( *s ==
'w' ) { }
675 else if ( *s ==
'W' ) { }
677 else if ( FG.cTable[(
int)*s] == 1 ) {
679 while ( FG.cTable[(
int)*s] == 1 )
680 x = 10 * x + *s++ -
'0';
682 if ( *s ==
'l' || *s ==
'd' ) {
683 if ( *s ==
'l' ) { y = va_arg(ap,LONG); }
684 else { y = va_arg(ap,
int); }
685 if ( y < 0 ) { y = -y; w = 1; }
688 do { *--u = y%10+
'0'; y /= 10; }
while ( y && u > t );
689 if ( w && u > t ) *--u =
'-';
690 while ( --u >= t ) *u =
' ';
693 else if ( *s ==
's' ) {
694 u = va_arg(ap,
char *);
696 while ( *u ) { i++; u++; }
698 while ( x > i ) { *t++ =
' '; x--; }
700 while ( --i >= 0 ) { *--t = *--u; }
703 else if ( *s ==
'p' ) {
713 ly = BASEPOSITION(*pp);
715 do { *--u = ly%10+
'0'; ly /= 10; }
while ( ly && u > t );
716 while ( --u >= t ) *u =
' ';
719 else if ( *s ==
'i' ) {
722 do { *--u = (char)(w%10+
'0'); w /= 10; }
while ( u > t );
728 do { *--u = (char )(w%10+
'0'); w /= 10; }
while ( w && u > t );
729 while ( --u >= t ) *u =
' ';
733 else if ( *s ==
'x' ) {
735 y = va_arg(ap, LONG);
738 ccc = ( y >> (i*4) ) & 0xF;
742 ccc = ( y >> (i*4) ) & 0xF;
743 *t++ = hex[(int)ccc];
744 }
while ( --i >= 0 );
746 else if ( *s ==
'#' ) *t++ = *s;
747 else if ( *s ==
'%' ) *t++ = *s;
748 else if ( *s == 0 ) { *t++ = 0;
break; }
749 else if ( *s ==
'&' ) {
760 WriteString(ERROROUT,(UBYTE *)Out,num);
762 if ( specialerror == 1 ) {
763 MesPrint(
"!!!Wrong object in Print statement!!!");
764 MesPrint(
"!!!Object encountered is of a different type as in the format specifier");
766 AO.OutputLine = oldoutfill;
781 if ( AC.WarnFlag ) MesPrint(
"&Warning: %s",s);
790void HighWarning(
char *s)
793 if ( AC.WarnFlag >= 2 ) MesPrint(
"&Warning: %s",s);
804 return(MesPrint((
char *)
"Called from %s",s));
812int MesCerr(
char *s, UBYTE *t)
817 while ( *u && --i >= 0 ) u--;
821 MesPrint(
"&Illegal %s: %s",s,u);
831int MesComp(
char *s, UBYTE *p, UBYTE *q)
835 MesPrint(
"&%s: %s",s,p);
845void PrintTerm(WORD *term,
char *where)
850 AO.OutFill = AO.OutputLine = OutBuf;
854 TokenToLine((UBYTE *)where);
855 TokenToLine((UBYTE *)
": ");
861 TokenToLine((UBYTE *)
"-");
863 TalToLine((UWORD)(x));
864 TokenToLine((UBYTE *)
" ");
875void PrintTermC(WORD *term,
char *where)
881 PrintTerm(term,where);
884 AO.OutFill = AO.OutputLine = OutBuf;
888 TokenToLine((UBYTE *)where);
889 TokenToLine((UBYTE *)
": ");
895 TokenToLine((UBYTE *)
"-");
897 TalToLine((UWORD)(x));
898 TokenToLine((UBYTE *)
" ");
909void PrintSubTerm(WORD *term,
char *where)
914 AO.OutFill = AO.OutputLine = OutBuf;
918 TokenToLine((UBYTE *)where);
919 TokenToLine((UBYTE *)
": ");
921 while ( --i >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
931void PrintWords(WORD *buffer, LONG number)
935 AO.OutFill = AO.OutputLine = OutBuf;
939 while ( --number >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
949void PrintSeq(WORD *a,
char *text)
951 MesPrint(
" %s:",text);
953 MesPrint(
" %a",a[0],a);
WORD EvalDoLoopArg(PHEAD WORD *, WORD)
LONG PF_WriteFileToFile(int handle, UBYTE *buffer, LONG size)