ibis_parser: fixes to build on MSVC

Use stringstream instead of C arrays for formatting std::string
std::isnan(int) is invalid

Also fix a few report severities that seemed inconsistent
This commit is contained in:
Jon Evans 2022-06-11 18:09:17 -04:00
parent 9b70308f5c
commit e5ece4e460
1 changed files with 35 additions and 64 deletions

View File

@ -30,6 +30,7 @@
#include "ibis_parser.h"
#include <sstream>
#include <iterator>
#include <locale_io.h> // KiCad header
@ -168,10 +169,9 @@ bool IbisComponentPin::Check()
if( !m_dummy )
{
int size = std::snprintf( nullptr, 0, _( "Checking pin %s" ), m_pinName.c_str() ) + 1;
char cstr[size];
std::snprintf( cstr, size, _( "Checking pin %s" ), m_pinName.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Checking pin " ) << m_pinName;
Report( message.str(), RPT_SEVERITY_ACTION );
if( m_pinName.empty() )
{
@ -218,10 +218,9 @@ bool IbisComponent::Check()
status = false;
}
int size = std::snprintf( nullptr, 0, _( "Checking component %s" ), m_name.c_str() ) + 1;
char cstr[size];
std::snprintf( cstr, size, _( "Checking component %s" ), m_name.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Checking component " ) << m_name;
Report( message.str(), RPT_SEVERITY_ACTION );
if( m_manufacturer.empty() )
{
@ -309,7 +308,6 @@ std::string IVtable::Spice( int aN, std::string aPort1, std::string aPort2, std:
double IVtable::InterpolatedI( double aV, IBIS_CORNER aCorner )
{
double result;
// @TODO change this algorithm
if( m_entries.back().V > m_entries.at( 0 ).V )
@ -431,10 +429,9 @@ bool IbisModel::Check()
status = false;
}
int size = std::snprintf( nullptr, 0, _( "Checking model %s" ), m_name.c_str() ) + 1;
char cstr[size];
std::snprintf( cstr, size, _( "Checking model %s" ), m_name.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Checking model " ) << m_name;
Report( message.str(), RPT_SEVERITY_ACTION );
if(m_type == IBIS_MODEL_TYPE::UNDEFINED)
{
@ -593,10 +590,9 @@ bool IbisPackageModel::Check()
status = false;
}
int size = std::snprintf( nullptr, 0, _( "Checking package model %s" ), m_name.c_str() ) + 1;
char cstr[size];
std::snprintf( cstr, size, _( "Checking package model %s" ), m_name.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Checking package model " ) << m_name;
Report( message.str(), RPT_SEVERITY_ACTION );
if( m_manufacturer.empty() )
{
@ -610,13 +606,7 @@ bool IbisPackageModel::Check()
status = false;
}
if( isnan( m_numberOfPins ) )
{
Report( _( "Number of pins is invalid." ), RPT_SEVERITY_ERROR );
status = false;
}
if( m_numberOfPins <= 0 )
if( m_numberOfPins < 0 )
{
Report( _( "Negative number of pins." ), RPT_SEVERITY_ERROR );
status = false;
@ -689,24 +679,21 @@ bool IbisPackageModel::Check()
bool IbisParser::ParseFile( std::string& aFileName )
{
std::string err_msg;
std::stringstream err_msg;
std::ifstream ibisFile;
ibisFile.open( aFileName );
if( !ibisFile.is_open() )
{
int size = std::snprintf( nullptr, 0, _( "Cannot open file %s" ), aFileName.c_str() ) + 1;
char cstr[size];
std::snprintf( cstr, size, _( "Cannot open file %s" ), aFileName.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ERROR );
err_msg << _( "Cannot open file " ) << aFileName;
Report( err_msg.str(), RPT_SEVERITY_ERROR );
return false;
}
int size1 = std::snprintf( nullptr, 0, _( "Reading file %s..." ), aFileName.c_str() ) + 1;
char cstr[size1];
std::snprintf( cstr, size1, _( "Reading file %s..." ), aFileName.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ERROR );
err_msg.clear();
err_msg << _( "Reading file " ) << aFileName << wxT( "..." );
Report( err_msg.str(), RPT_SEVERITY_ACTION );
std::ostringstream ss;
ss << ibisFile.rdbuf();
@ -737,10 +724,9 @@ bool IbisParser::ParseFile( std::string& aFileName )
if( status && !onNewLine() )
{
int size2 = std::snprintf( nullptr, 0, _( "Error on line %i..." ), m_lineCounter ) + 1;
char cstr2[size2];
std::snprintf( cstr2, size2, _( "Error on line %i..." ), m_lineCounter );
Report( std::string( cstr2 ), RPT_SEVERITY_ACTION );
err_msg.clear();
err_msg << _( "Error on line " ) << std::to_string( m_lineCounter );
Report( err_msg.str(), RPT_SEVERITY_ERROR );
status = false;
}
if( m_context == IBIS_PARSER_CONTEXT::END )
@ -961,7 +947,6 @@ bool IbisParser::readInt( int& aDest )
{
bool status = true;
std::string str;
double buffer;
if( readWord( str ) )
{
@ -1265,13 +1250,9 @@ bool IbisParser::changeContext( std::string& aKeyword )
default: context_string += "???"; break;
}
int size = std::snprintf( nullptr, 0, _( "Unknown keyword in %s context: %s" ),
context_string.c_str(), aKeyword.c_str() )
+ 1;
char cstr[size];
std::snprintf( cstr, size, _( "Unknown keyword in %s context: %s" ),
context_string.c_str(), aKeyword.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ERROR );
std::stringstream message;
message << _( "Unknown keyword in " ) << context_string << _( " context: " ) << aKeyword;
Report( message.str(), RPT_SEVERITY_ERROR );
}
}
else
@ -1881,13 +1862,9 @@ bool IbisParser::readModel()
m_currentModel->m_type = IBIS_MODEL_TYPE::SERIES_SWITCH;
else
{
int size = std::snprintf( nullptr, 0, _( "Unknown Model_type: %s" ),
subparam.c_str() )
+ 1;
char cstr[size];
std::snprintf( cstr, size, _( "Unknown Model_type: %s" ),
subparam.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Unknown Model_type " ) << subparam;
Report( message.str(), RPT_SEVERITY_ERROR );
status = false;
}
}
@ -1907,12 +1884,9 @@ bool IbisParser::readModel()
m_currentModel->m_enable = IBIS_MODEL_ENABLE::ACTIVE_LOW;
else
{
int size = std::snprintf( nullptr, 0, _( "Unknown Enable: %s" ),
subparam.c_str() )
+ 1;
char cstr[size];
std::snprintf( cstr, size, _( "Unknown Enable: %s" ), subparam.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Unknown Enable: " ) << subparam;
Report( message.str(), RPT_SEVERITY_ERROR );
status = false;
}
}
@ -1932,12 +1906,9 @@ bool IbisParser::readModel()
m_currentModel->m_enable = IBIS_MODEL_ENABLE::ACTIVE_LOW;
else
{
int size = std::snprintf( nullptr, 0, _( "Unknown polarity: %s" ),
subparam.c_str() )
+ 1;
char cstr[size];
std::snprintf( cstr, size, _( "Unknown polarity: %s" ), subparam.c_str() );
Report( std::string( cstr ), RPT_SEVERITY_ACTION );
std::stringstream message;
message << _( "Unknown polarity " ) << subparam;
Report( message.str(), RPT_SEVERITY_ERROR );
status = false;
}
}