KiCad PCB EDA Suite
STREAM_OUTPUTFORMATTER Class Reference

Class STREAM_OUTPUTFORMATTER implements OUTPUTFORMATTER to a wxWidgets wxOutputStream. More...

#include <richio.h>

Inheritance diagram for STREAM_OUTPUTFORMATTER:
OUTPUTFORMATTER

Public Member Functions

 STREAM_OUTPUTFORMATTER (wxOutputStream &aStream, char aQuoteChar='"' )
 Constructor STREAM_OUTPUTFORMATTER can take any number of wxOutputStream derivations, so it can write to a file, socket, or zip file. More...
 
virtual const char * GetQuoteChar (const char *wrapee)
 Function GetQuoteChar performs quote character need determination. More...
 
int PRINTF_FUNC Print (int nestLevel, const char *fmt,...)
 Function Print formats and writes text to the output stream. More...
 
virtual std::string Quotes (const std::string &aWrapee)
 Function Quotes checks aWrapee input string for a need to be quoted (e.g. More...
 
std::string Quotew (const wxString &aWrapee)
 

Protected Member Functions

void write (const char *aOutBuf, int aCount) override
 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

wxOutputStream & m_os
 

Detailed Description

Class STREAM_OUTPUTFORMATTER implements OUTPUTFORMATTER to a wxWidgets wxOutputStream.

The stream is neither opened nor closed by this class.

Definition at line 526 of file richio.h.

Constructor & Destructor Documentation

◆ STREAM_OUTPUTFORMATTER()

STREAM_OUTPUTFORMATTER::STREAM_OUTPUTFORMATTER ( wxOutputStream &  aStream,
char  aQuoteChar = '"' 
)
inline

Constructor STREAM_OUTPUTFORMATTER can take any number of wxOutputStream derivations, so it can write to a file, socket, or zip file.

Definition at line 536 of file richio.h.

536  :
537  OUTPUTFORMATTER( OUTPUTFMTBUFZ, aQuoteChar ),
538  m_os( aStream )
539  {
540  }
wxOutputStream & m_os
Definition: richio.h:528
OUTPUTFORMATTER(int aReserve=OUTPUTFMTBUFZ, char aQuoteChar='"' )
Definition: richio.h:337
#define OUTPUTFMTBUFZ
default buffer size for any OUTPUT_FORMATTER
Definition: richio.h:309

Member Function Documentation

◆ GetQuoteChar() [1/2]

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 327 of file richio.cpp.

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

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().

◆ GetQuoteChar() [2/2]

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 361 of file richio.cpp.

362 {
363  return GetQuoteChar( wrapee, quoteChar );
364 }
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:327
char quoteChar[2]
Definition: richio.h:330

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

◆ Print()

int OUTPUTFORMATTER::Print ( int  nestLevel,
const char *  fmt,
  ... 
)
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 404 of file richio.cpp.

405 {
406 #define NESTWIDTH 2
407 
408  va_list args;
409 
410  va_start( args, fmt );
411 
412  int result = 0;
413  int total = 0;
414 
415  for( int i=0; i<nestLevel; ++i )
416  {
417  // no error checking needed, an exception indicates an error.
418  result = sprint( "%*c", NESTWIDTH, ' ' );
419 
420  total += result;
421  }
422 
423  // no error checking needed, an exception indicates an error.
424  result = vprint( fmt, args );
425 
426  va_end( args );
427 
428  total += result;
429  return total;
430 }
int sprint(const char *fmt,...)
Definition: richio.cpp:392
#define NESTWIDTH
int vprint(const char *fmt, va_list ap)
Definition: richio.cpp:366
size_t i
Definition: json11.cpp:597

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

Referenced by COMPONENT_NET::Format(), XNODE::Format(), TEMPLATE_FIELDNAME::Format(), SCH_LEGACY_PLUGIN::Format(), FP_LIB_TABLE::Format(), SYMBOL_LIB_TABLE::Format(), TEMPLATES::Format(), TITLE_BLOCK::Format(), NETLIST_EXPORTER_PSPICE::Format(), DSN::POINT::Format(), LIB_TABLE_ROW::Format(), DSN::PROPERTY::Format(), PCB_PLOT_PARAMS::Format(), PAGE_INFO::Format(), COMPONENT::Format(), NETCLASS::Format(), PCB_IO::format(), DSN::ELEM::Format(), NETLIST::Format(), EDA_TEXT::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(), PCB_IO::formatBoardLayers(), 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(), PCB_IO::formatGeneral(), DSN::PIN_REF::FormatIt(), PCB_IO::formatLayer(), PCB_IO::formatLayers(), PCB_IO::formatNetInformation(), formatNode(), PCB_IO::formatSetup(), GENDRILL_WRITER_BASE::GenDrillReportFile(), GENDRILL_WRITER_BASE::printToolSummary(), CLIPBOARD_IO::Save(), PCB_IO::Save(), SCH_LEGACY_PLUGIN_CACHE::saveArc(), SCH_LEGACY_PLUGIN_CACHE::saveBezier(), SCH_LEGACY_PLUGIN::saveBitmap(), SCH_LEGACY_PLUGIN::saveBusAlias(), SCH_LEGACY_PLUGIN::saveBusEntry(), SCH_LEGACY_PLUGIN_CACHE::saveCircle(), SCH_LEGACY_PLUGIN::saveComponent(), LIB_PART::SaveDateAndTime(), SCH_LEGACY_PLUGIN_CACHE::saveDocFile(), SCH_LEGACY_PLUGIN::saveField(), SCH_LEGACY_PLUGIN_CACHE::saveField(), SCH_LEGACY_PLUGIN::saveJunction(), SCH_LEGACY_PLUGIN::saveLine(), SCH_LEGACY_PLUGIN::saveNoConnect(), SCH_LEGACY_PLUGIN_CACHE::savePin(), SCH_LEGACY_PLUGIN_CACHE::savePolyLine(), SCH_LEGACY_PLUGIN_CACHE::saveRectangle(), CLIPBOARD_IO::SaveSelection(), SCH_LEGACY_PLUGIN::saveSheet(), SCH_LEGACY_PLUGIN_CACHE::SaveSymbol(), SCH_LEGACY_PLUGIN::saveText(), SCH_LEGACY_PLUGIN_CACHE::saveText(), NETLIST_EXPORTER_PSPICE_SIM::writeDirectives(), NETLIST_EXPORTER_PSPICE::writeDirectives(), and DIALOG_BOM::~DIALOG_BOM().

◆ Quotes()

std::string OUTPUTFORMATTER::Quotes ( const std::string &  aWrapee)
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 433 of file richio.cpp.

434 {
435  std::string ret;
436 
437  ret.reserve( aWrapee.size()*2 + 2 );
438 
439  ret += '"';
440 
441  for( std::string::const_iterator it = aWrapee.begin(); it!=aWrapee.end(); ++it )
442  {
443  switch( *it )
444  {
445  case '\n':
446  ret += '\\';
447  ret += 'n';
448  break;
449  case '\r':
450  ret += '\\';
451  ret += 'r';
452  break;
453  case '\\':
454  ret += '\\';
455  ret += '\\';
456  break;
457  case '"':
458  ret += '\\';
459  ret += '"';
460  break;
461  default:
462  ret += *it;
463  }
464  }
465 
466  ret += '"';
467 
468  return ret;
469 }

Referenced by PCB_IO::format(), formatNode(), and OUTPUTFORMATTER::Quotew().

◆ Quotew()

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

Definition at line 472 of file richio.cpp.

473 {
474  // wxStrings are always encoded as UTF-8 as we convert to a byte sequence.
475  // The non-virutal function calls the virtual workhorse function, and if
476  // a different quoting or escaping strategy is desired from the standard,
477  // a derived class can overload Quotes() above, but
478  // should never be a reason to overload this Quotew() here.
479  return Quotes( (const char*) aWrapee.utf8_str() );
480 }
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:433

References OUTPUTFORMATTER::Quotes().

Referenced by COMPONENT_NET::Format(), TEMPLATE_FIELDNAME::Format(), TITLE_BLOCK::Format(), LIB_TABLE_ROW::Format(), PAGE_INFO::Format(), COMPONENT::Format(), NETCLASS::Format(), PCB_IO::format(), PCB_IO::formatBoardLayers(), XNODE::FormatContents(), PCB_IO::formatLayer(), PCB_IO::formatLayers(), PCB_IO::formatNetInformation(), CLIPBOARD_IO::Save(), PCB_IO::Save(), CLIPBOARD_IO::SaveSelection(), and DIALOG_BOM::~DIALOG_BOM().

◆ write()

void STREAM_OUTPUTFORMATTER::write ( const char *  aOutBuf,
int  aCount 
)
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 535 of file richio.cpp.

536 {
537  int lastWrite;
538 
539  // This might delay awhile if you were writing to say a socket, but for
540  // a file it should only go through the loop once.
541  for( int total = 0; total<aCount; total += lastWrite )
542  {
543  lastWrite = m_os.Write( aOutBuf, aCount ).LastWrite();
544 
545  if( !m_os.IsOk() )
546  {
547  THROW_IO_ERROR( _( "OUTPUTSTREAM_OUTPUTFORMATTER write error" ) );
548  }
549  }
550 }
wxOutputStream & m_os
Definition: richio.h:528
#define THROW_IO_ERROR(msg)

References m_os, and THROW_IO_ERROR.

Member Data Documentation

◆ m_os

wxOutputStream& STREAM_OUTPUTFORMATTER::m_os
private

Definition at line 528 of file richio.h.

Referenced by write().


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