36#include <wx/translation.h>
40#if !defined( HAVE_FGETC_NOLOCK )
43#define getc_unlocked _fgetc_nolock
45#define getc_unlocked getc
50static int vprint( std::string* result,
const char* format, va_list ap )
54 size_t len = vsnprintf(
nullptr, 0, format, tmp );
58 size_t size = result->size();
59 result->resize( size + len );
62 len = vsnprintf( result->data() + size, len + 1, format, ap );
68int StrPrintf( std::string* result,
const char* format, ... )
72 va_start( args, format );
73 int ret =
vprint( result, format, args );
85 va_start( args, format );
93wxString
SafeReadFile(
const wxString& aFilePath,
const wxString& aReadType )
96 [](
const char* cstring )
98 wxString line = wxString::FromUTF8( cstring );
101 line = wxConvCurrent->cMB2WC( cstring );
108 line = wxSafeConvertMB2WX( cstring );
112 line.Replace( wxS(
"\r\r\n" ), wxS(
"\n" ) );
118 FILE* fp = wxFopen( aFilePath, aReadType );
121 THROW_IO_ERROR( wxString::Format(
_(
"Cannot open file '%s'." ), aFilePath ) );
128 contents += From_UTF8_WINE( fileReader.
Line() );
137 m_length( 0 ), m_lineNum( 0 ), m_line( nullptr ),
138 m_capacity( 0 ), m_maxLineLength( aMaxLineLength )
140 if( aMaxLineLength != 0 )
193 unsigned aMaxLineLength ):
200 wxString msg = wxString::Format(
_(
"Unable to open %s for reading." ),
201 aFileName.GetData() );
212 unsigned aStartingLineNumber,
213 unsigned aMaxLineLength ) :
214 LINE_READER( aMaxLineLength ), m_iOwn( doOwn ), m_fp( aFile )
230 fseek(
m_fp, 0, SEEK_END );
231 long int fileLength = ftell(
m_fp );
240 return ftell(
m_fp );
280 m_lines( aString ), m_ndx( 0 )
290 m_lines( aStartingPoint.m_lines ),
291 m_ndx( aStartingPoint.m_ndx )
306 if( nlOffset == std::string::npos )
309 new_length = nlOffset -
m_ndx + 1;
334 const wxString& aSource ) :
389 if( strlen( wrapee ) == 0 )
394 for( ; *wrapee; ++wrapee, isFirst = false )
396 static const char quoteThese[] =
"\t ()"
403 if( strchr( quoteThese, *wrapee ) )
406 if( !isFirst &&
'-' == *wrapee )
450 va_start( args, fmt );
451 int ret =
vprint( fmt, args);
464 va_start( args, fmt );
469 for(
int i = 0; i < nestLevel; ++i )
478 result =
vprint( fmt, args );
491 ret.reserve( aWrapee.size() * 2 + 2 );
495 for( std::string::const_iterator it = aWrapee.begin(); it != aWrapee.end(); ++it )
533 return Quotes( (
const char*) aWrapee.utf8_str() );
550 for( std::string::iterator i =
copy.begin(); i !=
copy.end(); ++i )
552 if( !isspace( *i ) && *i !=
')' && *i !=
'(' && *i !=
'"' )
563 m_filename( aFileName )
565 m_fp = wxFopen( aFileName, aMode );
581 if( fwrite( aOutBuf, (
unsigned) aCount, 1,
m_fp ) != 1 )
591 m_fp = wxFopen( aFileName, aMode );
628 m_buf.append( aOutBuf, aCount );
A LINE_READER that reads from an open file.
~FILE_LINE_READER()
May or may not close the open file, depending on doOwn in constructor.
FILE_LINE_READER(const wxString &aFileName, unsigned aStartingLineNumber=0, unsigned aMaxLineLength=LINE_READER_LINE_DEFAULT_MAX)
Take aFileName and the size of the desired line buffer and opens the file and assumes the obligation ...
FILE * m_fp
I may own this file, but might not.
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
bool m_iOwn
if I own the file, I'll promise to close it, else not.
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
LINE_READER(unsigned aMaxLineLength=LINE_READER_LINE_DEFAULT_MAX)
Build a line reader and fixes the length of the maximum supported line length to aMaxLineLength.
unsigned m_maxLineLength
maximum allowed capacity using resizing.
unsigned m_length
no. bytes in line before trailing nul.
unsigned m_capacity
no. bytes allocated for line.
void expandCapacity(unsigned aNewsize)
Will expand the capacity of line up to maxLineLength but not greater, so be careful about making assu...
char * m_line
the read line of UTF8 text
wxString m_source
origin of text lines, e.g. filename or "clipboard"
char * Line() const
Return a pointer to the last line that was read in.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
STRING_LINE_READER(const std::string &aString, const wxString &aSource)
Construct a string line reader.
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
void ignore_unused(const T &)
#define THROW_IO_ERROR(msg)
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.
wxString SafeReadFile(const wxString &aFilePath, const wxString &aReadType)
Nominally opens a file and reads it into a string.
#define OUTPUTFMTBUFZ
default buffer size for any OUTPUT_FORMATTER
#define LINE_READER_LINE_INITIAL_SIZE
#define LINE_READER_LINE_DEFAULT_MAX