Mike McCormack : infosoft:
Use the pfnFillTextBuffer function to refresh the buffer.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Aug 11 13:37:20 CDT 2006
Module: wine
Branch: master
Commit: c4c35d33b52dcf68c39a5f1caf9aeb77a073845c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c4c35d33b52dcf68c39a5f1caf9aeb77a073845c
Author: Mike McCormack <mike at 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)
More information about the wine-cvs
mailing list