Module: wine Branch: master Commit: c4c35d33b52dcf68c39a5f1caf9aeb77a073845c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c4c35d33b52dcf68c39a5f1c...
Author: Mike McCormack mike@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)