int ME_IsSplitable(const ME_String *s) { WCHAR *pos = s->szData; WCHAR ch; while(ME_IsWSpace(*pos++)) ; pos--; while((ch = *pos++) != 0) { if (ME_IsWSpace(ch)) return 1; } return 0; }
/* note: returns offset of the first trailing nonwhitespace */ int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar) { int i; for (i = nVChar; i>0 && !ME_IsWSpace(s->szData[i-1]); i--) ; return i; }
int ME_FindNonWhitespaceV(const ME_String *s, int nVChar) { int i; for (i = nVChar; i<s->nLen && ME_IsWSpace(s->szData[i]); i++) ; return i; }
/* note: returns offset of the first trailing nonwhitespace */ static int reverse_find_whitespace(const WCHAR *s, int start) { int i; for (i = start; i > 0 && !ME_IsWSpace( s[i - 1] ); i--) ; return i; }
static int find_non_whitespace(const WCHAR *s, int len, int start) { int i; for (i = start; i < len && ME_IsWSpace( s[i] ); i++) ; return i; }
static int ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code) { /* FIXME: Native also knows about punctuation */ TRACE("s==%s, start==%d, len==%d, code==%d\n", debugstr_wn(s, len), start, len, code); switch (code) { case WB_ISDELIMITER: return ME_IsWSpace(s[start]); case WB_LEFT: case WB_MOVEWORDLEFT: while (start && ME_IsWSpace(s[start - 1])) start--; while (start && !ME_IsWSpace(s[start - 1])) start--; return start; case WB_RIGHT: case WB_MOVEWORDRIGHT: if (start && ME_IsWSpace(s[start - 1])) { while (start < len && ME_IsWSpace(s[start])) start++; } else { while (start < len && !ME_IsWSpace(s[start])) start++; while (start < len && ME_IsWSpace(s[start])) start++; } return start; } return 0; }
static BOOL run_is_entirely_ws( const ME_Run *run ) { WCHAR *str = get_text( run, 0 ), *p; int i; for (i = 0, p = str; i < run->len; i++, p++) if (!ME_IsWSpace( *p )) return FALSE; return TRUE; }
int ME_IsWhitespaces(const ME_String *s) { /* FIXME multibyte */ WCHAR *pos = s->szData; while(ME_IsWSpace(*pos++)) ; pos--; if (*pos) return 0; else return 1; }
/****************************************************************************** * ME_UpdateRunFlags * * Determine some of run attributes given its content (style, text content). * Some flags cannot be determined by this function (MERF_GRAPHICS, * MERF_ENDPARA) */ void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run) { assert(run->nCharOfs >= 0); if (RUN_IS_HIDDEN(run) || run->nFlags & MERF_TABLESTART) run->nFlags |= MERF_HIDDEN; else run->nFlags &= ~MERF_HIDDEN; if (run_is_splittable( run )) run->nFlags |= MERF_SPLITTABLE; else run->nFlags &= ~MERF_SPLITTABLE; if (!(run->nFlags & MERF_NOTEXT)) { if (run_is_entirely_ws( run )) run->nFlags |= MERF_WHITESPACE | MERF_STARTWHITE | MERF_ENDWHITE; else { run->nFlags &= ~MERF_WHITESPACE; if (ME_IsWSpace( *get_text( run, 0 ) )) run->nFlags |= MERF_STARTWHITE; else run->nFlags &= ~MERF_STARTWHITE; if (ME_IsWSpace( *get_text( run, run->len - 1 ) )) run->nFlags |= MERF_ENDWHITE; else run->nFlags &= ~MERF_ENDWHITE; } } else run->nFlags &= ~(MERF_WHITESPACE | MERF_STARTWHITE | MERF_ENDWHITE); }
static BOOL run_is_splittable( const ME_Run *run ) { WCHAR *str = get_text( run, 0 ), *p; int i; BOOL found_ink = FALSE; for (i = 0, p = str; i < run->len; i++, p++) { if (ME_IsWSpace( *p )) { if (found_ink) return TRUE; } else found_ink = TRUE; } return FALSE; }