diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp index 0a3da14e56..681e7ef534 100644 --- a/common/dsnlexer.cpp +++ b/common/dsnlexer.cpp @@ -111,7 +111,7 @@ void DSNLEXER::PushReader( LINE_READER* aLineReader ) { readerStack.push_back( aLineReader ); reader = aLineReader; - start = (char*) (*reader); + start = (const char*) (*reader); // force a new readLine() as first thing. limit = start; @@ -127,7 +127,7 @@ bool DSNLEXER::PopReader() readerStack.pop_back(); reader = readerStack.back(); - start = (char*) (*reader); + start = (const char*) (*reader); // force a new readLine() as first thing. limit = start; @@ -336,8 +336,8 @@ static inline bool isSpace( int cc ) int DSNLEXER::NextTok() throw( IO_ERROR ) { - char* cur = next; - char* head = cur; + const char* cur = next; + const char* head = cur; prevTok = curTok; diff --git a/common/richio.cpp b/common/richio.cpp index 82fca41dbe..6e2b19e9a2 100644 --- a/common/richio.cpp +++ b/common/richio.cpp @@ -107,12 +107,12 @@ unsigned FILE_LINE_READER::ReadLine() throw( IO_ERROR ) length = 0; line[0] = 0; - // fgets always put a terminating nul at end of its read. + // fgets always puts a terminating nul at end of its read. while( fgets( line + length, capacity - length, fp ) ) { length += strlen( line + length ); - if( length == maxLineLength ) + if( length >= maxLineLength ) THROW_IO_ERROR( _("Line length exceeded") ); // a normal line breaks here, once through while loop @@ -122,11 +122,9 @@ unsigned FILE_LINE_READER::ReadLine() throw( IO_ERROR ) expandCapacity( capacity * 2 ); } - /* if( length ) RHH: this may now refer to a non-existent line but - * that leads to better error reporting on unexpected end of file. - */ - - ++lineNum; + // lineNum is incremented even if there was no line read, because this + // leads to better error reporting when we hit an end of file. + ++lineNum; return length; } diff --git a/cvpcb/readschematicnetlist.cpp b/cvpcb/readschematicnetlist.cpp index 269545472c..9e5d227d01 100644 --- a/cvpcb/readschematicnetlist.cpp +++ b/cvpcb/readschematicnetlist.cpp @@ -91,7 +91,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist() char alim[1024]; int idx, jj, k, l; char cbuffer[BUFFER_CHAR_SIZE]; /* temporary storage */ - char* ptchar; + char* ptchar; COMPONENT* Cmp; FILE* source; @@ -114,8 +114,11 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist() } // FILE_LINE_READER will close the file. - FILE_LINE_READER netlistReader( source, m_NetlistFileName.GetFullPath(), BUFFER_CHAR_SIZE ); - char* Line = netlistReader; + FILE_LINE_READER netlistReader( source, m_NetlistFileName.GetFullPath() ); + + // hopes netlistReader's line buffer does not move. It won't unless you encounter + // a line larger than LINE_READER_LINE_INITIAL_SIZE = 5000 + const char* Line = netlistReader.Line(); /* Read the file header (must be "( { OrCAD PCB" or "({ OrCAD PCB" ) * or "# EESchema Netlist" @@ -194,11 +197,11 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist() /* idx points the component value. * Read value */ - ptchar = strstr( &Line[idx], " " ); // Search end of value field (space) + ptchar = strstr( (char*) &Line[idx], " " ); // Search end of value field (space) if( ptchar == 0 ) { wxString msg; - msg.Printf( _( "Netlist error: %s" ), Line ); + msg.Printf( _( "Netlist error: %s" ), (const wxChar*) CONV_FROM_UTF8( Line ) ); DisplayError( this, msg ); k = 0; } @@ -213,7 +216,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist() } cbuffer[jj] = 0; // Copy footprint name: - if( m_isEESchemaNetlist && (strnicmp( cbuffer, "$noname", 7 ) != 0) ) + if( m_isEESchemaNetlist && strnicmp( cbuffer, "$noname", 7 ) != 0 ) Cmp->m_Module = CONV_FROM_UTF8(cbuffer); if( (Line[++idx] == '(') && (Line[k - 1] == ')' ) ) @@ -271,7 +274,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist() int ReadFootprintFilterList( FILE_LINE_READER& aNetlistReader, COMPONENT_LIST& aComponentsList ) { - char* Line = aNetlistReader; + const char* Line = aNetlistReader; wxString CmpRef; COMPONENT* Cmp = NULL; diff --git a/include/dsnlexer.h b/include/dsnlexer.h index a5650d9d2a..a1b980fe65 100644 --- a/include/dsnlexer.h +++ b/include/dsnlexer.h @@ -77,9 +77,9 @@ enum DSN_SYNTAX_T { class DSNLEXER { bool iOwnReaders; ///< on readerStack, should I delete them? - char* start; - char* next; - char* limit; + const char* start; + const char* next; + const char* limit; typedef std::vector READER_STACK; diff --git a/include/richio.h b/include/richio.h index 9e8362d41e..ab11330616 100644 --- a/include/richio.h +++ b/include/richio.h @@ -205,8 +205,14 @@ protected: wxString source; ///< origin of text lines, e.g. filename or "clipboard" + /** + * Function expandCapacity + * will exand the capacity of @a line up to maxLineLength but not greater, so + * be careful about making assumptions of @a capacity after calling this. + */ void expandCapacity( unsigned newsize ); + public: /** @@ -238,11 +244,20 @@ public: * of lines of text. The returned string is useful for reporting error * messages. */ - const wxString& GetSource() const + virtual const wxString& GetSource() const { return source; } + /** + * Function Line + * returns a pointer to the last line that was read in. + */ + virtual char* Line() const + { + return line; + } + /** * Operator char* * is a casting operator that returns a char* pointer to the start of the @@ -250,7 +265,7 @@ public: */ operator char* () const { - return line; + return Line(); } /** @@ -258,7 +273,7 @@ public: * returns the line number of the last line read from this LINE_READER. Lines * start from 1. */ - unsigned LineNumber() const + virtual unsigned LineNumber() const { return lineNum; } @@ -267,7 +282,7 @@ public: * Function Length * returns the number of bytes in the last line read from this LINE_READER. */ - unsigned Length() const + virtual unsigned Length() const { return length; } diff --git a/new/CMakeLists.txt b/new/CMakeLists.txt index b66a20ca24..263915dbef 100644 --- a/new/CMakeLists.txt +++ b/new/CMakeLists.txt @@ -85,6 +85,7 @@ add_executable( test_sch_lib_table sch_lib_table_keywords.cpp sch_lib.cpp sch_lpid.cpp + filter_reader.cpp sch_dir_lib_source.cpp sch_part.cpp sweet_keywords.cpp diff --git a/new/filter_reader.cpp b/new/filter_reader.cpp new file mode 100644 index 0000000000..1cf8c58343 --- /dev/null +++ b/new/filter_reader.cpp @@ -0,0 +1,59 @@ + + +#include +#include + + +/** + * Class FILTER_READER + * reads lines of text from another LINE_READER, but only returns non-comment + * lines and non-blank lines from its ReadLine() function. + */ +class FILTER_READER : public LINE_READER +{ + LINE_READER& reader; + +public: + + /** + * Constructor ( LINE_READER& ) + * does not take ownership over @a aReader, so will not destroy it. + */ + FILTER_READER( LINE_READER& aReader ) : + reader( aReader ) + { + } + + unsigned ReadLine() throw( IO_ERROR ) + { + unsigned ret; + + while( ( ret = reader.ReadLine() ) != 0 ) + { + if( !strchr( "#\n\r", reader[0] ) ) + break; + } + return ret; + } + + const wxString& GetSource() const + { + return reader.GetSource(); + } + + char* Line() const + { + return reader.Line(); + } + + unsigned LineNumber() const + { + return reader.LineNumber(); + } + + unsigned Length() const + { + return reader.Length(); + } +}; +