From 742ebe1f13594e6a2934992b7ddae05534a54c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Gullik=20Bj=C3=B8nnes?= Date: Thu, 8 Feb 2001 15:09:15 +0000 Subject: [PATCH] the remove reinterpret_cast patch from Andre Poenitz git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1463 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/mathed/ChangeLog | 4 + src/mathed/formula.C | 57 ++++++-------- src/mathed/math_defs.h | 2 +- src/mathed/math_delim.C | 18 +++-- src/mathed/math_draw.C | 161 ++++++++++++++++++++-------------------- src/mathed/math_iter.C | 49 ++++-------- src/mathed/math_iter.h | 2 - src/mathed/math_macro.C | 40 +++++----- src/mathed/math_write.C | 27 +++---- 9 files changed, 166 insertions(+), 194 deletions(-) diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index 904a48b660..d1d0703396 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,3 +1,7 @@ +2001-02-08 Andre Poenitz + + * several files: get rid of reinterpret_cast + 2001-02-04 Allan Rae * math_parser.C (mathed_parse): I'm sure Lars has a better fix than diff --git a/src/mathed/formula.C b/src/mathed/formula.C index 4c31c53b2a..ac6d2aa752 100644 --- a/src/mathed/formula.C +++ b/src/mathed/formula.C @@ -197,55 +197,44 @@ LyXFont mathed_get_font(short type, int size) } -int mathed_string_width(short type, int size, byte const * s, int ls) +int mathed_string_width(short type, int size, string const & s) { string st; if (MathIsBinary(type)) - for (int i = 0; i < ls; ++i) { + for (string::const_iterator it = s.begin(); it != s.end(); ++it) { st += ' '; - st += s[i]; + st += *it; st += ' '; } else - st = string(reinterpret_cast(s), ls); + st = s; LyXFont const f = WhichFont(type, size); return lyxfont::width(st, f); } -int mathed_string_width(short type, int size, string const & str) -{ - return mathed_string_width(type, size, reinterpret_cast(str.c_str()), str.length()); -} - - int mathed_char_width(short type, int size, byte c) { - int t = (MathIsBinary(type)) ? mathed_string_width(type, size, &c, 1) : - lyxfont::width(c, WhichFont(type, size)); - return t; + if (MathIsBinary(type)) { + string s; + s += c; + return mathed_string_width(type, size, s); + } + else + return lyxfont::width(c, WhichFont(type, size)); } -int mathed_string_height(short type, int size, byte const * s, - int ls, int & asc, int & des) -{ - LyXFont font = WhichFont(type, size); - asc = des = 0; - for (int i = 0; i < ls; ++i) { - des = max(des, lyxfont::descent(s[i], font)); - asc = max(asc, lyxfont::ascent(s[i], font)); - } - return asc + des; -} - - -int mathed_string_height(short type, int size, string const & str, +int mathed_string_height(short type, int size, string const & s, int & asc, int & des) { - return mathed_string_height(type, size, - reinterpret_cast(str.c_str()), str.length(), - asc, des); + LyXFont font = WhichFont(type, size); + asc = des = 0; + for (string::const_iterator it = s.begin(); it != s.end(); ++it) { + des = max(des, lyxfont::descent(*it, font)); + asc = max(asc, lyxfont::ascent(*it, font)); + } + return asc + des; } @@ -260,17 +249,17 @@ int mathed_char_height(short type, int size, byte c, int & asc, int & des) // In a near future maybe we use a better fonts renderer void MathedInset::drawStr(Painter & pain, short type, int siz, - int x, int y, byte const * s, int ls) + int x, int y, string const & s) { string st; if (MathIsBinary(type)) - for (int i = 0; i < ls; ++i) { + for (string::const_iterator it = s.begin(); it != s.end(); ++it) { st += ' '; - st += char(s[i]); + st += *it; st += ' '; } else - st = string(reinterpret_cast(s), ls); + st = s; LyXFont const mf = mathed_get_font(type, siz); pain.text(x, y, st, mf); diff --git a/src/mathed/math_defs.h b/src/mathed/math_defs.h index 06c997773b..10e49d0e53 100644 --- a/src/mathed/math_defs.h +++ b/src/mathed/math_defs.h @@ -279,7 +279,7 @@ class MathedInset { /// static int df_width; /// In a near future maybe we use a better fonts renderer than X - void drawStr(Painter &, short, int, int, int, byte const *, int); + void drawStr(Painter &, short, int, int, int, string const &); /// friend class MathedCursor; /// diff --git a/src/mathed/math_delim.C b/src/mathed/math_delim.C index be58ebd343..55bd9dbeb1 100644 --- a/src/mathed/math_delim.C +++ b/src/mathed/math_delim.C @@ -527,15 +527,17 @@ MathDecorationInset::Metrics() void MathAccentInset::draw(Painter & pain, int x, int y) { - int dw = width - 2; + int dw = width - 2; - if (inset) { - inset->draw(pain, x, y); - } else { - drawStr(pain, fn, size, x, y, &c, 1); - } - x += (code == LM_not) ? (width-dw) / 2 : 2; - mathed_draw_deco(pain, x, y - dy, dw, dh, code); + if (inset) + inset->draw(pain, x, y); + else { + string s; + s += c; + drawStr(pain, fn, size, x, y, s); + } + x += (code == LM_not) ? (width-dw) / 2 : 2; + mathed_draw_deco(pain, x, y - dy, dw, dh, code); } diff --git a/src/mathed/math_draw.C b/src/mathed/math_draw.C index 620bf06b52..8aab09c1e7 100644 --- a/src/mathed/math_draw.C +++ b/src/mathed/math_draw.C @@ -54,86 +54,89 @@ MathSpaceInset::draw(Painter & pain, int x, int y) void MathParInset::draw(Painter & pain, int x, int y) { - byte cx, cxp = 0; - int xp = 0, ls; - int asc = df_asc, des = 0; - bool limits = false; - - xo = x; yo = y; - if (!array || array->empty()) { - if (array) { - MathedXIter data(this); - data.GetPos(x, y); - } - pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); - return; - } - MathedXIter data(this); - data.GoBegin(); - while (data.OK()) { - data.GetPos(x, y); - cx = data.GetChar(); - if (cx >= ' ') { - byte * s = data.GetString(ls); - drawStr(pain, data.FCode(), size, x, y, s, ls); - mathed_char_height(LM_TC_CONST, size, 'y', asc, des); - limits = false; - } else { - if (cx == 0) break; - if (MathIsInset(cx)) { - int yy = y; - MathedInset * p = data.GetInset(); - if (cx == LM_TC_UP) { - if (limits) { x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp; - yy -= (asc + p->Descent()+4); - } else - yy -= (p->Descent()>asc) ? p->Descent()+4: asc; - } else - if (cx == LM_TC_DOWN) { - if (limits) { - x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp; - yy += des + p->Ascent() + 2; - } else - yy += des + p->Ascent()/2; - } else { - asc = p->Ascent(); - des = p->Descent(); - } - p->draw(pain, x, yy); - if (cx!= LM_TC_UP && cx!= LM_TC_DOWN) { - limits = p->GetLimits(); - if (limits) xp = p->Width(); - } - data.Next(); - } else - if (cx == LM_TC_TAB) { - if ((cxp == cx || cxp == LM_TC_CR || data.IsFirst())) { // && objtype == L - pain.rectangle(x, y - df_asc, df_width, df_asc, - LColor::mathline); - } - data.Next(); - limits = false; - } else - if (cx == LM_TC_CR) { - if (cxp == LM_TC_TAB || cxp == LM_TC_CR || data.IsFirst()) { // && objtype == LM_OT_MATRIX) { - pain.rectangle(x, y - df_asc, df_width, df_asc, - LColor::mathline); + byte cxp = 0; + int xp = 0; + int asc = df_asc, des = 0; + bool limits = false; + + xo = x; yo = y; + if (!array || array->empty()) { + if (array) { + MathedXIter data(this); + data.GetPos(x, y); } - data.Next(); - limits = false; - } - else { - lyxerr << "GMathed Error: Unrecognized code[" << cx - << "]" << endl; - break; - } - } - cxp = cx; - } - if (cxp == LM_TC_TAB || cxp == LM_TC_CR) { // && objtype == LM_OT_MATRIX) { - data.GetPos(x, y); - pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); - } + pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); + return; + } + MathedXIter data(this); + data.GoBegin(); + while (data.OK()) { + data.GetPos(x, y); + byte cx = data.GetChar(); + if (cx >= ' ') { + string s = data.GetString(); + drawStr(pain, data.FCode(), size, x, y, s); + mathed_char_height(LM_TC_CONST, size, 'y', asc, des); + limits = false; + } + else { + if (cx == 0) + break; + if (MathIsInset(cx)) { + int yy = y; + MathedInset * p = data.GetInset(); + if (cx == LM_TC_UP) { + if (limits) { + x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp; + yy -= (asc + p->Descent()+4); + } + else + yy -= (p->Descent()>asc) ? p->Descent()+4: asc; + } + else if (cx == LM_TC_DOWN) { + if (limits) { + x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp; + yy += des + p->Ascent() + 2; + } else + yy += des + p->Ascent()/2; + } + else { + asc = p->Ascent(); + des = p->Descent(); + } + p->draw(pain, x, yy); + if (cx!= LM_TC_UP && cx!= LM_TC_DOWN) { + limits = p->GetLimits(); + if (limits) + xp = p->Width(); + } + data.Next(); + } + else if (cx == LM_TC_TAB) { + if (cxp == cx || cxp == LM_TC_CR || data.IsFirst()) { + pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); + } + data.Next(); + limits = false; + } + else if (cx == LM_TC_CR) { + if (cxp == LM_TC_TAB || cxp == LM_TC_CR || data.IsFirst()) { + pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); + } + data.Next(); + limits = false; + } + else { + lyxerr << "GMathed Error: Unrecognized code[" << cx << "]" << endl; + break; + } + } + cxp = cx; + } + if (cxp == LM_TC_TAB || cxp == LM_TC_CR) { + data.GetPos(x, y); + pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline); + } } diff --git a/src/mathed/math_iter.C b/src/mathed/math_iter.C index 5b7d4bc1e6..0a1bff2d17 100644 --- a/src/mathed/math_iter.C +++ b/src/mathed/math_iter.C @@ -32,7 +32,7 @@ using std::endl; const int SizeInset = sizeof(char*) + 2; 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_string_width(short type, int style, string const & s); extern int mathed_char_height(short, int, byte, int &, int &); // the builtin memcpy() is broken in egcs and gcc 2.95.x on alpha @@ -73,27 +73,18 @@ byte MathedIter::GetChar() const } -byte * MathedIter::GetString(int & len) const -{ - if (IsFont()) { - fcode = array->bf[++pos]; - ++pos; - } - byte * s = &array->bf[pos]; - len = pos; - while (array->bf[pos] >= ' ' && pos < array->last) ++pos; - len = pos - len; - - return s; -} - string const MathedIter::GetString() const { - int ls = 0; - byte const * s = GetString(ls); - return string(reinterpret_cast(s), ls); -} + if (IsFont()) { + fcode = array->bf[++pos]; + ++pos; + } + string s; + for ( ; array->bf[pos] >= ' ' && pos < array->last; ++pos) + s += array->bf[pos]; + return s; +} MathedInset * MathedIter::GetInset() const { @@ -587,25 +578,11 @@ void MathedXIter::SetData(MathParInset * pp) } -byte * MathedXIter::GetString(int & ls) const -{ - static byte s[255]; - byte const * sxs = MathedIter::GetString(ls); - if (ls > 0) { - strncpy(reinterpret_cast(s), - reinterpret_cast(sxs), ls); - x += mathed_string_width(fcode, size, s, ls); - return &s[0]; - } - return 0; -} - - string const MathedXIter::GetString() const { - int ls; - byte const * s = GetString(ls); - return string(reinterpret_cast(s), ls); + string s = MathedIter::GetString(); + x += mathed_string_width(fcode, size, s); + return s; } diff --git a/src/mathed/math_iter.h b/src/mathed/math_iter.h index 48e8f57121..c6e89231f6 100644 --- a/src/mathed/math_iter.h +++ b/src/mathed/math_iter.h @@ -68,8 +68,6 @@ class MathedIter { /// byte GetChar() const; /// - byte * GetString(int & len) const; - /// string const GetString() const; /// MathedInset * GetInset() const; diff --git a/src/mathed/math_macro.C b/src/mathed/math_macro.C index 2ddc24d13d..e0e77fffe4 100644 --- a/src/mathed/math_macro.C +++ b/src/mathed/math_macro.C @@ -49,8 +49,8 @@ ostream & operator<<(ostream & o, MathedMacroFlag mmf) return o << int(mmf); } -extern int mathed_string_width(short type, int style, byte const* s, int ls); -extern int mathed_string_height(short, int, byte const*, int, int&, int&); +extern int mathed_string_width(short type, int style, string const & s); +extern int mathed_string_height(short, int, string const &, int &, int &); MathMacro::MathMacro(MathMacroTemplate* t): @@ -216,30 +216,28 @@ MathMacroArgument::MathMacroArgument(int n) void MathMacroArgument::draw(Painter & pain, int x, int baseline) { - if (expnd_mode) { - MathParInset::draw(pain, x, baseline); - } else { - std::ostringstream ost; - ost << '#' << number; - drawStr(pain, LM_TC_TEX, size, x, baseline, - reinterpret_cast(ost.str().c_str()), 2); - } + if (expnd_mode) { + MathParInset::draw(pain, x, baseline); + } + else { + std::ostringstream ost; + ost << '#' << number; + drawStr(pain, LM_TC_TEX, size, x, baseline, ost.str()); + } } void MathMacroArgument::Metrics() { - if (expnd_mode) { - MathParInset::Metrics(); - } else { - std::ostringstream ost; - ost << '#' << number; - width = mathed_string_width(LM_TC_TEX, size, - reinterpret_cast(ost.str().c_str()), 2); - mathed_string_height(LM_TC_TEX, size, - reinterpret_cast(ost.str().c_str()), - 2, ascent, descent); - } + if (expnd_mode) { + MathParInset::Metrics(); + } + else { + std::ostringstream ost; + ost << '#' << number; + width = mathed_string_width(LM_TC_TEX, size, ost.str()); + mathed_string_height(LM_TC_TEX, size, ost.str(), ascent, descent); + } } diff --git a/src/mathed/math_write.C b/src/mathed/math_write.C index c212f1a7fa..e0e436924d 100644 --- a/src/mathed/math_write.C +++ b/src/mathed/math_write.C @@ -192,38 +192,39 @@ void MathParInset::Write(ostream & os, bool fragile) while (data.OK()) { byte cx = data.GetChar(); if (cx >= ' ') { - int ls; - byte * s = data.GetString(ls); + string str = data.GetString(); if (data.FCode() >= LM_TC_RM && data.FCode() <= LM_TC_TEXTRM) { os << '\\' << math_font_name[data.FCode()-LM_TC_RM] << '{'; } - while (ls > 0) { + for (string::const_iterator s = str.begin(); + s != str.end(); ++s) { + byte c = *s; if (MathIsSymbol(data.FCode())) { - l = lm_get_key_by_id(*s, (data.FCode() == LM_TC_BSYM) ? + l = lm_get_key_by_id(c, (data.FCode() == LM_TC_BSYM) ? LM_TK_BIGSYM : LM_TK_SYM); if (l) { os << '\\' << l->name << ' '; - } else { - lyxerr << "Illegal symbol code[" << *s - << " " << ls << " " << data.FCode() << "]"; + } else { +#warning This does not compile (Lgb) + //lyxerr << "Illegal symbol code[" << c + // << " " << str.end() - s << " " << data.FCode() << "]"; } } else { // Is there a standard logical XOR? - if ((data.FCode() == LM_TC_TEX && *s != '{' && *s != '}') || + if ((data.FCode() == LM_TC_TEX && c != '{' && c != '}') || (data.FCode() == LM_TC_SPECIAL)) os << '\\'; else { - if (*s == '{') ++brace; - if (*s == '}') --brace; + if (c == '{') ++brace; + if (c == '}') --brace; } - if (*s == '}' && data.FCode() == LM_TC_TEX && brace < 0) + if (c == '}' && data.FCode() == LM_TC_TEX && brace < 0) lyxerr <<"Math warning: Unexpected closing brace." << endl; else - os << char(*s); + os << char(c); } - ++s; --ls; } if (data.FCode()>= LM_TC_RM && data.FCode()<= LM_TC_TEXTRM) os << '}';