home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Magazine 1996 December / CD_shareware_12-96.iso / DOS / Programa / CCDL122.ZIP / SOURCE / ERROR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-06  |  25.3 KB  |  714 lines

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21. #include        <stdio.h>
  22. #include        "expr.h"
  23. #include        "c.h"
  24. #include        "gen.h"
  25. #include        "cglbdec.h"
  26.  
  27. extern FILE *tempfil;
  28. extern int prm_asmfile;
  29. extern FILE *outputFile;
  30. extern int prm_maxerr;
  31. extern int prm_diag;
  32. extern int prm_listfile;
  33. extern FILE            *inclfile[10];  /* shared with preproc */
  34. extern int             incldepth;      /* shared with preproc */
  35. extern char *infile;
  36. extern SYM *currentfunc;
  37. extern FILE *tempfil;
  38. extern int prm_warning,prm_cplusplus;
  39.  
  40. int diagcount = 0;
  41. static ERRORS *errlist = 0;
  42. static ERRORS *errtail = 0;
  43. static ERRORS *curerr = 0;
  44. static char expectlist[] = { "#############=###################,:;#[]{}()" };
  45. static int errline;
  46.  
  47. char nowarn[ERR_MAX] = { 
  48.  0,0,0,0,0,0,0,0,
  49.  0,0,0,0,0,0,0,0,
  50.  0,0,0,0,0,0,0,0,
  51.  0,0,0,0,0,0,0,0,
  52.  0,0,0,0,0,0,0,0,
  53.  0,0,0,0,0,0,0,0,
  54.  0,0,0,0,0,0,0,0,
  55.  0,0,0,0,0,0,0,0,
  56.  0,0,0,0,0,0,0,0,
  57.  0,0,0,0,0,0,0,0,
  58.  0,0,0,0,0,0,0,0,
  59.  0,0,0,0,
  60. };
  61. char warnarray[ERR_MAX][3] = { 
  62.     "all","","","","","","","",
  63.     "","","","","","","","",
  64.     "","","","","","","","",
  65.     "","","","","","","","",
  66.     "","","","","cln","","","",
  67.     "","","","","","","","",
  68.     "","","","","","ret","sun","sud",
  69.     "sas","npo","urc","fun","cno","ieq","","nco",
  70.     "lad","","","zer","dpc","nsf","lun","pro",
  71.     "cnv","","irg","san","ssu","","","",
  72.     "","","tua","","tui","","","",
  73.     "","","","","","","","",
  74.     "","","","",
  75. };
  76. int             total_errors = 0;
  77. void initerr(void)
  78. {
  79.                                 errlist = errtail = curerr = 0;
  80.         total_errors = 0;
  81.                                 diagcount  = 0;                 
  82.     errline = 0;
  83. }
  84. void warning_setup(char select, char *string)
  85. {
  86.     int bool = FALSE;
  87.     while (*string) {
  88.         int i;
  89.         if (string[0] == '-') {
  90.             bool = TRUE;
  91.             string++;
  92.         }
  93.         else
  94.             if (string[0] == '+')
  95.                 string++;
  96.         for (i=0; i < ERR_MAX; i++)
  97.             if (!strncmp(warnarray[i],string,3)) {
  98.                 if (i== 0) {
  99.                     int j;
  100.                     for (j =0; j < ERR_MAX; j++)
  101.                         nowarn[j] = bool;
  102.                 }
  103.                 else
  104.                     nowarn[i] = bool;
  105.                 string += 3;
  106.                 break;
  107.             }
  108.         if (i==ERR_MAX) {
  109.             fatal("Invalid warning");
  110.         }
  111.     }
  112. }
  113. void diag(char *s)
  114.         diagcount++;
  115.   if (prm_diag) {
  116.                 printf("DIAG - %s\n",s);
  117.                 if (prm_listfile && listFile)
  118.                         fprintf(listFile,"/*DIAG - %s*/",s);
  119.                 if (prm_asmfile)
  120. #ifdef i386
  121.                         fprintf(tempfil,"DIAG - %s\n",s);
  122. #else
  123.                         fprintf(outputFile,"DIAG - %s\n",s);
  124. #endif
  125.         }
  126. }
  127. int printerr(char *buf, ERRORS *err)
  128. {
  129.         int errlvl = 0;
  130.         switch (err->errno) {
  131.                 case ERR_PUNCT:
  132.                         sprintf(buf,"Expected '%c'",expectlist[(int)err->data]);
  133.                         break;
  134.                 case ERR_INSERT:
  135.                         sprintf(buf,"Inserted '%c'",expectlist[(int)err->data]);
  136.                         break;
  137.                 case ERR_NEEDCHAR:
  138.                         sprintf(buf,"Expected '%c'",(char)err->data);
  139.                         break;
  140.                 case ERR_ILLCHAR:
  141.                         sprintf(buf,"Illegal character '%c'",(char)err->data);
  142.                         break;
  143.                 case ERR_NEEDCONST:
  144.                         sprintf(buf,"Constant value expected");
  145.                         break;
  146.                 case ERR_UNDEFINED:
  147.                         sprintf(buf,"Undefined symbol '%s'", (char *)err->data);
  148.                         break;
  149.                 case ERR_DUPSYM:
  150.                         sprintf(buf,"Duplicate symbol '%s'", (char *)err->data);
  151.                         break;
  152.                 case ERR_IDENTEXPECT:
  153.                         sprintf(buf,"Expected '%s'",(char *)err->data);
  154.                         break;
  155.                 case ERR_IDEXPECT:
  156.                         sprintf(buf,"Identifier expected");
  157.                         break;
  158.                 case ERR_INITSIZE:
  159.                         sprintf(buf,"Too many initializers");
  160.                         break;
  161.                 case ERR_NOINIT:
  162.                         sprintf(buf,"Cannot initialize '%s'",(char *)err->data);
  163.                         break;
  164.                 case ERR_PREPROCID:
  165.                         sprintf(buf,"Invalid preprocessor directive '%s'",(char *)err->data);
  166.                         break;
  167.                 case ERR_INCLFILE:
  168.                         sprintf(buf,"File name expected in #include directive");
  169.                         break;
  170.                 case ERR_CANTOPEN:
  171.                         sprintf(buf,"Cannot open file \"%s\" for read access",(char *)err->data);
  172.                         break;
  173.                 case ERR_ILLCLASS:
  174.                         sprintf(buf,"Illegal storage class specifier '%s'",(char *)err->data);
  175.                         break;
  176.                 case ERR_ILLCLASS2:
  177.                         sprintf(buf,"Illegal storage class specifier on '%s'",(char *)err->data);
  178.                         break;
  179.                 case ERR_DUPCASE:
  180.                         sprintf(buf,"Duplicate case %d",(int)err->data);
  181.                         break;
  182.                 case ERR_RETMISMATCH:
  183.                         sprintf(buf,"Type mismatch in return");
  184.                         break;
  185.                 case ERR_ARGMISMATCH:
  186.                         sprintf(buf,"Type mismatch in arg '%s'",(char *)err->data);
  187.                         break;
  188.                 case ERR_ARGLENSHORT:
  189.                         sprintf(buf,"Argument list too short in redeclaration of function '%s'",(char *)err->data);
  190.                         break;
  191.                 case ERR_ARGLENLONG:
  192.                         sprintf(buf,"Argument list too long in redeclaration of function '%s'",(char*)err->data);
  193.                         break;
  194.                 case ERR_FUNCMISMATCH:
  195.                         sprintf(buf,"Type mismatch in redeclaration of function '%s'",(char *)err->data);
  196.                         break;
  197.                 case ERR_CALLMISMATCH:
  198.                         sprintf(buf,"Type mismatch in arg %s",(char *)err->data);
  199.                         break;
  200.                 case ERR_CALLLENSHORT:
  201.                         sprintf(buf,"Argument list too short %s",(char *)err->data);
  202.                         break;
  203.                 case ERR_CALLLENLONG:
  204.                         sprintf(buf,"Argument list too long %s",(char *)err->data);
  205.                         errlvl = 1;
  206.                         break;
  207.                 case ERR_LABEL:
  208.                         sprintf(buf,"'%s' is not a label",(char *)err->data);
  209.                         break;
  210.                 case ERR_NOPOINTER:
  211.                         sprintf(buf,"Pointer type expected");
  212.                         break;
  213.                 case ERR_LVALUE:
  214.                         sprintf(buf,"Lvalue expected");
  215.                         break;
  216.                 case ERR_NOFUNC:
  217.                         sprintf(buf,"'%s' is not a function",(char *)err->data);
  218.                         break;
  219.                 case ERR_MISMATCH:
  220.                         sprintf(buf,"Type mismatch");
  221.                         break;
  222.                 case ERR_ELSE:
  223.                         sprintf(buf,"Misplaced else");
  224.                         break;
  225.                 case ERR_EXPREXPECT:
  226.                         sprintf(buf,"Expression expected");
  227.                         break;
  228.                 case ERR_DEREF:
  229.                         sprintf(buf,"Illegal pointer");
  230.                         break;
  231.                 case ERR_UNEXPECT:
  232.                         if (lastst == id)
  233.                                 sprintf(buf,"Unexpected '%s'",lastid);
  234.                         else
  235.                                 sprintf(buf,"Unexpected '%c'",lastch);
  236.                         break;
  237.                 case ERR_ILLTYPE:
  238.                         sprintf(buf,"Illegal typedef of '%s'",(char *)err->data);
  239.                         break;
  240.                 case ERR_ARRAYMISMATCH:
  241.                         sprintf(buf,"Non-scalar array index");
  242.                         break;
  243.                 case ERR_PREPROCMATCH:
  244.                         sprintf(buf,"Unbalanced preprocessor directives");
  245.                         break;
  246.                 case ERR_MACROSUBS:
  247.                         sprintf(buf,"Macro substitution error");
  248.                         break;
  249.                 case ERR_DECLEXPECT:
  250.                         sprintf(buf,"Declaration expected");
  251.                         break;
  252.                 case ERR_INVFLOAT:
  253.                         sprintf(buf,"Invalid floating point");
  254.                         break;
  255.                 case ERR_INVTRAP:
  256.                         sprintf(buf,"Invalid trap id");
  257.                         break;
  258.                 case ERR_BFILLEGAL:
  259.                         sprintf(buf,"Can't use bit field here");
  260.                         break;
  261.                 case ERR_BFTOOBIG:
  262.                         sprintf(buf,"Bit field too big");
  263.                         break;
  264.                 case ERR_BFTYPE:
  265.                         sprintf(buf,"Bit field only allowed on scalar types");
  266.                         break;
  267.                 case ERR_ERROR:
  268.                         sprintf(buf,"User error: %s",(char *)err->data);
  269.                         break;
  270.                 case ERR_INTERP:
  271.                         sprintf(buf,"%s",(char *)err->data);
  272.                         break;
  273.                 case ERR_BFADDR:
  274.                         sprintf(buf,"Cannot take address of bit field");
  275.                         break;
  276.                 case ERR_MODCONS:
  277.                         sprintf(buf,"Cannot modify a const val");
  278.                         break;
  279.                 case ERR_SZTYPE:
  280.                         sprintf(buf,"Type expected in sizeof");
  281.                         break;
  282.                 case ERR_FUNCRETVAL:
  283.                         sprintf(buf,"Function should return a value");
  284.                         errlvl = 1;
  285.                         break;
  286.                 case ERR_STATICSYMUNUSED:
  287.                         sprintf(buf,"Static variable '%s' is declared but never used",(char *)err->data);
  288.                         errlvl = 1;
  289.                         break;
  290.                 case ERR_SYMUNUSED:
  291.                         sprintf(buf,"Variable '%s' is declared but never used",(char *)err->data);
  292.                         errlvl = 1;
  293.                         break;
  294.                 case ERR_FUNCUNUSED:
  295.                         sprintf(buf,"Static function '%s' is declared but never used",(char *)err->data);
  296.                         errlvl = 1;
  297.                         break;
  298.                 case ERR_SYMUNDEF:
  299.                         sprintf(buf,"Possible use of '%s' before assignment",(char *)err->data);
  300.                         errlvl = 1;
  301.                         break;
  302.                 case ERR_SYMASSIGNED:
  303.                         sprintf(buf,"Variable '%s' is assigned a value which is never used",(char *)err->data);
  304.                         errlvl = 1;
  305.                         break;
  306.                 case ERR_NONPORT:
  307.                         sprintf(buf,"Nonportable pointer conversion");
  308.                         errlvl = 1;
  309.                         break;
  310.                 case ERR_UNREACHABLE:
  311.                         sprintf(buf,"Unreachable code");
  312.                         errlvl = 1;
  313.                         break;
  314.                                 case ERR_CODENONE:
  315.                                                 sprintf(buf,"Code has no effect");
  316.                                                 errlvl = 1;
  317.                                                 break;
  318.                                 case ERR_BADEQUATE:
  319.                                                 sprintf(buf,"Possible incorrect assignment");
  320.                                                 errlvl = 1;
  321.                                                 break;
  322.                                 case ERR_NOANDREG:
  323.                                                 sprintf(buf,"Invalid '&' on register var '%s'",(char *)err->data);    
  324.                                                 break;
  325.                                 case ERR_NOCONTINUE:
  326.                                                 sprintf(buf,"Continue not allowed");    
  327.                                                 break;
  328.                                 case ERR_DUPLABEL:
  329.                                                 sprintf(buf,"Duplicate label '%s'",(char *)err->data);    
  330.                                                 break;
  331.                                 case ERR_NOFUNCARRAY:
  332.                                                 sprintf(buf,"Function cannot return array");    
  333.                                                 break;
  334.                                 case ERR_NOVOIDRET:
  335.                                                 sprintf(buf,"Return type is void");    
  336.                                                 errlvl = 1;
  337.                                                 break;
  338.                                 case ERR_ZEROSTORAGE:
  339.                                                 sprintf(buf,"No memory allocated for '%s'",(char *)err->data);    
  340.                                                 errlvl = 1;
  341.                                                 break;
  342.                                 case ERR_ZEROPTR:
  343.                                                 sprintf(buf,"Illegal use of void pointer");
  344.                                                 break;
  345.                                 case ERR_SHORTPOINTER:
  346.                                                 sprintf(buf,"Dangerous pointer cast");    
  347.                                                 errlvl = 1;
  348.                                                 break;
  349.                                 case ERR_NOSTATICFUNC:
  350.                                                 sprintf(buf,"Nonexistant static func '%s'",(char *)err->data);    
  351.                                                 break;
  352.                                 case ERR_UNUSEDLABEL:                                                
  353.                                                 errlvl = 1;
  354.                                                 sprintf(buf,"Unused label '%s'",(char *)err->data);    
  355.                                                 break;
  356.                                 case ERR_NOPROTO:
  357.                                                 sprintf(buf,"Call to function '%s' with no prototype",(char *)err->data);    
  358.                                                 errlvl = prm_cplusplus==0;
  359.                                                 break;
  360.                                 case ERR_LOSTCONV:
  361.                                                 sprintf(buf,"Conversion may truncate significant digits");    
  362.                                                 errlvl = 1;
  363.                                                 break;
  364.                                 case ERR_UNDEFLABEL:
  365.                                                 sprintf(buf,"Undefined label '%s'",(char *)err->data);    
  366.                                                 break;
  367.                                 case ERR_ILLREGISTER:
  368.                                                 sprintf(buf,"Illegal register var '%s'",(char *)err->data);
  369.                                                 errlvl = 1;
  370.                                                 break;
  371.                                 case ERR_SUPERAND:
  372.                                                 sprintf(buf,"Possible superfluous &");
  373.                                                 errlvl = 1;
  374.                                                 break;
  375.                                 case ERR_NODECLARE:
  376.                                                 sprintf(buf,"Declaration not allowed here");
  377.                                                 break;
  378.                                 case ERR_NOMAIN:
  379.                                                 sprintf(buf,"Illegal call to main() from within program");
  380.                                                 break;
  381.                                 case ERR_NOREF:
  382.                                                 sprintf(buf,"Illegal use of reference operator");
  383.                                                 break;
  384.                                 case ERR_CANTREF:
  385.                                                 sprintf(buf,"Cannot define a pointer or reference to a reference");
  386.                                                 break;
  387.                                 case ERR_TEMPUSED:
  388.                                                 sprintf(buf,"Temporary used for parameter %s",(char *)err->data);
  389.                                                 errlvl = 1;
  390.                                                 break;
  391.                                 case ERR_REFMUSTINIT:
  392.                                                 sprintf(buf,"Reference variable '%s' must be initialized",(char *)err->data);
  393.                                                 break;
  394.                                 case ERR_TEMPINIT:
  395.                                                 sprintf(buf,"Temporary used to initialize %s",(char *)err->data);
  396.                                                 errlvl = 1;
  397.                                                 break;
  398.                                 case ERR_REFLVALUE:
  399.                                                 sprintf(buf,"Reference initialization needs lvalue");
  400.                                                 break;
  401.                                 case ERR_REFNOCONS:
  402.                                                 sprintf(buf,"Reference member '%s' in a class with no constructors",(char *)err->data);
  403.                                                 break;
  404.                                 case ERR_MISSINGDEFAULT:
  405.                                                 sprintf(buf,"Default missing after parameter '%s'",(char *)err->data);
  406.                                                 break;
  407.                                 case ERR_AMBIGFUNC:
  408.                                                 sprintf(buf,"Ambiguity between %s",(char *)err->data);
  409.                                                 break;
  410.                                 case ERR_NOLOCALDEFAULT:
  411.                                                 sprintf(buf,"Local variables may not be used as parameter defaults");
  412.                                                 break;
  413.                                 case ERR_CPPMISMATCH:
  414.                                                 sprintf(buf,"Cannot cast %s",(char *)err->data);
  415.                                                 break;
  416.                                 case ERR_NOOVERMAIN:
  417.                                                 sprintf(buf,"Cannot overload 'main'",(char *)err->data);
  418.                                                 break;
  419.                                 case ERR_SWITCHINT:
  420.                                                 sprintf(buf,"Switch argument must be of integral type");
  421.                                                 break;
  422.                                 case ERR_NOFUNCMATCH:
  423.                                                 sprintf(buf,"Could not find a match for '%s'",(char *)err->data);
  424.                                                 break;
  425. /*
  426.                                 case ERR_PREDEFSTRUCT:
  427.                                                 sprintf(buf,"'%s' must be a predefined class or struct",(char *)err->data);
  428.                                                 break;
  429.                                 case ERR_LOCALCLASS:
  430.                                                 sprintf(buf,"Local class functions not supported",(char *)err->data);
  431.                                                 break;
  432.                                 case ERR_PUREDECL:
  433.                                                 sprintf(buf,"Illegal pure declaration syntzx of '%s'",(char *)err->data);
  434.                                                 break;
  435.                                 case ERR_BADESTRUCT:
  436.                                                 sprintf(buf,"Destructor for class '%s' expected",(char *)err->data);
  437.                                                 break;
  438.                                 case ERR_TYPECONSTRUCT:
  439.                                                 sprintf(buf,"Constructor/destructor must be untyped");
  440.                                                 break;
  441.                                 case ERR_NOTYPEQUAL:
  442.                                                 sprintf(buf,"Variable '%s' cannot have a type qualifier",(char *)err->data);
  443.                                                 break;
  444.                                 case ERR_NOTACLASS:
  445.                                                 sprintf(buf,"Variable '%s' is not a class instance",(char *)err->data);
  446.                                                 break;
  447. */                default:
  448.                         sprintf(buf,"Error #%d",err->errno);
  449.                         break;
  450.         }
  451.         return errlvl;
  452. }
  453. void     lferror(void)
  454. {  
  455.                                 char buf[100];
  456.         while(curerr) {
  457.                                                 int errlvl = printerr(buf,curerr);
  458.                                                 if (!errlvl)
  459.                                                         fprintf(listFile,"**** ERROR: %s",buf);
  460.                                                 else if (prm_warning)
  461.                                                         fprintf(listFile,"** WARNING: %s\n",buf);
  462.                                                 curerr = curerr->link;
  463.                                 }
  464.                                                 
  465. }
  466. void basicskim(int *skimlist)
  467. {
  468.                 int i = 0;
  469.                 for (i=0;;i++) {
  470.                         if (lastst == skimlist[i] || lastst == eof)
  471.                                 break;
  472.                         if (skimlist[i] == 0) {
  473.                                 getsym();
  474.                                 i = 0;
  475.                         }
  476.                 }
  477. }
  478. BALANCE *newbalance(BALANCE *bal)
  479. {
  480.         BALANCE *rv = xalloc(sizeof(BALANCE));
  481.         rv->back = bal;
  482.         rv->count = 0;
  483.         if (lastst == openpa)
  484.                 rv->type = BAL_PAREN;
  485.         else
  486.                 rv->type = BAL_BRACKET;
  487.         return(rv);
  488. }
  489. void setbalance(BALANCE **bal)
  490. {
  491.         if (bal == 0)
  492.                 if (lastst = openpa || lastst == closepa)
  493.                         *bal = newbalance(*bal);
  494.                 else
  495.                         return;
  496.         switch (lastst) {
  497.                 case closepa:
  498.                                         while (*bal && (*bal)->type != BAL_PAREN) {
  499.                                                 (*bal) = (*bal)->back;
  500.                                         }
  501.                                         if (!((*bal)->type)--)
  502.                                                 (*bal) = (*bal)->back;
  503.                                         else return;    
  504.                 case closebr:
  505.                                         while (*bal && (*bal)->type != BAL_BRACKET) {
  506.                                                 (*bal) = (*bal)->back;
  507.                                         }
  508.                                         if (!((*bal)->type)--)
  509.                                                 (*bal) = (*bal)->back;
  510.                 case openpa:
  511.                                         if ((*bal)->type != BAL_PAREN)
  512.                                                 *bal = newbalance(*bal);
  513.                                         (*bal)->count++;
  514.                                         break;
  515.                                         
  516.                 case openbr:
  517.                                         if ((*bal)->type != BAL_BRACKET)
  518.                                                 *bal = newbalance(*bal);
  519.                                         (*bal)->count++;
  520.                                         break;
  521.         }
  522.         return;
  523. }
  524. void expskim(int *skimlist)
  525. {
  526.         BALANCE *bal = 0;
  527.         int i = 0;
  528.         for (i = 0; ; i++) {
  529.                 if (lastst == openpa || lastst == openbr) {
  530.                         setbalance(&bal);
  531.                         getsym();
  532.                 }
  533.                 else
  534.                         if (lastst == eof)
  535.                                 break;
  536.                         else
  537.                                 if (lastst == skimlist[i])
  538.                                         if (lastst == closepa || lastst == openpa) {
  539.                                                 if (!bal)
  540.                                                         break;
  541.                                                 setbalance(&bal);
  542.                                                 getsym();
  543.                                         }
  544.                                         else
  545.                                                 break;
  546.                                 else
  547.                                         if (skimlist[i] == 0) {
  548.                                                 i = 0;
  549.                                                 getsym();
  550.                                         }
  551.         }
  552.         
  553. }
  554. void basicerror(int n, void *data)
  555. {
  556.         char buf[100];
  557.         ERRORS *nexterr;
  558.         int errlvl,errored = 0;;
  559.         global_flag++;
  560.             nexterr = xalloc(sizeof(ERRORS));
  561.             global_flag--;
  562.             nexterr->errno = n;
  563.             nexterr->link = 0;
  564.             nexterr->data = data;
  565.             if (errlist == 0)
  566.                     errlist = errtail = nexterr;
  567.             else {
  568.                     errtail->link = nexterr;
  569.                     errtail = nexterr;
  570.             }
  571.         errlvl = printerr(buf, nexterr);
  572.         if (curerr == 0)
  573.                 curerr = nexterr;
  574.         if (!errlvl) {
  575.                                 errline = lineno;
  576.                 fprintf(stdout,"Error   %s(%d):  %s",infile,lineno,buf);
  577.                                 errored++;
  578.                 total_errors++;
  579.         }
  580.         else if (prm_warning && !nowarn[n] && (errline != lineno)) {
  581.                                 errored++;
  582.                 fprintf(stdout,"Warning %s(%d):  %s",infile,lineno,buf);
  583.                 }
  584.                 if (errored) {
  585.             if (currentfunc) {
  586.                                 unmangle(buf,currentfunc->name);
  587.                 fprintf(stdout," in function '%s'",buf);
  588.                     }
  589.             fputc('\n',stdout);
  590.                 }
  591.   if (total_errors > prm_maxerr) {
  592. #ifdef i386
  593.                 fclose(tempfil);
  594. #endif
  595.                 fatal("Too many errors");
  596.         }
  597. }
  598. void Error(char *string)
  599. {
  600.         basicerror(ERR_INTERP,(void *)string);
  601. }
  602. void generror(int n, int data, int *skimlist)
  603. {                
  604.         basicerror(n,(void *)data);
  605.         if (skimlist) 
  606.                 basicskim(skimlist);
  607. }
  608. void gensymerror(int n, char *data)
  609. {
  610.                 char buf[100];
  611.                 unmangle(buf,data);
  612.         global_flag++;
  613.         basicerror(n,(void *)litlate(buf));
  614.         global_flag--;
  615. }
  616. void genfuncerror(int n, char*func, char *data)
  617. {
  618.                 char buf[100],buf1[100],buf2[100];
  619.                 unmangle(buf1,func);
  620.                 if (data) {
  621.                     unmangle(buf2,data);
  622.                     buf[0] = '\'';
  623.                     buf[1] = 0;
  624.                     strcat(buf,buf2);
  625.                     strcat(buf,"' ");
  626.                 }
  627.                 else
  628.                     buf[0] = 0;
  629.                 strcat(buf,"in call to function ");
  630.                 strcat(buf,"'");
  631.                 strcat(buf,buf1);
  632.                 strcat(buf,"'");
  633.         global_flag++;
  634.         basicerror(n,(void *)litlate(buf));
  635.         global_flag--;
  636. }
  637. void genfunc2error(int n, char*func, char *func2)
  638. {
  639.                 char buf[100],buf1[100],buf2[100];
  640.                 unmangle(buf1,func);
  641.                 unmangle(buf2,func2);
  642.                 buf[0] = '\'';
  643.                 buf[1] = 0;
  644.                 strcpy(buf,buf2);
  645.                 strcat(buf,"'");
  646.                 strcat(buf," and ");
  647.                 strcat(buf,"'");
  648.                 strcat(buf,buf1);
  649.                 strcat(buf,"'");
  650.         global_flag++;
  651.         basicerror(n,(void *)litlate(buf));
  652.         global_flag--;
  653. }
  654. void genclasserror(int n, char *struc, char *elem)
  655. {
  656.                 char buf[100],buf1[100],buf2[100];
  657.                 unmangle(buf1,elem);
  658.                 unmangle(buf2,struc);
  659.                 buf[0] = '\'';
  660.                 buf[1] = 0;
  661.                 strcpy(buf,buf2);
  662.                 strcat(buf,"::");
  663.                 strcat(buf,buf1);
  664.                 strcat(buf,"'");
  665.         global_flag++;
  666.         basicerror(n,(void *)litlate(buf));
  667.         global_flag--;
  668. }
  669. void genmismatcherror(TYP *tp1, TYP *tp2)
  670. {
  671.                 char buf[100],buf1[100],buf2[100];
  672.                 typenum(buf1,tp1);
  673.                 typenum(buf2,tp2);
  674.                 buf[0] = '\'';
  675.                 buf[1] = 0;
  676.                 strcat(buf,buf1);
  677.                 strcat(buf,"'");
  678.                 strcat(buf," to ");
  679.                 strcat(buf,"'");
  680.                 strcat(buf,buf2);
  681.                 strcat(buf,"'");
  682.         global_flag++;
  683.         basicerror(ERR_CPPMISMATCH,(void *)litlate(buf));
  684.         global_flag--;
  685. }
  686.  
  687.     
  688. void expecttoken(int n, int *skimlist)
  689. {
  690.         if (skimlist)
  691.                 generror(ERR_PUNCT, n, skimlist);
  692.         else
  693.                 generror(ERR_INSERT, n, 0);
  694. }
  695. void generrorexp(int n, int data, int *skimlist)
  696. {                
  697.         basicerror(n,(void *)data);
  698.         if (skimlist) 
  699.                 expskim(skimlist);
  700. }
  701. void gensymerrorexp(int n, char *data)
  702. {
  703.         global_flag++;
  704.         basicerror(n,(void *)litlate(data));
  705.         global_flag--;
  706. }
  707. void expecttokenexp(int n, int *skimlist)
  708. {
  709.         if (skimlist)
  710.                 generrorexp(ERR_PUNCT, n, skimlist);
  711.         else
  712.                 generrorexp(ERR_INSERT, n, 0);
  713. }