Commit 2decdbdd authored by dickelbeck's avatar dickelbeck

++common

  * DSNLEXER now owns an abstract LINE_READER by pointer so that polymorphism
    can be used in alternative LINE_READERS.
  * Write FILE_LINE_READER and STRING_LINE_READER.  The latter can be used
    to parse text coming from the clipboard or other string source.
parent a800351e
...@@ -4,6 +4,15 @@ KiCad ChangeLog 2010 ...@@ -4,6 +4,15 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2010-Mar-3 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
++common
* DSNLEXER now owns an abstract LINE_READER by pointer so that polymorphism
can be used in alternative LINE_READERS.
* Write FILE_LINE_READER and STRING_LINE_READER. The latter can be used
to parse text coming from the clipboard or other string source.
2010-Feb-20 UPDATE Dick Hollenbeck <dick@softplc.com> 2010-Feb-20 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
++common ++common
......
...@@ -51,7 +51,7 @@ static int compare( const void* a1, const void* a2 ) ...@@ -51,7 +51,7 @@ static int compare( const void* a1, const void* a2 )
DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename, DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename,
const KEYWORD* aKeywordTable, unsigned aKeywordCount ) const KEYWORD* aKeywordTable, unsigned aKeywordCount )
{ {
reader = new LINE_READER( aFile, 4096 ); reader = new FILE_LINE_READER( aFile, 4096 );
keywords = aKeywordTable; keywords = aKeywordTable;
keywordCount = aKeywordCount; keywordCount = aKeywordCount;
......
...@@ -34,9 +34,8 @@ ...@@ -34,9 +34,8 @@
//-----<LINE_READER>------------------------------------------------------ //-----<LINE_READER>------------------------------------------------------
LINE_READER::LINE_READER( FILE* aFile, unsigned aMaxLineLength ) LINE_READER::LINE_READER( unsigned aMaxLineLength )
{ {
fp = aFile;
lineNum = 0; lineNum = 0;
maxLineLength = aMaxLineLength; maxLineLength = aMaxLineLength;
...@@ -50,7 +49,14 @@ LINE_READER::LINE_READER( FILE* aFile, unsigned aMaxLineLength ) ...@@ -50,7 +49,14 @@ LINE_READER::LINE_READER( FILE* aFile, unsigned aMaxLineLength )
} }
int LINE_READER::ReadLine() throw (IOError) FILE_LINE_READER::FILE_LINE_READER( FILE* aFile, unsigned aMaxLineLength ) :
LINE_READER( aMaxLineLength )
{
fp = aFile;
}
int FILE_LINE_READER::ReadLine() throw (IOError)
{ {
const char* p = fgets( line, capacity, fp ); const char* p = fgets( line, capacity, fp );
...@@ -73,6 +79,35 @@ int LINE_READER::ReadLine() throw (IOError) ...@@ -73,6 +79,35 @@ int LINE_READER::ReadLine() throw (IOError)
} }
int STRING_LINE_READER::ReadLine() throw (IOError)
{
size_t nlOffset = source.find( '\n', ndx );
size_t advance;
if( nlOffset == std::string::npos )
advance = source.length() - ndx;
else
advance = nlOffset - ndx + 1; // include the newline, so +1
if( advance )
{
if( advance >= maxLineLength )
throw IOError( _("Line length exceeded") );
wxASSERT( ndx + advance <= source.length() );
memcpy( line, &source[ndx], advance );
line[advance] = 0;
length = advance;
++lineNum;
ndx += advance;
}
return advance;
}
//-----<OUTPUTFORMATTER>---------------------------------------------------- //-----<OUTPUTFORMATTER>----------------------------------------------------
......
...@@ -70,37 +70,21 @@ struct IOError ...@@ -70,37 +70,21 @@ struct IOError
class LINE_READER class LINE_READER
{ {
protected: protected:
FILE* fp;
int lineNum;
unsigned maxLineLength;
unsigned length; unsigned length;
int lineNum;
char* line; char* line;
unsigned maxLineLength;
unsigned capacity; unsigned capacity;
public:
/** public:
* Constructor LINE_READER LINE_READER( unsigned aMaxLineLength );
* takes an open FILE and the size of the desired line buffer.
* @param aFile An open file in "ascii" mode, not binary mode.
* @param aMaxLineLength The number of bytes to use in the line buffer.
*/
LINE_READER( FILE* aFile, unsigned aMaxLineLength );
~LINE_READER() virtual ~LINE_READER()
{ {
delete[] line; delete[] line;
} }
/*
int CharAt( int aNdx )
{
if( (unsigned) aNdx < capacity )
return (char) (unsigned char) line[aNdx];
return -1;
}
*/
/** /**
* Function ReadLine * Function ReadLine
...@@ -110,7 +94,7 @@ public: ...@@ -110,7 +94,7 @@ public:
* @return int - The number of bytes read, 0 at end of file. * @return int - The number of bytes read, 0 at end of file.
* @throw IOError only when a line is too long. * @throw IOError only when a line is too long.
*/ */
int ReadLine() throw (IOError); virtual int ReadLine() throw (IOError) = 0;
operator char* () operator char* ()
{ {
...@@ -129,6 +113,72 @@ public: ...@@ -129,6 +113,72 @@ public:
}; };
/**
* Class FILE_LINE_READER
* is a LINE_READER that reads from an open file. File must be already open
* so that this class can exist without and UI policy.
*/
class FILE_LINE_READER : public LINE_READER
{
protected:
FILE* fp; ///< no ownership, no close on destruction
public:
/**
* Constructor LINE_READER
* takes an open FILE and the size of the desired line buffer.
* @param aFile An open file in "ascii" mode, not binary mode.
* @param aMaxLineLength The number of bytes to use in the line buffer.
*/
FILE_LINE_READER( FILE* aFile, unsigned aMaxLineLength );
/**
* Function ReadLine
* reads a line of text into the buffer and increments the line number
* counter. If the line is larger than the buffer size, then an exception
* is thrown.
* @return int - The number of bytes read, 0 at end of file.
* @throw IOError only when a line is too long.
*/
int ReadLine() throw (IOError);
};
/**
* Class STRING_LINE_READER
* is a LINE_READER that reads from a multiline 8 bit wide std::string
*/
class STRING_LINE_READER : public LINE_READER
{
protected:
std::string source;
size_t ndx;
public:
STRING_LINE_READER( const std::string& aString ) :
LINE_READER( 4096 ),
source( aString ),
ndx( 0 )
{
// Clipboard text should be nice and _use multiple lines_ so that
// we can report _line number_ oriented error messages when parsing.
// Therefore a line of 4096 characters max seems more than adequate.
}
/**
* Function ReadLine
* reads a line of text into the buffer and increments the line number
* counter. If the line is larger than the buffer size, then an exception
* is thrown.
* @return int - The number of bytes read, 0 at end of file.
* @throw IOError only when a line is too long.
*/
int ReadLine() throw (IOError);
};
/** /**
* Class OUTPUTFORMATTER * Class OUTPUTFORMATTER
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment