     /* Loglan82 Compiler&Interpreter
     Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw
     Copyright (C)  1993, 1994 LITA, Pau
     
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
     
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
     

=======================================================================
*/

#include <stdio.h>

#if WSIZE==4
	typedef long word;
#elif WSIZE==2
	typedef short word;
#else
 Define WSIZE to 2 or 4 !
#endif

extern FILE *file_arr[];


#ifndef NO_PROTOTYPES
static char *find_msg( int );
#else
static char *find_msg();
#endif


void listing_error_line__( lun, line, nr, errno, nameid )
   word *lun,*line,*nr,*errno;
   char *nameid;
{
   FILE *f=stdout;
   if( *lun != 0L )  f=file_arr[*lun];
   fprintf(f,"*** %6d ERROR %6d %s %8.8s\n",(int)(*line),(int)(*nr),find_msg((int)(*errno)),nameid);
}



static char declaration_part_overloaded[]={"***DECLARATION PART OVERLOADED"};
static char class_identifier_expected[]={"CLASS IDENTIFIER  EXPECTED"};
static char null_program[]={"NULL PROGRAM"};
static char too_many_prototypes[]={"***TOO MANY PROTOTYPES"};
static char undeclared_identifier[]={"UNDECLARED IDENTIFIER"};
static char diff_lengths[]={"DIFFERENT LENGTHS OF THE 2ND PARAMETERS LISTS"};
static char incompat_kinds[]={"INCOMPATIBLE KINDS OF THE 2ND LEVEL PARAMETERS"};


