www.pudn.com > 12cocorc.zip > CR_ERROR.CPP


//********************************************************** 
//   CR_ERROR.CPP 
//   Coco/R C++ Support Library. 
//   Author: Frankie Arzu  
// 
//   Jun 12, 1996  Version 1.06 
//      Many fixes and suggestions thanks to 
//      Pat Terry  
//   Oct 11, 1997  Version 1.07 
//      Change definition of FileName to local Storage 
//********************************************************** 
 
#include "cr_error.hpp" 
#include  
 
CRError::CRError(char *name, AbsScanner *S, int MinUserNo, int MinErr) 
{ 
  if (!S) { 
    fprintf(stderr, "CRError::CRError: No Scanner specified\n"); 
    exit(1); 
  } 
  Scanner = S; 
  strcpy(FileName, name); 
  lst = stderr; 
  Errors = 0; FirstErr = LastErr = NULL; ErrorDist = MinErr; 
  MinErrorDist = MinErr; 
  MinUserError = MinUserNo; 
} 
 
CRError::~CRError() 
{ 
  if (FirstErr) delete FirstErr; 
} 
 
void CRError::Store(int nr, int line, int col, long pos) 
{ 
  ErrDesc *NextErr = new ErrDesc(nr, line, col); 
  if (FirstErr == NULL) FirstErr = NextErr; 
  else LastErr->SetNext(NextErr); 
  LastErr = NextErr; 
} 
 
void CRError::StoreErr(int ErrorNo, AbsToken &Token) 
{ 
  if (ErrorDist >= MinErrorDist) 
    { Errors++; Store(ErrorNo, Token.Line, Token.Col, Token.Pos); } 
  ErrorDist = 0; 
} 
 
void CRError::StoreWarn(int WarnNo, AbsToken &Token) 
{ 
  Store(WarnNo, Token.Line, Token.Col, Token.Pos); 
} 
 
void CRError::PrintErrMsg(int nr) 
{ 
  fprintf(lst, "%s (E%d)", GetErrorMsg(nr), nr); 
} 
 
void CRError::PrintErr(int nr, int col) 
{ 
  fprintf(lst, "*****"); 
  while (col--) fprintf(lst, " "); 
  fprintf(lst, " ^ "); 
  PrintErrMsg(nr); 
  fprintf(lst, "\n"); 
} 
 
void CRError::PrintListing(AbsScanner *Scanner) 
// Print a source listing with error messages 
{ 
  char line[255]; 
  fprintf(lst, "Listing:\n\n"); 
  long srcPos = 0; 
  ErrDesc *nextErr = FirstErr; 
  srcPos = Scanner->GetLine(srcPos, line, sizeof(line)-1); 
  int lnr = 1; 
  int errC = 0; 
  while (srcPos != -1) { 
    fprintf(lst, "%5d  %s\n", lnr, line); 
    while (nextErr != NULL && nextErr->line == lnr) { 
      PrintErr(nextErr->nr, nextErr->col); 
      errC++; 
      nextErr = nextErr->GetNext(); 
    } 
    srcPos=Scanner->GetLine(srcPos, line, sizeof(line)-1); 
    lnr++; 
  } 
  if (nextErr != NULL) { 
    fprintf(lst, "%5d\n", lnr); 
    while (nextErr != NULL) { 
      PrintErr(nextErr->nr, nextErr->col); 
      errC++; 
      nextErr = nextErr->GetNext(); 
    } 
  } 
  fprintf(lst, "\n\n%5d syntax errors\n", errC); 
} 
 
void CRError::SummarizeErrors() 
// Print a summary of error messages 
{ 
  ErrDesc *nextErr = FirstErr; 
  while (nextErr != NULL) { 
    fprintf(lst, "\"%s\", Line %d, Col %d: ", 
      FileName, nextErr->line, nextErr->col); 
    PrintErrMsg(nextErr->nr); 
    fprintf(lst, "\n"); 
    nextErr = nextErr->GetNext(); 
  } 
}