Mike McCormack : infosoft: Use the pfnFillTextBuffer function to refresh the buffer.
Module: wine Branch: master Commit: c4c35d33b52dcf68c39a5f1caf9aeb77a073845c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c4c35d33b52dcf68c39a5f1c... Author: Mike McCormack <mike(a)codeweavers.com> Date: Fri Aug 11 20:08:25 2006 +0900 infosoft: Use the pfnFillTextBuffer function to refresh the buffer. --- dlls/infosoft/wordbreaker.c | 76 +++++++++++++++++++++++++++++++------------ 1 files changed, 54 insertions(+), 22 deletions(-) diff --git a/dlls/infosoft/wordbreaker.c b/dlls/infosoft/wordbreaker.c index 7b3ac95..89d0b36 100644 --- a/dlls/infosoft/wordbreaker.c +++ b/dlls/infosoft/wordbreaker.c @@ -87,35 +87,67 @@ static HRESULT WINAPI wb_Init( IWordBrea return S_OK; } -static HRESULT WINAPI wb_BreakText( IWordBreaker *iface, - TEXT_SOURCE *pTextSource, IWordSink *pWordSink, IPhraseSink *pPhraseSink) +static HRESULT call_sink( IWordSink *pWordSink, TEXT_SOURCE *ts, UINT len ) { - LPCWSTR p, q; - DWORD len; + HRESULT r; - FIXME("%p %p %p\n", pTextSource, pWordSink, pPhraseSink); + if (!len) + return S_OK; - p = pTextSource->awcBuffer; + TRACE("%d %s\n", len, debugstr_w(&ts->awcBuffer[ts->iCur])); - while (*p) - { - /* skip spaces and punctuation */ - while(ispunctW(*p) || isspaceW(*p)) - p++; + r = IWordSink_PutWord( pWordSink, len, &ts->awcBuffer[ts->iCur], len, ts->iCur ); + ts->iCur += len; + + return r; +} - /* find the end of the word */ - q = p; - while(*q && !ispunctW(*q) && !isspaceW(*q)) - q++; +static HRESULT WINAPI wb_BreakText( IWordBreaker *iface, + TEXT_SOURCE *ts, IWordSink *pWordSink, IPhraseSink *pPhraseSink) +{ + UINT len, state = 0; + WCHAR ch; - len = q - p; - if (!len) - break; + TRACE("%p %p %p\n", ts, pWordSink, pPhraseSink); - IWordSink_PutWord( pWordSink, len, p, len, p - pTextSource->awcBuffer ); + if (pPhraseSink) + FIXME("IPhraseSink won't be called\n"); + + do + { + len = 0; + while ((ts->iCur + len) < ts->iEnd) + { + ch = ts->awcBuffer[ts->iCur + len]; + + switch (state) + { + case 0: /* skip spaces and punctuation */ + + if (!ch || ispunctW(ch) || isspaceW(ch)) + ts->iCur ++; + else + state = 1; + break; + + case 1: /* find the end of the word */ + + if (ch && !ispunctW(ch) && !isspaceW(ch)) + len++; + else + { + call_sink( pWordSink, ts, len ); + len = 0; + state = 0; + } + break; + + } + } + call_sink( pWordSink, ts, len ); + + } while (S_OK == ts->pfnFillTextBuffer( ts )); - p = q; - } return S_OK; } @@ -152,7 +184,7 @@ HRESULT WINAPI wb_Constructor(IUnknown* wordbreaker_impl *This; IWordBreaker *wb; - FIXME("%p %s %p\n", pUnkOuter, debugstr_guid(riid), ppvObject); + TRACE("%p %s %p\n", pUnkOuter, debugstr_guid(riid), ppvObject); This = HeapAlloc(GetProcessHeap(), 0, sizeof *This); if (!This)
participants (1)
-
Alexandre Julliard