filter_reader.cpp

This commit is contained in:
Dick Hollenbeck 2011-01-11 22:51:29 -06:00
parent 2a60327545
commit 2dd1287141
7 changed files with 101 additions and 25 deletions

View File

@ -111,7 +111,7 @@ void DSNLEXER::PushReader( LINE_READER* aLineReader )
{ {
readerStack.push_back( aLineReader ); readerStack.push_back( aLineReader );
reader = aLineReader; reader = aLineReader;
start = (char*) (*reader); start = (const char*) (*reader);
// force a new readLine() as first thing. // force a new readLine() as first thing.
limit = start; limit = start;
@ -127,7 +127,7 @@ bool DSNLEXER::PopReader()
readerStack.pop_back(); readerStack.pop_back();
reader = readerStack.back(); reader = readerStack.back();
start = (char*) (*reader); start = (const char*) (*reader);
// force a new readLine() as first thing. // force a new readLine() as first thing.
limit = start; limit = start;
@ -336,8 +336,8 @@ static inline bool isSpace( int cc )
int DSNLEXER::NextTok() throw( IO_ERROR ) int DSNLEXER::NextTok() throw( IO_ERROR )
{ {
char* cur = next; const char* cur = next;
char* head = cur; const char* head = cur;
prevTok = curTok; prevTok = curTok;

View File

@ -107,12 +107,12 @@ unsigned FILE_LINE_READER::ReadLine() throw( IO_ERROR )
length = 0; length = 0;
line[0] = 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 ) ) while( fgets( line + length, capacity - length, fp ) )
{ {
length += strlen( line + length ); length += strlen( line + length );
if( length == maxLineLength ) if( length >= maxLineLength )
THROW_IO_ERROR( _("Line length exceeded") ); THROW_IO_ERROR( _("Line length exceeded") );
// a normal line breaks here, once through while loop // a normal line breaks here, once through while loop
@ -122,11 +122,9 @@ unsigned FILE_LINE_READER::ReadLine() throw( IO_ERROR )
expandCapacity( capacity * 2 ); expandCapacity( capacity * 2 );
} }
/* if( length ) RHH: this may now refer to a non-existent line but // lineNum is incremented even if there was no line read, because this
* that leads to better error reporting on unexpected end of file. // leads to better error reporting when we hit an end of file.
*/ ++lineNum;
++lineNum;
return length; return length;
} }

View File

@ -91,7 +91,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist()
char alim[1024]; char alim[1024];
int idx, jj, k, l; int idx, jj, k, l;
char cbuffer[BUFFER_CHAR_SIZE]; /* temporary storage */ char cbuffer[BUFFER_CHAR_SIZE]; /* temporary storage */
char* ptchar; char* ptchar;
COMPONENT* Cmp; COMPONENT* Cmp;
FILE* source; FILE* source;
@ -114,8 +114,11 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist()
} }
// FILE_LINE_READER will close the file. // FILE_LINE_READER will close the file.
FILE_LINE_READER netlistReader( source, m_NetlistFileName.GetFullPath(), BUFFER_CHAR_SIZE ); FILE_LINE_READER netlistReader( source, m_NetlistFileName.GetFullPath() );
char* Line = netlistReader;
// 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" ) /* Read the file header (must be "( { OrCAD PCB" or "({ OrCAD PCB" )
* or "# EESchema Netlist" * or "# EESchema Netlist"
@ -194,11 +197,11 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist()
/* idx points the component value. /* idx points the component value.
* Read 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 ) if( ptchar == 0 )
{ {
wxString msg; wxString msg;
msg.Printf( _( "Netlist error: %s" ), Line ); msg.Printf( _( "Netlist error: %s" ), (const wxChar*) CONV_FROM_UTF8( Line ) );
DisplayError( this, msg ); DisplayError( this, msg );
k = 0; k = 0;
} }
@ -213,7 +216,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist()
} }
cbuffer[jj] = 0; cbuffer[jj] = 0;
// Copy footprint name: // 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); Cmp->m_Module = CONV_FROM_UTF8(cbuffer);
if( (Line[++idx] == '(') && (Line[k - 1] == ')' ) ) if( (Line[++idx] == '(') && (Line[k - 1] == ')' ) )
@ -271,7 +274,7 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist()
int ReadFootprintFilterList( FILE_LINE_READER& aNetlistReader, COMPONENT_LIST& aComponentsList ) int ReadFootprintFilterList( FILE_LINE_READER& aNetlistReader, COMPONENT_LIST& aComponentsList )
{ {
char* Line = aNetlistReader; const char* Line = aNetlistReader;
wxString CmpRef; wxString CmpRef;
COMPONENT* Cmp = NULL; COMPONENT* Cmp = NULL;

View File

@ -77,9 +77,9 @@ enum DSN_SYNTAX_T {
class DSNLEXER class DSNLEXER
{ {
bool iOwnReaders; ///< on readerStack, should I delete them? bool iOwnReaders; ///< on readerStack, should I delete them?
char* start; const char* start;
char* next; const char* next;
char* limit; const char* limit;
typedef std::vector<LINE_READER*> READER_STACK; typedef std::vector<LINE_READER*> READER_STACK;

View File

@ -205,8 +205,14 @@ protected:
wxString source; ///< origin of text lines, e.g. filename or "clipboard" 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 ); void expandCapacity( unsigned newsize );
public: public:
/** /**
@ -238,11 +244,20 @@ public:
* of lines of text. The returned string is useful for reporting error * of lines of text. The returned string is useful for reporting error
* messages. * messages.
*/ */
const wxString& GetSource() const virtual const wxString& GetSource() const
{ {
return source; return source;
} }
/**
* Function Line
* returns a pointer to the last line that was read in.
*/
virtual char* Line() const
{
return line;
}
/** /**
* Operator char* * Operator char*
* is a casting operator that returns a char* pointer to the start of the * is a casting operator that returns a char* pointer to the start of the
@ -250,7 +265,7 @@ public:
*/ */
operator char* () const 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 * returns the line number of the last line read from this LINE_READER. Lines
* start from 1. * start from 1.
*/ */
unsigned LineNumber() const virtual unsigned LineNumber() const
{ {
return lineNum; return lineNum;
} }
@ -267,7 +282,7 @@ public:
* Function Length * Function Length
* returns the number of bytes in the last line read from this LINE_READER. * returns the number of bytes in the last line read from this LINE_READER.
*/ */
unsigned Length() const virtual unsigned Length() const
{ {
return length; return length;
} }

View File

@ -85,6 +85,7 @@ add_executable( test_sch_lib_table
sch_lib_table_keywords.cpp sch_lib_table_keywords.cpp
sch_lib.cpp sch_lib.cpp
sch_lpid.cpp sch_lpid.cpp
filter_reader.cpp
sch_dir_lib_source.cpp sch_dir_lib_source.cpp
sch_part.cpp sch_part.cpp
sweet_keywords.cpp sweet_keywords.cpp

59
new/filter_reader.cpp Normal file
View File

@ -0,0 +1,59 @@
#include <richio.h>
#include <string.h>
/**
* 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();
}
};