KiCad PCB EDA Suite
STRING_FORMATTER Class Reference

Class STRING_FORMATTER implements 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= '"' )
 Constructor STRING_FORMATTER reserves space in the buffer. More...
 
void Clear ()
 Function Clear clears the buffer and empties the internal string. More...
 
void StripUseless ()
 Function StripUseless removes whitespace, '(', and ')' from the mystring. More...
 
const std::string & GetString ()
 
virtual const char * GetQuoteChar (const char *wrapee)
 Function GetQuoteChar performs quote character need determination. More...
 
int PRINTF_FUNC Print (int nestLevel, const char *fmt,...) throw ( IO_ERROR )
 Function Print formats and writes text to the output stream. More...
 
virtual std::string Quotes (const std::string &aWrapee) throw ( IO_ERROR )
 Function Quotes checks aWrapee input string for a need to be quoted (e.g. More...
 
std::string Quotew (const wxString &aWrapee) throw ( IO_ERROR )
 

Protected Member Functions

void write (const char *aOutBuf, int aCount) override throw ( IO_ERROR )
 Function write 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)
 Function GetQuoteChar performs quote character need determination according to the Specctra DSN specification. More...
 

Private Attributes

std::string mystring
 

Detailed Description

Class STRING_FORMATTER implements OUTPUTFORMATTER to a memory buffer.

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

Definition at line 445 of file richio.h.

Constructor & Destructor Documentation

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

Constructor STRING_FORMATTER reserves space in the buffer.

Definition at line 455 of file richio.h.

455  :
456  OUTPUTFORMATTER( aReserve, aQuoteChar )
457  {
458  }
OUTPUTFORMATTER(int aReserve=OUTPUTFMTBUFZ, char aQuoteChar= '"' )
Definition: richio.h:337

Member Function Documentation

void STRING_FORMATTER::Clear ( )
inline

Function Clear clears the buffer and empties the internal string.

Definition at line 464 of file richio.h.

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

465  {
466  mystring.clear();
467  }
std::string mystring
Definition: richio.h:447
const char * OUTPUTFORMATTER::GetQuoteChar ( const char *  wrapee,
const char *  quote_char 
)
staticprotectedinherited

Function GetQuoteChar performs 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
const char* - the quote_char as a single character string, or "" if the wrapee does not need to be wrapped.

Definition at line 331 of file richio.cpp.

Referenced by OUTPUTFORMATTER::GetQuoteChar().

332 {
333  // Include '#' so a symbol is not confused with a comment. We intend
334  // to wrap any symbol starting with a '#'.
335  // Our LEXER class handles comments, and comments appear to be an extension
336  // to the SPECCTRA DSN specification.
337  if( *wrapee == '#' )
338  return quote_char;
339 
340  if( strlen( wrapee ) == 0 )
341  return quote_char;
342 
343  bool isFirst = true;
344 
345  for( ; *wrapee; ++wrapee, isFirst = false )
346  {
347  static const char quoteThese[] = "\t ()"
348  "%" // per Alfons of freerouting.net, he does not like this unquoted as of 1-Feb-2008
349  "{}" // guessing that these are problems too
350  ;
351 
352  // if the string to be wrapped (wrapee) has a delimiter in it,
353  // return the quote_char so caller wraps the wrapee.
354  if( strchr( quoteThese, *wrapee ) )
355  return quote_char;
356 
357  if( !isFirst && '-' == *wrapee )
358  return quote_char;
359  }
360 
361  return ""; // caller does not need to wrap, can use an unwrapped string.
362 }
const char * OUTPUTFORMATTER::GetQuoteChar ( const char *  wrapee)
virtualinherited

Function GetQuoteChar performs 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
const char* - the quote_char as a single character string, or "" if the wrapee does not need to be wrapped.

Definition at line 365 of file richio.cpp.

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

366 {
367  return GetQuoteChar( wrapee, quoteChar );
368 }
static const char * GetQuoteChar(const char *wrapee, const char *quote_char)
Function GetQuoteChar performs quote character need determination according to the Specctra DSN speci...
Definition: richio.cpp:331
char quoteChar[2]
Definition: richio.h:330
int OUTPUTFORMATTER::Print ( int  nestLevel,
const char *  fmt,
  ... 
)
throw (IO_ERROR
)
inherited

Function Print formats and writes 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 408 of file richio.cpp.

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

