+ /* find last non-blank character on old line */
+ oLastChar = screen_columns - 1;
+ while (oLastChar > firstChar && CharEq(oldLine[oLastChar], blank))
+ oLastChar--;
+
+ /* find last non-blank character on new line */
+ nLastChar = screen_columns - 1;
+ while (nLastChar > firstChar && CharEq(newLine[nLastChar], blank))
+ nLastChar--;
+
+ if ((nLastChar == firstChar)
+ && (SP->_el_cost < (oLastChar - nLastChar))) {
+ GoTo(lineno, firstChar);
+ if (!CharEq(newLine[firstChar], blank))
+ PutChar(CHREF(newLine[firstChar]));
+ ClrToEOL(blank, FALSE);
+ } else if ((nLastChar != oLastChar)
+ && (!CharEq(newLine[nLastChar], oldLine[oLastChar])
+ || !(_nc_idcok && has_ic()))) {
+ GoTo(lineno, firstChar);
+ if ((oLastChar - nLastChar) > SP->_el_cost) {
+ if (PutRange(oldLine, newLine, lineno, firstChar, nLastChar))
+ GoTo(lineno, nLastChar + 1);
+ ClrToEOL(blank, FALSE);
+ } else {
+ n = max(nLastChar, oLastChar);
+ PutRange(oldLine, newLine, lineno, firstChar, n);
+ }
+ } else {
+ int nLastNonblank = nLastChar;
+ int oLastNonblank = oLastChar;
+
+ /* find the last characters that really differ */
+ /* can be -1 if no characters differ */
+ while (CharEq(newLine[nLastChar], oldLine[oLastChar])) {
+ /* don't split a wide char */
+ if (isWidecExt(newLine[nLastChar]) &&
+ !CharEq(newLine[nLastChar - 1], oldLine[oLastChar - 1]))
+ break;
+ nLastChar--;
+ oLastChar--;
+ if (nLastChar == -1 || oLastChar == -1)
+ break;
+ }