dbghelp: Implement SymGetSymFromAddr64.
[wine] / dlls / infosoft / wordbreaker.c
1 /*
2  *    Word splitter Implementation
3  *
4  * Copyright 2006 Mike McCormack
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #define COBJMACROS
22
23 #include "config.h"
24
25 #include <stdarg.h>
26
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winuser.h"
30 #include "winreg.h"
31 #include "ole2.h"
32 #include "indexsvr.h"
33 #include "wine/unicode.h"
34 #include "wine/debug.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(infosoft);
37
38 typedef struct tag_wordbreaker_impl
39 {
40     const IWordBreakerVtbl *lpVtbl;
41     LONG ref;
42 } wordbreaker_impl;
43
44 static HRESULT WINAPI wb_QueryInterface( IWordBreaker *iface,
45         REFIID riid, LPVOID *ppvObj)
46 {
47     wordbreaker_impl *This = (wordbreaker_impl *)iface;
48
49     TRACE("(%p)->(%s)\n",This,debugstr_guid(riid));
50
51     *ppvObj = NULL;
52
53     if (IsEqualIID(riid, &IID_IUnknown) ||
54         IsEqualIID(riid, &IID_IWordBreaker))
55     {
56         *ppvObj = This;
57         return S_OK;
58     }
59
60     TRACE("-- E_NOINTERFACE\n");
61     return E_NOINTERFACE;
62 }
63
64 static ULONG WINAPI wb_AddRef( IWordBreaker *iface )
65 {
66     wordbreaker_impl *This = (wordbreaker_impl *)iface;
67     return InterlockedIncrement(&This->ref);
68 }
69
70 static ULONG WINAPI wb_Release(IWordBreaker *iface)
71 {
72     wordbreaker_impl *This = (wordbreaker_impl *)iface;
73     LONG refcount;
74
75     refcount = InterlockedDecrement(&This->ref);
76     if (!refcount)
77         HeapFree(GetProcessHeap(), 0, This);
78
79     return refcount;
80 }
81
82 static HRESULT WINAPI wb_Init( IWordBreaker *iface,
83         BOOL fQuery, ULONG ulMaxTokenSize, BOOL *pfLicense )
84 {
85     TRACE("%d %lu\n", fQuery, ulMaxTokenSize);
86     *pfLicense = FALSE;
87     return S_OK;
88 }
89
90 static HRESULT WINAPI wb_BreakText( IWordBreaker *iface,
91          TEXT_SOURCE *pTextSource, IWordSink *pWordSink, IPhraseSink *pPhraseSink)
92 {
93     LPCWSTR p, q;
94     DWORD len;
95
96     FIXME("%p %p %p\n", pTextSource, pWordSink, pPhraseSink);
97
98     p = pTextSource->awcBuffer;
99
100     while (*p)
101     {
102         /* skip spaces and punctuation */
103         while(ispunctW(*p) || isspaceW(*p))
104             p++;
105
106         /* find the end of the word */
107         q = p;
108         while(*q && !ispunctW(*q) && !isspaceW(*q))
109             q++;
110
111         len = q - p;
112         if (!len)
113             break;
114
115         IWordSink_PutWord( pWordSink, len, p, len, p - pTextSource->awcBuffer );
116
117         p = q;
118     }
119     return S_OK;
120 }
121
122 static HRESULT WINAPI wb_ComposePhrase( IWordBreaker *iface,
123          const WCHAR *pwcNoun, ULONG cwcNoun,
124          const WCHAR *pwcModifier, ULONG cwcModifier,
125          ULONG ulAttachmentType, WCHAR *pwcPhrase, ULONG *pcwcPhrase)
126 {
127     FIXME("%p %lu %p %lu %lu %p %p\n", pwcNoun, cwcNoun,
128           pwcModifier, cwcModifier, ulAttachmentType, pwcPhrase, pcwcPhrase);
129     return S_OK;
130 }
131
132 static HRESULT WINAPI wb_GetLicenseToUse( IWordBreaker *iface, const WCHAR **ppwcsLicense )
133 {
134     FIXME("%p\n", ppwcsLicense);
135     *ppwcsLicense = NULL;
136     return S_OK;
137 }
138
139 static const IWordBreakerVtbl wordbreaker_vtbl =
140 {
141     wb_QueryInterface,
142     wb_AddRef,
143     wb_Release,
144     wb_Init,
145     wb_BreakText,
146     wb_ComposePhrase,
147     wb_GetLicenseToUse,
148 };
149
150 HRESULT WINAPI wb_en_us_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOID *ppvObject)
151 {
152     wordbreaker_impl *This;
153     IWordBreaker *wb;
154
155     FIXME("%p %s %p\n", pUnkOuter, debugstr_guid(riid), ppvObject);
156
157     This = HeapAlloc(GetProcessHeap(), 0, sizeof *This);
158     if (!This)
159         return E_OUTOFMEMORY;
160
161     This->ref = 1;
162     This->lpVtbl = &wordbreaker_vtbl;
163
164     wb = (IWordBreaker*) This;
165
166     return IWordBreaker_QueryInterface(wb, riid, ppvObject);
167 }