Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/SemanticError.cc

    r610354a rddcedfe  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec 14 13:45:28 2023
    13 // Update Count     : 34
     12// Last Modified On : Thu Jun  7 08:05:26 2018
     13// Update Count     : 10
    1414//
    1515
     
    2323#include <vector>
    2424
    25 using namespace std;
    26 
    2725#include "Common/utility.h"                                                             // for to_string, CodeLocation (ptr only)
    2826#include "SemanticError.h"
     
    3028//-----------------------------------------------------------------------------
    3129// Severity Handling
    32 vector<Severity> & get_severities() {
    33         static vector<Severity> severities;
     30std::vector<Severity> & get_severities() {
     31        static std::vector<Severity> severities;
    3432        if(severities.empty()) {
    3533                severities.reserve((size_t)Warning::NUMBER_OF_WARNINGS);
     
    6260        size_t idx = 0;
    6361        for ( const auto & w : WarningFormats ) {
    64                 if ( strcmp( name, w.name ) == 0 ) {
     62                if ( std::strcmp( name, w.name ) == 0 ) {
    6563                        get_severities()[idx] = s;
    6664                        break;
     
    7270//-----------------------------------------------------------------------------
    7371// Semantic Error
    74 
    7572bool SemanticErrorThrow = false;
    7673
    77 SemanticErrorException::SemanticErrorException( CodeLocation location, string error ) {
     74SemanticErrorException::SemanticErrorException( CodeLocation location, std::string error ) {
    7875        append( location, error );
    7976}
     
    8380}
    8481
    85 void SemanticErrorException::append( CodeLocation location, const string & msg ) {
     82void SemanticErrorException::append( CodeLocation location, const std::string & msg ) {
    8683        errors.emplace_back( location, msg );
    8784}
     
    9289
    9390void SemanticErrorException::print() {
    94 //      using to_string;
     91        using std::to_string;
    9592
    9693        errors.sort([](const error & lhs, const error & rhs) -> bool {
     
    10299
    103100        for( auto err : errors ) {
    104                 cerr << ErrorHelpers::bold() << err.location << ErrorHelpers::error_str() << ErrorHelpers::reset_font() << err.description << endl;
    105         }
    106 }
    107 
    108 void SemanticError( CodeLocation location, const char * fmt, ... ) {
    109         char msg[2048];                                                                         // worst-case error-message buffer
    110         va_list args;
    111         va_start( args, fmt );
    112         vsnprintf( msg, sizeof(msg), fmt, args );                       // always null terminated, but may be truncated
    113         va_end( args );
    114 
     101                std::cerr << ErrorHelpers::bold() << err.location << ErrorHelpers::error_str() << ErrorHelpers::reset_font() << err.description << std::endl;
     102        }
     103}
     104
     105void SemanticError( CodeLocation location, std::string error ) {
    115106        SemanticErrorThrow = true;
    116         throw SemanticErrorException( location, msg );          // convert msg to string
    117 }
    118 
    119 void SemanticWarning( CodeLocation location, Warning warning, ... ) {
     107        throw SemanticErrorException( location, error );
     108}
     109
     110namespace {
     111        // convert format string and arguments into a single string
     112        std::string fmtToString(const char * fmt, va_list ap) {
     113                int size = 128;
     114                while ( true ) {
     115                        char buf[size];
     116                        va_list args;
     117                        va_copy( args, ap );
     118                        int n = vsnprintf(&buf[0], size, fmt, args);
     119                        va_end( args );
     120                        if ( n < size && n >= 0 ) return buf;
     121                        size *= 2;
     122                }
     123                assert( false );
     124        }
     125}
     126
     127void SemanticWarningImpl( CodeLocation location, Warning warning, const char * const fmt, ... ) {
    120128        Severity severity = get_severities()[(int)warning];
    121 
    122         switch ( severity ) {
     129        switch(severity) {
    123130        case Severity::Suppress :
    124131                break;
    125132        case Severity::Warn :
     133                {
     134                        va_list args;
     135                        va_start(args, fmt);
     136                        std::string msg = fmtToString( fmt, args );
     137                        va_end(args);
     138                        std::cerr << ErrorHelpers::bold() << location << ErrorHelpers::warning_str() << ErrorHelpers::reset_font() << msg << std::endl;
     139                }
     140                break;
    126141        case Severity::Error :
    127142                {
    128                         char msg[2048];                                                         // worst-case error-message buffer
    129143                        va_list args;
    130                         va_start( args, warning );
    131                         vsnprintf( msg, sizeof(msg), WarningFormats[(int)warning].message, args ); // always null terminated, but may be truncated
    132                         va_end( args );
    133 
    134                         if ( severity == Severity::Warn ) {
    135                                 cerr << ErrorHelpers::bold() << location << ErrorHelpers::warning_str() << ErrorHelpers::reset_font() << msg << endl;
    136                         } else {
    137                                 SemanticError( location, string( msg ) );
    138                         }
     144                        va_start(args, fmt);
     145                        std::string msg = fmtToString( fmt, args );
     146                        va_end(args);
     147                        SemanticError(location, msg);
    139148                }
    140149                break;
     
    154163        }
    155164
    156         const string & error_str() {
    157                 static string str = with_colors() ? "\e[31merror:\e[39m " : "error: ";
    158                 return str;
    159         }
    160 
    161         const string & warning_str() {
    162                 static string str = with_colors() ? "\e[95mwarning:\e[39m " : "warning: ";
    163                 return str;
    164         }
    165 
    166         const string & bold_ttycode() {
    167                 static string str = with_colors() ? "\e[1m" : "";
    168                 return str;
    169         }
    170 
    171         const string & reset_font_ttycode() {
    172                 static string str = with_colors() ? "\e[0m" : "";
    173                 return str;
    174         }
    175 
    176         string make_bold( const string & str ) {
     165        const std::string & error_str() {
     166                static std::string str = with_colors() ? "\e[31merror:\e[39m " : "error: ";
     167                return str;
     168        }
     169
     170        const std::string & warning_str() {
     171                static std::string str = with_colors() ? "\e[95mwarning:\e[39m " : "warning: ";
     172                return str;
     173        }
     174
     175        const std::string & bold_ttycode() {
     176                static std::string str = with_colors() ? "\e[1m" : "";
     177                return str;
     178        }
     179
     180        const std::string & reset_font_ttycode() {
     181                static std::string str = with_colors() ? "\e[0m" : "";
     182                return str;
     183        }
     184
     185        std::string make_bold( const std::string & str ) {
    177186                return bold_ttycode() + str + reset_font_ttycode();
    178187        }
    179188
    180         ostream & operator<<(ostream & os, bold) {
     189        std::ostream & operator<<(std::ostream & os, bold) {
    181190                os << bold_ttycode();
    182191                return os;
    183192        }
    184193
    185         ostream & operator<<(ostream & os, reset_font) {
     194        std::ostream & operator<<(std::ostream & os, reset_font) {
    186195                os << reset_font_ttycode();
    187196                return os;
Note: See TracChangeset for help on using the changeset viewer.