X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_iter.C;h=8968d10871d4540f2a79168fdbb57bdd4d447f53;hb=82fa210ea8d38d51aafb131f10d843e27e056429;hp=2cc8ec9213ced9a27c3d0800dfbb016c9d7c5ff9;hpb=27de1486ca34aaad446adb798d71a77d6f6304da;p=lyx.git diff --git a/src/mathed/math_iter.C b/src/mathed/math_iter.C index 2cc8ec9213..8968d10871 100644 --- a/src/mathed/math_iter.C +++ b/src/mathed/math_iter.C @@ -7,7 +7,7 @@ * * Dependencies: Xlib, XForms * - * Copyright: (c) 1996, Alejandro Aguilar Sierra + * Copyright: 1996, Alejandro Aguilar Sierra * * Version: 0.8beta. * @@ -24,7 +24,10 @@ #include "math_iter.h" #include "math_inset.h" #include "symbol_def.h" -#include "error.h" +#include "support/lstrings.h" +#include "debug.h" + +using std::endl; const int SizeInset = sizeof(char*) + 2; const int SizeFont = 2; @@ -33,10 +36,24 @@ extern int mathed_char_width(short type, int style, byte c); extern int mathed_string_width(short type, int style, byte const* s, int ls); extern int mathed_char_height(short, int, byte, int&, int&); +// the builtin memcpy() is broken in egcs and gcc 2.95.x on alpha +// stations. We provide a hand-made version instead. +inline +void my_memcpy( void * ps_in, const void * pt_in, size_t n ) +{ + char * ps = static_cast(ps_in); + char const * pt = static_cast(pt_in); + /* + for(size_t i = n; i--;) + *ps++ = *pt++; + */ + while (n--) *ps++ = *pt++; +} + void MathedIter::Reset() { - if (array->last>0 && MathIsFont(array->bf[0])) { + if (array->last > 0 && MathIsFont(array->bf[0])) { fcode = array->bf[0]; pos = 1; } else { @@ -65,7 +82,7 @@ byte* MathedIter::GetString(int& len) } byte *s = &array->bf[pos]; len = pos; - while (array->bf[pos]>=' ' && poslast) pos++; + while (array->bf[pos]>= ' ' && poslast) pos++; len = pos-len; return s; @@ -75,23 +92,24 @@ MathedInset* MathedIter::GetInset() { if (IsInset()) { MathedInset* p; - memcpy(&p, &array->bf[pos+1], sizeof(p)); + my_memcpy(&p, &array->bf[pos+1], sizeof(p)); return p; } else { - fprintf(stderr,"Math Error: This is not an inset[%d]\n", array->bf[pos]); + lyxerr << "Math Error: This is not an inset[" + << array->bf[pos] << "]" << endl; return 0; } } // An active math inset MUST be derived from MathParInset because it // must have at least one paragraph to edit -MathParInset* MathedIter::GetActiveInset() +MathParInset * MathedIter::GetActiveInset() { if (IsActive()) { - return (MathParInset*)GetInset(); + return static_cast(GetInset()); } - fprintf(stderr,"Math Error: This is not an active inset\n"); + lyxerr << "Math Error: This is not an active inset" << endl; return 0; } @@ -124,7 +142,7 @@ bool MathedIter::Next() bool MathedIter::goNextCode(MathedTextCodes code) { while (Next()) { - if (array->bf[pos]==code) + if (array->bf[pos] == code) return true; } @@ -154,32 +172,32 @@ void MathedIter::Insert(byte c, MathedTextCodes t) { if (c<' ') return; - if (t==LM_TC_TAB && col>=ncols-1) + if (t == LM_TC_TAB && col>= ncols-1) return; // Never more than one space // array->bf[pos-1] gives error from purify: // Reading 1 byte from 0x47b857 in the heap. // Address 0x47b857 is 1 byte before start of malloc'd block at 0x47b858 of 16 bytes. - if (c==' ' && (array->bf[pos]==' ' || array->bf[pos-1]==' ')) + if (c == ' ' && (array->bf[pos] == ' ' || array->bf[pos-1] == ' ')) return; - if (IsFont() && array->bf[pos]==t) { + if (IsFont() && array->bf[pos] == t) { fcode = t; pos++; } else - if (t!=fcode && pos>0 && MathIsFont(array->bf[pos-1])) { + if (t!= fcode && pos>0 && MathIsFont(array->bf[pos-1])) { pos--; int k; - for (k=pos-1; k>=0 && array->bf[k]>=' '; k--); + for (k= pos-1; k>= 0 && array->bf[k]>= ' '; k--); fcode = (k >= 0 && MathIsFont(array->bf[k])) ? array->bf[k]: -1; } short f = (array->bf[pos]<' ') ? 0: fcode; - int shift = (t==fcode) ? 1: ((f) ? 3: 2); + int shift = (t == fcode) ? 1: ((f) ? 3: 2); - if (t==LM_TC_TAB || t==LM_TC_CR) { + if (t == LM_TC_TAB || t == LM_TC_CR) { shift--; c = t; - if (t==LM_TC_CR) { + if (t == LM_TC_CR) { row++; col = 0; } else @@ -189,7 +207,7 @@ void MathedIter::Insert(byte c, MathedTextCodes t) if (pos < array->last) array->Move(pos, shift); else { - if (array->last+shift>=array->maxsize) { + if (array->last+shift>= array->maxsize) { array->Resize(array->last+shift); } array->last += shift; @@ -198,7 +216,7 @@ void MathedIter::Insert(byte c, MathedTextCodes t) if (t != fcode) { if (f) array->bf[pos+shift-1] = fcode; - if (c>=' ') { + if (c>= ' ') { array->bf[pos++] = t; fcode = t; } else { @@ -214,7 +232,7 @@ void MathedIter::split(int shift) { if (pos < array->last) { bool fg = false; - if (array->bf[pos]>=' ') { + if (array->bf[pos]>= ' ') { if (pos> 0 && MathIsFont(array->bf[pos-1])) pos--; else { @@ -225,7 +243,7 @@ void MathedIter::split(int shift) array->Move(pos, shift); if (fg) array->bf[pos+shift-1] = fcode; } else { - if (array->last+shift>=array->maxsize) { + if (array->last+shift>= array->maxsize) { array->Resize(array->last+shift); } array->last += shift; @@ -237,18 +255,18 @@ void MathedIter::split(int shift) // I assume that both pos and pos2 are legal positions void MathedIter::join(int pos2) { - if (!OK() || pos2<=pos) + if (!OK() || pos2<= pos) return; - short f=fcode; - if (pos>0 && array->bf[pos]>=' ' && MathIsFont(array->bf[pos-1])) + short f= fcode; + if (pos>0 && array->bf[pos]>= ' ' && MathIsFont(array->bf[pos-1])) pos--; if (MathIsFont(array->bf[pos2-1])) pos2--; - if (array->bf[pos2]>=' ') { - for (int p=pos2; p>0; p--) + if (array->bf[pos2]>= ' ') { + for (int p= pos2; p>0; p--) if (MathIsFont(array->bf[p])) { f = array->bf[p]; break; @@ -265,21 +283,10 @@ void MathedIter::Insert(MathedInset* p, int type) if (!MathIsInset(type)) type = LM_TC_INSET; split(shift); -// array->bf[pos] = type; -// memcpy(&array->bf[pos+1], &p, sizeof(p)); -// pos += SizeInset; -// array->bf[pos-1] = type; - { - unsigned char *pt = &array->bf[pos]; - unsigned char *ps = (unsigned char *)&p; - size_t i; - *pt++ = type; - for(i = 0; i < sizeof(p); i++) { - *pt++ = *ps++; - } - *pt = type; - } + array->bf[pos] = type; + my_memcpy(&array->bf[pos+1], &p, sizeof(p)); pos += SizeInset; + array->bf[pos-1] = type; array->bf[array->last] = '\0'; fcode = -1; } @@ -292,12 +299,12 @@ bool MathedIter::Delete() int shift = 0; byte c = GetChar(); - if (c>=' ') { + if (c>= ' ') { if (MathIsFont(array->bf[pos-1]) && array->bf[pos+1]<' ') { int i; shift = 2; pos--; - for (i=pos-1; i>0 && !MathIsFont(array->bf[i]); i--); + for (i= pos-1; i>0 && !MathIsFont(array->bf[i]); i--); if (i>0 && MathIsFont(array->bf[i])) fcode = array->bf[i]; } else @@ -306,19 +313,18 @@ bool MathedIter::Delete() if (MathIsInset(array->bf[pos])) shift = sizeof(char*) + 2; else - if (c==LM_TC_TAB || c==LM_TC_CR) { + if (c == LM_TC_TAB || c == LM_TC_CR) { shift++; -// fprintf(stderr, "Es un tab."); +// lyxerr <<"Es un tab."; } else { - fprintf(stderr, "Math Warning: expected inset."); - fflush(stderr); + lyxerr << "Math Warning: expected inset." << endl; } } - if (shift!=0) { + if (shift!= 0) { array->Move(pos+shift, -shift); - if (pos>=array->last) + if (pos>= array->last) pos = (array->last>0) ? array->last: 0; return true; } else @@ -329,20 +335,20 @@ bool MathedIter::Delete() LyxArrayBase *MathedIter::Copy(int pos1, int pos2) { if (!array) { -// fprintf(stderr, "Math error: Attempting to copy a void array.\n"); +// lyxerr << "Math error: Attempting to copy a void array." << endl; return 0; } // int posx = pos; ipush(); - LyxArrayBase *t=array, *a; + LyxArrayBase *t= array, *a; - if (pos1>0 || pos2<=array->last) { - short fc=0; + if (pos1>0 || pos2<= array->last) { + short fc= 0; if (pos1>0 && array->bf[pos1]>' ') { - for (int p=pos1; p>=0; p--) + for (int p= pos1; p>= 0; p--) if (MathIsFont(array->bf[p])) { - if (p!=pos1-1) + if (p!= pos1-1) fc = array->bf[p]; else pos1--; @@ -350,13 +356,13 @@ LyxArrayBase *MathedIter::Copy(int pos1, int pos2) } } - if (pos2>0 && array->bf[pos2]>=' ' && MathIsFont(array->bf[pos2-1])) + if (pos2>0 && array->bf[pos2]>= ' ' && MathIsFont(array->bf[pos2-1])) pos2--; int dx = pos2 - pos1; a = new LyxArrayBase(dx+LyxArrayBase::ARRAY_MIN_SIZE); -// fprintf(stderr, "VA %d %d %d ", pos1, pos2, dx); fflush(stderr); - memcpy(&a->bf[(fc) ? 1: 0], &array->bf[pos1], dx); +// lyxerr << "VA " << pos2 << " " << pos2 << " " << dx << endl; + my_memcpy(&a->bf[(fc) ? 1: 0], &array->bf[pos1], dx); if (fc) { a->bf[0] = fc; dx++; @@ -370,7 +376,7 @@ LyxArrayBase *MathedIter::Copy(int pos1, int pos2) if (IsInset()) { MathedInset* inset = GetInset(); inset = inset->Clone(); - memcpy(&array->bf[pos+1], &inset, sizeof(inset)); + my_memcpy(&array->bf[pos+1], &inset, sizeof(inset)); } Next(); } @@ -384,14 +390,14 @@ LyxArrayBase *MathedIter::Copy(int pos1, int pos2) void MathedIter::Clear() { if (!array) { - fprintf(stderr, "Math error: Attempting to clean a void array.\n"); + lyxerr << "Math error: Attempting to clean a void array." << endl; return; } Reset(); while (OK()) { if (IsInset()) { MathedInset* inset = GetInset(); - if (inset->GetType()!=LM_OT_MACRO_ARG) + if (inset->GetType()!= LM_OT_MACRO_ARG) delete inset; Delete(); } else @@ -407,7 +413,7 @@ void MathedIter::checkTabs() // MathedIter:Reset(); while (OK()) { - if ((IsTab() && col>=ncols-1) || (IsCR() && !(MthIF_CR&flags))) { + if ((IsTab() && col>= ncols-1) || (IsCR() && !(MthIF_CR&flags))) { Delete(); continue; } @@ -437,7 +443,7 @@ void MathedIter::adjustTabs() void MathedXIter::Clean(int pos2) { if (!array) { - fprintf(stderr, "Math error: Attempting to clean a void array.\n"); + lyxerr << "Math error: Attempting to clean a void array." << endl; return; } @@ -456,7 +462,7 @@ void MathedXIter::Clean(int pos2) if (IsInset()) { MathedInset* inset = GetInset(); Next(); - if (inset->GetType()!=LM_OT_MACRO_ARG) + if (inset->GetType()!= LM_OT_MACRO_ARG) delete inset; continue; } @@ -473,7 +479,7 @@ void MathedXIter::Clean(int pos2) } ipop(); - if (pos2<=array->Last()) { + if (pos2<= array->Last()) { pos = pos1; join(pos2); checkTabs(); @@ -484,8 +490,9 @@ void MathedXIter::Clean(int pos2) void MathedXIter::Merge(LyxArrayBase *a0) { if (!a0) { - lyxerr.debug("Math error: Attempting to merge a void array.", - Error::MATHED); + lyxerr[Debug::MATHED] + << "Math error: Attempting to merge a void array." << endl; + return; } // All insets must be clonned @@ -496,7 +503,7 @@ void MathedXIter::Merge(LyxArrayBase *a0) split(a->Last()); array->MergeF(a, pos, a->Last()); - int pos1=pos, pos2 = pos + a->Last(); // pos3=0; + int pos1= pos, pos2 = pos + a->Last(); // pos3= 0; goPosAbs(pos1); @@ -572,9 +579,9 @@ void MathedXIter::SetData(MathParInset *pp) byte* MathedXIter::GetString(int& ls) { static byte s[255]; - byte const *sx = MathedIter::GetString(ls); + byte const *sxs = MathedIter::GetString(ls); if (ls>0) { - strncpy((char *)s, (char const*)sx, ls); + strncpy(reinterpret_cast(s), reinterpret_cast(sxs), ls); x += mathed_string_width(fcode, size, s, ls); return &s[0]; } @@ -584,47 +591,47 @@ byte* MathedXIter::GetString(int& ls) bool MathedXIter::Next() { -// fprintf(stderr, "Ne[%d]", pos); +// lyxerr << "Ne[" << pos << "]"; if (!OK()) return false; - int w=0; -// fprintf(stderr, "xt "); + int w = 0; +// lyxerr << "xt "; if (IsInset()) { - MathedInset* px = GetInset(); + MathedInset * px = GetInset(); w = px->Width(); - if (px->GetType()==LM_OT_SCRIPT) { - if (w>sw) sw = w; + if (px->GetType() == LM_OT_SCRIPT) { + if (w > sw) sw = w; w = 0; } else - sx = (px->GetLimits()) ? w: 0; + sx = (px->GetLimits()) ? w : 0; } else { byte c = GetChar(); - if (c>=' ') { -// fprintf(stderr, "WD[%d %d %c] ", fcode, size, c); fflush(stderr); + if (c >= ' ') { +// lyxerr << "WD[" << fcode << " " << size << " " << c << endl; w = mathed_char_width(fcode, size, c); } else - if (c==LM_TC_TAB && p) { + if (c == LM_TC_TAB && p) { // w = p->GetTab(col+1); - w = (crow) ? crow->getTab(col+1): 0; - //fprintf(stderr, "WW[%d]", w); + w = (crow) ? crow->getTab(col + 1) : 0; + //lyxerr << "WW[" << w << "]"; } else - if (c==LM_TC_CR && p) { + if (c == LM_TC_CR && p) { x = 0; if (crow && crow->next) { crow = crow->next; y = crow->getBaseline(); w = crow->getTab(0); } -// fprintf(stderr, "WW[%d %d|%d]", col, row, w); +// lyxerr << "WW[" << col " " << row << "|" << w << "]"; } else - fprintf(stderr, "No hubo w[%d]!", (int)c); + lyxerr << "No hubo w[" << c << "]!"; } if (MathedIter::Next()) { -// fprintf(stderr, "LNX %d ", pos); fflush(stderr); -// if (sw>0 && GetChar()!=LM_TC_UP && GetChar()!=LM_TC_DOWN) { +// lyxerr <<"LNX " << pos << endl; +// if (sw>0 && GetChar()!= LM_TC_UP && GetChar()!= LM_TC_DOWN) { // w = (sx>sw) ? 0: sw-sx; - if ((sw>0 || sx>0) && GetChar()!=LM_TC_UP && GetChar()!=LM_TC_DOWN) { - if (sw>0) - w = (sx>sw) ? 0: sw-sx; + if ((sw > 0 || sx > 0) && GetChar() != LM_TC_UP && GetChar() != LM_TC_DOWN) { + if (sw > 0) + w = (sx > sw) ? 0 : sw - sx; sx = sw = 0; } x += w; @@ -664,7 +671,7 @@ void MathedXIter::Adjust() bool MathedXIter::Prev() { - if (pos==0 || (pos==1 && GetChar()>=' ')) + if (pos == 0 || (pos == 1 && GetChar()>= ' ')) return false; int pos2 = pos; // pos1 @@ -681,24 +688,24 @@ bool MathedXIter::Prev() bool MathedXIter::goNextColumn() { - int rowp = row, colp=col; - while (Next() && col==colp); + int rowp = row, colp= col; + while (Next() && col == colp); - return (col!=colp+1 || rowp!=row); + return (col!= colp+1 || rowp!= row); } bool MathedXIter::Up() { - if (row==0) return false; - int xp = x, rowp = row, colp=col; + if (row == 0) return false; + int xp = x, rowp = row, colp= col; GoBegin(); while (rowcolp) // || (stck.col==colp && stck.x<=xp && x>xp)) + if (col>colp) // || (stck.col == colp && stck.x<= xp && x>xp)) ipop(); return true; @@ -707,7 +714,7 @@ bool MathedXIter::Up() bool MathedXIter::Down() { - int xp = x, colp=col; // ,rowp = row + int xp = x, colp= col; // , rowp = row bool res = (IsCR()) ? true: goNextCode(LM_TC_CR); if (res) { @@ -717,7 +724,7 @@ bool MathedXIter::Down() ipush(); Next(); } - if (col>colp || (stck.col==colp && stck.x<=xp && x>xp)) + if (col>colp || (stck.col == colp && stck.x<= xp && x>xp)) ipop(); return true; } @@ -728,9 +735,9 @@ bool MathedXIter::Down() void MathedXIter::addRow() { if (!crow) { - lyxerr.debug(LString("MathErr: Attempt to insert new" - " line in a subparagraph. ") - + long(this), Error::MATHED); + lyxerr[Debug::MATHED] << "MathErr: Attempt to insert new" + " line in a subparagraph. " << this << endl; + return; } // Create new item for the structure @@ -762,8 +769,7 @@ void MathedXIter::addRow() void MathedXIter::delRow() { if (!crow) { - lyxerr.debug("MathErr: Attempt to delete a line in a subparagraph.", - Error::MATHED); + lyxerr[Debug::MATHED] << "MathErr: Attempt to delete a line in a subparagraph." << endl; return; } bool line_empty = true; @@ -810,7 +816,7 @@ void MathedXIter::ipop() if (p) { crow = p->getRowSt(); if (crow) - for (int i=0; inext; } } @@ -825,7 +831,7 @@ void MathedXIter::fitCoord(int /*xx*/, int yy) p->GetXY(xo, yo); // first fit vertically while (crow && OK()) { - if (yy>=yo+y-crow->asc && yy<= yo+y+crow->desc) + if (yy>= yo+y-crow->asc && yy<= yo+y+crow->desc) break; goNextCode(LM_TC_CR); Next(); @@ -836,18 +842,18 @@ void MathedXIter::fitCoord(int /*xx*/, int yy) void MathedXIter::setTab(int tx, int tab) { - if (crow && tab<=ncols) { + if (crow && tab<= ncols) { crow->w[tab] = tx; } else - fprintf(stderr, "MathErr: No tabs allowed here"); + lyxerr << "MathErr: No tabs allowed here" << endl; } void MathedXIter::subMetrics(int a, int d) { if (!crow) { -// fprintf(stderr, "MathErr: Attempt to submetric a subparagraph."); +// lyxerr << "MathErr: Attempt to submetric a subparagraph." << endl; return; } crow->asc = a; @@ -858,14 +864,14 @@ void MathedXIter::subMetrics(int a, int d) // This function is not recursive, as MathPar::Metrics is void MathedXIter::IMetrics(int pos2, int& width, int& ascent, int& descent) { - byte cx, cxp=0;// *s; + byte cx, cxp= 0;// *s; int x1;// ls; - int asc=0, des=0; - bool limits = false; + int asc= 0, des= 0; + bool limit = false; descent = ascent = width = 0; if (!array) return; - if (array->Empty()) return; + if (array->empty()) return; // if (pos2 > array->last) return; x1 = x; while (pos ascent) ascent = asc; if (des > descent) descent = des; - limits = false; + limit = false; } else if (MathIsInset(cx)) { MathedInset *pp = GetInset(); - if (cx==LM_TC_UP) { + if (cx == LM_TC_UP) { if (!asc && p) { int xx, yy; p->GetXY(xx, yy); - ((MathParInset*)pp)->GetXY(xx, asc); + static_cast(pp)->GetXY(xx, asc); asc = yy - asc; } asc += ((limits) ? pp->Height()+4: pp->Ascent()); } else - if (cx==LM_TC_DOWN) { + if (cx == LM_TC_DOWN) { if (!des && p) { int xx, yy; p->GetXY(xx, yy); - ((MathParInset*)pp)->GetXY(xx, des); + static_cast(pp)->GetXY(xx, des); if (des-pp->Height()Height()); des -= yy; } - des += ((limits) ? pp->Height()+4: pp->Height()-pp->Ascent()/2); + des += (limit ? pp->Height()+4: pp->Height()-pp->Ascent()/2); } else { asc = pp->Ascent(); des = pp->Descent(); } if (asc > ascent) ascent = asc; if (des > descent) descent = des; - if (cx!=LM_TC_UP && cx!=LM_TC_DOWN) - limits = pp->GetLimits(); + if (cx!= LM_TC_UP && cx!= LM_TC_DOWN) + limit = pp->GetLimits(); } else - if (cx==LM_TC_TAB) { - limits = false; + if (cx == LM_TC_TAB) { + limit = false; } else { - lyxerr.debug(LString("Mathed Sel-Error: Unrecognized code[") - + int(cx) + ']', Error::MATHED); + lyxerr[Debug::MATHED] + << "Mathed Sel-Error: Unrecognized code[" + << cx << ']' << endl; break; } - if (pos=ncols) ncols = col+1; + if (col>= ncols) ncols = col+1; MathedRowSt *r = new MathedRowSt(ncols+1); // this leaks // r->next = crow->next; crow->next = r; crow = r; -// fprintf(stderr, " CX[%p]", crow); +// lyxerr << " CX[" << crow << "]"; } Next(); } - return row; + return mrow; }