112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_report_handler.cpp -
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Alex Riesen, Synopsys, Inc.
2512027Sjungma@eit.uni-kl.de  see also sc_report.cpp
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.de  CHANGE LOG AT END OF FILE
2812027Sjungma@eit.uni-kl.de *****************************************************************************/
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de#include <cstdio>
3112027Sjungma@eit.uni-kl.de#include <stdlib.h>
3212027Sjungma@eit.uni-kl.de#include <string.h>
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h"
3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process.h"
3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext_int.h"
3712027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_stop_here.h"
3812027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_report_handler.h"
3912027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_report.h"
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.denamespace std {}
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.denamespace sc_core {
4412027Sjungma@eit.uni-kl.de
4512027Sjungma@eit.uni-kl.deint sc_report_handler::verbosity_level = SC_MEDIUM;
4612027Sjungma@eit.uni-kl.de
4712027Sjungma@eit.uni-kl.de// not documented, but available
4812027Sjungma@eit.uni-kl.deconst std::string sc_report_compose_message(const sc_report& rep)
4912027Sjungma@eit.uni-kl.de{
5012027Sjungma@eit.uni-kl.de    static const char * severity_names[] = {
5112027Sjungma@eit.uni-kl.de	"Info", "Warning", "Error", "Fatal"
5212027Sjungma@eit.uni-kl.de    };
5312027Sjungma@eit.uni-kl.de    std::string str;
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de    str += severity_names[rep.get_severity()];
5612027Sjungma@eit.uni-kl.de    str += ": ";
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.de    if ( rep.get_id() >= 0 ) // backward compatibility with 2.0+
5912027Sjungma@eit.uni-kl.de    {
6012027Sjungma@eit.uni-kl.de	char idstr[64];
6112027Sjungma@eit.uni-kl.de	std::sprintf(idstr, "(%c%d) ",
6212027Sjungma@eit.uni-kl.de		"IWEF"[rep.get_severity()], rep.get_id());
6312027Sjungma@eit.uni-kl.de	str += idstr;
6412027Sjungma@eit.uni-kl.de    }
6512027Sjungma@eit.uni-kl.de    str += rep.get_msg_type();
6612027Sjungma@eit.uni-kl.de
6712027Sjungma@eit.uni-kl.de    if( *rep.get_msg() )
6812027Sjungma@eit.uni-kl.de    {
6912027Sjungma@eit.uni-kl.de	str += ": ";
7012027Sjungma@eit.uni-kl.de	str += rep.get_msg();
7112027Sjungma@eit.uni-kl.de    }
7212027Sjungma@eit.uni-kl.de    if( rep.get_severity() > SC_INFO )
7312027Sjungma@eit.uni-kl.de    {
7412027Sjungma@eit.uni-kl.de        char line_number_str[16];
7512027Sjungma@eit.uni-kl.de	str += "\nIn file: ";
7612027Sjungma@eit.uni-kl.de	str += rep.get_file_name();
7712027Sjungma@eit.uni-kl.de	str += ":";
7812027Sjungma@eit.uni-kl.de	std::sprintf(line_number_str, "%d", rep.get_line_number());
7912027Sjungma@eit.uni-kl.de	str += line_number_str;
8012027Sjungma@eit.uni-kl.de	sc_simcontext* simc = sc_get_curr_simcontext();
8112027Sjungma@eit.uni-kl.de
8212027Sjungma@eit.uni-kl.de	if( simc && sc_is_running() )
8312027Sjungma@eit.uni-kl.de	{
8412027Sjungma@eit.uni-kl.de	    const char* proc_name = rep.get_process_name();
8512027Sjungma@eit.uni-kl.de
8612027Sjungma@eit.uni-kl.de	    if( proc_name )
8712027Sjungma@eit.uni-kl.de	    {
8812027Sjungma@eit.uni-kl.de		str += "\nIn process: ";
8912027Sjungma@eit.uni-kl.de		str += proc_name;
9012027Sjungma@eit.uni-kl.de		str += " @ ";
9112027Sjungma@eit.uni-kl.de		str += rep.get_time().to_string();
9212027Sjungma@eit.uni-kl.de	    }
9312027Sjungma@eit.uni-kl.de	}
9412027Sjungma@eit.uni-kl.de    }
9512027Sjungma@eit.uni-kl.de
9612027Sjungma@eit.uni-kl.de    return str;
9712027Sjungma@eit.uni-kl.de}
9812027Sjungma@eit.uni-kl.debool sc_report_close_default_log();
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.destatic ::std::ofstream* log_stream = 0;
10112027Sjungma@eit.uni-kl.destatic
10212027Sjungma@eit.uni-kl.destruct auto_close_log
10312027Sjungma@eit.uni-kl.de{
10412027Sjungma@eit.uni-kl.de    ~auto_close_log()
10512027Sjungma@eit.uni-kl.de    {
10612027Sjungma@eit.uni-kl.de	sc_report_close_default_log();
10712027Sjungma@eit.uni-kl.de    }
10812027Sjungma@eit.uni-kl.de} auto_close;
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.deconst char* sc_report::get_process_name() const
11112027Sjungma@eit.uni-kl.de{
11212027Sjungma@eit.uni-kl.de	return process ? process->name() : 0;
11312027Sjungma@eit.uni-kl.de}
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.de//
11712027Sjungma@eit.uni-kl.de// The official handler of the exception reporting
11812027Sjungma@eit.uni-kl.de//
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.devoid sc_report_handler::default_handler(const sc_report& rep,
12112027Sjungma@eit.uni-kl.de					const sc_actions& actions)
12212027Sjungma@eit.uni-kl.de{
12312027Sjungma@eit.uni-kl.de    if ( actions & SC_DISPLAY )
12412027Sjungma@eit.uni-kl.de	::std::cout << ::std::endl << sc_report_compose_message(rep) <<
12512027Sjungma@eit.uni-kl.de		::std::endl;
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de    if ( (actions & SC_LOG) && get_log_file_name() )
12812027Sjungma@eit.uni-kl.de    {
12912027Sjungma@eit.uni-kl.de	if ( !log_stream )
13012027Sjungma@eit.uni-kl.de	    log_stream = new ::std::ofstream(get_log_file_name()); // ios::trunc
13112027Sjungma@eit.uni-kl.de
13212027Sjungma@eit.uni-kl.de	*log_stream << rep.get_time() << ": "
13312027Sjungma@eit.uni-kl.de	    << sc_report_compose_message(rep) << ::std::endl;
13412027Sjungma@eit.uni-kl.de    }
13512027Sjungma@eit.uni-kl.de    if ( actions & SC_STOP )
13612027Sjungma@eit.uni-kl.de    {
13712027Sjungma@eit.uni-kl.de	sc_stop_here(rep.get_msg_type(), rep.get_severity());
13812027Sjungma@eit.uni-kl.de	sc_stop();
13912027Sjungma@eit.uni-kl.de    }
14012027Sjungma@eit.uni-kl.de    if ( actions & SC_INTERRUPT )
14112027Sjungma@eit.uni-kl.de	sc_interrupt_here(rep.get_msg_type(), rep.get_severity());
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.de    if ( actions & SC_ABORT )
14412027Sjungma@eit.uni-kl.de	abort();
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de    if ( actions & SC_THROW ) {
14712027Sjungma@eit.uni-kl.de        sc_process_b* proc_p = sc_get_current_process_b();
14812027Sjungma@eit.uni-kl.de        if( proc_p && proc_p->is_unwinding() )
14912027Sjungma@eit.uni-kl.de            proc_p->clear_unwinding();
15012027Sjungma@eit.uni-kl.de        throw rep;
15112027Sjungma@eit.uni-kl.de    }
15212027Sjungma@eit.uni-kl.de}
15312027Sjungma@eit.uni-kl.de
15412027Sjungma@eit.uni-kl.de// not documented, but available
15512027Sjungma@eit.uni-kl.debool sc_report_close_default_log()
15612027Sjungma@eit.uni-kl.de{
15712027Sjungma@eit.uni-kl.de    delete log_stream;
15812027Sjungma@eit.uni-kl.de    sc_report_handler::set_log_file_name(NULL);
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de    if ( !log_stream )
16112027Sjungma@eit.uni-kl.de	return false;
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de    log_stream = 0;
16412027Sjungma@eit.uni-kl.de    return true;
16512027Sjungma@eit.uni-kl.de}
16612027Sjungma@eit.uni-kl.de
16712027Sjungma@eit.uni-kl.deint sc_report_handler::get_count(sc_severity severity_)
16812027Sjungma@eit.uni-kl.de{
16912027Sjungma@eit.uni-kl.de   return sev_call_count[severity_];
17012027Sjungma@eit.uni-kl.de}
17112027Sjungma@eit.uni-kl.de
17212027Sjungma@eit.uni-kl.deint sc_report_handler::get_count(const char* msg_type_)
17312027Sjungma@eit.uni-kl.de{
17412027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
17512027Sjungma@eit.uni-kl.de
17612027Sjungma@eit.uni-kl.de    if ( !md )
17712027Sjungma@eit.uni-kl.de        md = add_msg_type(msg_type_);
17812027Sjungma@eit.uni-kl.de
17912027Sjungma@eit.uni-kl.de    return md->call_count;
18012027Sjungma@eit.uni-kl.de}
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.deint sc_report_handler::get_count(const char* msg_type_, sc_severity severity_)
18312027Sjungma@eit.uni-kl.de{
18412027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
18512027Sjungma@eit.uni-kl.de
18612027Sjungma@eit.uni-kl.de    if ( !md )
18712027Sjungma@eit.uni-kl.de        md = add_msg_type(msg_type_);
18812027Sjungma@eit.uni-kl.de
18912027Sjungma@eit.uni-kl.de    return md->sev_call_count[severity_];
19012027Sjungma@eit.uni-kl.de}
19112027Sjungma@eit.uni-kl.de
19212027Sjungma@eit.uni-kl.de
19312027Sjungma@eit.uni-kl.de//
19412027Sjungma@eit.uni-kl.de// CLASS: sc_report_handler
19512027Sjungma@eit.uni-kl.de// implementation
19612027Sjungma@eit.uni-kl.de//
19712027Sjungma@eit.uni-kl.de
19812027Sjungma@eit.uni-kl.desc_msg_def * sc_report_handler::mdlookup(const char * msg_type_)
19912027Sjungma@eit.uni-kl.de{
20012027Sjungma@eit.uni-kl.de    if( !msg_type_ ) // if msg_type is NULL, report unknown error
20112027Sjungma@eit.uni-kl.de        msg_type_ = SC_ID_UNKNOWN_ERROR_;
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.de    for ( msg_def_items * item = messages; item; item = item->next )
20412027Sjungma@eit.uni-kl.de    {
20512027Sjungma@eit.uni-kl.de	for ( int i = 0; i < item->count; ++i )
20612027Sjungma@eit.uni-kl.de	    if ( !strcmp(msg_type_, item->md[i].msg_type) )
20712027Sjungma@eit.uni-kl.de		return item->md + i;
20812027Sjungma@eit.uni-kl.de    }
20912027Sjungma@eit.uni-kl.de    return 0;
21012027Sjungma@eit.uni-kl.de}
21112027Sjungma@eit.uni-kl.de
21212027Sjungma@eit.uni-kl.de// The calculation of actions to be executed
21312027Sjungma@eit.uni-kl.desc_actions sc_report_handler::execute(sc_msg_def* md, sc_severity severity_)
21412027Sjungma@eit.uni-kl.de{
21512027Sjungma@eit.uni-kl.de    sc_actions actions = md->sev_actions[severity_]; // high prio
21612027Sjungma@eit.uni-kl.de
21712027Sjungma@eit.uni-kl.de    if ( SC_UNSPECIFIED == actions ) // middle prio
21812027Sjungma@eit.uni-kl.de	actions = md->actions;
21912027Sjungma@eit.uni-kl.de
22012027Sjungma@eit.uni-kl.de    if ( SC_UNSPECIFIED == actions ) // the lowest prio
22112027Sjungma@eit.uni-kl.de	actions = sev_actions[severity_];
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.de    actions &= ~suppress_mask; // higher than the high prio
22412027Sjungma@eit.uni-kl.de    actions |= force_mask; // higher than above, and the limit is the highest
22512027Sjungma@eit.uni-kl.de
22612027Sjungma@eit.uni-kl.de    unsigned * limit = 0;
22712027Sjungma@eit.uni-kl.de    unsigned * call_count = 0;
22812027Sjungma@eit.uni-kl.de
22912027Sjungma@eit.uni-kl.de    // just increment counters and check for overflow
23012027Sjungma@eit.uni-kl.de    if ( md->sev_call_count[severity_] < UINT_MAX )
23112027Sjungma@eit.uni-kl.de	md->sev_call_count[severity_]++;
23212027Sjungma@eit.uni-kl.de    if ( md->call_count < UINT_MAX )
23312027Sjungma@eit.uni-kl.de	md->call_count++;
23412027Sjungma@eit.uni-kl.de    if ( sev_call_count[severity_] < UINT_MAX )
23512027Sjungma@eit.uni-kl.de	sev_call_count[severity_]++;
23612027Sjungma@eit.uni-kl.de
23712027Sjungma@eit.uni-kl.de    if ( md->limit_mask & (1 << (severity_ + 1)) )
23812027Sjungma@eit.uni-kl.de    {
23912027Sjungma@eit.uni-kl.de	limit = md->sev_limit + severity_;
24012027Sjungma@eit.uni-kl.de	call_count = md->sev_call_count + severity_;
24112027Sjungma@eit.uni-kl.de    }
24212027Sjungma@eit.uni-kl.de    if ( !limit && (md->limit_mask & 1) )
24312027Sjungma@eit.uni-kl.de    {
24412027Sjungma@eit.uni-kl.de	limit = &md->limit;
24512027Sjungma@eit.uni-kl.de	call_count = &md->call_count;
24612027Sjungma@eit.uni-kl.de    }
24712027Sjungma@eit.uni-kl.de    if ( !limit )
24812027Sjungma@eit.uni-kl.de    {
24912027Sjungma@eit.uni-kl.de	limit = sev_limit + severity_;
25012027Sjungma@eit.uni-kl.de	call_count = sev_call_count + severity_;
25112027Sjungma@eit.uni-kl.de    }
25212027Sjungma@eit.uni-kl.de    if ( *limit == 0 )
25312027Sjungma@eit.uni-kl.de    {
25412027Sjungma@eit.uni-kl.de	// stop limit disabled
25512027Sjungma@eit.uni-kl.de    }
25612027Sjungma@eit.uni-kl.de    else if ( *limit != UINT_MAX )
25712027Sjungma@eit.uni-kl.de    {
25812027Sjungma@eit.uni-kl.de	if ( *call_count >= *limit )
25912027Sjungma@eit.uni-kl.de	    actions |= SC_STOP; // force sc_stop()
26012027Sjungma@eit.uni-kl.de    }
26112027Sjungma@eit.uni-kl.de    return actions;
26212027Sjungma@eit.uni-kl.de}
26312027Sjungma@eit.uni-kl.de
26412027Sjungma@eit.uni-kl.devoid sc_report_handler::report( sc_severity severity_,
26512027Sjungma@eit.uni-kl.de                                const char* msg_type_,
26612027Sjungma@eit.uni-kl.de				const char* msg_,
26712027Sjungma@eit.uni-kl.de				int verbosity_,
26812027Sjungma@eit.uni-kl.de				const char* file_,
26912027Sjungma@eit.uni-kl.de				int line_ )
27012027Sjungma@eit.uni-kl.de{
27112027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
27212027Sjungma@eit.uni-kl.de
27312027Sjungma@eit.uni-kl.de    // If the severity of the report is SC_INFO and the specified verbosity
27412027Sjungma@eit.uni-kl.de    // level is greater than the maximum verbosity level of the simulator then
27512027Sjungma@eit.uni-kl.de    // return without any action.
27612027Sjungma@eit.uni-kl.de
27712027Sjungma@eit.uni-kl.de    if ( (severity_ == SC_INFO) && (verbosity_ > verbosity_level) ) return;
27812027Sjungma@eit.uni-kl.de
27912027Sjungma@eit.uni-kl.de    // Process the report:
28012027Sjungma@eit.uni-kl.de
28112027Sjungma@eit.uni-kl.de    if ( !md )
28212027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
28312027Sjungma@eit.uni-kl.de
28412027Sjungma@eit.uni-kl.de    sc_actions actions = execute(md, severity_);
28512027Sjungma@eit.uni-kl.de    sc_report rep(severity_, md, msg_, file_, line_, verbosity_);
28612027Sjungma@eit.uni-kl.de
28712027Sjungma@eit.uni-kl.de    if ( actions & SC_CACHE_REPORT )
28812027Sjungma@eit.uni-kl.de	cache_report(rep);
28912027Sjungma@eit.uni-kl.de
29012027Sjungma@eit.uni-kl.de    handler(rep, actions);
29112027Sjungma@eit.uni-kl.de}
29212027Sjungma@eit.uni-kl.de
29312027Sjungma@eit.uni-kl.devoid sc_report_handler::report(sc_severity severity_,
29412027Sjungma@eit.uni-kl.de			       const char * msg_type_,
29512027Sjungma@eit.uni-kl.de			       const char * msg_,
29612027Sjungma@eit.uni-kl.de			       const char * file_,
29712027Sjungma@eit.uni-kl.de			       int line_)
29812027Sjungma@eit.uni-kl.de{
29912027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de    // If the severity of the report is SC_INFO and the maximum verbosity
30212027Sjungma@eit.uni-kl.de    // level is less than SC_MEDIUM return without any action.
30312027Sjungma@eit.uni-kl.de
30412027Sjungma@eit.uni-kl.de    if ( (severity_ == SC_INFO) && (SC_MEDIUM > verbosity_level) ) return;
30512027Sjungma@eit.uni-kl.de
30612027Sjungma@eit.uni-kl.de    // Process the report:
30712027Sjungma@eit.uni-kl.de
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.de    if ( !md )
31012027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
31112027Sjungma@eit.uni-kl.de
31212027Sjungma@eit.uni-kl.de    sc_actions actions = execute(md, severity_);
31312027Sjungma@eit.uni-kl.de    sc_report rep(severity_, md, msg_, file_, line_);
31412027Sjungma@eit.uni-kl.de
31512027Sjungma@eit.uni-kl.de    if ( actions & SC_CACHE_REPORT )
31612027Sjungma@eit.uni-kl.de	cache_report(rep);
31712027Sjungma@eit.uni-kl.de
31812027Sjungma@eit.uni-kl.de    handler(rep, actions);
31912027Sjungma@eit.uni-kl.de}
32012027Sjungma@eit.uni-kl.de
32112027Sjungma@eit.uni-kl.de// The following method is never called by the simulator.
32212027Sjungma@eit.uni-kl.de
32312027Sjungma@eit.uni-kl.devoid sc_report_handler::initialize()
32412027Sjungma@eit.uni-kl.de{
32512027Sjungma@eit.uni-kl.de#if 0 // actually, i do not know whether we have to reset these.
32612027Sjungma@eit.uni-kl.de    suppress();
32712027Sjungma@eit.uni-kl.de    force();
32812027Sjungma@eit.uni-kl.de    set_actions(SC_INFO,    SC_DEFAULT_INFO_ACTIONS);
32912027Sjungma@eit.uni-kl.de    set_actions(SC_WARNING, SC_DEFAULT_WARNING_ACTIONS);
33012027Sjungma@eit.uni-kl.de    set_actions(SC_ERROR,   SC_DEFAULT_ERROR_ACTIONS);
33112027Sjungma@eit.uni-kl.de    set_actions(SC_FATAL,   SC_DEFAULT_FATAL_ACTIONS);
33212027Sjungma@eit.uni-kl.de#endif
33312027Sjungma@eit.uni-kl.de
33412027Sjungma@eit.uni-kl.de    sev_call_count[SC_INFO]    = 0;
33512027Sjungma@eit.uni-kl.de    sev_call_count[SC_WARNING] = 0;
33612027Sjungma@eit.uni-kl.de    sev_call_count[SC_ERROR]   = 0;
33712027Sjungma@eit.uni-kl.de    sev_call_count[SC_FATAL]   = 0;
33812027Sjungma@eit.uni-kl.de
33912027Sjungma@eit.uni-kl.de    msg_def_items * items = messages;
34012027Sjungma@eit.uni-kl.de
34112027Sjungma@eit.uni-kl.de    while ( items != &msg_terminator )
34212027Sjungma@eit.uni-kl.de    {
34312027Sjungma@eit.uni-kl.de	for ( int i = 0; i < items->count; ++i )
34412027Sjungma@eit.uni-kl.de	{
34512027Sjungma@eit.uni-kl.de	    items->md[i].call_count = 0;
34612027Sjungma@eit.uni-kl.de	    items->md[i].sev_call_count[SC_INFO]    = 0;
34712027Sjungma@eit.uni-kl.de	    items->md[i].sev_call_count[SC_WARNING] = 0;
34812027Sjungma@eit.uni-kl.de	    items->md[i].sev_call_count[SC_ERROR]   = 0;
34912027Sjungma@eit.uni-kl.de	    items->md[i].sev_call_count[SC_FATAL]   = 0;
35012027Sjungma@eit.uni-kl.de	}
35112027Sjungma@eit.uni-kl.de	items = items->next;
35212027Sjungma@eit.uni-kl.de    }
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de    // PROCESS ANY ENVIRONMENTAL OVERRIDES:
35512027Sjungma@eit.uni-kl.de
35612027Sjungma@eit.uni-kl.de    const char* deprecation_warn = std::getenv("SC_DEPRECATION_WARNINGS");
35712027Sjungma@eit.uni-kl.de    if ( (deprecation_warn!=0) && !strcmp(deprecation_warn,"DISABLE") )
35812027Sjungma@eit.uni-kl.de    {
35912027Sjungma@eit.uni-kl.de        set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING);
36012027Sjungma@eit.uni-kl.de    }
36112027Sjungma@eit.uni-kl.de}
36212027Sjungma@eit.uni-kl.de
36312027Sjungma@eit.uni-kl.de// free the sc_msg_def's allocated by add_msg_type
36412027Sjungma@eit.uni-kl.de// (or implicit msg_type registration: set_actions, abort_after)
36512027Sjungma@eit.uni-kl.de// clear last_global_report.
36612027Sjungma@eit.uni-kl.devoid sc_report_handler::release()
36712027Sjungma@eit.uni-kl.de{
36812027Sjungma@eit.uni-kl.de    delete last_global_report;
36912027Sjungma@eit.uni-kl.de    last_global_report = 0;
37012027Sjungma@eit.uni-kl.de    sc_report_close_default_log();
37112027Sjungma@eit.uni-kl.de
37212027Sjungma@eit.uni-kl.de    msg_def_items * items = messages, * newitems = &msg_terminator;
37312027Sjungma@eit.uni-kl.de    messages = &msg_terminator;
37412027Sjungma@eit.uni-kl.de
37512027Sjungma@eit.uni-kl.de    while ( items != &msg_terminator )
37612027Sjungma@eit.uni-kl.de    {
37712027Sjungma@eit.uni-kl.de	for ( int i = 0; i < items->count; ++i )
37812027Sjungma@eit.uni-kl.de	    if ( items->md[i].msg_type == items->md[i].msg_type_data )
37912027Sjungma@eit.uni-kl.de		free(items->md[i].msg_type_data);
38012027Sjungma@eit.uni-kl.de
38112027Sjungma@eit.uni-kl.de	msg_def_items * prev = items;
38212027Sjungma@eit.uni-kl.de	items = items->next;
38312027Sjungma@eit.uni-kl.de
38412027Sjungma@eit.uni-kl.de	if ( prev->allocated )
38512027Sjungma@eit.uni-kl.de	{
38612027Sjungma@eit.uni-kl.de	    delete [] prev->md;
38712027Sjungma@eit.uni-kl.de	    delete prev;
38812027Sjungma@eit.uni-kl.de	}
38912027Sjungma@eit.uni-kl.de	else
39012027Sjungma@eit.uni-kl.de	{
39112027Sjungma@eit.uni-kl.de	    prev->next = newitems;
39212027Sjungma@eit.uni-kl.de	    newitems = prev;
39312027Sjungma@eit.uni-kl.de	}
39412027Sjungma@eit.uni-kl.de    }
39512027Sjungma@eit.uni-kl.de    messages = newitems;
39612027Sjungma@eit.uni-kl.de}
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.desc_msg_def * sc_report_handler::add_msg_type(const char * msg_type_)
39912027Sjungma@eit.uni-kl.de{
40012027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
40112027Sjungma@eit.uni-kl.de    int          msg_type_len;
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.de    if ( md )
40412027Sjungma@eit.uni-kl.de	return md;
40512027Sjungma@eit.uni-kl.de
40612027Sjungma@eit.uni-kl.de    msg_def_items * items = new msg_def_items;
40712027Sjungma@eit.uni-kl.de
40812027Sjungma@eit.uni-kl.de    if ( !items )
40912027Sjungma@eit.uni-kl.de	return 0;
41012027Sjungma@eit.uni-kl.de
41112027Sjungma@eit.uni-kl.de    items->count = 1;
41212027Sjungma@eit.uni-kl.de    items->md = new sc_msg_def[items->count];
41312027Sjungma@eit.uni-kl.de
41412027Sjungma@eit.uni-kl.de    if ( !items->md )
41512027Sjungma@eit.uni-kl.de    {
41612027Sjungma@eit.uni-kl.de	delete items;
41712027Sjungma@eit.uni-kl.de	return 0;
41812027Sjungma@eit.uni-kl.de    }
41912027Sjungma@eit.uni-kl.de    memset(items->md, 0, sizeof(sc_msg_def) * items->count);
42012027Sjungma@eit.uni-kl.de    msg_type_len = strlen(msg_type_);
42112027Sjungma@eit.uni-kl.de    if ( msg_type_len > 0 )
42212027Sjungma@eit.uni-kl.de    {
42312027Sjungma@eit.uni-kl.de	items->md->msg_type_data = (char*) malloc(msg_type_len+1);
42412027Sjungma@eit.uni-kl.de	strcpy( items->md->msg_type_data, msg_type_ );
42512027Sjungma@eit.uni-kl.de	items->md->id = -1; // backward compatibility with 2.0+
42612027Sjungma@eit.uni-kl.de    }
42712027Sjungma@eit.uni-kl.de    else
42812027Sjungma@eit.uni-kl.de    {
42912027Sjungma@eit.uni-kl.de	delete items->md;
43012027Sjungma@eit.uni-kl.de	delete items;
43112027Sjungma@eit.uni-kl.de	return 0;
43212027Sjungma@eit.uni-kl.de    }
43312027Sjungma@eit.uni-kl.de    items->md->msg_type = items->md->msg_type_data;
43412027Sjungma@eit.uni-kl.de    add_static_msg_types(items);
43512027Sjungma@eit.uni-kl.de    items->allocated = true;
43612027Sjungma@eit.uni-kl.de
43712027Sjungma@eit.uni-kl.de    return items->md;
43812027Sjungma@eit.uni-kl.de}
43912027Sjungma@eit.uni-kl.de
44012027Sjungma@eit.uni-kl.devoid sc_report_handler::add_static_msg_types(msg_def_items * items)
44112027Sjungma@eit.uni-kl.de{
44212027Sjungma@eit.uni-kl.de    items->allocated = false;
44312027Sjungma@eit.uni-kl.de    items->next = messages;
44412027Sjungma@eit.uni-kl.de    messages = items;
44512027Sjungma@eit.uni-kl.de}
44612027Sjungma@eit.uni-kl.de
44712027Sjungma@eit.uni-kl.desc_actions sc_report_handler::set_actions(sc_severity severity_,
44812027Sjungma@eit.uni-kl.de					  sc_actions actions_)
44912027Sjungma@eit.uni-kl.de{
45012027Sjungma@eit.uni-kl.de    sc_actions old = sev_actions[severity_];
45112027Sjungma@eit.uni-kl.de    sev_actions[severity_] = actions_;
45212027Sjungma@eit.uni-kl.de    return old;
45312027Sjungma@eit.uni-kl.de}
45412027Sjungma@eit.uni-kl.de
45512027Sjungma@eit.uni-kl.desc_actions sc_report_handler::set_actions(const char * msg_type_,
45612027Sjungma@eit.uni-kl.de					  sc_actions actions_)
45712027Sjungma@eit.uni-kl.de{
45812027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
45912027Sjungma@eit.uni-kl.de
46012027Sjungma@eit.uni-kl.de    if ( !md )
46112027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
46212027Sjungma@eit.uni-kl.de
46312027Sjungma@eit.uni-kl.de    sc_actions old = md->actions;
46412027Sjungma@eit.uni-kl.de    md->actions = actions_;
46512027Sjungma@eit.uni-kl.de
46612027Sjungma@eit.uni-kl.de    return old;
46712027Sjungma@eit.uni-kl.de}
46812027Sjungma@eit.uni-kl.de
46912027Sjungma@eit.uni-kl.desc_actions sc_report_handler::set_actions(const char * msg_type_,
47012027Sjungma@eit.uni-kl.de					  sc_severity severity_,
47112027Sjungma@eit.uni-kl.de					  sc_actions actions_)
47212027Sjungma@eit.uni-kl.de{
47312027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
47412027Sjungma@eit.uni-kl.de
47512027Sjungma@eit.uni-kl.de    if ( !md )
47612027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.de    sc_actions old = md->sev_actions[severity_];
47912027Sjungma@eit.uni-kl.de    md->sev_actions[severity_] = actions_;
48012027Sjungma@eit.uni-kl.de
48112027Sjungma@eit.uni-kl.de    return old;
48212027Sjungma@eit.uni-kl.de}
48312027Sjungma@eit.uni-kl.de
48412027Sjungma@eit.uni-kl.deint sc_report_handler::stop_after(sc_severity severity_, int limit)
48512027Sjungma@eit.uni-kl.de{
48612027Sjungma@eit.uni-kl.de    int old = sev_limit[severity_];
48712027Sjungma@eit.uni-kl.de
48812027Sjungma@eit.uni-kl.de    sev_limit[severity_] = limit < 0 ? UINT_MAX: (unsigned) limit;
48912027Sjungma@eit.uni-kl.de
49012027Sjungma@eit.uni-kl.de    return old;
49112027Sjungma@eit.uni-kl.de}
49212027Sjungma@eit.uni-kl.de
49312027Sjungma@eit.uni-kl.deint sc_report_handler::stop_after(const char * msg_type_, int limit)
49412027Sjungma@eit.uni-kl.de{
49512027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
49612027Sjungma@eit.uni-kl.de
49712027Sjungma@eit.uni-kl.de    if ( !md )
49812027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
49912027Sjungma@eit.uni-kl.de
50012027Sjungma@eit.uni-kl.de    int old = md->limit_mask & 1 ? md->limit: UINT_MAX;
50112027Sjungma@eit.uni-kl.de
50212027Sjungma@eit.uni-kl.de    if ( limit < 0 )
50312027Sjungma@eit.uni-kl.de	md->limit_mask &= ~1;
50412027Sjungma@eit.uni-kl.de    else
50512027Sjungma@eit.uni-kl.de    {
50612027Sjungma@eit.uni-kl.de	md->limit_mask |= 1;
50712027Sjungma@eit.uni-kl.de	md->limit = limit;
50812027Sjungma@eit.uni-kl.de    }
50912027Sjungma@eit.uni-kl.de    return old;
51012027Sjungma@eit.uni-kl.de}
51112027Sjungma@eit.uni-kl.de
51212027Sjungma@eit.uni-kl.deint sc_report_handler::stop_after(const char * msg_type_,
51312027Sjungma@eit.uni-kl.de				  sc_severity severity_,
51412027Sjungma@eit.uni-kl.de				  int limit)
51512027Sjungma@eit.uni-kl.de{
51612027Sjungma@eit.uni-kl.de    sc_msg_def * md = mdlookup(msg_type_);
51712027Sjungma@eit.uni-kl.de
51812027Sjungma@eit.uni-kl.de    if ( !md )
51912027Sjungma@eit.uni-kl.de	md = add_msg_type(msg_type_);
52012027Sjungma@eit.uni-kl.de
52112027Sjungma@eit.uni-kl.de    int mask = 1 << (severity_ + 1);
52212027Sjungma@eit.uni-kl.de    int old = md->limit_mask & mask ?  md->sev_limit[severity_]: UINT_MAX;
52312027Sjungma@eit.uni-kl.de
52412027Sjungma@eit.uni-kl.de    if ( limit < 0 )
52512027Sjungma@eit.uni-kl.de	md->limit_mask &= ~mask;
52612027Sjungma@eit.uni-kl.de    else
52712027Sjungma@eit.uni-kl.de    {
52812027Sjungma@eit.uni-kl.de	md->limit_mask |= mask;
52912027Sjungma@eit.uni-kl.de	md->sev_limit[severity_] = limit;
53012027Sjungma@eit.uni-kl.de    }
53112027Sjungma@eit.uni-kl.de    return old;
53212027Sjungma@eit.uni-kl.de}
53312027Sjungma@eit.uni-kl.de
53412027Sjungma@eit.uni-kl.desc_actions sc_report_handler::suppress(sc_actions mask)
53512027Sjungma@eit.uni-kl.de{
53612027Sjungma@eit.uni-kl.de    sc_actions old = suppress_mask;
53712027Sjungma@eit.uni-kl.de    suppress_mask = mask;
53812027Sjungma@eit.uni-kl.de    return old;
53912027Sjungma@eit.uni-kl.de}
54012027Sjungma@eit.uni-kl.de
54112027Sjungma@eit.uni-kl.desc_actions sc_report_handler::suppress()
54212027Sjungma@eit.uni-kl.de{
54312027Sjungma@eit.uni-kl.de    return suppress(0);
54412027Sjungma@eit.uni-kl.de}
54512027Sjungma@eit.uni-kl.de
54612027Sjungma@eit.uni-kl.desc_actions sc_report_handler::force(sc_actions mask)
54712027Sjungma@eit.uni-kl.de{
54812027Sjungma@eit.uni-kl.de    sc_actions old = force_mask;
54912027Sjungma@eit.uni-kl.de    force_mask = mask;
55012027Sjungma@eit.uni-kl.de    return old;
55112027Sjungma@eit.uni-kl.de}
55212027Sjungma@eit.uni-kl.de
55312027Sjungma@eit.uni-kl.desc_actions sc_report_handler::force()
55412027Sjungma@eit.uni-kl.de{
55512027Sjungma@eit.uni-kl.de    return force(0);
55612027Sjungma@eit.uni-kl.de}
55712027Sjungma@eit.uni-kl.de
55812027Sjungma@eit.uni-kl.desc_report_handler_proc
55912027Sjungma@eit.uni-kl.desc_report_handler::set_handler(sc_report_handler_proc handler_)
56012027Sjungma@eit.uni-kl.de{
56112027Sjungma@eit.uni-kl.de    sc_report_handler_proc old = handler;
56212027Sjungma@eit.uni-kl.de    handler = handler_ ? handler_: &sc_report_handler::default_handler;
56312027Sjungma@eit.uni-kl.de    return old;
56412027Sjungma@eit.uni-kl.de}
56512027Sjungma@eit.uni-kl.de
56612027Sjungma@eit.uni-kl.desc_report_handler_proc
56712027Sjungma@eit.uni-kl.desc_report_handler::get_handler()
56812027Sjungma@eit.uni-kl.de{
56912027Sjungma@eit.uni-kl.de    return handler;
57012027Sjungma@eit.uni-kl.de}
57112027Sjungma@eit.uni-kl.de
57212027Sjungma@eit.uni-kl.desc_report* sc_report_handler::get_cached_report()
57312027Sjungma@eit.uni-kl.de{
57412027Sjungma@eit.uni-kl.de    sc_process_b * proc = sc_get_current_process_b();
57512027Sjungma@eit.uni-kl.de
57612027Sjungma@eit.uni-kl.de    if ( proc )
57712027Sjungma@eit.uni-kl.de	return proc->get_last_report();
57812027Sjungma@eit.uni-kl.de
57912027Sjungma@eit.uni-kl.de    return last_global_report;
58012027Sjungma@eit.uni-kl.de}
58112027Sjungma@eit.uni-kl.de
58212027Sjungma@eit.uni-kl.devoid sc_report_handler::clear_cached_report()
58312027Sjungma@eit.uni-kl.de{
58412027Sjungma@eit.uni-kl.de    sc_process_b * proc = sc_get_current_process_b();
58512027Sjungma@eit.uni-kl.de
58612027Sjungma@eit.uni-kl.de    if ( proc )
58712027Sjungma@eit.uni-kl.de	proc->set_last_report(0);
58812027Sjungma@eit.uni-kl.de    else
58912027Sjungma@eit.uni-kl.de    {
59012027Sjungma@eit.uni-kl.de	delete last_global_report;
59112027Sjungma@eit.uni-kl.de	last_global_report = 0;
59212027Sjungma@eit.uni-kl.de    }
59312027Sjungma@eit.uni-kl.de}
59412027Sjungma@eit.uni-kl.de
59512027Sjungma@eit.uni-kl.desc_actions sc_report_handler::get_new_action_id()
59612027Sjungma@eit.uni-kl.de{
59712027Sjungma@eit.uni-kl.de    for ( sc_actions p = 1; p; p <<= 1 )
59812027Sjungma@eit.uni-kl.de    {
59912027Sjungma@eit.uni-kl.de	if ( !(p & available_actions) ) // free
60012027Sjungma@eit.uni-kl.de	{
60112027Sjungma@eit.uni-kl.de	    available_actions |= p;
60212027Sjungma@eit.uni-kl.de	    return p;
60312027Sjungma@eit.uni-kl.de	}
60412027Sjungma@eit.uni-kl.de    }
60512027Sjungma@eit.uni-kl.de    return SC_UNSPECIFIED;
60612027Sjungma@eit.uni-kl.de}
60712027Sjungma@eit.uni-kl.de
60812027Sjungma@eit.uni-kl.debool sc_report_handler::set_log_file_name(const char* name_)
60912027Sjungma@eit.uni-kl.de{
61012027Sjungma@eit.uni-kl.de    if ( !name_ )
61112027Sjungma@eit.uni-kl.de    {
61212027Sjungma@eit.uni-kl.de	free(log_file_name);
61312027Sjungma@eit.uni-kl.de	log_file_name = 0;
61412027Sjungma@eit.uni-kl.de	return false;
61512027Sjungma@eit.uni-kl.de    }
61612027Sjungma@eit.uni-kl.de    if ( log_file_name )
61712027Sjungma@eit.uni-kl.de	return false;
61812027Sjungma@eit.uni-kl.de
61912027Sjungma@eit.uni-kl.de    log_file_name = (char*)malloc(strlen(name_)+1);
62012027Sjungma@eit.uni-kl.de    strcpy(log_file_name, name_);
62112027Sjungma@eit.uni-kl.de    return true;
62212027Sjungma@eit.uni-kl.de}
62312027Sjungma@eit.uni-kl.de
62412027Sjungma@eit.uni-kl.deconst char * sc_report_handler::get_log_file_name()
62512027Sjungma@eit.uni-kl.de{
62612027Sjungma@eit.uni-kl.de    return log_file_name;
62712027Sjungma@eit.uni-kl.de}
62812027Sjungma@eit.uni-kl.de
62912027Sjungma@eit.uni-kl.devoid sc_report_handler::cache_report(const sc_report& rep)
63012027Sjungma@eit.uni-kl.de{
63112027Sjungma@eit.uni-kl.de    sc_process_b * proc = sc_get_current_process_b();
63212027Sjungma@eit.uni-kl.de    if ( proc )
63312027Sjungma@eit.uni-kl.de	proc->set_last_report(new sc_report(rep));
63412027Sjungma@eit.uni-kl.de    else
63512027Sjungma@eit.uni-kl.de    {
63612027Sjungma@eit.uni-kl.de	delete last_global_report;
63712027Sjungma@eit.uni-kl.de	last_global_report = new sc_report(rep);
63812027Sjungma@eit.uni-kl.de    }
63912027Sjungma@eit.uni-kl.de}
64012027Sjungma@eit.uni-kl.de
64112027Sjungma@eit.uni-kl.de//
64212027Sjungma@eit.uni-kl.de// backward compatibility with 2.0+
64312027Sjungma@eit.uni-kl.de//
64412027Sjungma@eit.uni-kl.de
64512027Sjungma@eit.uni-kl.desc_msg_def * sc_report_handler::mdlookup(int id)
64612027Sjungma@eit.uni-kl.de{
64712027Sjungma@eit.uni-kl.de    for ( msg_def_items * item = messages; item; item = item->next )
64812027Sjungma@eit.uni-kl.de    {
64912027Sjungma@eit.uni-kl.de	for ( int i = 0; i < item->count; ++i )
65012027Sjungma@eit.uni-kl.de	    if ( id == item->md[i].id )
65112027Sjungma@eit.uni-kl.de		return item->md + i;
65212027Sjungma@eit.uni-kl.de    }
65312027Sjungma@eit.uni-kl.de    return 0;
65412027Sjungma@eit.uni-kl.de}
65512027Sjungma@eit.uni-kl.de
65612027Sjungma@eit.uni-kl.deint sc_report_handler::get_verbosity_level() { return verbosity_level; }
65712027Sjungma@eit.uni-kl.de
65812027Sjungma@eit.uni-kl.deint sc_report_handler::set_verbosity_level( int level )
65912027Sjungma@eit.uni-kl.de{
66012027Sjungma@eit.uni-kl.de    int result = verbosity_level;
66112027Sjungma@eit.uni-kl.de    verbosity_level = level;
66212027Sjungma@eit.uni-kl.de    return result;
66312027Sjungma@eit.uni-kl.de}
66412027Sjungma@eit.uni-kl.de
66512027Sjungma@eit.uni-kl.de//
66612027Sjungma@eit.uni-kl.de// CLASS: sc_report_handler
66712027Sjungma@eit.uni-kl.de// static variables
66812027Sjungma@eit.uni-kl.de//
66912027Sjungma@eit.uni-kl.de
67012027Sjungma@eit.uni-kl.desc_actions sc_report_handler::suppress_mask = 0;
67112027Sjungma@eit.uni-kl.desc_actions sc_report_handler::force_mask = 0;
67212027Sjungma@eit.uni-kl.de
67312027Sjungma@eit.uni-kl.desc_actions sc_report_handler::sev_actions[SC_MAX_SEVERITY] =
67412027Sjungma@eit.uni-kl.de{
67512027Sjungma@eit.uni-kl.de    /* info  */ SC_DEFAULT_INFO_ACTIONS,
67612027Sjungma@eit.uni-kl.de    /* warn  */ SC_DEFAULT_WARNING_ACTIONS,
67712027Sjungma@eit.uni-kl.de    /* error */ SC_DEFAULT_ERROR_ACTIONS,
67812027Sjungma@eit.uni-kl.de    /* fatal */ SC_DEFAULT_FATAL_ACTIONS
67912027Sjungma@eit.uni-kl.de};
68012027Sjungma@eit.uni-kl.de
68112027Sjungma@eit.uni-kl.de// Note that SC_FATAL has a limit of 1 by default
68212027Sjungma@eit.uni-kl.de
68312027Sjungma@eit.uni-kl.desc_actions sc_report_handler::sev_limit[SC_MAX_SEVERITY] =
68412027Sjungma@eit.uni-kl.de{
68512027Sjungma@eit.uni-kl.de    UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX
68612027Sjungma@eit.uni-kl.de};
68712027Sjungma@eit.uni-kl.desc_actions sc_report_handler::sev_call_count[SC_MAX_SEVERITY] = { 0, 0, 0, 0 };
68812027Sjungma@eit.uni-kl.de
68912027Sjungma@eit.uni-kl.desc_report* sc_report_handler::last_global_report = NULL;
69012027Sjungma@eit.uni-kl.desc_actions sc_report_handler::available_actions =
69112027Sjungma@eit.uni-kl.de    SC_DO_NOTHING |
69212027Sjungma@eit.uni-kl.de    SC_THROW |
69312027Sjungma@eit.uni-kl.de    SC_LOG |
69412027Sjungma@eit.uni-kl.de    SC_DISPLAY |
69512027Sjungma@eit.uni-kl.de    SC_CACHE_REPORT |
69612027Sjungma@eit.uni-kl.de    SC_INTERRUPT |
69712027Sjungma@eit.uni-kl.de    SC_STOP |
69812027Sjungma@eit.uni-kl.de    SC_ABORT;
69912027Sjungma@eit.uni-kl.de
70012027Sjungma@eit.uni-kl.desc_report_handler_proc sc_report_handler::handler =
70112027Sjungma@eit.uni-kl.de    &sc_report_handler::default_handler;
70212027Sjungma@eit.uni-kl.de
70312027Sjungma@eit.uni-kl.dechar * sc_report_handler::log_file_name = 0;
70412027Sjungma@eit.uni-kl.de
70512027Sjungma@eit.uni-kl.desc_report_handler::msg_def_items * sc_report_handler::messages =
70612027Sjungma@eit.uni-kl.de    &sc_report_handler::msg_terminator;
70712027Sjungma@eit.uni-kl.de
70812027Sjungma@eit.uni-kl.de
70912027Sjungma@eit.uni-kl.de//
71012027Sjungma@eit.uni-kl.de// predefined messages
71112027Sjungma@eit.uni-kl.de//
71212027Sjungma@eit.uni-kl.de
71312027Sjungma@eit.uni-kl.deconst char SC_ID_REGISTER_ID_FAILED_[] = "register_id failed";
71412027Sjungma@eit.uni-kl.deconst char SC_ID_UNKNOWN_ERROR_[]      = "unknown error";
71512027Sjungma@eit.uni-kl.deconst char SC_ID_WITHOUT_MESSAGE_[]    = "";
71612027Sjungma@eit.uni-kl.deconst char SC_ID_NOT_IMPLEMENTED_[]    = "not implemented";
71712027Sjungma@eit.uni-kl.deconst char SC_ID_INTERNAL_ERROR_[]     = "internal error";
71812027Sjungma@eit.uni-kl.deconst char SC_ID_ASSERTION_FAILED_[]   = "assertion failed";
71912027Sjungma@eit.uni-kl.deconst char SC_ID_OUT_OF_BOUNDS_[]      = "out of bounds";
72012027Sjungma@eit.uni-kl.de
72112027Sjungma@eit.uni-kl.de#define DEFINE_MSG(id,n)                                                     \
72212027Sjungma@eit.uni-kl.de    {                                                                        \
72312027Sjungma@eit.uni-kl.de	(id),                                                                \
72412027Sjungma@eit.uni-kl.de	0u, {0u}, /* actions */                                              \
72512027Sjungma@eit.uni-kl.de	0u, {0u}, 0u, /* limits */                                           \
72612027Sjungma@eit.uni-kl.de	0u, {0u}, NULL, /* call counters */                                  \
72712027Sjungma@eit.uni-kl.de	n                                                                    \
72812027Sjungma@eit.uni-kl.de    }
72912027Sjungma@eit.uni-kl.de
73012027Sjungma@eit.uni-kl.destatic sc_msg_def default_msgs[] = {
73112027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_REGISTER_ID_FAILED_, 800),
73212027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_UNKNOWN_ERROR_, 0),
73312027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_WITHOUT_MESSAGE_, 1),
73412027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_NOT_IMPLEMENTED_, 2),
73512027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_INTERNAL_ERROR_, 3),
73612027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_ASSERTION_FAILED_, 4),
73712027Sjungma@eit.uni-kl.de    DEFINE_MSG(SC_ID_OUT_OF_BOUNDS_, 5)
73812027Sjungma@eit.uni-kl.de};
73912027Sjungma@eit.uni-kl.de
74012027Sjungma@eit.uni-kl.desc_report_handler::msg_def_items sc_report_handler::msg_terminator =
74112027Sjungma@eit.uni-kl.de{
74212027Sjungma@eit.uni-kl.de    default_msgs,
74312027Sjungma@eit.uni-kl.de    sizeof(default_msgs)/sizeof(*default_msgs),
74412027Sjungma@eit.uni-kl.de    false,
74512027Sjungma@eit.uni-kl.de    NULL
74612027Sjungma@eit.uni-kl.de};
74712027Sjungma@eit.uni-kl.de
74812027Sjungma@eit.uni-kl.de} // namespace sc_core
74912027Sjungma@eit.uni-kl.de
75012027Sjungma@eit.uni-kl.de// $Log: sc_report_handler.cpp,v $
75112027Sjungma@eit.uni-kl.de// Revision 1.9  2011/08/29 18:04:32  acg
75212027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: miscellaneous clean ups.
75312027Sjungma@eit.uni-kl.de//
75412027Sjungma@eit.uni-kl.de// Revision 1.8  2011/08/26 20:46:19  acg
75512027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the modification log to the end of the file to
75612027Sjungma@eit.uni-kl.de//  eliminate source line number skew when check-ins are done.
75712027Sjungma@eit.uni-kl.de//
75812027Sjungma@eit.uni-kl.de// Revision 1.7  2011/08/07 19:08:08  acg
75912027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved logs to end of file so line number synching works
76012027Sjungma@eit.uni-kl.de//  better between versions.
76112027Sjungma@eit.uni-kl.de//
76212027Sjungma@eit.uni-kl.de// Revision 1.6  2011/08/07 18:56:03  acg
76312027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: added cast to ? : to eliminate clang warning message.
76412027Sjungma@eit.uni-kl.de//
76512027Sjungma@eit.uni-kl.de// Revision 1.5  2011/03/23 16:16:49  acg
76612027Sjungma@eit.uni-kl.de//  Andy Goodrich: finish message verbosity support.
76712027Sjungma@eit.uni-kl.de//
76812027Sjungma@eit.uni-kl.de// Revision 1.4  2011/02/18 20:38:44  acg
76912027Sjungma@eit.uni-kl.de//  Andy Goodrich: Updated Copyright notice.
77012027Sjungma@eit.uni-kl.de//
77112027Sjungma@eit.uni-kl.de// Revision 1.3  2011/02/11 13:25:55  acg
77212027Sjungma@eit.uni-kl.de//  Andy Goodrich: Philipp's changes for sc_unwind_exception.
77312027Sjungma@eit.uni-kl.de//
77412027Sjungma@eit.uni-kl.de// Revision 1.2  2011/02/01 23:02:05  acg
77512027Sjungma@eit.uni-kl.de//  Andy Goodrich: IEEE 1666 2011 changes.
77612027Sjungma@eit.uni-kl.de//
77712027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:06  acg
77812027Sjungma@eit.uni-kl.de// SystemC 2.3
77912027Sjungma@eit.uni-kl.de//
78012027Sjungma@eit.uni-kl.de// Revision 1.7  2006/05/26 20:35:52  acg
78112027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed debug message that should not have been left in.
78212027Sjungma@eit.uni-kl.de//
78312027Sjungma@eit.uni-kl.de// Revision 1.6  2006/03/21 00:00:37  acg
78412027Sjungma@eit.uni-kl.de//   Andy Goodrich: changed name of sc_get_current_process_base() to be
78512027Sjungma@eit.uni-kl.de//   sc_get_current_process_b() since its returning an sc_process_b instance.
78612027Sjungma@eit.uni-kl.de//
78712027Sjungma@eit.uni-kl.de// Revision 1.5  2006/01/31 21:42:07  acg
78812027Sjungma@eit.uni-kl.de//  Andy Goodrich: Added checks for SC_DEPRECATED_WARNINGS being defined as
78912027Sjungma@eit.uni-kl.de//  DISABLED. If so, we turn off the /IEEE_Std_1666/deprecated message group.
79012027Sjungma@eit.uni-kl.de//
79112027Sjungma@eit.uni-kl.de// Revision 1.4  2006/01/26 21:08:17  acg
79212027Sjungma@eit.uni-kl.de//  Andy Goodrich: conversion to use sc_is_running instead of deprecated
79312027Sjungma@eit.uni-kl.de//  sc_simcontext::is_running()
79412027Sjungma@eit.uni-kl.de//
79512027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:11  acg
79612027Sjungma@eit.uni-kl.de// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
79712027Sjungma@eit.uni-kl.de// the source.
79812027Sjungma@eit.uni-kl.de
79912027Sjungma@eit.uni-kl.de// Taf!
800