]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_parser.C
Hopefully fix the problem with stateText() in lyxfont.C
[lyx.git] / src / mathed / math_parser.C
index be49f67e1d1f05043398f0ab9355b06d13ed8ccd..2c8c7053cfaec4d5abacf8e7662dac005ab000bb 100644 (file)
@@ -7,7 +7,7 @@
  *
  *  Dependencies: Xlib, XForms
  *
- *  Copyright: (c) 1996, Alejandro Aguilar Sierra
+ *  Copyright: 1996, Alejandro Aguilar Sierra
  *
  *   Version: 0.8beta.
  *
@@ -30,6 +30,9 @@
 #include "math_root.h"
 #include "debug.h"
 
+using std::istream;
+using std::endl;
+
 enum {
        FLAG_BRACE      = 1,    //  A { needed
        FLAG_BRACE_ARG  = 2,    //  Next { is argument
@@ -86,26 +89,28 @@ enum lexcode_enum {
 static lexcode_enum lexcode[256];  
 static char yytext[256];
 static int yylineno;
-static FILE * yyin;
+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
+       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(char 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;
@@ -119,7 +124,7 @@ static void LexInitCodes()
    lexcode['%'] = LexComment;
    lexcode['#'] = LexArgument;
    lexcode['+'] = lexcode['-'] = lexcode['*'] = lexcode['/'] = 
-   lexcode['<'] = lexcode['>'] = lexcode['= '] = LexBOP;
+   lexcode['<'] = lexcode['>'] = lexcode['='] = LexBOP;
    
    lexcode['!'] = lexcode[','] = lexcode[':'] = lexcode[';'] = LexMathSpace;
    lexcode['('] = lexcode[')'] = lexcode['|'] = lexcode['.'] = lexcode['?'] = LexOther; 
@@ -134,16 +139,20 @@ static void LexInitCodes()
 }
 
 
-static char LexGetArg(char lf, bool accept_spaces= false)
+static
+char LexGetArg(char lf, bool accept_spaces= false)
 {
-   char c, rg, * p = &yytext[0];
+       char rg;
+       char * p = &yytext[0];
    int bcnt = 1;
-   
-   while (!feof(yyin)) {
-      c = getc(yyin); 
-      if (c>' ') {
+   unsigned char c;
+   char cc;
+   while (yyis->good()) {
+      yyis->get(cc);
+      c = cc;
+      if (c > ' ') {
         if (!lf) lf = c; else
-        if (c!= lf)
+        if (c != lf)
                 lyxerr << "Math parse error: unexpected '"
                        << c << "'" << endl;
         break;
@@ -156,25 +165,29 @@ static char LexGetArg(char lf, bool accept_spaces= false)
       return '\0';
    } 
    do {
-      c = getc(yyin); 
-      if (c == lf) bcnt++;
-      if (c == rg) bcnt--;
-      if ((c>' ' || (c == ' ' && accept_spaces)) && bcnt>0) *(p++) = c;
-   } while (bcnt>0 && !feof(yyin));
+      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());
    *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();
    
-   while (!feof(yyin)) { 
-      c = getc(yyin);
+   while (yyis->good()) {
+      yyis->get(cc);
+      c = cc;
        
       if (yy_mtextmode && c == ' ') {
          yylval.i= ' ';
@@ -182,20 +195,20 @@ static int yylex(void)
       }
        
        if (lexcode[c] == LexNewLine) {
-          yylineno++
+          ++yylineno
           continue;
        }
         
-      if (lexcode[c] == LexComment) 
-       do c = getc(yyin); while (c!= '\n' % !feof(yyin));  // eat comments
+      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] == 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] == LexArgument)   { 
-         c = getc(yyin);
+      if (lexcode[c] == LexArgument) {
+         yyis->get(cc);
+         c = cc;
          yylval.i = c - '0';
          return LM_TK_ARGUMENT; 
       }
@@ -203,7 +216,8 @@ static int yylex(void)
       if (lexcode[c] == LexClose)   { return LM_TK_CLOSE; }
       
       if (lexcode[c] == LexESC)   {
-        c = getc(yyin);
+        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; }
@@ -215,28 +229,29 @@ static int yylex(void)
         }  
         if (lexcode[c] == LexMathSpace) {
            int i;
-           for (i= 0; i<4 && c!= latex_mathspace[i][0]; i++);
-           yylval.i = (i<4) ? i: 0; 
+           for (i = 0; i < 4 && static_cast<int>(c) != latex_mathspace[i][0]; ++i);
+           yylval.i = (i < 4) ? i: 0; 
            return LM_TK_SPACE; 
         }
         if (lexcode[c] == LexAlpha || lexcode[c] == LexDigit) {
-           char* p = &yytext[0];
+           char * p = &yytext[0];
            while (lexcode[c] == LexAlpha || lexcode[c] == LexDigit) {
               *p = c;
-              c = getc(yyin);
-              p++;
+              yyis->get(cc);
+              c = cc;
+              ++p;
            }
            *p = '\0';
-           if (!feof(yyin)) ungetc(c, yyin);
-           latexkeys *l = in_word_set (yytext, strlen(yytext));
+           if (yyis->good()) yyis->putback(c);
+           latexkeys * l = in_word_set (yytext, strlen(yytext));
            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 && strncmp(yytext, latex_mathenv[i],
+//                             strlen(latex_mathenv[i])); ++i);
                  
-                 for (i= 0; i<6 && strcmp(yytext, latex_mathenv[i]); i++);
+                 for (i = 0; i < 6 && strcmp(yytext, latex_mathenv[i]); ++i);
                  yylval.i = i;
               } else
               if (l->token == LM_TK_SPACE) 
@@ -258,7 +273,7 @@ static int yylex(void)
 int parse_align(char * hor, char *)
 {
    int nc = 0;
-   for (char * c = hor; c && *c > ' '; ++c) nc++;
+   for (char * c = hor; c && *c > ' '; ++c) ++nc;
    return nc;
 }
 
@@ -280,8 +295,8 @@ MathedInset * doAccent(byte c, MathedTextCodes t)
 {
        MathedInset * ac = 0;
        
-       for (int i= accent-1; i>= 0; i--) {
-               if (i == accent-1)
+       for (int i = accent - 1; i >= 0; --i) {
+               if (i == accent - 1)
                  ac = new MathAccentInset(c, t, nestaccent[i]);
                else 
                  ac = new MathAccentInset(ac, nestaccent[i]);
@@ -296,8 +311,8 @@ MathedInset * doAccent(MathedInset * p)
 {
        MathedInset * ac = 0;
        
-       for (int i= accent-1; i>= 0; i--) {
-               if (i == accent-1)
+       for (int i = accent - 1; i >= 0; --i) {
+               if (i == accent - 1)
                  ac = new MathAccentInset(p, nestaccent[i]);
                else 
                  ac = new MathAccentInset(ac, nestaccent[i]);
@@ -308,8 +323,6 @@ MathedInset * doAccent(MathedInset * p)
 }
 
 
-
-
 LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                            MathParInset ** mtx)
 {
@@ -318,14 +331,14 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
    static int plevel = -1;
    static int size = LM_ST_TEXT;
    MathedTextCodes varcode = LM_TC_VAR;
-   MathedInset* binset = 0;
-   static MathMacroTemplate *macro= 0;
+   MathedInset * binset = 0;
+   static MathMacroTemplate * macro= 0;
    
    int brace = 0;
    int acc_brace = 0;
    int acc_braces[8];
-   MathParInset * mt = (mtx) ? *mtx: 0;//(MathParInset*)0;
-    MathedRowSt * crow = (mt) ? mt->getRowSt(): 0;
+   MathParInset * mt = (mtx) ? *mtx : 0;//(MathParInset*)0;
+    MathedRowSt * crow = (mt) ? mt->getRowSt() : 0;
 
    ++plevel;
    if (!array) array = new LyxArrayBase;
@@ -364,10 +377,10 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
          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]);
+         char const * name = strnew(&yytext[1]);
          // ugly trick to be removed soon (lyx3)
-         char c = getc(yyin);
-         ungetc(c, yyin);
+         char c; yyis->get(c);
+         yyis->putback(c);
          if (c == '[') {
              LexGetArg('[');
              na = atoi(yytext);
@@ -393,7 +406,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_OPEN:
       {
-       brace++;
+       ++brace;
        if  (accent && tprev == LM_TK_ACCENT) {
            acc_braces[acc_brace++] = brace;
            break;
@@ -412,14 +425,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) {
@@ -429,7 +442,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);
@@ -441,7 +454,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       {
         if (flags & FLAG_BRACK_ARG) {
           flags &= ~FLAG_BRACK_ARG;
-          char rg= LexGetArg('[');
+          char rg = LexGetArg('[');
           if (rg!= ']') {
              mathPrintError("Expected ']'");
              panic = true;
@@ -455,7 +468,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case ']':
       {
          if (flags & FLAG_BRACK_END) {
-             plevel--;
+             --plevel;
              return array;
          } else
            data.Insert (']');
@@ -464,7 +477,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
 
     case '^':
       {  
-        MathParInset *p = new MathParInset(size, "", LM_OT_SCRIPT);
+        MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
         LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
         p->SetData(ar);
 //      lyxerr << "UP[" << p->GetStyle() << "]" << endl;
@@ -483,7 +496,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
     case LM_TK_LIMIT:
       {
         if (binset) {
-           binset->SetLimits((bool)(yylval.l->id));
+           binset->SetLimits(bool(yylval.l->id));
            binset = 0;
         }
         break;
@@ -530,7 +543,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
            } else
            data.Insert (yylval.l->id, tc);
         } else {
-           MathFuncInset *bg = new MathFuncInset(yylval.l->name);
+           MathFuncInset * bg = new MathFuncInset(yylval.l->name);
             if (accent) {
                     data.Insert(doAccent(bg));
             } else
@@ -555,7 +568,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       }
     case LM_TK_SPACE:
       {
-        if (yylval.i>= 0) {
+        if (yylval.i >= 0) {
            MathSpaceInset * sp = new MathSpaceInset(yylval.i);
            data.Insert(sp);
         }
@@ -566,7 +579,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         MathDotsInset * p = new MathDotsInset(yylval.l->name, yylval.l->id);
         data.Insert(p);
         break;
-      }     
+      }
     case LM_TK_STACK:
        fractype = LM_OT_STACKREL;
     case LM_TK_FRAC:
@@ -582,7 +595,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
       {            
         MathParInset * rt;
          
-        char c = getc(yyin);
+        char c; yyis->get(c);
          
         if (c == '[') {
             rt = new MathRootInset(size);
@@ -590,7 +603,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
             rt->SetData(mathed_parse(FLAG_BRACK_END, 0, &rt));
             rt->setArgumentIdx(1);
         } else {
-            ungetc(c, yyin);
+                yyis->putback(c);
             rt = new MathSqrtInset(size);
         }
         rt->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST, 0, &rt));
@@ -619,7 +632,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");
@@ -630,7 +643,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
 
     case LM_TK_FONT:
       {
-        varcode = (MathedTextCodes)yylval.l->id;
+        varcode = static_cast<MathedTextCodes>(yylval.l->id);
          yy_mtextmode = bool(varcode == LM_TC_TEXTRM);
         flags |= (FLAG_BRACE|FLAG_BRACE_FONT);
        break;
@@ -678,7 +691,7 @@ 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++)
+          for (int i = 0; p->setArgumentIdx(i); ++i)
             p->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
        }
        else {
@@ -698,7 +711,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         // 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);
            array = 0;
@@ -710,7 +723,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
         if (yylval.i == LM_EN_ARRAY) {
            char ar[120], ar2[8];
            ar[0] = ar2[0] = '\0'; 
-            char rg= LexGetArg(0);
+            char rg = LexGetArg(0);
            if (rg == ']') {
               strcpy(ar2, yytext);
               rg = LexGetArg('{');
@@ -722,7 +735,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
                    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) {
+        if (yylval.i >= LM_EN_INTEXT && yylval.i<= LM_EN_EQNARRAY) {
             if (plevel!= 0) {
                 mathPrintError("Misplaced environment");
                 break;
@@ -759,8 +772,8 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
             if (p) {
                 data.Insert(p, p->getTCode());
                 p->setArgumentIdx(0);
-                mathed_parse(FLAG_END, p->GetData(), (MathParInset**)&p);
-//              for (int i= 0; p->setArgumentIdx(i); i++)
+                mathed_parse(FLAG_END, p->GetData(), reinterpret_cast<MathParInset**>(&p));
+//              for (int i = 0; p->setArgumentIdx(i); ++i)
 //                p->SetData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
             } else 
               mathPrintError("Unrecognized environment");
@@ -777,7 +790,7 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
              if (accent) {
                data.Insert(doAccent(p));
              } else
-               data.Insert(p, ((MathMacro*)p)->getTCode());
+               data.Insert(p, static_cast<MathMacro*>(p)->getTCode());
          }
          break;
       }
@@ -828,14 +841,14 @@ LyxArrayBase * mathed_parse(unsigned flags, LyxArrayBase * array,
        break;
     }
    }
-   plevel--;
+   --plevel;
    return array;
 }
 
 
-void mathed_parser_file(FILE * file, int lineno)
+void mathed_parser_file(istream & is, int lineno)
 {
-    yyin = file;
+    yyis = &is;
     yylineno = lineno;
     if (!MathMacroTable::built)
        MathMacroTable::mathMTable.builtinMacros();