static struct { int errno; char *errmsg; }  err_tab[]={

{   0,declaration_part_overloaded	},
{  10,"***TOO MANY ERRORS"	},
{  41,declaration_part_overloaded	},
{ 101,"\":=\"  EXPECTED"	},
{ 102,"\";\"  EXPECTED"	},
{ 103,"\"THEN\"  EXPECTED"	},
{ 104,"\"FI\"/\"ELSE\"  EXPECTED"	},
{ 105,"\"OD\"  EXPECTED"	},
{ 106,"\"(\"  EXPECTED"	},
{ 107,"\")\"  EXPECTED"	},
{ 108,"\"DO\"  EXPECTED"	},
{ 109,"IDENTIFIER  EXPECTED"	},
{ 110,"TOO MANY EXITS"	},
{ 111,"ILLEGAL CHARACTER"	},
{ 112,"WRONG STRUCTURE OF \"IF\"-STATEMENT"	},
{ 113,"\"END\"  MISSING"	},
{ 114,"\".\"  EXPECTED"	},
{ 115,"ILLEGAL CONSTANT IN EXPRESSION"	},
{ 116,"\"=\"  EXPECTED"	},
{ 117,"CONSTANT  EXPEXCTED"	},
{ 118,"\":\"  EXPECTED"	},
{ 119,"UNIT KIND SPECIFICATION  EXPECTED"	},
{ 120,"\"HIDDEN\" OR \"CLOSE\" OCCURRED TWICE"	},
{ 121,"HIDDEN OR CLOSE OUT OF A CLASS"	},
{ 122,"\"BLOCK\"  EXPECTED"	},
{ 123,"OBJECT EXPRESSION IS NOT A GENERATOR"	},
{ 124,"\"DIM\"  EXPECTED"	},
{ 125,"\"TO\"/\"DOWNTO\"  EXPECTED"	},
{ 126,"ILLEGAL ARITHMETIC OPERATOR"	},
{ 127,"DECLARATION PART  EXPECTED"	},
{ 128,"INCORRECT IDENTIFIER AT \"END\""	},
{ 129,"WRONG STRUCTURE OF \"CASE\"-STATEMENT"	},
{ 130,"WRONG STRUCTURE OF \"DO\"-STATEMENT"	},
{ 131,"ILLEGAL USE OF \"MAIN\""	},
{ 132,"\"WHEN\"  EXPECTED"	},
{ 133,"TOO MANY BRANCHES IN \"CASE\"-STATEMENT"	},
{ 134,"\"BEGIN\" MISSING"	},
{ 135,"BAD OPTION"	},
{ 136,"IS IT REALLY A LOGLAN PROGRAM ???"	},
{ 137,"\"BLOCK\" MISSING -PARSING BEGAN"	},
{ 138,"\"REPEAT\" OUT OF A LOOP"	},
{ 139,"THERE IS NO PATH TO THIS STATEMENT"	},
{ 140,"\"ANDIF\"/\"ORIF\" MIXED"	},
{ 141,"ARRAY OF \"SEMAPHORE\" IS ILLEGAL"	},
{ 142,"WRONG HANDLER END"	},
{ 143,"LASTWILL INSIDE A STRUCTURED STATEMENT"	},
{ 144,"REPEATED LASTWILL"	},
{ 145,"NO PARAMETER SPECIFICATION"	},
{ 146,"WRONG REGISTER SPECIFICATION"	},
{ 147,"\",\" EXPECTED"	},
{ 191,null_program	},
{ 196,"***TOO MANY IDENTIFIERS"	},
{ 197,"***TOO MANY FORMAL PARAMETERS"	},
{ 198,"***PARSER STACK OVERLOADED"	},
{ 199,too_many_prototypes	},
{ 201,"WRONG REAL CONSTANT"	},
{ 202,"WRONG COMMENT"	},
{ 203,"WRONG CHARACTER CONSTANT"	},
{ 204,"WRONG INTEGER CONSTANT"	},
{ 205,"INTEGER OVERFLOW"	},
{ 206,"REAL OVERFLOW"	},
{ 211,"IDENTIFIER TOO LONG"	},
{ 212,"STRING TOO LONG"	},
{ 301,"PREFIX IS NOT A CLASS"	},
{ 303,"COROUTINE/PROCESS ILLEGAL HERE AS PREFIX"	},
{ 304,"HIDDEN IDENTIFIER CANNOT BE TAKEN"	},
{ 305,undeclared_identifier	},
{ 306,"UNDECLARED TYPE IDENTIFIER"	},
{ 307,"TYPE IDENTIFIER  EXPECTED"	},
{ 308,"UNDECLARED PREFIX IDENTIFIER"	},
{ 309,"DECLARED MORE THAN ONCE"	},
{ 310,"TAKEN LIST IN UNPREFIXED UNIT"	},
{ 316,"FORMAL TYPE SPECIFICATION AFTER USING"	},
{ 317,"HIDDEN TYPE IDENTIFIER"	},
{ 318,"TYPE IDENTIFIER NOT TAKEN"	},
{ 319,"HIDDEN IDENTIFIER IN THE LIST"	},
{ 320,"IDENTIFIER IN THE LIST NOT TAKEN"	},
{ 321,"IDENTIFIER CANNOT BE TAKEN"	},
{ 322,"HIDDEN PREFIX IDENTIFIER"	},
{ 323,"PREFIX IDENTIFIER NOT TAKEN"	},
{ 329,"ONLY PROCEDURE AND FUNCTION MAY BE VIRTUAL"	},
{ 330,"VIRTUAL IN UNPREFIXED BLOCK/PROCEDURE/FUNCTION"	},
{ 331,"INCOMPATIBLE KINDS OF VIRTULS"	},
{ 332,"INCOMPATIBLE TYPES OF VIRTUALS"	},
{ 333,"DIFFERENT LENGTH OF FORM. PARAM. LISTS IN VIRTUALS"	},
{ 334,"INCOMPATIBLE KINDS OF THE 1ST LEVEL PARAMETERS"	},
{ 335,"INCOMPATIBLE TYPES OF THE 1ST LEVEL PARAMETERS"	},
{ 336,diff_lengths	},
{ 337,incompat_kinds	},
{ 338,"INCOMPATIBLE TYPES OF THE 2ND LEVEL PARAMETERS"	},
{ 341,"***DECLARATION PART OVERLOADED"	},
{ 342,"***TOO MANY CLASSES DECLARED"	},
{ 343,too_many_prototypes	},
{ 350,"UNDECLARED SIGNAL IDENTIFIER"	},
{ 351,"HIDDEN SIGNAL IDENTIFIER"	},
{ 352,"SIGNAL IDENTIFIER NOT TAKEN"	},
{ 353,"SIGNAL IDENTIFIER  EXPECTED"	},
{ 354,"DIFFERENT TYPES OF PARAMETERS"	},
{ 355,"INCOMPATIBLE KINDS OF THE PARAMETERS"	},
{ 356,"DIFFERENT IDENTIFIERS OF PARAMETERS"	},
{ 357,incompat_kinds	},
{ 358,"DIFFERENT TYPES OF THE 2ND LEVEL PARAMETERS"	},
{ 359,diff_lengths	},
{ 360,"DIFFERENT LENGTHS OF FORM. PARAM. LISTS IN SIGNALS"	},
{ 361,"NON-LOCAL FORMAL TYPE CANNOT BE USED"	},
{ 362,"REPEATED HANDLER FOR SIGNAL"	},
{ 370,"ONLY \"INPUT\" IS LEGAL HERE"	},
{ 398,"CLASS PREFIXED BY ITSELF"	},
{ 399,"CYCLE IN PREFIX SEQUENCE"	},
{ 401,"WRONG LABEL IN \"CASE\""	},
{ 402,"\"CASE\"-STATEMENT NESTED TOO DEEPLY"	},
{ 403,"TOO LONG SPAN OF \"CASE\" LABELS"	},
{ 404,"REPEATED LABEL IN \"CASE\"-STATEMENT"	},
{ 405,"ILLEGAL TYPE OF \"CASE\" EXPRESSION"	},
{ 406,"DIFFERENT TYPES OF LABELS AND \"CASE\" EXPRESSION"	},
{ 407,"NON-LOGICAL EXPRESSION AFTER \"IF\"/\"WHILE\""	},
{ 408,"REAL CONSTANT OUT OF INTEGER RANGE"	},
{ 410,"SIMPLE VARIABLE  EXPECTED"	},
{ 411,"NON-INTEGER CONTROL VARIABLE"	},
{ 412,"NON-INTEGER EXPRESSION"	},
{ 413,"FILE EXPRESSION EXPECTED"	},
{ 414,"STRING EXPRESSION EXPECTED"	},
{ 415,"REFERENCE EXPRESSION EXPECTED"	},
{ 416,"ARRAY EXPRESSION EXPECTED"	},
{ 417,"BOOLEAN EXPRESSION EXPECTED"	},
{ 418,"SEMAPHORE VARIABLE  EXPECTED"	},
{ 419,"ILLEGAL TYPE IN \"OPEN\""	},
{ 420,"VARIABLE  EXPECTED"	},
{ 421,"CLASS IDENTIFIER AFTER \"NEW\" EXPECTED"	},
{ 422,"PROCEDURE IDENTIFIER AFTER \"CALL\" EXPECTED"	},
{ 423,"\"NEW\"  MISSING"	},
{ 424,"\"CALL\"  MISSING"	},
{ 425,"\"INNER\" OUT OF A CLASS"	},
{ 426,"\"INNER\" OCCURRED MORE THAN ONCE"	},
{ 427,"\"WIND\"/\"TERMINATE\" OUT OF A HANDLER"	},
{ 428,"\"INNER\" INSIDE LASTWILL"	},
{ 429,"DEFINITION CANNOT BE REDUCED TO CONSTANT"	},
{ 430,"UNDEFINED CONSTANT IN THE DEFINITION"	},
{ 431,"WRONG NUMBER OF INDICES"	},
{ 432,"INDEX OUT OF RANGE"	},
{ 433,"UPPER BOUND LESS THAN LOWER BOUND"	},
{ 434,"TOO MANY SUBSCRIPTS"	},
{ 435,"VARIABLE IS NOT ARRAY"	},
{ 440,"TYPE IDENTIFIER EXPECTED AFTER \"ARRAYOF\""	},
{ 441,"INCORRECT FORMAT IN \"WRITE\""	},
{ 442,"ILLEGAL EXPRESSION IN \"WRITE\""	},
{ 443,"ILLEGAL TYPE OF VARIABLE IN \"READ\""	},
{ 444,"NO DATA FOR I/O TRANSFER"	},
{ 445,"ILLEGAL EXPRESSION IN \"PUT\""	},
{ 446,"ILLEGAL TYPE OF VARIABLE IN \"GET\""	},
{ 448,"\"RAISE\" MISSING"	},
{ 449,"SIGNAL IDENTIFIER AFTER \"RAISE\" EXPECTED"	},
{ 450,"ILLEGAL PROCEDURE OCCURRENCE"	},
{ 451,"ILLEGAL CLASS OCCURRENCE"	},
{ 452,"ILLEGAL TYPE OCCURRENCE"	},
{ 453,"ILLEGAL SIGNAL OCCURRENCE"	},
{ 454,"ILLEGAL OPERATOR OCCURRENCE"	},
{ 455,"WRONG NUMBER OF OPERANDS"	},
{ 460,"DIVIDED BY ZERO"	},
{ 469,"WRONG REGISTER NUMBER"	},
{ 470,"ILLEGAL INPUT PARAMETER"	},
{ 471,"ILLEGAL OUTPUT PARAMETER"	},
{ 472,"ILLEGAL TYPE PARAMETER"	},
{ 473,"ILLEGAL PROCEDURE PARAMETER"	},
{ 474,"ILLEGAL FUNCTION PARAMETER"	},
{ 475,"ILLEGAL LEFT SIDE OF \"IS\"/\"IN\""	},
{ 476,"ILLEGAL RIGHT SIDE OF \"IS\"/\"IN\""	},
{ 477,"ILLEGAL PARAMETER OF \"ATTACH\""	},
{ 478,"ILLEGAL TYPE OF EXPRESSION"	},
{ 479,"NEGATIVE STEP VALUE"	},
{ 500,"***PROGRAM UNEXPECTEDLY HARD"	},
{ 550,"***STACK OVERLOADED"	},
{ 551,"***TOO MANY AUXILIARY VARIABLES NEEDED"	},
{ 552,"***TOO MANY AUXILIARY REFERENCE VARIABLES NEEDED"	},
{ 553,"***STATEMENT SEQUENCE TOO LONG OR TOO COMPLICATED"	},
{ 554,"***REAL CONSTANTS DICTIONARY OVERFOW"	},
{ 600,undeclared_identifier	},
{ 601,"ILLEGAL TYPE BEFORE \".\""	},
{ 602,"CLOSE IDENTIFIER AFTER \".\""	},
{ 603,"UNDECLARED IDENTIFIER AFTER \".\""	},
{ 604,"ILLEGAL OPERAND TYPE"	},
{ 605,"ILLEGAL TYPE IN \"DIV\"/\"MOD\" TERM"	},
{ 606,"INCOMPATIBLE TYPES IN COMPARISON"	},
{ 607,"UNRELATED CLASS TYPES IN COMPARISON"	},
{ 608,"STRINGS CANNOT BE COMPARED"	},
{ 609,"INCOMPATIBLE TYPES IN ASSIGNMENT/TRANSMISSION"	},
{ 610,"UNRELATED CLASS TYPES IN ASSIGNMENT/TRANSMISSION"	},
{ 611,"CONSTANT AFTER \".\""	},
{ 612,"THIS CLASS DOES NOT OCCUR IN SL-CHAIN"	},
{ 613,class_identifier_expected	},
{ 614,class_identifier_expected	},
{ 615,"ILLEGAL TYPE BEFORE \"QUA\""	},
{ 616,"ILLEGAL TYPE AFTER \"QUA\""	},
{ 617,"ILLEGAL TYPE AFTER \"QUA\""	},
{ 618,"UNRELATED TYPES IN \"QUA\"-EXPRESSION"	},
{ 619,"HIDDEN IDENTIFIER"	},
{ 620,"NON-TAKEN IDENTIFIER"	},
{ 621,"INVISIBLE IDENTIFIER AFTER \".\""	},
{ 622,"FORMAL PARAMETER LIST SHORTER"	},
{ 623,"FORMAL PARAMETER LIST LONGER"	},
{ 624,"ACTUAL PARAMETER IS NOT A REFERENCE TYPE"	},
{ 625,"ACTUAL PARAMETER IS NOT A TYPE"	},
{ 626,"PROCEDURE-FUNCTION CONFLICT BETWEEN PARAMETERS"	},
{ 627,"UNMATCHED HEADS -  WRONG KINDS OF PARAMETERS"	},
{ 628,"UNMATCHED HEADS-INCOMPATIBLE TYPES IN LISTS"	},
{ 629,"UNMATCHED HEADS-UNRELATED CLASS TYPES IN LISTS"	},
{ 630,"UNMATCHED HEADS-DIFFERENT NUMBERS OF PARAMETERS"	},
{ 631,"INCOMPATIBLE TYPES OF FUNCTION PARAMETERS"	},
{ 632,"FUNCTION/PROCEDURE  EXPECTED"	},
{ 633,null_program	},
{ 634,"UNMATCHED HEADS-TOO WEAK TYPE IN ACTUAL LIST"	},
{ 635,"STANDARD FUNCTION/PROCEDURE CANNOT BE ACTUAL PAR."	},
{ 636,"ILLEGAL USE OF SEMAPHORE"	},
{ 637,"\"SEMAPHORE\" TYPE CANNOT BE USED"	}

};


static char *find_msg( errno )  int errno;{
   int l=0;
   int u=sizeof(err_tab)/sizeof(err_tab[0]);
   while( l!=u ){
      int m= ( l+u )/2 ;
      if( errno > err_tab[m].errno )  l=m;
      else
      if( errno < err_tab[m].errno )  u=m;
      else
      l=u=m;
   }
   if( err_tab[l].errno != errno )
      return "UNKNOWN ERROR MESSAGE NUBER - INTERNAL COMPILER ERROR";
   return err_tab[l].errmsg;
}

