riched20: Add an explicit run length member and use it rather than accessing the string length.

This commit is contained in:
Huw Davies 2013-01-31 13:48:00 +00:00 committed by Alexandre Julliard
parent f24ba125f6
commit 86f077b163
10 changed files with 79 additions and 79 deletions

View file

@ -236,7 +236,7 @@ ME_GetCursorCoordinates(ME_TextEditor *editor, ME_Cursor *pCursor,
assert(run); assert(run);
assert(run->type == diRun); assert(run->type == diRun);
sz = ME_GetRunSize(&c, &para->member.para, sz = ME_GetRunSize(&c, &para->member.para,
&run->member.run, run->member.run.strText->nLen, &run->member.run, run->member.run.len,
row->member.row.nLMargin); row->member.row.nLMargin);
} }
} }
@ -317,11 +317,11 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
/* We aren't deleting anything in this run, so we will go back to the /* We aren't deleting anything in this run, so we will go back to the
* last run we are deleting text in. */ * last run we are deleting text in. */
ME_PrevRun(&c.pPara, &c.pRun); ME_PrevRun(&c.pPara, &c.pRun);
c.nOffset = c.pRun->member.run.strText->nLen; c.nOffset = c.pRun->member.run.len;
} }
run = &c.pRun->member.run; run = &c.pRun->member.run;
if (run->nFlags & MERF_ENDPARA) { if (run->nFlags & MERF_ENDPARA) {
int eollen = c.pRun->member.run.strText->nLen; int eollen = c.pRun->member.run.len;
BOOL keepFirstParaFormat; BOOL keepFirstParaFormat;
if (!ME_FindItemFwd(c.pRun, diParagraph)) if (!ME_FindItemFwd(c.pRun, diParagraph))
@ -376,15 +376,16 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
shift -= nCharsToDelete; shift -= nCharsToDelete;
TRACE("Deleting %d (remaning %d) chars at %d in %s (%d)\n", TRACE("Deleting %d (remaning %d) chars at %d in %s (%d)\n",
nCharsToDelete, nChars, c.nOffset, nCharsToDelete, nChars, c.nOffset,
debugstr_run( run ), run->strText->nLen); debugstr_run( run ), run->len);
/* nOfs is a character offset (from the start of the document /* nOfs is a character offset (from the start of the document
to the current (deleted) run */ to the current (deleted) run */
add_undo_insert_run( editor, nOfs + nChars, get_text( run, c.nOffset ), nCharsToDelete, run->nFlags, run->style ); add_undo_insert_run( editor, nOfs + nChars, get_text( run, c.nOffset ), nCharsToDelete, run->nFlags, run->style );
TRACE("Post deletion string: %s (%d)\n", debugstr_run( run ), run->strText->nLen);
TRACE("Shift value: %d\n", shift);
ME_StrDeleteV(run->strText, c.nOffset, nCharsToDelete); ME_StrDeleteV(run->strText, c.nOffset, nCharsToDelete);
run->len -= nCharsToDelete;
TRACE("Post deletion string: %s (%d)\n", debugstr_run( run ), run->len);
TRACE("Shift value: %d\n", shift);
/* update cursors (including c) */ /* update cursors (including c) */
for (i=-1; i<editor->nCursors; i++) { for (i=-1; i<editor->nCursors; i++) {
@ -397,9 +398,9 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
else else
pThisCur->nOffset -= nCharsToDelete; pThisCur->nOffset -= nCharsToDelete;
assert(pThisCur->nOffset >= 0); assert(pThisCur->nOffset >= 0);
assert(pThisCur->nOffset <= run->strText->nLen); assert(pThisCur->nOffset <= run->len);
} }
if (pThisCur->nOffset == run->strText->nLen) if (pThisCur->nOffset == run->len)
{ {
pThisCur->pRun = ME_FindItemFwd(pThisCur->pRun, diRunOrParagraphOrEnd); pThisCur->pRun = ME_FindItemFwd(pThisCur->pRun, diRunOrParagraphOrEnd);
assert(pThisCur->pRun->type == diRun); assert(pThisCur->pRun->type == diRun);
@ -415,9 +416,9 @@ BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start,
else else
ME_PropagateCharOffset(c.pRun, shift); ME_PropagateCharOffset(c.pRun, shift);
if (!cursor.pRun->member.run.strText->nLen) if (!cursor.pRun->member.run.len)
{ {
TRACE("Removing useless run\n"); TRACE("Removing empty run\n");
ME_Remove(cursor.pRun); ME_Remove(cursor.pRun);
ME_DestroyDisplayItem(cursor.pRun); ME_DestroyDisplayItem(cursor.pRun);
} }
@ -625,7 +626,7 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
cursor->pRun = ME_FindItemBack(cursor->pRun, diRun); cursor->pRun = ME_FindItemBack(cursor->pRun, diRun);
} }
cursor->nOffset -= cursor->pRun->member.run.nCharOfs; cursor->nOffset -= cursor->pRun->member.run.nCharOfs;
} else if (cursor->nOffset >= cursor->pRun->member.run.strText->nLen) { } else if (cursor->nOffset >= cursor->pRun->member.run.len) {
ME_DisplayItem *next_para; ME_DisplayItem *next_para;
int new_offset; int new_offset;
@ -635,9 +636,9 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
{ {
/* new offset in the same paragraph */ /* new offset in the same paragraph */
do { do {
cursor->nOffset -= cursor->pRun->member.run.strText->nLen; cursor->nOffset -= cursor->pRun->member.run.len;
cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun); cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
} while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen); } while (cursor->nOffset >= cursor->pRun->member.run.len);
return nRelOfs; return nRelOfs;
} }
@ -657,9 +658,9 @@ int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
cursor->nOffset = new_offset - cursor->pPara->member.para.nCharOfs; cursor->nOffset = new_offset - cursor->pPara->member.para.nCharOfs;
cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun); cursor->pRun = ME_FindItemFwd(cursor->pPara, diRun);
while (cursor->nOffset >= cursor->pRun->member.run.strText->nLen) while (cursor->nOffset >= cursor->pRun->member.run.len)
{ {
cursor->nOffset -= cursor->pRun->member.run.strText->nLen; cursor->nOffset -= cursor->pRun->member.run.len;
cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun); cursor->pRun = ME_FindItemFwd(cursor->pRun, diRun);
} }
} /* else new offset is in the same run */ } /* else new offset is in the same run */
@ -687,7 +688,7 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
if (pOtherRun->type == diRun) if (pOtherRun->type == diRun)
{ {
if (ME_CallWordBreakProc(editor, pOtherRun->member.run.strText, if (ME_CallWordBreakProc(editor, pOtherRun->member.run.strText,
pOtherRun->member.run.strText->nLen - 1, pOtherRun->member.run.len - 1,
WB_ISDELIMITER) WB_ISDELIMITER)
&& !(pRun->member.run.nFlags & MERF_ENDPARA) && !(pRun->member.run.nFlags & MERF_ENDPARA)
&& !(cursor->pRun == pRun && cursor->nOffset == 0) && !(cursor->pRun == pRun && cursor->nOffset == 0)
@ -695,7 +696,7 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
WB_ISDELIMITER)) WB_ISDELIMITER))
break; break;
pRun = pOtherRun; pRun = pOtherRun;
nOffset = pOtherRun->member.run.strText->nLen; nOffset = pOtherRun->member.run.len;
} }
else if (pOtherRun->type == diParagraph) else if (pOtherRun->type == diParagraph)
{ {
@ -728,7 +729,7 @@ ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs)
break; break;
nOffset = ME_CallWordBreakProc(editor, pRun->member.run.strText, nOffset = ME_CallWordBreakProc(editor, pRun->member.run.strText,
nOffset, WB_MOVEWORDRIGHT); nOffset, WB_MOVEWORDRIGHT);
if (nOffset < pRun->member.run.strText->nLen) if (nOffset < pRun->member.run.len)
break; break;
pOtherRun = ME_FindItemFwd(pRun, diRunOrParagraphOrEnd); pOtherRun = ME_FindItemFwd(pRun, diRunOrParagraphOrEnd);
if (pOtherRun->type == diRun) if (pOtherRun->type == diRun)
@ -878,7 +879,7 @@ static BOOL ME_ReturnFoundPos(ME_TextEditor *editor, ME_DisplayItem *found,
rx = 0; rx = 0;
result->pRun = found; result->pRun = found;
result->nOffset = ME_CharFromPointCursor(editor, rx, &found->member.run); result->nOffset = ME_CharFromPointCursor(editor, rx, &found->member.run);
if (result->nOffset == found->member.run.strText->nLen && rx) if (result->nOffset == found->member.run.len && rx)
{ {
result->pRun = ME_FindItemFwd(result->pRun, diRun); result->pRun = ME_FindItemFwd(result->pRun, diRun);
result->nOffset = 0; result->nOffset = 0;
@ -1199,8 +1200,7 @@ static ME_DisplayItem *ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pR
if (x >= run_x && x < run_x+width) if (x >= run_x && x < run_x+width)
{ {
int ch = ME_CharFromPointCursor(editor, x-run_x, &pNext->member.run); int ch = ME_CharFromPointCursor(editor, x-run_x, &pNext->member.run);
ME_String *s = pNext->member.run.strText; if (ch < pNext->member.run.len) {
if (ch < s->nLen) {
if (pOffset) if (pOffset)
*pOffset = ch; *pOffset = ch;
return pNext; return pNext;

View file

@ -1750,7 +1750,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
/* Check to see if next character is a whitespace */ /* Check to see if next character is a whitespace */
if (flags & FR_WHOLEWORD) if (flags & FR_WHOLEWORD)
{ {
if (nCurStart + nMatched == pCurItem->member.run.strText->nLen) if (nCurStart + nMatched == pCurItem->member.run.len)
{ {
pNextItem = ME_FindItemFwd(pCurItem, diRun); pNextItem = ME_FindItemFwd(pCurItem, diRun);
nNextStart = -nMatched; nNextStart = -nMatched;
@ -1774,7 +1774,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
TRACE("found at %d-%d\n", cursor.nOffset, cursor.nOffset + nLen); TRACE("found at %d-%d\n", cursor.nOffset, cursor.nOffset + nLen);
return cursor.nOffset; return cursor.nOffset;
} }
if (nCurStart + nMatched == pCurItem->member.run.strText->nLen) if (nCurStart + nMatched == pCurItem->member.run.len)
{ {
pCurItem = ME_FindItemFwd(pCurItem, diRun); pCurItem = ME_FindItemFwd(pCurItem, diRun);
nCurStart = -nMatched; nCurStart = -nMatched;
@ -1786,7 +1786,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
wLastChar = ' '; wLastChar = ' ';
cursor.nOffset++; cursor.nOffset++;
if (cursor.nOffset == cursor.pRun->member.run.strText->nLen) if (cursor.nOffset == cursor.pRun->member.run.len)
{ {
ME_NextRun(&cursor.pPara, &cursor.pRun); ME_NextRun(&cursor.pPara, &cursor.pRun);
cursor.nOffset = 0; cursor.nOffset = 0;
@ -1815,7 +1815,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
if (nCurEnd == 0) if (nCurEnd == 0)
{ {
ME_PrevRun(&pCurPara, &pCurItem); ME_PrevRun(&pCurPara, &pCurItem);
nCurEnd = pCurItem->member.run.strText->nLen + nMatched; nCurEnd = pCurItem->member.run.len + nMatched;
} }
while (pCurItem && ME_CharCompare( *get_text( &pCurItem->member.run, nCurEnd - nMatched - 1 ), while (pCurItem && ME_CharCompare( *get_text( &pCurItem->member.run, nCurEnd - nMatched - 1 ),
@ -1839,7 +1839,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
{ {
pPrevItem = ME_FindItemBack(pCurItem, diRun); pPrevItem = ME_FindItemBack(pCurItem, diRun);
if (pPrevItem) if (pPrevItem)
nPrevEnd = pPrevItem->member.run.strText->nLen + nMatched; nPrevEnd = pPrevItem->member.run.len + nMatched;
} }
if (pPrevItem) if (pPrevItem)
@ -1866,7 +1866,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
ME_PrevRun(&pCurPara, &pCurItem); ME_PrevRun(&pCurPara, &pCurItem);
/* Don't care about pCurItem becoming NULL here; it's already taken /* Don't care about pCurItem becoming NULL here; it's already taken
* care of in the exterior loop condition */ * care of in the exterior loop condition */
nCurEnd = pCurItem->member.run.strText->nLen + nMatched; nCurEnd = pCurItem->member.run.len + nMatched;
} }
} }
if (pCurItem) if (pCurItem)
@ -1878,7 +1878,7 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
if (cursor.nOffset < 0) if (cursor.nOffset < 0)
{ {
ME_PrevRun(&cursor.pPara, &cursor.pRun); ME_PrevRun(&cursor.pPara, &cursor.pRun);
cursor.nOffset = cursor.pRun->member.run.strText->nLen; cursor.nOffset = cursor.pRun->member.run.len;
} }
} }
} }
@ -3011,7 +3011,7 @@ static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM
info.lParam = lParam; info.lParam = lParam;
cursor.nOffset = 0; cursor.nOffset = 0;
info.chrg.cpMin = ME_GetCursorOfs(&cursor); info.chrg.cpMin = ME_GetCursorOfs(&cursor);
info.chrg.cpMax = info.chrg.cpMin + cursor.pRun->member.run.strText->nLen; info.chrg.cpMax = info.chrg.cpMin + cursor.pRun->member.run.len;
ITextHost_TxNotify(editor->texthost, info.nmhdr.code, &info); ITextHost_TxNotify(editor->texthost, info.nmhdr.code, &info);
} }
} }
@ -3708,7 +3708,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
WCHAR *str = get_text( &run->member.run, 0 ); WCHAR *str = get_text( &run->member.run, 0 );
unsigned int nCopy; unsigned int nCopy;
nCopy = min(nCharsLeft, run->member.run.strText->nLen); nCopy = min(nCharsLeft, run->member.run.len);
if (unicode) if (unicode)
memcpy(dest, str, nCopy * sizeof(WCHAR)); memcpy(dest, str, nCopy * sizeof(WCHAR));
@ -3755,7 +3755,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
assert(last_para->member.run.nFlags & MERF_ENDPARA); assert(last_para->member.run.nFlags & MERF_ENDPARA);
if (editor->bEmulateVersion10 && prev_para && if (editor->bEmulateVersion10 && prev_para &&
last_para->member.run.nCharOfs == 0 && last_para->member.run.nCharOfs == 0 &&
prev_para->member.run.strText->nLen == 1 && prev_para->member.run.len == 1 &&
*get_text( &prev_para->member.run, 0 ) == '\r') *get_text( &prev_para->member.run, 0 ) == '\r')
{ {
/* In 1.0 emulation, the last solitary \r at the very end of the text /* In 1.0 emulation, the last solitary \r at the very end of the text
@ -3820,7 +3820,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
} else { } else {
ME_DisplayItem *endRun = ME_FindItemBack(item_end, diRun); ME_DisplayItem *endRun = ME_FindItemBack(item_end, diRun);
assert(endRun && endRun->member.run.nFlags & MERF_ENDPARA); assert(endRun && endRun->member.run.nFlags & MERF_ENDPARA);
nNextLineOfs = item_end->member.para.nCharOfs - endRun->member.run.strText->nLen; nNextLineOfs = item_end->member.para.nCharOfs - endRun->member.run.len;
} }
nChars = nNextLineOfs - nThisLineOfs; nChars = nNextLineOfs - nThisLineOfs;
TRACE("EM_LINELENGTH(%ld)==%d\n",wParam, nChars); TRACE("EM_LINELENGTH(%ld)==%d\n",wParam, nChars);
@ -4604,7 +4604,7 @@ int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen,
assert(pRun); assert(pRun);
pNextRun = ME_FindItemFwd(pRun, diRun); pNextRun = ME_FindItemFwd(pRun, diRun);
nLen = pRun->member.run.strText->nLen - start->nOffset; nLen = pRun->member.run.len - start->nOffset;
str = get_text( &pRun->member.run, start->nOffset ); str = get_text( &pRun->member.run, start->nOffset );
/* No '\r' is appended to the last paragraph. */ /* No '\r' is appended to the last paragraph. */
@ -4636,7 +4636,7 @@ int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen,
pRun = pNextRun; pRun = pNextRun;
pNextRun = ME_FindItemFwd(pRun, diRun); pNextRun = ME_FindItemFwd(pRun, diRun);
nLen = pRun->member.run.strText->nLen; nLen = pRun->member.run.len;
str = get_text( &pRun->member.run, 0 ); str = get_text( &pRun->member.run, 0 );
} }
*buffer = 0; *buffer = 0;
@ -4779,7 +4779,7 @@ static BOOL ME_FindNextURLCandidate(ME_TextEditor *editor,
{ {
WCHAR *strStart = get_text( &cursor.pRun->member.run, 0 ); WCHAR *strStart = get_text( &cursor.pRun->member.run, 0 );
WCHAR *str = strStart + cursor.nOffset; WCHAR *str = strStart + cursor.nOffset;
int nLen = cursor.pRun->member.run.strText->nLen - cursor.nOffset; int nLen = cursor.pRun->member.run.len - cursor.nOffset;
nChars -= nLen; nChars -= nLen;
if (~cursor.pRun->member.run.nFlags & MERF_ENDPARA) if (~cursor.pRun->member.run.nFlags & MERF_ENDPARA)
@ -4953,9 +4953,9 @@ static BOOL ME_UpdateLinkAttribute(ME_TextEditor *editor, ME_Cursor *start, int
/* Update candidateEnd since setting character formats may split /* Update candidateEnd since setting character formats may split
* runs, which can cause a cursor to be at an invalid offset within * runs, which can cause a cursor to be at an invalid offset within
* a split run. */ * a split run. */
while (candidateEnd.nOffset >= candidateEnd.pRun->member.run.strText->nLen) while (candidateEnd.nOffset >= candidateEnd.pRun->member.run.len)
{ {
candidateEnd.nOffset -= candidateEnd.pRun->member.run.strText->nLen; candidateEnd.nOffset -= candidateEnd.pRun->member.run.len;
candidateEnd.pRun = ME_FindItemFwd(candidateEnd.pRun, diRun); candidateEnd.pRun = ME_FindItemFwd(candidateEnd.pRun, diRun);
} }
modified = TRUE; modified = TRUE;

View file

@ -145,6 +145,7 @@ typedef struct tagME_Run
ME_Style *style; ME_Style *style;
struct tagME_Paragraph *para; /* ptr to the run's paragraph */ struct tagME_Paragraph *para; /* ptr to the run's paragraph */
int nCharOfs; /* relative to para's offset */ int nCharOfs; /* relative to para's offset */
int len; /* length of run's text */
int nWidth; /* width of full run, width of leading&trailing ws */ int nWidth; /* width of full run, width of leading&trailing ws */
int nFlags; int nFlags;
int nAscent, nDescent; /* pixels above/below baseline */ int nAscent, nDescent; /* pixels above/below baseline */

View file

@ -425,7 +425,7 @@ static void ME_DrawRun(ME_Context *c, int x, int y, ME_DisplayItem *rundi, ME_Pa
{ {
if (c->editor->cPasswordMask) if (c->editor->cPasswordMask)
{ {
ME_String *szMasked = ME_MakeStringR(c->editor->cPasswordMask, run->strText->nLen); ME_String *szMasked = ME_MakeStringR(c->editor->cPasswordMask, run->len);
ME_DrawTextWithStyle(c, x, y, ME_DrawTextWithStyle(c, x, y,
szMasked->szData, szMasked->nLen, run->style, run->nWidth, szMasked->szData, szMasked->nLen, run->style, run->nWidth,
nSelFrom-runofs,nSelTo-runofs, nSelFrom-runofs,nSelTo-runofs,
@ -435,7 +435,7 @@ static void ME_DrawRun(ME_Context *c, int x, int y, ME_DisplayItem *rundi, ME_Pa
} }
else else
ME_DrawTextWithStyle(c, x, y, ME_DrawTextWithStyle(c, x, y,
get_text( run, 0 ), run->strText->nLen, run->style, run->nWidth, get_text( run, 0 ), run->len, run->style, run->nWidth,
nSelFrom-runofs,nSelTo-runofs, nSelFrom-runofs,nSelTo-runofs,
c->pt.y + para->pt.y + start->member.row.pt.y, c->pt.y + para->pt.y + start->member.row.pt.y,
start->member.row.nHeight); start->member.row.nHeight);

View file

@ -341,7 +341,7 @@ ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp,
assert(pRun->type == diRun); assert(pRun->type == diRun);
assert(pRun->member.run.nFlags & MERF_ENDPARA); assert(pRun->member.run.nFlags & MERF_ENDPARA);
end_len = pRun->member.run.strText->nLen; end_len = pRun->member.run.len;
/* null char format operation to store the original char format for the ENDPARA run */ /* null char format operation to store the original char format for the ENDPARA run */
ME_InitCharFormat2W(&fmt); ME_InitCharFormat2W(&fmt);

View file

@ -123,12 +123,12 @@ void ME_CheckCharOffsets(ME_TextEditor *editor)
case diRun: case diRun:
TRACE_(richedit_check)("run, real ofs = %d (+ofsp = %d), counted = %d, len = %d, txt = %s, flags=%08x, fx&mask = %08x\n", TRACE_(richedit_check)("run, real ofs = %d (+ofsp = %d), counted = %d, len = %d, txt = %s, flags=%08x, fx&mask = %08x\n",
p->member.run.nCharOfs, p->member.run.nCharOfs+ofsp, ofsp+ofs, p->member.run.nCharOfs, p->member.run.nCharOfs+ofsp, ofsp+ofs,
p->member.run.strText->nLen, debugstr_run( &p->member.run ), p->member.run.len, debugstr_run( &p->member.run ),
p->member.run.nFlags, p->member.run.nFlags,
p->member.run.style->fmt.dwMask & p->member.run.style->fmt.dwEffects); p->member.run.style->fmt.dwMask & p->member.run.style->fmt.dwEffects);
assert(ofs == p->member.run.nCharOfs); assert(ofs == p->member.run.nCharOfs);
assert(p->member.run.strText->nLen); assert(p->member.run.len);
ofs += p->member.run.strText->nLen; ofs += p->member.run.len;
break; break;
case diCell: case diCell:
TRACE_(richedit_check)("cell\n"); TRACE_(richedit_check)("cell\n");
@ -226,11 +226,12 @@ void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p)
for (i=0; i<editor->nCursors; i++) { for (i=0; i<editor->nCursors; i++) {
if (editor->pCursors[i].pRun == pNext) { if (editor->pCursors[i].pRun == pNext) {
editor->pCursors[i].pRun = p; editor->pCursors[i].pRun = p;
editor->pCursors[i].nOffset += p->member.run.strText->nLen; editor->pCursors[i].nOffset += p->member.run.len;
} }
} }
ME_AppendString(p->member.run.strText, pNext->member.run.strText); ME_AppendString(p->member.run.strText, pNext->member.run.strText);
p->member.run.len += pNext->member.run.len;
ME_Remove(pNext); ME_Remove(pNext);
ME_DestroyDisplayItem(pNext); ME_DestroyDisplayItem(pNext);
ME_UpdateRunFlags(editor, &p->member.run); ME_UpdateRunFlags(editor, &p->member.run);
@ -308,7 +309,7 @@ ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_Cursor *cursor)
new_run = ME_MakeRun(run->member.run.style, new_run = ME_MakeRun(run->member.run.style,
ME_VSplitString(run->member.run.strText, nOffset), ME_VSplitString(run->member.run.strText, nOffset),
run->member.run.nFlags & MERF_SPLITMASK); run->member.run.nFlags & MERF_SPLITMASK);
run->member.run.len = nOffset;
new_run->member.run.nCharOfs = run->member.run.nCharOfs + nOffset; new_run->member.run.nCharOfs = run->member.run.nCharOfs + nOffset;
new_run->member.run.para = run->member.run.para; new_run->member.run.para = run->member.run.para;
cursor->pRun = new_run; cursor->pRun = new_run;
@ -342,6 +343,7 @@ ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags)
item->member.run.strText = strData; item->member.run.strText = strData;
item->member.run.nFlags = nFlags; item->member.run.nFlags = nFlags;
item->member.run.nCharOfs = -1; item->member.run.nCharOfs = -1;
item->member.run.len = strData->nLen;
item->member.run.para = NULL; item->member.run.para = NULL;
ME_AddRefStyle(s); ME_AddRefStyle(s);
return item; return item;
@ -379,10 +381,10 @@ ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor, ME_Style *style,
static BOOL run_is_splittable( const ME_Run *run ) static BOOL run_is_splittable( const ME_Run *run )
{ {
WCHAR *str = get_text( run, 0 ), *p; WCHAR *str = get_text( run, 0 ), *p;
int i, len = run->strText->nLen; int i;
BOOL found_ink = FALSE; BOOL found_ink = FALSE;
for (i = 0, p = str; i < len; i++, p++) for (i = 0, p = str; i < run->len; i++, p++)
{ {
if (ME_IsWSpace( *p )) if (ME_IsWSpace( *p ))
{ {
@ -397,9 +399,9 @@ static BOOL run_is_splittable( const ME_Run *run )
static BOOL run_is_entirely_ws( const ME_Run *run ) static BOOL run_is_entirely_ws( const ME_Run *run )
{ {
WCHAR *str = get_text( run, 0 ), *p; WCHAR *str = get_text( run, 0 ), *p;
int i, len = run->strText->nLen; int i;
for (i = 0, p = str; i < len; i++, p++) for (i = 0, p = str; i < run->len; i++, p++)
if (!ME_IsWSpace( *p )) return FALSE; if (!ME_IsWSpace( *p )) return FALSE;
return TRUE; return TRUE;
@ -439,7 +441,7 @@ void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run)
else else
run->nFlags &= ~MERF_STARTWHITE; run->nFlags &= ~MERF_STARTWHITE;
if (ME_IsWSpace( *get_text( run, run->strText->nLen - 1 ) )) if (ME_IsWSpace( *get_text( run, run->len - 1 ) ))
run->nFlags |= MERF_ENDWHITE; run->nFlags |= MERF_ENDWHITE;
else else
run->nFlags &= ~MERF_ENDWHITE; run->nFlags &= ~MERF_ENDWHITE;
@ -461,7 +463,7 @@ int ME_CharFromPoint(ME_Context *c, int cx, ME_Run *run)
int fit = 0; int fit = 0;
HGDIOBJ hOldFont; HGDIOBJ hOldFont;
SIZE sz; SIZE sz;
if (!run->strText->nLen || cx <= 0) if (!run->len || cx <= 0)
return 0; return 0;
if (run->nFlags & MERF_TAB || if (run->nFlags & MERF_TAB ||
@ -483,14 +485,14 @@ int ME_CharFromPoint(ME_Context *c, int cx, ME_Run *run)
if (c->editor->cPasswordMask) if (c->editor->cPasswordMask)
{ {
ME_String *strMasked = ME_MakeStringR(c->editor->cPasswordMask, run->strText->nLen); ME_String *strMasked = ME_MakeStringR(c->editor->cPasswordMask, run->len);
GetTextExtentExPointW(c->hDC, strMasked->szData, run->strText->nLen, GetTextExtentExPointW(c->hDC, strMasked->szData, run->len,
cx, &fit, NULL, &sz); cx, &fit, NULL, &sz);
ME_DestroyString(strMasked); ME_DestroyString(strMasked);
} }
else else
{ {
GetTextExtentExPointW(c->hDC, get_text( run, 0 ), run->strText->nLen, GetTextExtentExPointW(c->hDC, get_text( run, 0 ), run->len,
cx, &fit, NULL, &sz); cx, &fit, NULL, &sz);
} }
@ -514,11 +516,11 @@ int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run)
{ {
ME_String *mask_text = NULL; ME_String *mask_text = NULL;
WCHAR *str; WCHAR *str;
int fit = 0, len; int fit = 0;
ME_Context c; ME_Context c;
HGDIOBJ hOldFont; HGDIOBJ hOldFont;
SIZE sz, sz2, sz3; SIZE sz, sz2, sz3;
if (!run->strText->nLen || cx <= 0) if (!run->len || cx <= 0)
return 0; return 0;
if (run->nFlags & (MERF_TAB | MERF_ENDCELL)) if (run->nFlags & (MERF_TAB | MERF_ENDCELL))
@ -538,19 +540,18 @@ int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run)
return 1; return 1;
} }
len = run->strText->nLen;
if (editor->cPasswordMask) if (editor->cPasswordMask)
{ {
mask_text = ME_MakeStringR( editor->cPasswordMask, len ); mask_text = ME_MakeStringR( editor->cPasswordMask, run->len );
str = mask_text->szData; str = mask_text->szData;
} }
else else
str = get_text( run, 0 ); str = get_text( run, 0 );
hOldFont = ME_SelectStyleFont(&c, run->style); hOldFont = ME_SelectStyleFont(&c, run->style);
GetTextExtentExPointW(c.hDC, str, len, GetTextExtentExPointW(c.hDC, str, run->len,
cx, &fit, NULL, &sz); cx, &fit, NULL, &sz);
if (fit != len) if (fit != run->len)
{ {
GetTextExtentPoint32W(c.hDC, str, fit, &sz2); GetTextExtentPoint32W(c.hDC, str, fit, &sz2);
GetTextExtentPoint32W(c.hDC, str, fit + 1, &sz3); GetTextExtentPoint32W(c.hDC, str, fit + 1, &sz3);
@ -595,7 +596,6 @@ int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset)
ME_Context c; ME_Context c;
ME_String *mask_text = NULL; ME_String *mask_text = NULL;
WCHAR *str; WCHAR *str;
int len;
ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost)); ME_InitContext(&c, editor, ITextHost_TxGetDC(editor->texthost));
if (pRun->nFlags & MERF_GRAPHICS) if (pRun->nFlags & MERF_GRAPHICS)
@ -608,16 +608,15 @@ int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset)
nOffset = 0; nOffset = 0;
} }
len = pRun->strText->nLen;
if (editor->cPasswordMask) if (editor->cPasswordMask)
{ {
mask_text = ME_MakeStringR(editor->cPasswordMask, len); mask_text = ME_MakeStringR(editor->cPasswordMask, pRun->len);
str = mask_text->szData; str = mask_text->szData;
} }
else else
str = get_text( pRun, 0 ); str = get_text( pRun, 0 );
ME_GetTextExtent(&c, str, nOffset, pRun->style, &size); ME_GetTextExtent(&c, str, nOffset, pRun->style, &size);
ME_DestroyContext(&c); ME_DestroyContext(&c);
ME_DestroyString( mask_text ); ME_DestroyString( mask_text );
return size.cx; return size.cx;
@ -633,7 +632,7 @@ static SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run
int startx, int *pAscent, int *pDescent) int startx, int *pAscent, int *pDescent)
{ {
SIZE size; SIZE size;
int nMaxLen = run->strText->nLen; int nMaxLen = run->len;
if (nLen>nMaxLen) if (nLen>nMaxLen)
nLen = nMaxLen; nLen = nMaxLen;
@ -726,7 +725,7 @@ void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Ru
run->nWidth = 0; run->nWidth = 0;
else else
{ {
int nEnd = run->strText->nLen; int nEnd = run->len;
SIZE size = ME_GetRunSizeCommon(c, para, run, nEnd, startx, SIZE size = ME_GetRunSizeCommon(c, para, run, nEnd, startx,
&run->nAscent, &run->nDescent); &run->nAscent, &run->nDescent);
run->nWidth = size.cx; run->nWidth = size.cx;
@ -806,7 +805,7 @@ void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, C
/* ME_DumpStyle(new_style); */ /* ME_DumpStyle(new_style); */
add_undo_set_char_fmt( editor, para->member.para.nCharOfs + run->member.run.nCharOfs, add_undo_set_char_fmt( editor, para->member.para.nCharOfs + run->member.run.nCharOfs,
run->member.run.strText->nLen, &run->member.run.style->fmt ); run->member.run.len, &run->member.run.style->fmt );
ME_ReleaseStyle(run->member.run.style); ME_ReleaseStyle(run->member.run.style);
run->member.run.style = new_style; run->member.run.style = new_style;
run = ME_FindItemFwd(run, diRunOrParagraph); run = ME_FindItemFwd(run, diRunOrParagraph);

View file

@ -305,7 +305,7 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nC
- end_para->member.para.nCharOfs; - end_para->member.para.nCharOfs;
if (remaining) if (remaining)
{ {
assert(remaining < c2.pRun->member.run.strText->nLen); assert(remaining < c2.pRun->member.run.len);
end_para = end_para->member.para.next_para; end_para = end_para->member.para.next_para;
} }
} }
@ -353,7 +353,7 @@ void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nC
{ {
ME_Run *end_run = &ME_FindItemBack(next_para, diRun)->member.run; ME_Run *end_run = &ME_FindItemBack(next_para, diRun)->member.run;
int nCharsNew = (next_para->member.para.nCharOfs - nOfs int nCharsNew = (next_para->member.para.nCharOfs - nOfs
- end_run->strText->nLen); - end_run->len);
nCharsNew = max(nCharsNew, 0); nCharsNew = max(nCharsNew, 0);
assert(nCharsNew <= *nChars); assert(nCharsNew <= *nChars);
*nChars = nCharsNew; *nChars = nCharsNew;

View file

@ -187,7 +187,7 @@ BOOL add_undo_split_para( ME_TextEditor *editor, const ME_Paragraph *para, const
struct undo_item *undo = add_undo( editor, undo_split_para ); struct undo_item *undo = add_undo( editor, undo_split_para );
if (!undo) return FALSE; if (!undo) return FALSE;
undo->u.split_para.pos = para->nCharOfs - run->strText->nLen; undo->u.split_para.pos = para->nCharOfs - run->len;
undo->u.split_para.eol_str = ME_StrDup( run->strText ); undo->u.split_para.eol_str = ME_StrDup( run->strText );
undo->u.split_para.fmt = *para->pFmt; undo->u.split_para.fmt = *para->pFmt;
undo->u.split_para.border = para->border; undo->u.split_para.border = para->border;

View file

@ -111,7 +111,7 @@ static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd)
/* Exclude space characters from run width. /* Exclude space characters from run width.
* Other whitespace or delimiters are not treated this way. */ * Other whitespace or delimiters are not treated this way. */
SIZE sz; SIZE sz;
int len = p->member.run.strText->nLen; int len = p->member.run.len;
WCHAR *text = get_text( &p->member.run, len - 1 ); WCHAR *text = get_text( &p->member.run, len - 1 );
assert (len); assert (len);
@ -120,7 +120,7 @@ static void ME_InsertRowStart(ME_WrapContext *wc, const ME_DisplayItem *pEnd)
len--; len--;
if (len) if (len)
{ {
if (len == p->member.run.strText->nLen) if (len == p->member.run.len)
{ {
width += p->member.run.nWidth; width += p->member.run.nWidth;
} else { } else {
@ -233,7 +233,7 @@ static ME_DisplayItem *ME_MaximizeSplit(ME_WrapContext *wc, ME_DisplayItem *p, i
if (piter->member.run.nFlags & MERF_ENDWHITE) if (piter->member.run.nFlags & MERF_ENDWHITE)
{ {
i = ME_ReverseFindNonWhitespaceV(piter->member.run.strText, i = ME_ReverseFindNonWhitespaceV(piter->member.run.strText,
piter->member.run.strText->nLen); piter->member.run.len);
pp = ME_SplitRun(wc, piter, i); pp = ME_SplitRun(wc, piter, i);
wc->pt = pp->member.run.pt; wc->pt = pp->member.run.pt;
return pp; return pp;
@ -256,7 +256,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem
ME_Run *run = &p->member.run; ME_Run *run = &p->member.run;
idesp = i = ME_CharFromPoint(wc->context, loc, run); idesp = i = ME_CharFromPoint(wc->context, loc, run);
len = run->strText->nLen; len = run->len;
assert(len>0); assert(len>0);
assert(i<len); assert(i<len);
if (i) { if (i) {
@ -283,7 +283,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem
piter = wc->pLastSplittableRun; piter = wc->pLastSplittableRun;
run = &piter->member.run; run = &piter->member.run;
len = run->strText->nLen; len = run->len;
/* don't split words */ /* don't split words */
i = ME_ReverseFindWhitespaceV(run->strText, len); i = ME_ReverseFindWhitespaceV(run->strText, len);
if (i == len) if (i == len)
@ -340,7 +340,7 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p)
run->pt.x = wc->pt.x; run->pt.x = wc->pt.x;
run->pt.y = wc->pt.y; run->pt.y = wc->pt.y;
ME_WrapSizeRun(wc, p); ME_WrapSizeRun(wc, p);
len = run->strText->nLen; len = run->len;
if (wc->bOverflown) /* just skipping final whitespaces */ if (wc->bOverflown) /* just skipping final whitespaces */
{ {

View file

@ -870,7 +870,7 @@ static BOOL ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream,
return FALSE; return FALSE;
} }
/* Skip as many characters as required by current line break */ /* Skip as many characters as required by current line break */
nChars = max(0, nChars - cursor.pRun->member.run.strText->nLen); nChars = max(0, nChars - cursor.pRun->member.run.len);
} else if (cursor.pRun->member.run.nFlags & MERF_ENDROW) { } else if (cursor.pRun->member.run.nFlags & MERF_ENDROW) {
if (!ME_StreamOutPrint(pStream, "\\line \r\n")) if (!ME_StreamOutPrint(pStream, "\\line \r\n"))
return FALSE; return FALSE;
@ -884,7 +884,7 @@ static BOOL ME_StreamOutRTF(ME_TextEditor *editor, ME_OutStream *pStream,
if (!ME_StreamOutRTFCharProps(pStream, &cursor.pRun->member.run.style->fmt)) if (!ME_StreamOutRTFCharProps(pStream, &cursor.pRun->member.run.style->fmt))
return FALSE; return FALSE;
nEnd = (cursor.pRun == endCur.pRun) ? endCur.nOffset : cursor.pRun->member.run.strText->nLen; nEnd = (cursor.pRun == endCur.pRun) ? endCur.nOffset : cursor.pRun->member.run.len;
if (!ME_StreamOutRTFText(pStream, get_text( &cursor.pRun->member.run, cursor.nOffset ), if (!ME_StreamOutRTFText(pStream, get_text( &cursor.pRun->member.run, cursor.nOffset ),
nEnd - cursor.nOffset)) nEnd - cursor.nOffset))
return FALSE; return FALSE;
@ -919,7 +919,7 @@ static BOOL ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream,
/* TODO: Handle SF_TEXTIZED */ /* TODO: Handle SF_TEXTIZED */
while (success && nChars && cursor.pRun) { while (success && nChars && cursor.pRun) {
nLen = min(nChars, cursor.pRun->member.run.strText->nLen - cursor.nOffset); nLen = min(nChars, cursor.pRun->member.run.len - cursor.nOffset);
if (!editor->bEmulateVersion10 && cursor.pRun->member.run.nFlags & MERF_ENDPARA) if (!editor->bEmulateVersion10 && cursor.pRun->member.run.nFlags & MERF_ENDPARA)
{ {