]> git.lyx.org Git - lyx.git/blobdiff - src/Lexer.cpp
Allow using \binom without amsmath and add support for \brace and \brack
[lyx.git] / src / Lexer.cpp
index 8a80758874d9ba98c7a24ade44a492126e6bfabb..fd9a1f362c302ce3460d7a2f076a6ab5c05c685b 100644 (file)
 
 #include "Lexer.h"
 
-#include "support/debug.h"
-
 #include "support/convert.h"
+#include "support/debug.h"
+#include "support/FileName.h"
 #include "support/filetools.h"
 #include "support/gzstream.h"
 #include "support/lstrings.h"
 #include "support/lyxalgo.h"
 #include "support/types.h"
-#include "support/unicode.h"
-
-#include <boost/noncopyable.hpp>
 
 #include <functional>
 #include <istream>
 #include <stack>
-#include <sstream>
 #include <vector>
 
 using namespace std;
@@ -46,7 +42,7 @@ namespace lyx {
 
 
 ///
-class Lexer::Pimpl : boost::noncopyable {
+class Lexer::Pimpl {
 public:
        ///
        Pimpl(keyword_item * tab, int num);
@@ -63,7 +59,7 @@ public:
        ///
        void popTable();
        ///
-       bool setFile(support::FileName const & filename);
+       bool setFile(FileName const & filename);
        ///
        void setStream(istream & i);
        ///
@@ -107,16 +103,20 @@ public:
        ///
        char commentChar;
 private:
+       /// non-copyable
+       Pimpl(Pimpl const &);
+       void operator=(Pimpl const &);
+
        ///
        void verifyTable();
        ///
-       class pushed_table {
+       class PushedTable {
        public:
                ///
-               pushed_table()
+               PushedTable()
                        : table_elem(0), table_siz(0) {}
                ///
-               pushed_table(keyword_item * ki, int siz)
+               PushedTable(keyword_item * ki, int siz)
                        : table_elem(ki), table_siz(siz) {}
                ///
                keyword_item * table_elem;
@@ -124,14 +124,14 @@ private:
                int table_siz;
        };
        ///
-       stack<pushed_table> pushed;
+       stack<PushedTable> pushed;
 };
 
 
 
 namespace {
 
-class compare_tags
+class CompareTags
        : public binary_function<keyword_item, keyword_item, bool> {
 public:
        // used by lower_bound, sort and sorted
@@ -190,14 +190,14 @@ void Lexer::Pimpl::verifyTable()
 {
        // Check if the table is sorted and if not, sort it.
        if (table
-           && !lyx::sorted(table, table + no_items, compare_tags())) {
+           && !lyx::sorted(table, table + no_items, CompareTags())) {
                lyxerr << "The table passed to Lexer is not sorted!\n"
                       << "Tell the developers to fix it!" << endl;
                // We sort it anyway to avoid problems.
                lyxerr << "\nUnsorted:" << endl;
                printTable(lyxerr);
 
-               sort(table, table + no_items, compare_tags());
+               sort(table, table + no_items, CompareTags());
                lyxerr << "\nSorted:" << endl;
                printTable(lyxerr);
        }
@@ -206,7 +206,7 @@ void Lexer::Pimpl::verifyTable()
 
 void Lexer::Pimpl::pushTable(keyword_item * tab, int num)
 {
-       pushed_table tmppu(table, no_items);
+       PushedTable tmppu(table, no_items);
        pushed.push(tmppu);
 
        table = tab;
@@ -223,7 +223,7 @@ void Lexer::Pimpl::popTable()
                return;
        }
 
-       pushed_table tmp = pushed.top();
+       PushedTable tmp = pushed.top();
        pushed.pop();
        table = tmp.table_elem;
        no_items = tmp.table_siz;
@@ -485,7 +485,7 @@ int Lexer::Pimpl::search_kw(char const * const tag) const
        keyword_item search_tag = { tag, 0 };
        keyword_item * res =
                lower_bound(table, table + no_items,
-                           search_tag, compare_tags());
+                           search_tag, CompareTags());
        // use the compare_ascii_no_case instead of compare_no_case,
        // because in turkish, 'i' is not the lowercase version of 'I',
        // and thus turkish locale breaks parsing of tags.
@@ -573,7 +573,8 @@ bool Lexer::Pimpl::nextToken()
                                } while (c >= ' ' && c != '\\' && is);
                        }
 
-                       if (c == '\\') is.putback(c); // put it back
+                       if (c == '\\')
+                               is.putback(c); // put it back
                        status = LEX_TOKEN;
                }
 
@@ -669,7 +670,7 @@ void Lexer::printError(string const & message) const
 }
 
 
-bool Lexer::setFile(support::FileName const & filename)
+bool Lexer::setFile(FileName const & filename)
 {
        return pimpl_->setFile(filename);
 }
@@ -757,7 +758,8 @@ docstring const Lexer::getDocString() const
 // explicit tokens (JMarc)
 string const Lexer::getLongString(string const & endtoken)
 {
-       string str, prefix;
+       string str;
+       string prefix;
        bool firstline = true;
 
        while (pimpl_->is) { //< eatLine only reads from is, not from pushTok
@@ -775,7 +777,7 @@ string const Lexer::getLongString(string const & endtoken)
 
                string tmpstr = getString();
                if (firstline) {
-                       string::size_type i(tmpstr.find_first_not_of(' '));
+                       size_t i = tmpstr.find_first_not_of(' ');
                        if (i != string::npos)
                                prefix = tmpstr.substr(0, i);
                        firstline = false;
@@ -784,16 +786,14 @@ string const Lexer::getLongString(string const & endtoken)
 
                // further lines in long strings may have the same
                // whitespace prefix as the first line. Remove it.
-               if (prefix.length() && prefixIs(tmpstr, prefix)) {
+               if (prefix.length() && prefixIs(tmpstr, prefix))
                        tmpstr.erase(0, prefix.length() - 1);
-               }
 
                str += ltrim(tmpstr, "\t") + '\n';
        }
 
-       if (!pimpl_->is) {
+       if (!pimpl_->is)
                printError("Long string not ended by `" + endtoken + '\'');
-       }
 
        return str;
 }
@@ -926,12 +926,15 @@ Lexer & Lexer::operator>>(bool & s)
 }
 
 
-/// quotes a string, e.g. for use in preferences files or as an argument of the "log" dialog
+// quotes a string, e.g. for use in preferences files or as an argument
+// of the "log" dialog
 string const Lexer::quoteString(string const & arg)
 {
-       ostringstream os;
-       os << '"' << subst(subst(arg, "\\", "\\\\"), "\"", "\\\"") << '"';
-       return os.str();
+       string res;
+       res += '"';
+       res += subst(subst(arg, "\\", "\\\\"), "\"", "\\\"");
+       res += '"';
+       return res;
 }