infosoft: Use the pfnFillTextBuffer function to refresh the buffer.
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 @@
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)
+ r = IWordSink_PutWord( pWordSink, len, &ts->awcBuffer[ts->iCur], len, ts->iCur );
+ ts->iCur += len;
+
+ return r;
+}
+
+static HRESULT WINAPI wb_BreakText( IWordBreaker *iface,
+ TEXT_SOURCE *ts, IWordSink *pWordSink, IPhraseSink *pPhraseSink)
+{
+ UINT len, state = 0;
+ WCHAR ch;
+
+ TRACE("%p %p %p\n", ts, pWordSink, pPhraseSink);
+
+ if (pPhraseSink)
+ FIXME("IPhraseSink won't be called\n");
+
+ do
{
- /* skip spaces and punctuation */
- while(ispunctW(*p) || isspaceW(*p))
- p++;
+ len = 0;
+ while ((ts->iCur + len) < ts->iEnd)
+ {
+ ch = ts->awcBuffer[ts->iCur + len];
- /* find the end of the word */
- q = p;
- while(*q && !ispunctW(*q) && !isspaceW(*q))
- q++;
+ switch (state)
+ {
+ case 0: /* skip spaces and punctuation */
- len = q - p;
- if (!len)
- break;
+ if (!ch || ispunctW(ch) || isspaceW(ch))
+ ts->iCur ++;
+ else
+ state = 1;
+ break;
- IWordSink_PutWord( pWordSink, len, p, len, p - pTextSource->awcBuffer );
+ case 1: /* find the end of the word */
- p = q;
- }
+ 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 ));
+
return S_OK;
}
@@ -152,7 +184,7 @@
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)