From a800351eab732e73eaf152632e75b6f04f83b812 Mon Sep 17 00:00:00 2001
From: dickelbeck <Unknown>
Date: Tue, 2 Mar 2010 19:15:30 +0000
Subject: [PATCH] Switch the LINE_READER being used by DSN_LEXER as owned, and
 accessible via pointer. This paves the way for other kinds of LINE_READERs,
 such as one which reads from a multiline string which comes from the
 clipboard.

Will still need to:
1) add new additional DSN_LEXER constructor,
2) virtualize the LINE_READER's ReadLine() function
3) create derived class from LINE_READER.
---
 common/dsnlexer.cpp |  9 +++++----
 include/dsnlexer.h  | 19 ++++++++++++++-----
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp
index 187a237454..14972a8f3e 100644
--- a/common/dsnlexer.cpp
+++ b/common/dsnlexer.cpp
@@ -49,9 +49,10 @@ static int compare( const void* a1, const void* a2 )
 //-----<DSNLEXER>-------------------------------------------------------------
 
 DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename,
-    const KEYWORD* aKeywordTable, unsigned aKeywordCount ) :
-        reader( aFile, 4096 )
+    const KEYWORD* aKeywordTable, unsigned aKeywordCount )
 {
+    reader = new LINE_READER( aFile, 4096 );
+
     keywords = aKeywordTable;
     keywordCount = aKeywordCount;
 
@@ -66,7 +67,7 @@ DSNLEXER::DSNLEXER( FILE* aFile, const wxString& aFilename,
     // "start" should never change until we change the reader.  The DSN
     // format spec supports an include file mechanism but we can add that later
     // using a std::stack to hold a stack of LINE_READERs to track nesting.
-    start = (char*) reader;
+    start = (char*) (*reader);
 
     limit = start;
     next  = start;
@@ -166,7 +167,7 @@ void DSNLEXER::ThrowIOError( wxString aText, int charOffset ) throw (IOError)
 {
     // append to aText, do not overwrite
     aText << wxT(" ") << _("in file") << wxT(" \"") << filename
-          << wxT("\" ") << _("on line") << wxT(" ") << reader.LineNumber()
+          << wxT("\" ") << _("on line") << wxT(" ") << reader->LineNumber()
           << wxT(" ") << _("at offset") << wxT(" ") << charOffset;
 
     throw IOError( aText );
diff --git a/include/dsnlexer.h b/include/dsnlexer.h
index 8c679f5a24..2d2d294f06 100644
--- a/include/dsnlexer.h
+++ b/include/dsnlexer.h
@@ -74,7 +74,7 @@ enum DSN_SYNTAX_T {
  * Class DLEXER
  * implements a lexical analyzer for the SPECCTRA DSN file format.  It
  * reads lexical tokens from the current LINE_READER through the NextTok()
- * function.  The NextTok() function returns one of the DSN_T values.
+ * function.
  */
 class DSNLEXER
 {
@@ -82,7 +82,7 @@ class DSNLEXER
     char*               start;
     char*               limit;
 
-    LINE_READER         reader;
+    LINE_READER*        reader;
     int                 stringDelimiter;
     bool                space_in_quoted_tokens; ///< blank spaces within quoted strings
     bool                commentsAreTokens;      ///< true if should return comments as tokens
@@ -101,7 +101,7 @@ class DSNLEXER
 
     int readLine() throw (IOError)
     {
-        int len = reader.ReadLine();
+        int len = reader->ReadLine();
 
         next  = start;
         limit = start + len;
@@ -159,6 +159,12 @@ public:
     DSNLEXER( FILE* aFile, const wxString& aFilename,
             const KEYWORD* aKeywordTable, unsigned aKeywordCount );
 
+    ~DSNLEXER()
+    {
+        delete reader;
+    }
+
+
     /**
      * Function SetStringDelimiter
      * changes the string delimiter from the default " to some other character
@@ -203,7 +209,10 @@ public:
     /**
      * Function NextTok
      * returns the next token found in the input file or T_EOF when reaching
-     * the end of file.
+     * the end of file.  Users should wrap this function to return an enum
+     * to aid in grammar debugging while running under a debugger, but leave
+     * this lower level function returning an int (so the enum does not collide
+     * with another usage).
      * @return int - the type of token found next.
      * @throw IOError - only if the LINE_READER throws it.
      */
@@ -250,7 +259,7 @@ public:
      */
     int CurLineNumber()
     {
-        return reader.LineNumber();
+        return reader->LineNumber();
     }
 
     /**