]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_parser.C
small cleanup, doxygen, formatting changes
[lyx.git] / src / mathed / math_parser.C
index 289d6a1f417c9a23810428970482b82ff31898aa..d5de9bef843efc86c6df3830055354bcda9f8912 100644 (file)
@@ -7,7 +7,7 @@
  *
  *  Dependencies: Xlib, XForms
  *
- *  Copyright: (c) 1996, Alejandro Aguilar Sierra
+ *  Copyright: 1996, Alejandro Aguilar Sierra
  *
  *   Version: 0.8beta.
  *
  */
 
 #include <config.h>
-#include <cstdlib>
+
 #include <cctype>
 
 #ifdef __GNUG__
-#pragma implementation "math_parser.h"
+#pragma implementation
 #endif
 
 #include "math_parser.h"
+#include "array.h"
+#include "math_rowst.h"
 #include "math_iter.h"
 #include "math_inset.h"
 #include "math_macro.h"
+#include "math_macrotable.h"
+#include "math_macrotemplate.h"
 #include "math_root.h"
+#include "math_matrixinset.h"
+#include "math_accentinset.h"
+#include "math_bigopinset.h"
+#include "math_funcinset.h"
+#include "math_spaceinset.h"
+#include "math_dotsinset.h"
+#include "math_fracinset.h"
+#include "math_deliminset.h"
+#include "math_decorationinset.h"
 #include "debug.h"