Referenced by WORKSHEET_LAYOUT_IO::Format(), COMPONENT_NET::Format(), WORKSHEET_LAYOUT_IO::format(), SCH_LEGACY_PLUGIN::Format(), SYMBOL_LIB_TABLE::Format(), FP_LIB_TABLE::Format(), NETLIST_EXPORTER_PSPICE::Format(), LIB_TABLE_ROW::Format(), COMPONENT::Format(), NETLIST::Format(), WORKSHEET_LAYOUT_IO::formatCoordinate(), PCB_IO::formatLayer(), WORKSHEET_LAYOUT_IO::formatOptions(), WORKSHEET_LAYOUT_IO::formatRepeatParameters(), EXCELLON_WRITER::GenDrillReportFile(), EXCELLON_WRITER::printToolSummary(), LIB_CIRCLE::Save(), LIB_POLYLINE::Save(), LIB_BEZIER::Save(), LIB_RECTANGLE::Save(), LIB_TEXT::Save(), LIB_ARC::Save(), PCB_IO::Save(), LIB_PIN::Save(), LIB_FIELD::Save(), LIB_PART::Save(), SCH_LEGACY_PLUGIN::saveBitmap(), SCH_LEGACY_PLUGIN::saveBusEntry(), SCH_LEGACY_PLUGIN::saveComponent(), LIB_PART::SaveDateAndTime(), LIB_ALIAS::SaveDoc(), SCH_LEGACY_PLUGIN_CACHE::saveDocFile(), SCH_LEGACY_PLUGIN::saveField(), SCH_LEGACY_PLUGIN::saveJunction(), SCH_LEGACY_PLUGIN::saveLine(), SCH_LEGACY_PLUGIN::saveNoConnect(), LIB_EDIT_FRAME::SaveOneSymbol(), SCH_LEGACY_PLUGIN::saveSheet(), SCH_LEGACY_PLUGIN::saveText(), NETLIST_EXPORTER_PSPICE_SIM::writeDirectives(), NETLIST_EXPORTER_PSPICE::writeDirectives(), and DIALOG_BOM::~DIALOG_BOM().

409 {
410 #define NESTWIDTH 2
411 
412  va_list args;
413 
414  va_start( args, fmt );
415 
416  int result = 0;
417  int total = 0;
418 
419  for( int i=0; i<nestLevel; ++i )
420  {
421  // no error checking needed, an exception indicates an error.
422  result = sprint( "%*c", NESTWIDTH, ' ' );
423 
424  total += result;
425  }
426 
427  // no error checking needed, an exception indicates an error.
428  result = vprint( fmt, args );
429 
430  va_end( args );
431 
432  total += result;
433  return total;
434 }
int sprint(const char *fmt,...)
Definition: richio.cpp:396
#define NESTWIDTH
int vprint(const char *fmt, va_list ap)
Definition: richio.cpp:370
std::string OUTPUTFORMATTER::Quotes ( const std::string &  aWrapee)
throw (IO_ERROR
)
virtualinherited

Function Quotes checks 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 wraping in double quotes, and it might need to have its internal content escaped, or not.
Returns
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 437 of file richio.cpp.

438 {
439  static const char quoteThese[] = "\t ()\n\r";
440 
441  if( !aWrapee.size() || // quote null string as ""
442  aWrapee[0]=='#' || // quote a potential s-expression comment, so it is not a comment
443  aWrapee[0]=='"' || // NextTok() will travel through DSN_STRING path anyway, then must apply escapes
444  aWrapee.find_first_of( quoteThese ) != std::string::npos )
445  {
446  std::string ret;
447 
448  ret.reserve( aWrapee.size()*2 + 2 );
449 
450  ret += '"';
451 
452  for( std::string::const_iterator it = aWrapee.begin(); it!=aWrapee.end(); ++it )
453  {
454  switch( *it )
455  {
456  case '\n':
457  ret += '\\';
458  ret += 'n';
459  break;
460  case '\r':
461  ret += '\\';
462  ret += 'r';
463  break;
464  case '\\':
465  ret += '\\';
466  ret += '\\';
467  break;
468  case '"':
469  ret += '\\';
470  ret += '"';
471  break;
472  default:
473  ret += *it;
474  }
475  }
476 
477  ret += '"';
478 
479  return ret;
480  }
481 
482  return aWrapee;
483 }
std::string OUTPUTFORMATTER::Quotew ( const wxString &  aWrapee)
throw (IO_ERROR
)
inherited

Definition at line 486 of file richio.cpp.

Referenced by COMPONENT_NET::Format(), WORKSHEET_LAYOUT_IO::format(), LIB_TABLE_ROW::Format(), COMPONENT::Format(), PCB_IO::formatLayer(), PCB_IO::Save(), and DIALOG_BOM::~DIALOG_BOM().

487 {
488  // wxStrings are always encoded as UTF-8 as we convert to a byte sequence.
489  // The non-virutal function calls the virtual workhorse function, and if
490  // a different quoting or escaping strategy is desired from the standard,
491  // a derived class can overload Quotes() above, but
492  // should never be a reason to overload this Quotew() here.
493  return Quotes( (const char*) aWrapee.utf8_str() );
494 }
virtual std::string Quotes(const std::string &aWrapee)
Function Quotes checks aWrapee input string for a need to be quoted (e.g.
Definition: richio.cpp:437
void STRING_FORMATTER::StripUseless ( )

Function StripUseless removes whitespace, '(', and ')' from the mystring.

Definition at line 504 of file richio.cpp.

References mystring.

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

505 {
506  std::string copy = mystring;
507 
508  mystring.clear();
509 
510  for( std::string::iterator i=copy.begin(); i!=copy.end(); ++i )
511  {
512  if( !isspace( *i ) && *i!=')' && *i!='(' && *i!='"' )
513  {
514  mystring += *i;
515  }
516  }
517 }
std::string mystring
Definition: richio.h:447
void STRING_FORMATTER::write ( const char *  aOutBuf,
int  aCount 
)
throw (IO_ERROR
)
overrideprotectedvirtual

Function write 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 499 of file richio.cpp.

500 {
501  mystring.append( aOutBuf, aCount );
502 }
std::string mystring
Definition: richio.h:447

Member Data Documentation

std::string STRING_FORMATTER::mystring
private

Definition at line 447 of file richio.h.

Referenced by StripUseless().


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