45 static int iswarning = 0;
47 static char hex[] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
48 'A',
'B',
'C',
'D',
'E',
'F'};
67 VOID Error1(
char *s, UBYTE *t)
69 MesPrint(
"@%s %s",s,t);
78 VOID 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);
138 MesPrint(
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' ) {
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 ) {
453 if ( d->type == 0 || d->factors == 0 )
goto dollarzero;
456 value[0] = 4; value[1] = d->nfactors; value[2] = 1; value[3] = 3; value[4] = 0;
457 term = value;
goto printterms;
459 if ( num == 1 && d->nfactors == 1 ) {
461 if ( *term == 0 )
goto dollarzero;
464 if ( num > d->nfactors ) {
465 MesPrint(
"\nFactor number for dollar is too large.");
468 term = d->factors[num-1].where;
470 if ( d->factors[num-1].value < 0 ) {
471 value[0] = 4; value[1] = -d->factors[num-1].value; value[2] = 1; value[3] = -3; value[4] = 0;
474 value[0] = 4; value[1] = d->factors[num-1].value; value[2] = 1; value[3] = 3; value[4] = 0;
480 if ( d->type == DOLTERMS || d->type == DOLNUMBER ) {
482 printterms: first = 1;
484 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
488 AO.OutFill = AO.OutputLine;
489 AO.OutStop = AO.OutputLine + AC.LineLength;
491 AddToLine((UBYTE *)Out);
492 if ( WriteInnerTerm(term,first) ) {
494 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
500 u = (
char *)AO.OutputLine;
502 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
504 AO.OutSkip = oldskip;
505 AC.OutputMode = oldmode;
506 AO.IsBracket = oldbracket;
507 AC.LineLength = oldlength;
508 AO.OutStop = oldStop;
511 AO.OutSkip = oldskip;
513 else if ( d->type == DOLSUBTERM ) {
515 dosubterm:
if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
519 AO.OutFill = AO.OutputLine;
520 AO.OutStop = AO.OutputLine + AC.LineLength;
522 AddToLine((UBYTE *)Out);
523 if ( WriteSubTerm(tt,1) ) {
525 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
530 u = (
char *)AO.OutputLine;
532 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
534 AO.OutSkip = oldskip;
535 AC.OutputMode = oldmode;
536 AO.IsBracket = oldbracket;
537 AC.LineLength = oldlength;
538 AO.OutStop = oldStop;
540 else if ( d->type == DOLUNDEFINED ) {
541 *t++ =
'*'; *t++ =
'*'; *t++ =
'*'; *t = 0;
543 else if ( d->type == DOLZERO ) {
544 dollarzero: *t++ =
'0'; *t = 0;
546 else if ( d->type == DOLINDEX ) {
547 tt = indsubterm; *tt = INDEX;
548 tt[1] = 3; tt[2] = d->index;
551 else if ( d->type == DOLARGUMENT ) {
552 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
556 AO.OutFill = AO.OutputLine;
557 AO.OutStop = AO.OutputLine + AC.LineLength;
559 AddToLine((UBYTE *)Out);
560 WriteArgument(d->where);
562 u = (
char *)AO.OutputLine;
564 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
566 AO.OutSkip = oldskip;
567 AC.OutputMode = oldmode;
568 AO.IsBracket = oldbracket;
569 AC.LineLength = oldlength;
570 AO.OutStop = oldStop;
572 else if ( d->type == DOLWILDARGS ) {
574 if ( *tt == 0 ) { tt++;
576 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
580 AO.OutFill = AO.OutputLine;
581 AO.OutStop = AO.OutputLine + AC.LineLength;
583 AddToLine((UBYTE *)Out);
586 if ( *tt ) TokenToLine((UBYTE *)
",");
588 u = (
char *)AO.OutputLine;
590 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
592 AO.OutSkip = oldskip;
593 AC.OutputMode = oldmode;
594 AO.IsBracket = oldbracket;
595 AC.LineLength = oldlength;
596 AO.OutStop = oldStop;
599 else if ( *tt > 0 ) {
602 indsubterm[0] = INDEX;
604 indsubterm[2] = *tt++;
605 if ( AC.LineLength > MAXLINELENGTH ) AC.LineLength = MAXLINELENGTH;
609 AO.OutFill = AO.OutputLine;
610 AO.OutStop = AO.OutputLine + AC.LineLength;
612 AddToLine((UBYTE *)Out);
613 if ( WriteSubTerm(indsubterm,1) ) Terminate(-1);
614 if ( i > 0 ) TokenToLine((UBYTE *)
",");
616 u = (
char *)AO.OutputLine;
618 while ( u < (
char *)(AO.OutFill) ) *t++ = *u++;
620 AO.OutSkip = oldskip;
621 AC.OutputMode = oldmode;
622 AO.IsBracket = oldbracket;
623 AC.LineLength = oldlength;
624 AO.OutStop = oldStop;
629 if ( dtype > 0 && dtype != MODLOCAL ) { UNLOCK(d->pthreadslockread); }
632 while ( AN.listinprint[0] == DOLLAREXPR2 ) AN.listinprint += 2;
639 else if ( *s ==
'W' ) {
642 t = (
char *)NumCopy(identity,(UBYTE *)t);
643 millitime = TimeCPU(1);
644 timepart = (WORD)(millitime%1000);
648 t = (
char *)LongCopy(millitime,(
char *)t);
650 t = (
char *)NumCopy(timepart,(UBYTE *)t);
652 if ( t >= stopper ) {
654 WriteString(ERROROUT,(UBYTE *)Out,num);
658 else if ( *s ==
'w' ) {
659 t = (
char *)NumCopy(identity,(UBYTE *)t);
661 #elif defined(WITHMPI) 662 else if ( *s ==
'W' ) {
665 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
666 millitime = TimeCPU(1);
667 timepart = (WORD)(millitime%1000);
671 t = (
char *)LongCopy(millitime,(
char *)t);
673 t = (
char *)NumCopy(timepart,(UBYTE *)t);
675 if ( t >= stopper ) {
677 WriteString(ERROROUT,(UBYTE *)Out,num);
681 else if ( *s ==
'w' ) {
682 t = (
char *)NumCopy(PF.me,(UBYTE *)t);
685 else if ( *s ==
'w' ) { }
686 else if ( *s ==
'W' ) { }
688 else if ( FG.cTable[(
int)*s] == 1 ) {
690 while ( FG.cTable[(
int)*s] == 1 )
691 x = 10 * x + *s++ -
'0';
693 if ( *s ==
'l' || *s ==
'd' ) {
694 if ( *s ==
'l' ) { y = va_arg(ap,LONG); }
695 else { y = va_arg(ap,
int); }
696 if ( y < 0 ) { y = -y; w = 1; }
699 do { *--u = y%10+
'0'; y /= 10; }
while ( y && u > t );
700 if ( w && u > t ) *--u =
'-';
701 while ( --u >= t ) *u =
' ';
704 else if ( *s ==
's' ) {
705 u = va_arg(ap,
char *);
707 while ( *u ) { i++; u++; }
709 while ( x > i ) { *t++ =
' '; x--; }
711 while ( --i >= 0 ) { *--t = *--u; }
714 else if ( *s ==
'p' ) {
724 ly = BASEPOSITION(*pp);
726 do { *--u = ly%10+
'0'; ly /= 10; }
while ( ly && u > t );
727 while ( --u >= t ) *u =
' ';
730 else if ( *s ==
'i' ) {
733 do { *--u = (char)(w%10+
'0'); w /= 10; }
while ( u > t );
739 do { *--u = (char )(w%10+
'0'); w /= 10; }
while ( w && u > t );
740 while ( --u >= t ) *u =
' ';
744 else if ( *s ==
'x' ) {
746 y = va_arg(ap, LONG);
749 ccc = ( y >> (i*4) ) & 0xF;
753 ccc = ( y >> (i*4) ) & 0xF;
754 *t++ = hex[(int)ccc];
755 }
while ( --i >= 0 );
757 else if ( *s ==
'#' ) *t++ = *s;
758 else if ( *s ==
'%' ) *t++ = *s;
759 else if ( *s == 0 ) { *t++ = 0;
break; }
760 else if ( *s ==
'&' ) {
771 WriteString(ERROROUT,(UBYTE *)Out,num);
773 if ( specialerror == 1 ) {
774 MesPrint(
"!!!Wrong object in Print statement!!!");
775 MesPrint(
"!!!Object encountered is of a different type as in the format specifier");
777 AO.OutputLine = oldoutfill;
789 VOID Warning(
char *s)
792 if ( AC.WarnFlag ) MesPrint(
"&Warning: %s",s);
801 VOID HighWarning(
char *s)
804 if ( AC.WarnFlag >= 2 ) MesPrint(
"&Warning: %s",s);
815 return(MesPrint((
char *)
"Called from %s",s));
823 WORD MesCerr(
char *s, UBYTE *t)
828 while ( *u && --i >= 0 ) u--;
832 MesPrint(
"&Illegal %s: %s",s,u);
842 WORD MesComp(
char *s, UBYTE *p, UBYTE *q)
846 MesPrint(
"&%s: %s",s,p);
856 VOID PrintTerm(WORD *term,
char *where)
861 AO.OutFill = AO.OutputLine = OutBuf;
865 TokenToLine((UBYTE *)where);
866 TokenToLine((UBYTE *)
": ");
872 TokenToLine((UBYTE *)
"-");
874 TalToLine((UWORD)(x));
875 TokenToLine((UBYTE *)
" ");
886 VOID PrintTermC(WORD *term,
char *where)
892 PrintTerm(term,where);
895 AO.OutFill = AO.OutputLine = OutBuf;
899 TokenToLine((UBYTE *)where);
900 TokenToLine((UBYTE *)
": ");
906 TokenToLine((UBYTE *)
"-");
908 TalToLine((UWORD)(x));
909 TokenToLine((UBYTE *)
" ");
920 VOID PrintSubTerm(WORD *term,
char *where)
925 AO.OutFill = AO.OutputLine = OutBuf;
929 TokenToLine((UBYTE *)where);
930 TokenToLine((UBYTE *)
": ");
932 while ( --i >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
942 VOID PrintWords(WORD *buffer, LONG number)
946 AO.OutFill = AO.OutputLine = OutBuf;
950 while ( --number >= 0 ) { TalToLine((UWORD)(*t++)); TokenToLine((UBYTE *)
" "); }
LONG PF_WriteFileToFile(int handle, UBYTE *buffer, LONG size)
WORD EvalDoLoopArg(PHEAD WORD *, WORD)