+#include "support/lyxlib.h"
+#include "mathed/support.h"
+#include "boost/array.hpp"
+
+using std::istream;
+using std::endl;
+
+
+extern MathMatrixInset * create_multiline(short int type, int cols);
+
 
 enum {
        FLAG_BRACE      = 1,    //  A { needed
@@ -42,27 +65,48 @@ enum {
        FLAG_BRACK_END  = 256   // Next ] ends the parsing process
 };
 
+
+///
+union YYSTYPE {
+    ///
+    unsigned char c;
+    ///
+    char const * s;
+    ///
+    int i;
+    ///
+    latexkeys const * l;
+};
+
+static
 YYSTYPE yylval;
 
 
-static short mathed_env = LM_EN_INTEXT;
+static
+MathedInsetTypes mathed_env = LM_OT_MIN;
+
+string mathed_label;
 
-char * mathed_label = 0;
 
-char const * latex_mathenv[] = { 
+int const latex_mathenv_num = 12;
+char const * latex_mathenv[latex_mathenv_num] = { 
    "math", 
    "displaymath", 
    "equation", 
    "eqnarray*",
    "eqnarray",
+   "align*",
+   "align",
+   "alignat*",
+   "alignat",
+   "multline*",
+   "multline",
    "array"
 };
 
 
-char const * latex_mathspace[] = {
-   "!", ",", ":", ";", "quad", "qquad"
-};
-   
+
+
 char const * latex_special_chars = "#$%&_{}";
            
 // These are lexical codes, not semantic
@@ -84,28 +128,23 @@ enum lexcode_enum {
 };
 
 static lexcode_enum lexcode[256];  
-static char yytext[256];
+#warning Replace with string
+//static char yytext[256];
+static array<char, 256> yytext;
 static int yylineno;
 static istream * yyis;
 static bool yy_mtextmode= false;
            
-inline
-char * strnew(char const * s)
-{
-       char * s1 = new char[strlen(s) + 1]; // this leaks when not delete[]'ed
-       strcpy(s1, s);
-       return s1;
-}
-
-
-static void mathPrintError(char const * msg) 
+static
+void mathPrintError(string const & msg) 
 {
        lyxerr << "Line ~" << yylineno << ": Math parse error: "
               << msg << endl;
 }
 
 
-static void LexInitCodes()
+static
+void LexInitCodes()
 {
    for (int i = 0;  i <= 255; ++i)     {
      if (isalpha(i)) lexcode[i] = LexAlpha;
@@ -122,8 +161,11 @@ static void LexInitCodes()
    lexcode['<'] = lexcode['>'] = lexcode['='] = LexBOP;
    
    lexcode['!'] = lexcode[','] = lexcode[':'] = lexcode[';'] = LexMathSpace;
-   lexcode['('] = lexcode[')'] = lexcode['|'] = lexcode['.'] = lexcode['?'] = LexOther; 
-   lexcode['\'']= LexAlpha;
+   
+   lexcode['('] = lexcode[')'] = lexcode['|'] = lexcode['.'] =
+   lexcode['?'] = LexOther; 
+
+   lexcode['\''] = lexcode['@'] = LexAlpha;
    
    lexcode['['] = lexcode[']'] = lexcode['^'] = lexcode['_'] = 
    lexcode['&'] = LexSelf;  
@@ -134,50 +176,55 @@ static void LexInitCodes()
 }
 
 
-static char LexGetArg(char lf, bool accept_spaces= false)
+static
+char LexGetArg(char lf, bool accept_spaces= false)
 {
-       char rg;
-       char * p = &yytext[0];
-   int bcnt = 1;
    unsigned char c;
    char cc;
    while (yyis->good()) {
       yyis->get(cc);
       c = cc;
       if (c > ' ') {
-        if (!lf) lf = c; else
-        if (c != lf)
+        if (!lf) 
+            lf = c;
+        else if (c != lf) {
                 lyxerr << "Math parse error: unexpected '"
                        << c << "'" << endl;
+                return '\0';
+        }
         break;
       }
    }
-   rg = (lf == '{') ? '}': ((lf == '[') ? ']': ((lf == '(') ? ')': 0));
+   char const rg =
+          (lf == '{') ? '}' : ((lf == '[') ? ']' : ((lf == '(') ? ')' : 0));
    if (!rg) {
           lyxerr << "Math parse error: unknown bracket '"
                  << lf << "'" << endl;
       return '\0';
-   } 
+   }
+   char * p = &yytext[0];
+   int bcnt = 1;
    do {
       yyis->get(cc);
       c = cc;
       if (c == lf) ++bcnt;
       if (c == rg) --bcnt;
-      if ((c > ' ' || (c == ' ' && accept_spaces)) && bcnt>0) *(p++) = c;
-   } while (bcnt > 0 && yyis->good());
+      if ((c > ' ' || (c == ' ' && accept_spaces)) && bcnt > 0) *(p++) = c;
+   } while (bcnt > 0 && yyis->good() && p - yytext.data() < 255);
    *p = '\0';
    return rg;
 }
 
 
-static int yylex(void)
+static
+int yylex(void)
 {
    static int init_done = 0;
-   unsigned char c;
-   char cc;
    
    if (!init_done) LexInitCodes();
    
+   unsigned char c;
+   char cc;
    while (yyis->good()) {
       yyis->get(cc);
       c = cc;
@@ -185,66 +232,102 @@ static int yylex(void)
       if (yy_mtextmode && c == ' ') {
          yylval.i= ' ';
          return LM_TK_ALPHA;
-      }
+      } else
        
        if (lexcode[c] == LexNewLine) {
           ++yylineno; 
           continue;
-       }
+       } else
         
-      if (lexcode[c] == LexComment)
-       do { yyis->get(cc); c = cc; } while (c != '\n' % yyis->good());  // eat comments
-    
-      if (lexcode[c] == LexDigit || lexcode[c] == LexOther || lexcode[c] == LexMathSpace) { yylval.i = c; return LM_TK_STR; }
-      if (lexcode[c] == LexAlpha) { yylval.i= c; return LM_TK_ALPHA; }
-      if (lexcode[c] == LexBOP)   { yylval.i= c; return LM_TK_BOP; }
-      if (lexcode[c] == LexSelf)  { return c; }   
+       if (lexcode[c] == LexComment) {
+       do {
+         yyis->get(cc);
+         c = cc;
+       } while (c != '\n' % yyis->good());  // eat comments
+       } else
+       
+      if (lexcode[c] == LexDigit
+         || lexcode[c] == LexOther
+         || lexcode[c] == LexMathSpace) {
+             yylval.i = c;
+             return LM_TK_STR;
+      } else
+      if (lexcode[c] == LexAlpha) {
+             yylval.i= c;
+             return LM_TK_ALPHA;
+      } else
+      if (lexcode[c] == LexBOP) {
+             yylval.i= c;
+             return LM_TK_BOP;
+      } else
+      if (lexcode[c] == LexSelf) {
+             return c;
+      } else
       if (lexcode[c] == LexArgument) {
          yyis->get(cc);
          c = cc;
          yylval.i = c - '0';
          return LM_TK_ARGUMENT; 
-      }
-      if (lexcode[c] == LexOpen)   { return LM_TK_OPEN; }
-      if (lexcode[c] == LexClose)   { return LM_TK_CLOSE; }
-      
+      } else
+      if (lexcode[c] == LexOpen) {
+             return LM_TK_OPEN;
+      } else
+      if (lexcode[c] == LexClose) {
+             return LM_TK_CLOSE;
+      } else
       if (lexcode[c] == LexESC)   {
         yyis->get(cc);
         c = cc;
-        if (c == '\\') { return LM_TK_NEWLINE; }
-        if (c == '(')  { yylval.i = LM_EN_INTEXT; return LM_TK_BEGIN; }
-        if (c == ')')  { yylval.i = LM_EN_INTEXT; return LM_TK_END; }
-        if (c == '[')  { yylval.i = LM_EN_DISPLAY; return LM_TK_BEGIN; }
-        if (c == ']')  { yylval.i = LM_EN_DISPLAY; return LM_TK_END; }
+        if (c == '\\') {
+                return LM_TK_NEWLINE;
+        }
+        if (c == '(') {
+                yylval.i = LM_OT_MIN;
+                return LM_TK_BEGIN;
+        }
+        if (c == ')') {
+                yylval.i = LM_OT_MIN;
+                return LM_TK_END;
+        }
+        if (c == '[') {
+                yylval.i = LM_OT_PAR;
+                return LM_TK_BEGIN;
+        }
+        if (c == ']') {
+                yylval.i = LM_OT_PAR;
+                return LM_TK_END;
+        }
         if (strchr(latex_special_chars, c)) {
             yylval.i = c;
             return LM_TK_SPECIAL;
-        }  
+        } 
         if (lexcode[c] == LexMathSpace) {
            int i;
            for (i = 0; i < 4 && static_cast<int>(c) != latex_mathspace[i][0]; ++i);
-           yylval.i = (i < 4) ? i: 0; 
+           yylval.i = (i < 4) ? i : 0; 
            return LM_TK_SPACE; 
         }
         if (lexcode[c] == LexAlpha || lexcode[c] == LexDigit) {
            char * p = &yytext[0];
-           while (lexcode[c] == LexAlpha || lexcode[c] == LexDigit) {
+           while ((lexcode[c] == LexAlpha || lexcode[c] == LexDigit)
+                  && p - yytext.data() < 255) {
               *p = c;
               yyis->get(cc);
               c = cc;
-              p++;
+              ++p;
            }
            *p = '\0';
            if (yyis->good()) yyis->putback(c);
-           latexkeys * l = in_word_set (yytext, strlen(yytext));
+           latexkeys const * l = in_word_set (yytext.data(), strlen(yytext.data()));
            if (l) {
               if (l->token == LM_TK_BEGIN || l->token == LM_TK_END) { 
                  int i;
                  LexGetArg('{');
-//               for (i= 0; i<5 && strncmp(yytext, latex_mathenv[i],
-//                             strlen(latex_mathenv[i])); i++);
+//               for (i = 0; i < 5 && compare(yytext, latex_mathenv[i],
+//                             strlen(latex_mathenv[i])); ++i);
                  
-                 for (i = 0; i < 6 && strcmp(yytext, latex_mathenv[i]); i++);
+                 for (i = 0; i < latex_mathenv_num
+                              && compare(yytext.data(), latex_mathenv[i]); ++i);
                  yylval.i = i;
               } else
               if (l->token == LM_TK_SPACE) 
@@ -253,7 +336,7 @@ static int yylex(void)
                 yylval.l = l;
               return l->token;
            } else { 
-              yylval.s = yytext;
+              yylval.s = yytext.data();
               return LM_TK_UNDEF;
            }
         }
@@ -263,6 +346,7 @@ static int yylex(void)
 }
 
 
