-
- if (flags & FLAG_BRACE)
- flags &= ~FLAG_BRACE;
- else {
- data.insert('{', LM_TC_TEX);
- }
- break;
- }
- case LM_TK_CLOSE:
- {
- --brace;
- if (brace < 0) {
- mathPrintError("Unmatching braces");
- panic = true;
- break;
- }
- if (acc_brace && brace == acc_braces[acc_brace-1]-1) {
- --acc_brace;
- break;
- }
- if (flags & FLAG_BRACE_FONT) {
- varcode = LM_TC_VAR;
- yy_mtextmode = false;
- flags &= ~FLAG_BRACE_FONT;
- break;
- }
- if (brace == 0 && (flags & FLAG_BRACE_LAST)) {
- --plevel;
- return array;
- } else {
- data.insert('}', LM_TC_TEX);
- }
- break;
- }
-
- case '[':
- {
- if (flags & FLAG_BRACK_ARG) {
- flags &= ~FLAG_BRACK_ARG;
- char const rg = LexGetArg('[');
- if (rg != ']') {
- mathPrintError("Expected ']'");
- panic = true;
- break;
- }
-// if (arg) strcpy(arg, yytext);
- } else
- data.insert('[', LM_TC_CONST);
- break;
- }
- case ']':
- {
- if (flags & FLAG_BRACK_END) {
- --plevel;
- return array;
- } else
- data.insert(']', LM_TC_CONST);
- break;
- }
-
- case '^':
- {
- MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
- MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
- p->setData(ar);
-// lyxerr << "UP[" << p->GetStyle() << "]" << endl;
- data.insertInset(p, LM_TC_UP);
- break;
- }
- case '_':
- {
- MathParInset * p = new MathParInset(size, "", LM_OT_SCRIPT);
- MathedArray * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
- p->setData(ar);
- data.insertInset(p, LM_TC_DOWN);
- break;
- }
-
- case LM_TK_LIMIT:
- {
- if (binset) {
- binset->SetLimits(bool(yylval.l->id));
- binset = 0;
- }
- break;
- }
-
- case '&': // Tab
- {
- if ((flags & FLAG_END) && mt && data.getCol()<mt->GetColumns() - 1) {
- data.setNumCols(mt->GetColumns());
- data.insert('T', LM_TC_TAB);
- } else
- mathPrintError("Unexpected tab");
- // debug info. [made that conditional -JMarc]
- if (lyxerr.debugging(Debug::MATHED))
- lyxerr << data.getCol() << " " << mt->GetColumns() << endl;
- break;
- }
- case LM_TK_NEWLINE:
- {
- if (mt && (flags & FLAG_END)) {
- if (mt->Permit(LMPF_ALLOW_CR)) {
- if (crow) {
- crow->setNext(new MathedRowSt(mt->GetColumns() + 1)); // this leaks
- crow = crow->getNext();
- }
- data.insert('K', LM_TC_CR);
- } else
- mathPrintError("Unexpected newline");
- }
- break;
- }
- case LM_TK_BIGSYM:
- {
- binset = new MathBigopInset(yylval.l->name, yylval.l->id);
- data.insertInset(binset, LM_TC_INSET);
- break;
- }
- case LM_TK_SYM:
- {
- if (yylval.l->id < 256) {
- MathedTextCodes tc = MathIsBOPS(yylval.l->id) ? LM_TC_BOPS: LM_TC_SYMB;
- if (accent) {
- data.insertInset(doAccent(yylval.l->id, tc), LM_TC_INSET);
- } else
- data.insert(yylval.l->id, tc);
- } else {
- MathFuncInset * bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.insertInset(doAccent(bg), LM_TC_INSET);
- } else {
-#warning This is suspisious! (Lgb)
- // it should not take a bool as second arg (Lgb)
- data.insertInset(bg, true);
- }
-
- }
- break;
- }
- case LM_TK_BOP:
- {
- if (accent) {
- data.insertInset(doAccent(yylval.i, LM_TC_BOP), LM_TC_INSET);
- } else
- data.insert(yylval.i, LM_TC_BOP);
- break;
- }
- case LM_TK_STY:
- {
- if (mt) {
- mt->UserSetSize(yylval.l->id);
- }
- break;
- }
- case LM_TK_SPACE:
- {
- if (yylval.i >= 0) {
- MathSpaceInset * sp = new MathSpaceInset(yylval.i);
- data.insertInset(sp, LM_TC_INSET);
- }
- break;
- }
- case LM_TK_DOTS:
- {
- MathDotsInset * p = new MathDotsInset(yylval.l->name, yylval.l->id);
- data.insertInset(p, LM_TC_INSET);
- break;
- }
- case LM_TK_STACK:
- fractype = LM_OT_STACKREL;
- case LM_TK_FRAC:
- {
- MathFracInset * fc = new MathFracInset(fractype);
- MathedArray * num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
- MathedArray * den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
- fc->SetData(num, den);
- data.insertInset(fc, LM_TC_ACTIVE_INSET);
- break;
- }
- case LM_TK_SQRT:
- {
- MathParInset * rt;
-
- char c; yyis->get(c);
-
- if (c == '[') {
- rt = new MathRootInset(size);
- rt->setArgumentIdx(0);
- 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));
- data.insertInset(rt, LM_TC_ACTIVE_INSET);
- break;
- }
-
- case LM_TK_LEFT:
- {
- 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 << "]";
- 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);
- data.insertInset(dl, LM_TC_ACTIVE_INSET);
-// lyxerr << "RL[" << lfd << " " << rgd << "]";
- break;
- }
- case LM_TK_RIGHT:
- {
- if (flags & FLAG_RIGHT) {
- --plevel;
- return array;
- } else {
- mathPrintError("Unmatched right delimiter");
-// panic = true;
- }
- break;
- }
-
- case LM_TK_FONT:
- {
- varcode = static_cast<MathedTextCodes>(yylval.l->id);
- yy_mtextmode = bool(varcode == LM_TC_TEXTRM);
- flags |= (FLAG_BRACE|FLAG_BRACE_FONT);
- break;
- }
- case LM_TK_WIDE:
- {
- MathDecorationInset * sq = new MathDecorationInset(yylval.l->id,
- size);
- sq->setData(mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST));
- data.insertInset(sq, LM_TC_ACTIVE_INSET);
- break;
- }
-
- case LM_TK_ACCENT:
- setAccent(yylval.l->id);
- break;
-
- case LM_TK_NONUM:
- {
- if (crow)
- crow->setNumbered(false);
- break;
- }
-
- case LM_TK_PMOD:
- case LM_TK_FUNC:
- {
-#warning This must leak. (Lgb)
- // if (accent) this must leak... (Lgb)
- MathedInset * bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.insert(t, LM_TC_CONST);
- } else
- data.insertInset(bg, LM_TC_INSET);
- break;
- }
- case LM_TK_FUNCLIM:
- {
- data.insertInset(new MathFuncInset(yylval.l->name, LM_OT_FUNCLIM),
- LM_TC_INSET);
- break;
- }
- case LM_TK_UNDEF:
- {
-
- MathMacro * p =
- MathMacroTable::mathMTable.getMacro(yylval.s);
- if (p) {
- if (accent)
- data.insertInset(doAccent(p), p->getTCode());
- else
- data.insertInset(p, p->getTCode());
- 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);
- if (accent) {
- data.insertInset(doAccent(q), LM_TC_INSET);
- } else {
- data.insertInset(q, LM_TC_INSET);
- }
- }
- break;
- }
- case LM_TK_END:
- {
- 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;
- if (mt) { // && (flags & FLAG_END)) {
- mt->setData(array);
- array = 0;
- }
- return array;
- }
- case LM_TK_BEGIN:
- {
- 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.data());
- rg = LexGetArg('{');
- }
- strcpy(ar, yytext.data());
- int const nc = parse_align(ar, ar2);
- MathParInset * mm = new MathMatrixInset(nc, 0);
- mm->SetAlign(ar2[0], ar);
- data.insertInset(mm, LM_TC_ACTIVE_INSET);
- mathed_parse(FLAG_END, mm->GetData(), &mm);
- } else if (is_eqn_type(yylval.i)) {
- if (plevel!= 0) {
- mathPrintError("Misplaced environment");
- break;
- }
- if (!mt) {
- mathPrintError("0 paragraph.");
- panic = true;
- }
-
- mathed_env = static_cast<MathedInsetTypes>(yylval.i);
- if (mathed_env != LM_OT_MIN) {
- size = LM_ST_DISPLAY;
- 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);
-// data.Insert(' ', LM_TC_TAB);
-// data.Reset();
- }
- mt->SetStyle(size);
- 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.data());
- if (p) {
- data.insertInset(p, p->getTCode());
- p->setArgumentIdx(0);
- 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");
- }
- break;
- }
-
- case LM_TK_MACRO:
- {
- MathedInset * p =
- MathMacroTable::mathMTable.getMacro(yylval.l->name);
-
- if (p) {
- if (accent) {
- data.insertInset(doAccent(p), LM_TC_INSET);
- } else
- data.insertInset(p, static_cast<MathMacro*>(p)->getTCode());
- }
- break;
- }
-
- case LM_TK_LABEL:
- {
- char const rg = LexGetArg('\0', true);
- if (rg != '}') {
- mathPrintError("Expected '{'");
- // debug info
- lyxerr << "[" << yytext.data() << "]" << endl;
- panic = true;
- break;
- }
- if (crow) {
- crow->setLabel(yytext.data());
- } else {
- mathed_label = yytext.data();
- }
-#ifdef DEBUG
- lyxerr << "Label[" << mathed_label << "]" << endl;
-#endif
- break;
- }
- default:
- mathPrintError("Unrecognized token");
- // debug info
- 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);
- } else
- t = yylex ();
-
- if ((flags & FLAG_BRACE_OPT)/* && t!= '^' && t!= '_'*/) {
- flags &= ~FLAG_BRACE_OPT;
- //data.Insert (LM_TC_CLOSE);
- break;
- }
- }
- --plevel;
- return array;