-
- 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 rg=LexGetArg('[');
- if (rg!=']') {
- mathPrintError("Expected ']'");
- panic = true;
- break;
- }
-// if (arg) strcpy(arg, yytext);
- } else
- data.Insert ('[');
- break;
- }
- case ']':
- {
- if (flags & FLAG_BRACK_END) {
- plevel--;
- return array;
- } else
- data.Insert (']');
- break;
- }
-
- case '^':
- {
- MathParInset *p = new MathParInset(size, "", LM_OT_SCRIPT);
- LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
- p->SetData(ar);
-// fprintf(stderr, "UP[%d]", p->GetStyle());
- data.Insert (p, LM_TC_UP);
- break;
- }
- case '_':
- {
- MathParInset *p = new MathParInset(size, "", LM_OT_SCRIPT);
- LyxArrayBase * ar = mathed_parse(FLAG_BRACE_OPT|FLAG_BRACE_LAST, 0);
- p->SetData(ar);
- data.Insert (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(Error::MATHED))
- fprintf(stderr, "%d %d\n", data.getCol(), mt->GetColumns());
- 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.Insert(binset);
- 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.Insert(doAccent(yylval.l->id, tc));
- } else
- data.Insert (yylval.l->id, tc);
- } else {
- MathFuncInset *bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.Insert(doAccent(bg));
- } else
- data.Insert(bg, true);
- }
- break;
- }
- case LM_TK_BOP:
- {
- if (accent) {
- data.Insert(doAccent(yylval.i, LM_TC_BOP));
- } 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.Insert(sp);
- }
- break;
- }
- case LM_TK_DOTS:
- {
- 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:
- {
- MathFracInset *fc = new MathFracInset(fractype);
- LyxArrayBase* num = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
- LyxArrayBase* den = mathed_parse(FLAG_BRACE|FLAG_BRACE_LAST);
- fc->SetData(num, den);
- data.Insert(fc, LM_TC_ACTIVE_INSET);
- break;
- }
- case LM_TK_SQRT:
- {
- MathParInset *rt;
-
- char c = getc(yyin);
-
- if (c=='[') {
- rt = new MathRootInset(size);
- rt->setArgumentIdx(0);
- rt->SetData(mathed_parse(FLAG_BRACK_END, 0, &rt));
- rt->setArgumentIdx(1);
- } else {
- ungetc(c, yyin);
- rt = new MathSqrtInset(size);
- }
- 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();
- 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;
-// fprintf(stderr, "L[%d %c]", lfd, lfd);
- LyxArrayBase* a = mathed_parse(FLAG_RIGHT);
- rgd=yylex();
-// fprintf(stderr, "R[%d]", 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.Insert(dl, LM_TC_ACTIVE_INSET);
-// fprintf(stderr, "RL[%d %d]", 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 = (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.Insert(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:
- {
- MathedInset *bg = new MathFuncInset(yylval.l->name);
- if (accent) {
- data.Insert(t);
- } else
- data.Insert(bg);
- break;
- }
- case LM_TK_FUNCLIM:
- {
- data.Insert(new MathFuncInset(yylval.l->name, LM_OT_FUNCLIM));
- break;
- }
- case LM_TK_UNDEF:
- {
-
- MathMacro* p =
- MathMacroTable::mathMTable.getMacro(yylval.s);
- if (p) {
- if (accent)
- 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));
- }
- else {
- MathedInset *q = new MathFuncInset(yylval.s, LM_OT_UNDEF);
- if (accent) {
- data.Insert(doAccent(q));
- } else {
- data.Insert(q);
- }
- }
- break;
- }
- case LM_TK_END:
- {
- if (mathed_env != yylval.i && yylval.i!=LM_EN_ARRAY)
- mathPrintError("Unmatched environment");
- // debug info [made that conditional -JMarc]
- if (lyxerr.debugging(Error::MATHED))
- fprintf(stderr, "[%d]\n", yylval.i);
- plevel--;
- if (mt) { // && (flags & FLAG_END)) {
- mt->SetData(array);
- array = 0;
- }
- return array;
- }
- case LM_TK_BEGIN:
- {
- if (yylval.i==LM_EN_ARRAY) {
- char ar[120], ar2[8];
- ar[0] = ar2[0] = '\0';
- char rg=LexGetArg(0);
- if (rg==']') {
- strcpy(ar2, yytext);
- rg = LexGetArg('{');
- }
- strcpy(ar, yytext);
- int 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) {
- if (plevel!=0) {
- mathPrintError("Misplaced environment");
- break;
- }
- if (!mt) {
- mathPrintError("0 paragraph.");
- panic = true;
- }
-
- mathed_env = yylval.i;
- if (mathed_env>=LM_EN_DISPLAY) {
- size = LM_ST_DISPLAY;
- if (mathed_env>LM_EN_EQUATION) {
- mt = new MathMatrixInset(3, -1);
- mt->SetAlign(' ', "rcl");
- 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
- fprintf(stderr, "MATH BEGIN[%d]\n", mathed_env);
-#endif
- } else {
-// fprintf(stderr, "MATHCRO[%s]",yytext);
- MathMacro* p =
- MathMacroTable::mathMTable.getMacro(yytext);
- 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++)
-// 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.Insert(doAccent(p));
- } else
- data.Insert(p, ((MathMacro*)p)->getTCode());
- }
- break;
- }
-
- case LM_TK_LABEL:
- {
- char rg = LexGetArg('\0', true);
- if (rg != '}') {
- mathPrintError("Expected '{'");
- // debug info
- fprintf(stderr, "[%s]\n", yytext); fflush(stderr);
- 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);
- }
-#ifdef DEBUG
- fprintf(stderr, "Label[%d]\n", mathed_label);
-#endif
- break;
- }
- default:
- mathPrintError("Unrecognized token");
- // debug info
- fprintf(stderr, "[%d %s]\n", t, yytext);
- break;
- }
- tprev = t;
- if (panic) {
- fprintf(stderr, " Math Panic, expect problems!\n");
- // 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;