+static
 int parse_align(char * hor, char *)
 {
    int nc = 0;
@@ -272,9 +356,12 @@ int parse_align(char * hor, char *)
 
 
 // Accent hacks only for 0.12. Stolen from Cursor.
+static
 int accent = 0;
+static
 int nestaccent[8];
 
+static
 void setAccent(int ac)
 {
        if (ac > 0 && accent < 8) {
@@ -284,6 +371,7 @@ void setAccent(int ac)
 }
 
 
+static
 MathedInset * doAccent(byte c, MathedTextCodes t)
 {
        MathedInset * ac = 0;
@@ -300,6 +388,7 @@ MathedInset * doAccent(byte c, MathedTextCodes t)
 }
 
 
+static
 MathedInset * doAccent(MathedInset * p)
 {
        MathedInset * ac = 0;
@@ -316,25 +405,26 @@ MathedInset * doAccent(MathedInset * p)
 }
 
 
-LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
-                           MathParInset ** mtx)
+MathedArray * mathed_parse(unsigned flags = 0, MathedArray * array = 0,
+                           MathParInset ** mtx = 0)
 {
-   int t = yylex(), tprev = 0;
+   int t = yylex();
+   int tprev = 0;
    bool panic = false;
    static int plevel = -1;
    static int size = LM_ST_TEXT;
    MathedTextCodes varcode = LM_TC_VAR;
    MathedInset * binset = 0;
-   static MathMacroTemplate * macro= 0;
+   static MathMacroTemplate * macro = 0;
    
    int brace = 0;
    int acc_brace = 0;
    int acc_braces[8];
-   MathParInset * mt = (mtx) ? *mtx: 0;//(MathParInset*)0;
+   MathParInset * mt = (mtx) ? *mtx : 0;//(MathParInset*)0;
     MathedRowSt * crow = (mt) ? mt->getRowSt() : 0;
 
    ++plevel;
-   if (!array) array = new LyxArrayBase;
+   if (!array) array = new MathedArray;
    MathedIter data(array);
    while (t) {
       if ((flags & FLAG_BRACE) && t != LM_TK_OPEN) {
@@ -368,20 +458,18 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
          int na = 0; 
 
          LexGetArg('{');
-         // This name lives until quitting, for that reason
-         // I didn't care on deleting explicitly. Later I will.
-         char const * name = strnew(&yytext[1]);
+         string const name(&yytext[1]);
+         
          // ugly trick to be removed soon (lyx3)
-         char c; yyis->get(c);
-         yyis->putback(c);
+         char const c = yyis->peek();
          if (c == '[') {
              LexGetArg('[');
-             na = atoi(yytext);
+             na = lyx::atoi(yytext.data());
          }  
          macro = new MathMacroTemplate(name, na);
          flags = FLAG_BRACE|FLAG_BRACE_LAST;
          *mtx = macro;
-         macro->SetData(array);
+         macro->setData(array);
          break;
       }
     case LM_TK_SPECIAL:
@@ -392,14 +480,14 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case LM_TK_STR:
       {          
          if (accent) {
-                 data.Insert(doAccent(yylval.i, LM_TC_CONST));
+           data.Insert(doAccent(yylval.i, LM_TC_CONST));
          } else
            data.Insert (yylval.i, LM_TC_CONST);
          break;
       }
     case LM_TK_OPEN:
       {
-       brace++;
+       ++brace;
        if  (accent && tprev == LM_TK_ACCENT) {
            acc_braces[acc_brace++] = brace;
            break;
@@ -418,14 +506,14 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_CLOSE:
       {
-        brace--;        
+        --brace;        
         if (brace < 0) {
            mathPrintError("Unmatching braces");
            panic = true;
            break;
         }
         if (acc_brace && brace == acc_braces[acc_brace-1]-1) {
-            acc_brace--;
+            --acc_brace;
             break;
         }
         if (flags & FLAG_BRACE_FONT) {
@@ -435,7 +523,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
            break;
         }
         if (brace == 0 && (flags & FLAG_BRACE_LAST)) {
-           plevel--;
+           --plevel;
            return array;
         } else {
            data.Insert ('}', LM_TC_TEX);
@@ -447,8 +535,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       {
         if (flags & FLAG_BRACK_ARG) {
           flags &= ~FLAG_BRACK_ARG;
-          char rg = LexGetArg('[');
-          if (rg!= ']') {
+          char const rg = LexGetArg('[');
+          if (rg != ']') {
              mathPrintError("Expected ']'");
              panic = true;
              break;
@@ -461,7 +549,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case ']':
       {
          if (flags & FLAG_BRACK_END) {
-             plevel--;
+             --plevel;
              return array;
          } else
            data.Insert (']');
@@ -471,8 +559,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case '^':
       {  
         MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
-        LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
-        p->SetData(ar);
+        MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
+        p->setData(ar);
 //      lyxerr << "UP[" << p->GetStyle() << "]" << endl;
         data.Insert (p, LM_TC_UP);
         break;
@@ -480,8 +568,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case '_':
       {
         MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
-        LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
-        p->SetData(ar);
+        MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
+        p->setData(ar);
         data.Insert (p, LM_TC_DOWN);
         break;
       }
@@ -497,7 +585,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       
     case '&':    // Tab
       {
-        if ((flags & FLAG_END) && mt && data.getCol()<mt->GetColumns()-1) {
+        if ((flags & FLAG_END) && mt && data.getCol()<mt->GetColumns() - 1) {
             data.setNumCols(mt->GetColumns());
             data.Insert('T', LM_TC_TAB);
         } else 
@@ -512,7 +600,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
          if (mt && (flags & FLAG_END)) {
              if (mt->Permit(LMPF_ALLOW_CR)) {
                  if (crow) {
-                         crow->setNext(new MathedRowSt(mt->GetColumns()+1)); // this leaks
+                         crow->setNext(new MathedRowSt(mt->GetColumns() + 1)); // this leaks
                      crow = crow->getNext();
                  }
                  data.Insert('K', LM_TC_CR);
@@ -534,7 +622,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
            if (accent) {
                data.Insert(doAccent(yylval.l->id, tc));
            } else
-           data.Insert (yylval.l->id, tc);
+           data.Insert(yylval.l->id, tc);
         } else {
            MathFuncInset * bg = new MathFuncInset(yylval.l->name);
             if (accent) {
@@ -549,7 +637,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         if (accent) {
                 data.Insert(doAccent(yylval.i, LM_TC_BOP));
          } else
-           data.Insert (yylval.i, LM_TC_BOP);
+           data.Insert(yylval.i, LM_TC_BOP);
         break;
       }
     case LM_TK_STY:
@@ -578,8 +666,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case LM_TK_FRAC:
       {
         MathFracInset * fc = new MathFracInset(fractype);
-        LyxArrayBase * num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
-        LyxArrayBase * den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
+        MathedArray * num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
+        MathedArray * den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
         fc->SetData(num, den);
         data.Insert(fc, LM_TC_ACTIVE_INSET);
         break;
@@ -593,31 +681,30 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         if (c == '[') {
             rt = new MathRootInset(size);
             rt->setArgumentIdx(0);
-            rt->SetData(mathed_parse(FLAG_BRACK_END, 0, &rt));
+            rt->setData(mathed_parse(FLAG_BRACK_END, 0, &rt));
             rt->setArgumentIdx(1);
         } else {
                 yyis->putback(c);
             rt = new MathSqrtInset(size);
         }
-        rt->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST, 0, &rt));
+        rt->setData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST, 0, &rt));
         data.Insert(rt, LM_TC_ACTIVE_INSET);
         break;
       }
        
     case LM_TK_LEFT:
       {
-        int lfd, rgd;
-        lfd = yylex();
+        int lfd = yylex();
         if (lfd == LM_TK_SYM || lfd == LM_TK_STR || lfd == LM_TK_BOP|| lfd == LM_TK_SPECIAL)
           lfd = (lfd == LM_TK_SYM) ? yylval.l->id: yylval.i;
 //      lyxerr << "L[" << lfd << " " << lfd << "]";
-        LyxArrayBase * a = mathed_parse(FLAG_RIGHT);
-        rgd = yylex();
+        MathedArray * a = mathed_parse(FLAG_RIGHT);
+        int rgd = yylex();
 //      lyxerr << "R[" << rgd << "]";
         if (rgd == LM_TK_SYM || rgd == LM_TK_STR || rgd == LM_TK_BOP || rgd == LM_TK_SPECIAL)
           rgd = (rgd == LM_TK_SYM) ? yylval.l->id: yylval.i;    
         MathDelimInset * dl = new MathDelimInset(lfd, rgd);
-        dl->SetData(a);
+        dl->setData(a);
         data.Insert(dl, LM_TC_ACTIVE_INSET);
 //      lyxerr << "RL[" << lfd << " " << rgd << "]";
         break;
@@ -625,7 +712,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case LM_TK_RIGHT:
       {
         if (flags & FLAG_RIGHT) { 
-           plevel--;
+           --plevel;
            return array;
         } else {
            mathPrintError("Unmatched right delimiter");
@@ -645,12 +732,14 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       {  
         MathDecorationInset * sq = new MathDecorationInset(yylval.l->id,
                                                            size);
-        sq->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
+        sq->setData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
         data.Insert(sq, LM_TC_ACTIVE_INSET);
         break;
       }
       
-    case LM_TK_ACCENT: setAccent(yylval.l->id); break;
+    case LM_TK_ACCENT:
+      setAccent(yylval.l->id);
+      break;
          
     case LM_TK_NONUM:
       {
@@ -684,8 +773,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
             data.Insert(doAccent(p), p->getTCode());
           else
             data.Insert(p, p->getTCode());
-          for (int i = 0; p->setArgumentIdx(i); i++)
-            p->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
+          for (int i = 0; p->setArgumentIdx(i); ++i)
+            p->setData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
        }
        else {
           MathedInset * q = new MathFuncInset(yylval.s, LM_OT_UNDEF);
@@ -699,36 +788,35 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_END:
       {
-         if (mathed_env != yylval.i && yylval.i!= LM_EN_ARRAY)
+         if (mathed_env != yylval.i && yylval.i != LM_OT_MATRIX)
           mathPrintError("Unmatched environment");
         // debug info [made that conditional -JMarc]
         if (lyxerr.debugging(Debug::MATHED))
                 lyxerr << "[" << yylval.i << "]" << endl;
-        plevel--;
+        --plevel;
         if (mt) { // && (flags & FLAG_END)) {
-           mt->SetData(array);
+           mt->setData(array);
            array = 0;
         }
         return array;
       }
     case LM_TK_BEGIN:
       {
-        if (yylval.i == LM_EN_ARRAY) {
+        if (yylval.i == LM_OT_MATRIX) {
            char ar[120], ar2[8];
            ar[0] = ar2[0] = '\0'; 
             char rg = LexGetArg(0);
            if (rg == ']') {
-              strcpy(ar2, yytext);
+              strcpy(ar2, yytext.data());
               rg = LexGetArg('{');
            }
-           strcpy(ar, yytext);
-           int nc = parse_align(ar, ar2);
+           strcpy(ar, yytext.data());
+           int const nc = parse_align(ar, ar2);
            MathParInset * mm = new MathMatrixInset(nc, 0);
            mm->SetAlign(ar2[0], ar);
                    data.Insert(mm, LM_TC_ACTIVE_INSET);
             mathed_parse(FLAG_END, mm->GetData(), &mm);
-        } else
-        if (yylval.i >= LM_EN_INTEXT && yylval.i<= LM_EN_EQNARRAY) {
+        } else if (is_eqn_type(yylval.i)) {
             if (plevel!= 0) {
                 mathPrintError("Misplaced environment");
                 break;
@@ -738,12 +826,25 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                 panic = true;
             }
             
-            mathed_env = yylval.i;
-            if (mathed_env>= LM_EN_DISPLAY) {
+            mathed_env = static_cast<MathedInsetTypes>(yylval.i);
+            if (mathed_env != LM_OT_MIN) {
                 size = LM_ST_DISPLAY;
-                if (mathed_env>LM_EN_EQUATION) {
-                    mt = new MathMatrixInset(3, -1);
-                    mt->SetAlign(' ', "rcl");
+                if (is_multiline(mathed_env)) {
+                    int cols = 1;
+                    if (is_multicolumn(mathed_env)) {
+                        if (mathed_env != LM_OT_ALIGNAT &&
+                            mathed_env != LM_OT_ALIGNATN &&
+                            yyis->good()) {
+                            char c;
+                            yyis->get(c);
+                            if (c != '%')
+                                    lyxerr << "Math parse error: unexpected '"
+                                           << c << "'" << endl;
+                        }
+                        LexGetArg('{');
+                        cols = strToInt(string(yytext.data()));
+                    }
+                    mt = create_multiline(mathed_env, cols);
                     if (mtx) *mtx = mt;
                     flags |= FLAG_END;
 //                  data.Insert(' ', LM_TC_TAB);
@@ -754,19 +855,19 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                 mt->SetType(mathed_env);
                 crow = mt->getRowSt();
             }
-                              
+
 #ifdef DEBUG
             lyxerr << "MATH BEGIN[" << mathed_env << "]" << endl;
 #endif
         } else {
 //          lyxerr << "MATHCRO[" << yytext << "]";
             MathMacro * p = 
-              MathMacroTable::mathMTable.getMacro(yytext);
+              MathMacroTable::mathMTable.getMacro(yytext.data());
             if (p) {
                 data.Insert(p, p->getTCode());
                 p->setArgumentIdx(0);
                 mathed_parse(FLAG_END, p->GetData(), reinterpret_cast<MathParInset**>(&p));
-//              for (int i= 0; p->setArgumentIdx(i); i++)
+//              for (int i = 0; p->setArgumentIdx(i); ++i)
 //                p->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
             } else 
               mathPrintError("Unrecognized environment");
@@ -790,24 +891,18 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
        
      case LM_TK_LABEL:
        {          
-         char rg = LexGetArg('\0', true);
+         char const rg = LexGetArg('\0', true);
          if (rg != '}') {
             mathPrintError("Expected '{'");
              // debug info
-            lyxerr << "[" << yytext << "]" << endl;
+            lyxerr << "[" << yytext.data() << "]" << endl;
              panic = true;
             break;
          } 
          if (crow) {
-             // This is removed by crow's destructor. Bad design? yes, this 
-             // will be changed after 0.12
-             crow->setLabel(strnew(yytext));
-         }
-         else {
-                 // where is this math_label free'ed?
-                 // Supposedly in ~formula, another bad hack,
-                 // give me some time please.
-                 mathed_label = strnew(yytext);
+             crow->setLabel(yytext.data());
+         } else {
+                 mathed_label = yytext.data();
          }
 #ifdef DEBUG
          lyxerr << "Label[" << mathed_label << "]" << endl;
@@ -817,14 +912,16 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
      default:
        mathPrintError("Unrecognized token");
        // debug info
-       lyxerr << "[" << t << " " << yytext << "]" << endl;
+       lyxerr << "[" << t << " " << yytext.data() << "]" << endl;
        break;
     }
     tprev = t;
     if (panic) {
            lyxerr << " Math Panic, expect problems!" << endl;
        //   Search for the end command. 
-       do t = yylex (); while (t != LM_TK_END && t);
+       do {
+              t = yylex ();
+       } while (t != LM_TK_END && t);
     } else
      t = yylex ();
    
@@ -834,7 +931,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
        break;
     }
    }
-   plevel--;
+   --plevel;
    return array;
 }