KiCad PCB EDA Suite
STRING_FORMATTER Class Reference

Implement an OUTPUTFORMATTER to a memory buffer. More...

#include <richio.h>

Inheritance diagram for STRING_FORMATTER:
OUTPUTFORMATTER

Public Member Functions

 STRING_FORMATTER (int aReserve=OUTPUTFMTBUFZ, char aQuoteChar='"' )
 Reserve space in the buffer. More...
 
void Clear ()
 Clear the buffer and empties the internal string. More...
 
void StripUseless ()
 Removes whitespace, '(', and ')' from the string. More...
 
const std::string & GetString ()
 
virtual const char * GetQuoteChar (const char *wrapee) const
 Perform quote character need determination. More...
 
int PRINTF_FUNC Print (int nestLevel, const char *fmt,...)
 Format and write text to the output stream. More...
 
virtual std::string Quotes (const std::string &aWrapee) const
 Check aWrapee input string for a need to be quoted (e.g. More...
 
std::string Quotew (const wxString &aWrapee) const
 

Protected Member Functions

void write (const char *aOutBuf, int aCount) override
 Should be coded in the interface implementation (derived) classes. More...
 

Static Protected Member Functions

static const char * GetQuoteChar (const char *wrapee, const char *quote_char)
 Perform quote character need determination according to the Specctra DSN specification. More...
 

Private Member Functions

int sprint (const char *fmt,...)
 
int vprint (const char *fmt, va_list ap)
 

Private Attributes

std::string m_mystring
 
std::vector< char > m_buffer
 
char quoteChar [2]
 

Detailed Description

Implement an OUTPUTFORMATTER to a memory buffer.

After Print()ing the string is available through GetString()

Definition at line 414 of file richio.h.

Constructor & Destructor Documentation

◆ STRING_FORMATTER()

STRING_FORMATTER::STRING_FORMATTER ( int  aReserve = OUTPUTFMTBUFZ,
char  aQuoteChar = '"' 
)
inline

Reserve space in the buffer.

Definition at line 420 of file richio.h.

420 :
421 OUTPUTFORMATTER( aReserve, aQuoteChar )
422 {
423 }
OUTPUTFORMATTER(int aReserve=OUTPUTFMTBUFZ, char aQuoteChar='"' )
Definition: richio.h:312

Member Function Documentation

◆ Clear()

void STRING_FORMATTER::Clear ( )
inline

Clear the buffer and empties the internal string.

Definition at line 428 of file richio.h.

429 {
430 m_mystring.clear();
431 }
std::string m_mystring
Definition: richio.h:447

References m_mystring.

Referenced by PCB_PLUGIN::GetStringOutput(), and DSN::ELEM::makeHash().

◆ GetQuoteChar() [1/2]

const char * OUTPUTFORMATTER::GetQuoteChar ( const char *  wrapee) const
virtualinherited

Perform quote character need determination.

It returns the quote character as a single character string for a given input wrapee string. If the wrappee does not need to be quoted, the return value is "" (the null string), such as when there are no delimiters in the input wrapee string. If you want the quote_char to be assuredly not "", then pass in "(" as the wrappee.

Implementations are free to override the default behavior, which is to call the static function of the same name.

Parameters
wrapeeA string that might need wrapping on each end.
Returns
the quote_char as a single character string, or "" if the wrapee does not need to be wrapped.

Definition at line 387 of file richio.cpp.

388{
389 return GetQuoteChar( wrapee, quoteChar );
390}
char quoteChar[2]
Definition: richio.h:401
static const char * GetQuoteChar(const char *wrapee, const char *quote_char)
Perform quote character need determination according to the Specctra DSN specification.
Definition: richio.cpp:353

References OUTPUTFORMATTER::GetQuoteChar(), and OUTPUTFORMATTER::quoteChar.

◆ GetQuoteChar() [2/2]

const char * OUTPUTFORMATTER::GetQuoteChar ( const char *  wrapee,
const char *  quote_char 
)
staticprotectedinherited

Perform quote character need determination according to the Specctra DSN specification.

Parameters
wrapeeA string that might need wrapping on each end.
quote_charA single character C string which provides the current quote character, should it be needed by the wrapee.
Returns
the quote_char as a single character string, or "" if the wrapee does not need to be wrapped.

Definition at line 353 of file richio.cpp.

354{
355 // Include '#' so a symbol is not confused with a comment. We intend
356 // to wrap any symbol starting with a '#'.
357 // Our LEXER class handles comments, and comments appear to be an extension
358 // to the SPECCTRA DSN specification.
359 if( *wrapee == '#' )
360 return quote_char;
361
362 if( strlen( wrapee ) == 0 )
363 return quote_char;
364
365 bool isFirst = true;
366
367 for( ; *wrapee; ++wrapee, isFirst = false )
368 {
369 static const char quoteThese[] = "\t ()"
370 "%" // per Alfons of freerouting.net, he does not like this unquoted as of 1-Feb-2008
371 "{}" // guessing that these are problems too
372 ;
373
374 // if the string to be wrapped (wrapee) has a delimiter in it,
375 // return the quote_char so caller wraps the wrapee.
376 if( strchr( quoteThese, *wrapee ) )
377 return quote_char;
378
379 if( !isFirst && '-' == *wrapee )
380 return quote_char;
381 }
382
383 return ""; // caller does not need to wrap, can use an unwrapped string.
384}

Referenced by DSN::PROPERTY::Format(), DSN::RECTANGLE::Format(), DSN::LAYER_RULE::Format(), DSN::PATH::Format(), DSN::CIRCLE::Format(), DSN::QARC::Format(), DSN::KEEPOUT::Format(), DSN::VIA::Format(), DSN::LAYER::Format(), DSN::SPECCTRA_LAYER_PAIR::Format(), DSN::STRINGPROP::Format(), DSN::PLACE::Format(), DSN::COMPONENT::Format(), DSN::PIN::Format(), DSN::IMAGE::Format(), DSN::PADSTACK::Format(), DSN::FROMTO::Format(), DSN::COMP_ORDER::Format(), DSN::NET::Format(), DSN::CLASS::Format(), DSN::WIRE::Format(), DSN::WIRE_VIA::Format(), DSN::PCB::Format(), DSN::ANCESTOR::Format(), DSN::SUPPLY_PIN::Format(), DSN::NET_OUT::Format(), DSN::SESSION::Format(), DSN::PARSER::FormatContents(), DSN::CLASSES::FormatContents(), DSN::REGION::FormatContents(), DSN::PADSTACK::FormatContents(), DSN::HISTORY::FormatContents(), DSN::PIN_REF::FormatIt(), and OUTPUTFORMATTER::GetQuoteChar().

◆ GetString()

◆ Print()

int OUTPUTFORMATTER::Print ( int  nestLevel,
const char *  fmt,
  ... 
)
inherited

Format and write text to the output stream.

Parameters
nestLevelThe multiple of spaces to precede the output with.
fmtA printf() style format string.
...a variable list of parameters that will get blended into the output under control of the format string.
Returns
int - the number of characters output.
Exceptions
IO_ERROR,ifthere is a problem outputting, such as a full disk.

Definition at line 431 of file richio.cpp.

432{
433#define NESTWIDTH 2
434
435 va_list args;
436
437 va_start( args, fmt );
438
439 int result = 0;
440 int total = 0;
441
442 for( int i = 0; i < nestLevel; ++i )
443 {
444 // no error checking needed, an exception indicates an error.
445 result = sprint( "%*c", NESTWIDTH, ' ' );
446
447 total += result;
448 }
449
450 // no error checking needed, an exception indicates an error.
451 result = vprint( fmt, args );
452
453 va_end( args );
454
455 total += result;
456 return total;
457}
int sprint(const char *fmt,...)
Definition: richio.cpp:419
int vprint(const char *fmt, va_list ap)
Definition: richio.cpp:393
#define NESTWIDTH

References NESTWIDTH, OUTPUTFORMATTER::sprint(), and OUTPUTFORMATTER::vprint().

Referenced by PANEL_SYM_LIB_TABLE::convertLibrary(), PCB_PLUGIN::format(), NETLIST::Format(), DS_DATA_MODEL_IO::format(), DS_DATA_MODEL_IO::Format(), PCB_CALCULATOR_DATAFILE::Format(), PCB_PLOT_PARAMS::Format(), EDA_TEXT::Format(), PAGE_INFO::Format(), TITLE_BLOCK::Format(), COMPONENT_NET::Format(), COMPONENT::Format(), SYMBOL_LIB_TABLE::Format(), FP_LIB_TABLE::Format(), STROKE_PARAMS::Format(), XNODE::Format(), DSN::ELEM::Format(), LIB_TABLE_ROW::Format(), TEMPLATE_FIELDNAME::Format(), DSN::POINT::Format(), DSN::PROPERTY::Format(), DSN::UNIT_RES::Format(), DSN::RECTANGLE::Format(), DSN::RULE::Format(), DSN::LAYER_RULE::Format(), DSN::PATH::Format(), DSN::BOUNDARY::Format(), DSN::CIRCLE::Format(), DSN::QARC::Format(), DSN::WINDOW::Format(), DSN::KEEPOUT::Format(), DSN::VIA::Format(), DSN::CONTROL::Format(), DSN::LAYER::Format(), DSN::SPECCTRA_LAYER_PAIR::Format(), DSN::LAYER_NOISE_WEIGHT::Format(), DSN::TOKPROP::Format(), DSN::STRINGPROP::Format(), DSN::GRID::Format(), DSN::PLACE::Format(), DSN::COMPONENT::Format(), DSN::SHAPE::Format(), DSN::PIN::Format(), DSN::IMAGE::Format(), DSN::PADSTACK::Format(), DSN::FROMTO::Format(), DSN::COMP_ORDER::Format(), DSN::NET::Format(), DSN::CLASS::Format(), DSN::WIRE::Format(), DSN::WIRE_VIA::Format(), DSN::PCB::Format(), DSN::ANCESTOR::Format(), DSN::SUPPLY_PIN::Format(), DSN::NET_OUT::Format(), DSN::SESSION::Format(), TEMPLATES::Format(), SCH_SEXPR_PLUGIN::Format(), SCH_LEGACY_PLUGIN::Format(), formatArc(), formatBezier(), PCB_PLUGIN::formatBoardLayers(), BOARD_STACKUP::FormatBoardStackup(), formatCircle(), XNODE::FormatContents(), DSN::PARSER::FormatContents(), DSN::CLASSES::FormatContents(), DSN::REGION::FormatContents(), DSN::PLACEMENT::FormatContents(), DSN::IMAGE::FormatContents(), DSN::PADSTACK::FormatContents(), DSN::HISTORY::FormatContents(), DSN::ROUTE::FormatContents(), DSN::WAS_IS::FormatContents(), DS_DATA_MODEL_IO::formatCoordinate(), formatFill(), PCB_PLUGIN::formatGeneral(), DSN::PIN_REF::FormatIt(), PCB_PLUGIN::formatLayer(), PCB_PLUGIN::formatLayers(), PCB_PLUGIN::formatNetInformation(), formatNode(), DS_DATA_MODEL_IO::formatOptions(), formatPoly(), PCB_PLUGIN::formatPolyPts(), PCB_PLUGIN::formatProperties(), formatRect(), PCB_PLUGIN::formatRenderCache(), DS_DATA_MODEL_IO::formatRepeatParameters(), PCB_PLUGIN::formatSetup(), GENDRILL_WRITER_BASE::GenDrillReportFile(), GENDRILL_WRITER_BASE::printToolSummary(), CLIPBOARD_IO::Save(), PCB_PLUGIN::Save(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), SCH_LEGACY_PLUGIN::saveBitmap(), SCH_SEXPR_PLUGIN::saveBitmap(), SCH_LEGACY_PLUGIN::saveBusAlias(), SCH_SEXPR_PLUGIN::saveBusAlias(), SCH_LEGACY_PLUGIN::saveBusEntry(), SCH_SEXPR_PLUGIN::saveBusEntry(), SCH_LEGACY_PLUGIN_CACHE::saveCircle(), SCH_LEGACY_PLUGIN_CACHE::saveDocFile(), SCH_LEGACY_PLUGIN_CACHE::saveField(), SCH_SEXPR_PLUGIN_CACHE::saveField(), SCH_LEGACY_PLUGIN::saveField(), SCH_SEXPR_PLUGIN::saveField(), SCH_SEXPR_PLUGIN::saveInstances(), SCH_LEGACY_PLUGIN::saveJunction(), SCH_SEXPR_PLUGIN::saveJunction(), SCH_LEGACY_PLUGIN::saveLine(), SCH_SEXPR_PLUGIN::saveLine(), SCH_LEGACY_PLUGIN::saveNoConnect(), SCH_SEXPR_PLUGIN::saveNoConnect(), SCH_LEGACY_PLUGIN_CACHE::savePin(), SCH_SEXPR_PLUGIN_CACHE::savePin(), SCH_LEGACY_PLUGIN_CACHE::savePolyLine(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), CLIPBOARD_IO::SaveSelection(), SCH_LEGACY_PLUGIN::saveSheet(), SCH_SEXPR_PLUGIN::saveSheet(), SCH_SEXPR_PLUGIN_CACHE::SaveSymbol(), SCH_LEGACY_PLUGIN_CACHE::SaveSymbol(), SCH_LEGACY_PLUGIN::saveSymbol(), SCH_SEXPR_PLUGIN::saveSymbol(), SCH_LEGACY_PLUGIN_CACHE::saveText(), SCH_SEXPR_PLUGIN_CACHE::saveText(), SCH_LEGACY_PLUGIN::saveText(), SCH_SEXPR_PLUGIN::saveText(), SCH_SEXPR_PLUGIN_CACHE::saveTextBox(), SCH_SEXPR_PLUGIN::saveTextBox(), PANEL_REGULATOR::WriteDataFile(), NETLIST_EXPORTER_SPICE::WriteDirectives(), NGSPICE_CIRCUIT_MODEL::WriteDirectives(), NETLIST_EXPORTER_SPICE::WriteHead(), NETLIST_EXPORTER_SPICE_MODEL::WriteHead(), PCB_CALCULATOR_DATAFILE::WriteHeader(), NETLIST_EXPORTER_SPICE::writeInclude(), NETLIST_EXPORTER_SPICE::writeItems(), NETLIST_EXPORTER_SPICE::writeModels(), NETLIST_EXPORTER_SPICE::WriteTail(), and NETLIST_EXPORTER_SPICE_MODEL::WriteTail().

◆ Quotes()

std::string OUTPUTFORMATTER::Quotes ( const std::string &  aWrapee) const
virtualinherited

Check aWrapee input string for a need to be quoted (e.g.

contains a ')' character or a space), and for " double quotes within the string that need to be escaped such that the DSNLEXER will correctly parse the string from a file later.

Parameters
aWrapeeis a string that might need wrapping in double quotes, and it might need to have its internal content escaped, or not.
Returns
a std::string- whose c_str() function can be called for passing to printf() style functions that output UTF8 encoded s-expression streams.
Exceptions
IO_ERROR,ifthere is any kind of problem with the input string.

Definition at line 460 of file richio.cpp.

461{
462 std::string ret;
463
464 ret.reserve( aWrapee.size() * 2 + 2 );
465
466 ret += '"';
467
468 for( std::string::const_iterator it = aWrapee.begin(); it != aWrapee.end(); ++it )
469 {
470 switch( *it )
471 {
472 case '\n':
473 ret += '\\';
474 ret += 'n';
475 break;
476 case '\r':
477 ret += '\\';
478 ret += 'r';
479 break;
480 case '\\':
481 ret += '\\';
482 ret += '\\';
483 break;
484 case '"':
485 ret += '\\';
486 ret += '"';
487 break;
488 default:
489 ret += *it;
490 }
491 }
492
493 ret += '"';
494
495 return ret;
496}

Referenced by PCB_PLUGIN::format(), formatNode(), OUTPUTFORMATTER::Quotew(), and SCH_SEXPR_PLUGIN_CACHE::SaveSymbol().

◆ Quotew()

std::string OUTPUTFORMATTER::Quotew ( const wxString &  aWrapee) const
inherited

Definition at line 499 of file richio.cpp.

500{
501 // wxStrings are always encoded as UTF-8 as we convert to a byte sequence.
502 // The non-virtual function calls the virtual workhorse function, and if
503 // a different quoting or escaping strategy is desired from the standard,
504 // a derived class can overload Quotes() above, but
505 // should never be a reason to overload this Quotew() here.
506 return Quotes( (const char*) aWrapee.utf8_str() );
507}
virtual std::string Quotes(const std::string &aWrapee) const
Check aWrapee input string for a need to be quoted (e.g.
Definition: richio.cpp:460

References OUTPUTFORMATTER::Quotes().

Referenced by PCB_PLUGIN::format(), DS_DATA_MODEL_IO::format(), PCB_CALCULATOR_DATAFILE::Format(), EDA_TEXT::Format(), PAGE_INFO::Format(), TITLE_BLOCK::Format(), COMPONENT_NET::Format(), COMPONENT::Format(), LIB_TABLE_ROW::Format(), TEMPLATE_FIELDNAME::Format(), PCB_PLUGIN::formatBoardLayers(), BOARD_STACKUP::FormatBoardStackup(), XNODE::FormatContents(), PCB_PLUGIN::formatLayer(), PCB_PLUGIN::formatLayers(), PCB_PLUGIN::formatNetInformation(), PCB_PLUGIN::formatProperties(), PCB_PLUGIN::formatRenderCache(), SCH_SEXPR_PLUGIN::saveBusAlias(), SCH_SEXPR_PLUGIN_CACHE::saveField(), SCH_SEXPR_PLUGIN::saveField(), SCH_SEXPR_PLUGIN::saveInstances(), SCH_SEXPR_PLUGIN_CACHE::savePin(), SCH_SEXPR_PLUGIN_CACHE::SaveSymbol(), SCH_SEXPR_PLUGIN::saveSymbol(), SCH_SEXPR_PLUGIN_CACHE::saveText(), SCH_SEXPR_PLUGIN::saveText(), SCH_SEXPR_PLUGIN_CACHE::saveTextBox(), SCH_SEXPR_PLUGIN::saveTextBox(), and PCB_CALCULATOR_DATAFILE::WriteHeader().

◆ sprint()

int OUTPUTFORMATTER::sprint ( const char *  fmt,
  ... 
)
privateinherited

Definition at line 419 of file richio.cpp.

420{
421 va_list args;
422
423 va_start( args, fmt );
424 int ret = vprint( fmt, args);
425 va_end( args );
426
427 return ret;
428}

References OUTPUTFORMATTER::vprint().

Referenced by OUTPUTFORMATTER::Print().

◆ StripUseless()

void STRING_FORMATTER::StripUseless ( )

Removes whitespace, '(', and ')' from the string.

Definition at line 517 of file richio.cpp.

518{
519 std::string copy = m_mystring;
520
521 m_mystring.clear();
522
523 for( std::string::iterator i = copy.begin(); i != copy.end(); ++i )
524 {
525 if( !isspace( *i ) && *i != ')' && *i != '(' && *i != '"' )
526 {
527 m_mystring += *i;
528 }
529 }
530}

References copy, and m_mystring.

Referenced by DSN::ELEM::makeHash().

◆ vprint()

int OUTPUTFORMATTER::vprint ( const char *  fmt,
va_list  ap 
)
privateinherited

Definition at line 393 of file richio.cpp.

394{
395 // This function can call vsnprintf twice.
396 // But internally, vsnprintf retrieves arguments from the va_list identified by arg as if
397 // va_arg was used on it, and thus the state of the va_list is likely to be altered by the call.
398 // see: www.cplusplus.com/reference/cstdio/vsnprintf
399 // we make a copy of va_list ap for the second call, if happens
400 va_list tmp;
401 va_copy( tmp, ap );
402 int ret = vsnprintf( &m_buffer[0], m_buffer.size(), fmt, ap );
403
404 if( ret >= (int) m_buffer.size() )
405 {
406 m_buffer.resize( ret + 1000 );
407 ret = vsnprintf( &m_buffer[0], m_buffer.size(), fmt, tmp );
408 }
409
410 va_end( tmp ); // Release the temporary va_list, initialised from ap
411
412 if( ret > 0 )
413 write( &m_buffer[0], ret );
414
415 return ret;
416}
virtual void write(const char *aOutBuf, int aCount)=0
Should be coded in the interface implementation (derived) classes.
std::vector< char > m_buffer
Definition: richio.h:400

References OUTPUTFORMATTER::m_buffer, and OUTPUTFORMATTER::write().

Referenced by OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::sprint().

◆ write()

void STRING_FORMATTER::write ( const char *  aOutBuf,
int  aCount 
)
overrideprotectedvirtual

Should be coded in the interface implementation (derived) classes.

Parameters
aOutBufis the start of a byte buffer to write.
aCounttells how many bytes to write.
Exceptions
IO_ERROR,ifthere is a problem outputting, such as a full disk.

Implements OUTPUTFORMATTER.

Definition at line 512 of file richio.cpp.

513{
514 m_mystring.append( aOutBuf, aCount );
515}

References m_mystring.

Member Data Documentation

◆ m_buffer

std::vector<char> OUTPUTFORMATTER::m_buffer
privateinherited

Definition at line 400 of file richio.h.

Referenced by OUTPUTFORMATTER::vprint().

◆ m_mystring

std::string STRING_FORMATTER::m_mystring
private

Definition at line 447 of file richio.h.

Referenced by Clear(), GetString(), StripUseless(), and write().

◆ quoteChar

char OUTPUTFORMATTER::quoteChar[2]
privateinherited

Definition at line 401 of file richio.h.

Referenced by OUTPUTFORMATTER::GetQuoteChar(), and OUTPUTFORMATTER::OUTPUTFORMATTER().


The documentation for this class was generated from the following files: