]> git.lyx.org Git - lyx.git/blobdiff - src/lyxlex.h
Fix small bug in reading \set_color in lyxrc
[lyx.git] / src / lyxlex.h
index 215bde91c62682e6a77e9a762dc994e221a77292..9f260653db8eb88aa7eafbd813cf55a8b9e66c8f 100644 (file)
@@ -3,7 +3,7 @@
 //  It can be used for simple syntax parsers, like lyxrc,
 //  texclass and others to come.   [asierra30/03/96]
 //
-//   (C) 1996 Lyx Team.
+//   Copyright 1996 Lyx Team.
 #ifndef LYXLEX_H
 #define LYXLEX_H
 
@@ -11,8 +11,7 @@
 #pragma interface
 #endif
 
-#include <fstream>
-using std::filebuf;
+#include <iosfwd>
 
 #include "LString.h"
 
@@ -34,7 +33,9 @@ class LyXLex {
 public:
        ///
        LyXLex (keyword_item *, int);
-
+       ///
+       ~LyXLex();
+       
        /// Lex basic codes
        enum {
                ///
@@ -52,11 +53,12 @@ public:
        /// return true if able to open file, else false
        bool setFile(string const & filename);
        ///
-       void setStream(istream & i);
+       void setStream(std::istream & i);
        ///
-       istream & getStream() { return is; }
+       std::istream & getStream();
        /// Danger! Don't use it unless you know what you are doing.
-       void setLineNo(int l) { lineno = l; }
+       void setLineNo(int l);
+       
        /// returns a lex code
        int lex();
 
@@ -69,9 +71,12 @@ public:
          split a word if it contains a backslash.
          */
        bool nextToken();
+       /// Push a token, that next token got from lyxlex.
+       void pushToken(string const &);
        
        /// 
-       int GetLineNo() const { return lineno; }
+       int GetLineNo() const;
+       
        ///
        int GetInteger() const;
        ///
@@ -81,18 +86,25 @@ public:
        ///
        string GetString() const;
        
-       /// get a long string, ended by the tag `endtag'
-       string getLongString(string const & endtoken);
+       /**
+        * Get a long string, ended by the tag `endtag'
+        * This string can span several lines. The first line
+        * serves as a template for how many spaces the lines
+        * are indented. This much white space is skipped from
+        * each following line. This mechanism does not work
+        * perfectly if you use tabs.
+        */
+       string getLongString(string const & endtag);
        
        ///
        bool EatLine();
        ///
-       int FindToken(char const * string[]);
+       int FindToken(char const * str[]);
        ///
-       int CheckToken(char const * string[], int print_error);
+       int CheckToken(char const * str[], int print_error);
 
        ///
-       char const * text() const { return &buff[0]; }
+       char const * text() const;
 
        /** Pushes a token list on a stack and replaces it with a new one.
         */
@@ -110,61 +122,15 @@ public:
        void printError(string const & message) const;
 
        /**
-         Prints the current token table on cerr.
+         Prints the current token table on the supplied ostream.
          */
-       void printTable();
-protected:
-       ///
-       enum {
-               ///
-               LEX_MAX_BUFF = 2048
-       };
-
-       ///
-       struct pushed_table {
-               ///
-               pushed_table(){
-                       next= 0;
-                       table_elem= 0;
-               }
-               ///
-               pushed_table * next;
-               ///
-               keyword_item * table_elem;
-               ///
-               int table_siz;
-       };
-
-       /// fb__ is only used to open files, the stream is accessed through is
-       filebuf fb__;
-       /// the stream that we use.
-       istream is;
-       /// 
-       string name;
-       ///
-       int lineno;
-       ///
-       keyword_item * table;
-       ///
-       int no_items;
-       ///
-       char buff[LEX_MAX_BUFF];
-       ///
-       pushed_table * pushed;
-       ///
-       int search_kw(char const * const) const;
-       ///
-       short status;
+       void printTable(std::ostream &);
+private:
+       struct Pimpl;
+       Pimpl * pimpl_;
 };
 
 
-inline
-bool LyXLex::IsOK() const
-{
-       return is.good();
-}
-
-
 // This is needed to ensure that the pop is done upon exit from methods
 // with more than one exit point or that can return as a response to
 // exceptions. (Lgb)
@@ -177,5 +143,11 @@ struct pushpophelper {
        }
        LyXLex & lex;
 };
+// To avoid wrong usage:
+// pushpophelper(...); // wrong
+// pushpophelper pph(...); // right
+// we add this macro:
+#define pushpophelper(x, y, z) unnamed_pushpophelper;
+// Tip gotten from Bobby Schmidt's column in C/C++ Users Journal
 
 #endif