*
* Dependencies: Xlib, XForms
*
- * Copyright: (c) 1996, Alejandro Aguilar Sierra
+ * Copyright: 1996, Alejandro Aguilar Sierra
*
* Version: 0.8beta.
*
#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;
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<char *>(ps_in);
+ char const * pt = static_cast<char const *>(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 {
}
byte *s = &array->bf[pos];
len = pos;
- while (array->bf[pos]>=' ' && pos<array->last) pos++;
+ while (array->bf[pos]>= ' ' && pos<array->last) pos++;
len = pos-len;
return s;
{
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<MathParInset*>(GetInset());
}
- fprintf(stderr,"Math Error: This is not an active inset\n");
+ lyxerr << "Math Error: This is not an active inset" << endl;
return 0;
}
bool MathedIter::goNextCode(MathedTextCodes code)
{
while (Next()) {
- if (array->bf[pos]==code)
+ if (array->bf[pos] == code)
return true;
}
{
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
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;
if (t != fcode) {
if (f)
array->bf[pos+shift-1] = fcode;
- if (c>=' ') {
+ if (c>= ' ') {
array->bf[pos++] = t;
fcode = t;
} else {
{
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 {
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;
// 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;
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;
}
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
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
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--;
}
}
- 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++;
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();
}
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
// MathedIter:Reset();
while (OK()) {
- if ((IsTab() && col>=ncols-1) || (IsCR() && !(MthIF_CR&flags))) {
+ if ((IsTab() && col>= ncols-1) || (IsCR() && !(MthIF_CR&flags))) {
Delete();
continue;
}
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;
}
if (IsInset()) {
MathedInset* inset = GetInset();
Next();
- if (inset->GetType()!=LM_OT_MACRO_ARG)
+ if (inset->GetType()!= LM_OT_MACRO_ARG)
delete inset;
continue;
}
}
ipop();
- if (pos2<=array->Last()) {
+ if (pos2<= array->Last()) {
pos = pos1;
join(pos2);
checkTabs();
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
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);
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<char*>(s), reinterpret_cast<const char*>(sxs), ls);
x += mathed_string_width(fcode, size, s, ls);
return &s[0];
}
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;
bool MathedXIter::Prev()
{
- if (pos==0 || (pos==1 && GetChar()>=' '))
+ if (pos == 0 || (pos == 1 && GetChar()>= ' '))
return false;
int pos2 = pos; // pos1
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 (row<rowp-1) Next();
while (x<xp && OK() && !IsCR()) {
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;
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) {
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;
}
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
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;
if (p) {
crow = p->getRowSt();
if (crow)
- for (int i=0; i<row; i++)
+ for (int i= 0; i<row; i++)
crow = crow->next;
}
}
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();
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;
// 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<pos2) {
mathed_char_height(FCode(), size, cx, asc, des);
if (asc > 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<MathParInset*>(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<MathParInset*>(pp)->GetXY(xx, des);
if (des-pp->Height()<yy && !asc)
asc = yy - (des-pp->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<pos2) Next();
+ if (pos < pos2) Next();
cxp = cx;
}
width = x - x1;
{
GoBegin();
if (!crow) {
-// fprintf(stderr, " CRW%d ", ncols);
+// lyxerr << " CRW" << ncols << " ";
crow = new MathedRowSt(ncols+1); // this leaks
}
-// fprintf(stderr, " CRW[%p] ", crow);
- MathedRowSt *row = crow;
+// lyxerr<< " CRW[" << crow << "] ";
+ MathedRowSt *mrow = crow;
while (OK()) {
if (IsCR()) {
- if (col>=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;
}