From ec2fa5bb786eb63110249c345820e2e7e21a74a1 Mon Sep 17 00:00:00 2001 From: Liang Chang Date: Sat, 29 Jan 2022 21:21:01 +0800 Subject: [PATCH] dtinfo: fix a highlighting issue. --- .../dtinfo/dtinfo/src/Basic/NodeViewInfo.C | 111 +++++++++++++----- .../dtinfo/src/OnlineRender/CanvasRenderer.C | 26 ++-- .../src/UAS/DtSR/DtSR_SearchResultsEntry.C | 26 ++-- 3 files changed, 104 insertions(+), 59 deletions(-) diff --git a/cde/programs/dtinfo/dtinfo/src/Basic/NodeViewInfo.C b/cde/programs/dtinfo/dtinfo/src/Basic/NodeViewInfo.C index b50964cf8..4f555326b 100644 --- a/cde/programs/dtinfo/dtinfo/src/Basic/NodeViewInfo.C +++ b/cde/programs/dtinfo/dtinfo/src/Basic/NodeViewInfo.C @@ -256,31 +256,40 @@ DtCvStrVccToIndex(_DtCvSegment* seg, unsigned int vcc) if (seg->type & _DtCvWIDE_CHAR) { wchar_t* seg_str = (wchar_t*)seg->handle.string.string; for (; *seg_str && rel_vcc > 0; seg_str++, index++) { - if (*seg_str != ' ' && *seg_str != '\t' && *seg_str != '\n') + if (!isspace(*seg_str)) rel_vcc--; } if (*seg_str == 0 && rel_vcc > 0) index = (unsigned int)-1; else { for (; *seg_str; seg_str++, index++) { - if (*seg_str != ' ' && *seg_str != '\t' && *seg_str != '\n') + if (!isspace(*seg_str)) break; } } } else { unsigned char* seg_str = (unsigned char*)seg->handle.string.string; - for (; *seg_str && rel_vcc > 0; seg_str++, index++) { - if (*seg_str != ' ' && *seg_str != '\t' && - *seg_str != '\n' && *seg_str != 0xA0) + while (*seg_str && rel_vcc > 0) { + if (!isspace(*seg_str)) rel_vcc--; + + int mbl = mblen((char *) seg_str, MB_CUR_MAX); + + if (mbl < 0) { + ++seg_str; + ++index; + } + else { + seg_str += mbl; + index += mbl; + } } if (*seg_str == 0 && rel_vcc > 0) index = (unsigned int)-1; else { for (; *seg_str; seg_str++, index++) { - if (*seg_str != ' ' && *seg_str != '\t' && - *seg_str != '\n' && *seg_str != 0xA0) + if (!isspace(*seg_str)) break; } } @@ -301,16 +310,20 @@ DtCvStrVcLenSync(_DtCvSegment* seg) if (seg->type & _DtCvWIDE_CHAR) { wchar_t* seg_str = (wchar_t*)seg->handle.string.string; for (; *seg_str; seg_str++) { - if (*seg_str != ' ' && *seg_str != '\t' && *seg_str != '\n') + if (!isspace(*seg_str)) vclen++; } } else { unsigned char* seg_str = (unsigned char*)seg->handle.string.string; - for (; *seg_str; seg_str++) { - if (*seg_str != ' ' && *seg_str != '\t' && - *seg_str != '\n' && *seg_str != 0xA0) + while (*seg_str) { + if (!isspace(*seg_str)) vclen++; + + int mbl = mblen((char *) seg_str, MB_CUR_MAX); + + if (mbl < 0) ++seg_str; + else seg_str += mbl; } } @@ -459,15 +472,16 @@ chop_segment(_DtCvSegment* seg, unsigned int nc) // the segment to be highlighted _DtCvSegment* -highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) +highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int vlen) { if (seg == NULL || (seg->type & _DtCvPRIMARY_MASK) != _DtCvSTRING) return NULL; - if (len <= 0) + if (vlen <= 0) return NULL; unsigned int seg_vcc = DtCvStrVcc(seg); + unsigned int seg_vc_len = DtCvStrVcLen(seg); unsigned int seg_nc = DtCvStrLen(seg); if (vcc < seg_vcc) // vcc falls short @@ -480,17 +494,22 @@ highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) if (nseg_nc == (unsigned int)-1) // vcc is beyond segment return NULL; + unsigned int rel_vcc = vcc - ((SegClientData*)seg->client_use)->vcc(); + #ifdef DEBUG - fprintf(stderr, "(DEBUG) vcc=%d, index=%d, clen=%d\n", vcc, nseg_nc, len); + fprintf(stderr, "(DEBUG) vcc=%d, index=%d, vlen=%d\n", vcc, nseg_nc, vlen); #endif - if (len == 0) + if (vlen == 0) return NULL; - else if (seg_vcc == vcc && seg_nc == len) + else if (seg_vcc == vcc && seg_vc_len == vlen) return seg; - if (len > seg_nc - nseg_nc) { // len goes beyond this segment + unsigned int len = 0; + + if (vlen > seg_vc_len - rel_vcc) { // vlen goes beyond this segment if (seg->next_seg == NULL) { + vlen = seg_vc_len - rel_vcc; len = seg_nc - nseg_nc; } else { @@ -499,6 +518,7 @@ highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) if (type != _DtCvSTRING || sibling->client_use == NULL || DtCvStrVcc(sibling) == (unsigned int)-1 || (seg->type & _DtCvWIDE_CHAR) != (sibling->type & _DtCvWIDE_CHAR)) { + vlen = seg_vc_len - rel_vcc; len = seg_nc - nseg_nc; } else { // let's merge segments @@ -510,23 +530,23 @@ highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) if (widec) { wchar_t* src = (wchar_t*)sibling->handle.string.string; wchar_t* dst = (wchar_t*)seg->handle.string.string; - int slen = wcslen(dst); - int len = wcslen(src); + int dlen = wcslen(dst); + int slen = wcslen(src); seg->handle.string.string = (void*) realloc(seg->handle.string.string, - sizeof(wchar_t) * (slen + len + 1)); + sizeof(wchar_t) * (dlen + slen + 1)); dst = (wchar_t*)seg->handle.string.string; - *((char *) memcpy(dst + slen, src, len) + len) = '\0'; + *((char *) memcpy(dst + dlen, src, slen) + slen) = '\0'; } else { char* src = (char*)sibling->handle.string.string; char* dst = (char*)seg->handle.string.string; - int slen = strlen(dst); - int len = strlen(src); + int dlen = strlen(dst); + int slen = strlen(src); seg->handle.string.string = (void*) - realloc(seg->handle.string.string, slen + len + 1); + realloc(seg->handle.string.string, dlen + slen + 1); dst = (char*)seg->handle.string.string; - *((char *) memcpy(dst + slen, src, len) + len) = '\0'; + *((char *) memcpy(dst + dlen, src, slen) + slen) = '\0'; } DtCvStrVcLenSync(seg); @@ -539,7 +559,44 @@ highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) // NOTE: sibling is kept (i.e. not deleted) // this fact may cause problems in next highlight_search_hit - return highlight_search_hit(seg, vcc, len); + return highlight_search_hit(seg, vcc, vlen); + } + } + } + else if (vlen < seg_vc_len - rel_vcc) { + if (widec) len = vlen; + else { + unsigned char *seg_str = (unsigned char*)seg->handle.string.string; + + for (int i = 0; i < rel_vcc; ++i) { + if (isspace(*seg_str)) { + ++seg_str; + continue; + } + + int mbl = mblen((char *) seg_str, MB_CUR_MAX); + + if (mbl < 0) ++seg_str; + else seg_str += mbl; + } + + for (int i = 0; i < vlen; ++i) { + if (isspace(*seg_str)) { + ++seg_str; + ++len; + continue; + } + + int mbl = mblen((char *) seg_str, MB_CUR_MAX); + + if (mbl < 0) { + ++seg_str; + ++len; + } + else { + seg_str += mbl; + len += mbl; + } } } } @@ -563,7 +620,7 @@ highlight_search_hit(_DtCvSegment* seg, unsigned int vcc, unsigned int len) return NULL; } - if (len != seg_nc - nseg_nc) + if (vlen != seg_vc_len - rel_vcc) chop_segment(seg, len); return seg; diff --git a/cde/programs/dtinfo/dtinfo/src/OnlineRender/CanvasRenderer.C b/cde/programs/dtinfo/dtinfo/src/OnlineRender/CanvasRenderer.C index 568ce281e..ff7aa8072 100644 --- a/cde/programs/dtinfo/dtinfo/src/OnlineRender/CanvasRenderer.C +++ b/cde/programs/dtinfo/dtinfo/src/OnlineRender/CanvasRenderer.C @@ -1282,10 +1282,7 @@ CanvasRenderer::handle_olias_attributes(ElementFeatures &features, assert( mb_len > 0 ); if (mb_len == 1) { const unsigned char ch = (unsigned char)*p++; - if (ch == ' ' || // space - ch == '\t' || // tab - ch == '\n' || // newline - ch == 0xA0) // nbsp + if (isspace(ch)) continue; } else @@ -1296,10 +1293,7 @@ CanvasRenderer::handle_olias_attributes(ElementFeatures &features, #else while (*p) { - if (!((*p == ' ') || // space - (*p == ' ') || // tab - (*p == '\n') || // newline - (*p == (char)0xA0))) // nbsp + if (!isspace(*p)) { vcc++ ; } @@ -1679,15 +1673,21 @@ CanvasRenderer::really_insert_string (_DtCvSegment *container, if (strseg->type & _DtCvWIDE_CHAR) { wchar_t *p; for (p = (wchar_t*)string; *p; p++) { - if (*p != ' ' && *p != '\t' && *p != '\n') + if (!isspace(*p)) scd.vclen()++; } } - else { // also need to exclude nbsp - unsigned char* p; - for (p = (unsigned char*)string; *p; p++) { - if (*p != ' ' && *p != '\t' && *p != '\n' && *p != 0xA0) + else { + unsigned char* p = (unsigned char *) string; + + while (*p) { + int mbl = mblen((char *) p, MB_CUR_MAX); + + if (!isspace(*p)) scd.vclen()++; + + if (mbl < 0) ++p; + else p += mbl; } } diff --git a/cde/programs/dtinfo/dtinfo/src/UAS/DtSR/DtSR_SearchResultsEntry.C b/cde/programs/dtinfo/dtinfo/src/UAS/DtSR/DtSR_SearchResultsEntry.C index 5b992106b..6f7667fb3 100644 --- a/cde/programs/dtinfo/dtinfo/src/UAS/DtSR/DtSR_SearchResultsEntry.C +++ b/cde/programs/dtinfo/dtinfo/src/UAS/DtSR/DtSR_SearchResultsEntry.C @@ -395,8 +395,7 @@ DtSR_SearchResultsEntry::create_matches() while (off > 0) { int scanned = 0; - if (*cursor == '\n' || *cursor == '\t' || *cursor == ' ' || - *cursor == 0x0D) { + if (isspace(*cursor)) { scanned++; } else if (*cursor == ShiftIn || *cursor == ShiftOut) { @@ -407,20 +406,11 @@ DtSR_SearchResultsEntry::create_matches() scanned++; } else { - int mbl = mblen(cursor, MB_CUR_MAX); + scanned = mblen(cursor, MB_CUR_MAX); + vcc++; - if ((mbl == 1 && (unsigned char) cursor[0] == 0xA0) || - (mbl == 2 && (unsigned char) cursor[0] == 0xC2 && - (unsigned char) cursor[1] == 0xA0)) { - scanned++; - } - else { - scanned = mbl; - vcc++; - - /* skip one byte in case of failure */ - if (scanned < 0) scanned = 1; - } + /* skip one byte in case of failure */ + if (scanned < 0) scanned = 1; } off -= scanned; @@ -434,13 +424,11 @@ DtSR_SearchResultsEntry::create_matches() int len = atoi(len_str); // remove leading white-spaces - for (; len && (*cursor == ' ' || *cursor == '\t' || - *cursor == '\n'|| *cursor == 0x0D); cursor++, len--); + for (; len && isspace(*cursor); cursor++, len--); // remove trailing white-spaces if (len > 0) { - for (const char* p = cursor + len - 1; - *p==' ' || *p=='\t' || *p=='\n' || *p==0x0D; p--, len--); + for (const char *p = cursor + len - 1; isspace(*p); p--, len--); } if (len == 0)