KiCad PCB EDA Suite
richio.cpp File Reference
#include <cstdarg>
#include <config.h>
#include <ignore.h>
#include <richio.h>
#include <errno.h>
#include <wx/file.h>
#include <wx/translation.h>

Go to the source code of this file.

Macros

#define getc_unlocked   getc
 
#define NESTWIDTH   2
 

Functions

static int vprint (std::string *result, const char *format, va_list ap)
 
int StrPrintf (std::string *result, const char *format,...)
 This is like sprintf() but the output is appended to a std::string instead of to a character array. More...
 
std::string StrPrintf (const char *format,...)
 This is like sprintf() but the output is returned in a std::string instead of to a character array. More...
 

Macro Definition Documentation

◆ getc_unlocked

#define getc_unlocked   getc

Definition at line 43 of file richio.cpp.

◆ NESTWIDTH

#define NESTWIDTH   2

Function Documentation

◆ StrPrintf() [1/2]

std::string StrPrintf ( const char *  format,
  ... 
)

This is like sprintf() but the output is returned in a std::string instead of to a character array.

Parameters
formatis a printf() style format string.
Returns
std::string - the result of the sprintf().

Definition at line 96 of file richio.cpp.

97{
98 std::string ret;
99 va_list args;
100
101 va_start( args, format );
102 ignore_unused( vprint( &ret, format, args ) );
103 va_end( args );
104
105 return ret;
106}
void ignore_unused(const T &)
Definition: ignore.h:24
static int vprint(std::string *result, const char *format, va_list ap)
Definition: richio.cpp:48

References ignore_unused(), and vprint().

◆ StrPrintf() [2/2]

int StrPrintf ( std::string *  aResult,
const char *  aFormat,
  ... 
)

This is like sprintf() but the output is appended to a std::string instead of to a character array.

Parameters
aResultis the string to append to, previous text is not clear()ed.
aFormatis a printf() style format string.
Returns
the count of bytes appended to the result string, no terminating nul is included.

Definition at line 84 of file richio.cpp.

85{
86 va_list args;
87
88 va_start( args, format );
89 int ret = vprint( result, format, args );
90 va_end( args );
91
92 return ret;
93}

References vprint().

Referenced by IMPORT_PROJ_HELPER::AssociateFileWithProj(), fmt_mask(), PCB_PLUGIN::format(), FormatProbeItem(), GenCADLayerName(), GenCADLayerNameFlipped(), PCB_PARSER::init(), GENDRILL_WRITER_BASE::layerName(), PCB_EDIT_FRAME::OpenProjectFiles(), ReplaceIllegalFileNameChars(), SCH_EDIT_FRAME::SendCrossProbeNetName(), PCB_EDIT_FRAME::SendCrossProbeNetName(), and SCH_EDIT_FRAME::SetCrossProbeConnection().

◆ vprint()

static int vprint ( std::string *  result,
const char *  format,
va_list  ap 
)
static

Definition at line 48 of file richio.cpp.

49{
50 char msg[512];
51 // This function can call vsnprintf twice.
52 // But internally, vsnprintf retrieves arguments from the va_list identified by arg as if
53 // va_arg was used on it, and thus the state of the va_list is likely to be altered by the call.
54 // see: www.cplusplus.com/reference/cstdio/vsnprintf
55 // we make a copy of va_list ap for the second call, if happens
56 va_list tmp;
57 va_copy( tmp, ap );
58
59 size_t len = vsnprintf( msg, sizeof(msg), format, ap );
60
61 if( len < sizeof(msg) ) // the output fit into msg
62 {
63 result->append( msg, msg + len );
64 }
65 else
66 {
67 // output was too big, so now incur the expense of allocating
68 // a buf for holding suffient characters.
69
70 std::vector<char> buf;
71 buf.reserve( len+1 ); // reserve(), not resize() which writes. +1 for trailing nul.
72
73 len = vsnprintf( &buf[0], len+1, format, tmp );
74
75 result->append( &buf[0], &buf[0] + len );
76 }
77
78 va_end( tmp ); // Release the temporary va_list, initialised from ap
79
80 return len;
81}

Referenced by StrPrintf().