Pass the main exe name in the CREATE_PROCESS debug event.
[wine.git] / dlls / shell32 / shellstring.c
blobb67f5b22b3bebf46f9004a0aa258d5a77b074856
1 #include <string.h>
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <stdlib.h>
6 #include "winnls.h"
7 #include "winerror.h"
8 #include "debugtools.h"
9 #include "winversion.h"
10 #include "crtdll.h"
11 #include "heap.h"
13 #include "shellapi.h"
14 #include "wine/undocshell.h"
16 DEFAULT_DEBUG_CHANNEL(shell);
18 /************************* STRRET functions ****************************/
20 /*************************************************************************
21 * StrRetToStrN [SHELL32.96]
23 * converts a STRRET to a normal string
25 * NOTES
26 * the pidl is for STRRET OFFSET
28 HRESULT WINAPI StrRetToStrNA (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
30 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
32 switch (src->uType)
34 case STRRET_WSTR:
35 WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
36 SHFree(src->u.pOleStr);
37 break;
39 case STRRET_CSTRA:
40 lstrcpynA((LPSTR)dest, src->u.cStr, len);
41 break;
43 case STRRET_OFFSETA:
44 lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
45 break;
47 default:
48 FIXME("unknown type!\n");
49 if (len)
51 *(LPSTR)dest = '\0';
53 return(FALSE);
55 return S_OK;
58 HRESULT WINAPI StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
60 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
62 switch (src->uType)
64 case STRRET_WSTR:
65 lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
66 SHFree(src->u.pOleStr);
67 break;
69 case STRRET_CSTRA:
70 lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
71 break;
73 case STRRET_OFFSETA:
74 if (pidl)
76 lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
78 break;
80 default:
81 FIXME("unknown type!\n");
82 if (len)
83 { *(LPSTR)dest = '\0';
85 return(FALSE);
87 return S_OK;
89 HRESULT WINAPI StrRetToStrNAW (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
91 if(VERSION_OsIsUnicode())
92 return StrRetToStrNW (dest, len, src, pidl);
93 return StrRetToStrNA (dest, len, src, pidl);
96 /*************************************************************************
97 * StrRetToBufA [SHLWAPI.@]
99 * converts a STRRET to a normal string
101 * NOTES
102 * the pidl is for STRRET OFFSET
104 HRESULT WINAPI StrRetToBufA (LPSTRRET src, LPITEMIDLIST pidl, LPSTR dest, DWORD len)
106 return StrRetToStrNA(dest, len, src, pidl);
109 /*************************************************************************
110 * StrRetToBufW [SHLWAPI.@]
112 * converts a STRRET to a normal string
114 * NOTES
115 * the pidl is for STRRET OFFSET
117 HRESULT WINAPI StrRetToBufW (LPSTRRET src, LPITEMIDLIST pidl, LPWSTR dest, DWORD len)
119 return StrRetToStrNW(dest, len, src, pidl);
122 /************************* string functions ****************************/
124 /*************************************************************************
125 * StrChrA [SHLWAPI]
127 LPSTR WINAPI StrChrA (LPCSTR str, INT c)
129 TRACE("%s %i stub\n", str,c);
130 return strchr(str, c);
133 /*************************************************************************
134 * StrChrW [NT 4.0:SHELL32.651]
137 LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
139 TRACE("%s 0x%04x\n",debugstr_w(str),x);
140 return CRTDLL_wcschr(str, x);
143 /*************************************************************************
144 * StrCmpNA [NT 4.0:SHELL32.*]
146 INT WINAPI StrCmpNA ( LPCSTR str1, LPCSTR str2, INT len)
148 TRACE("%s %s %i stub\n", str1,str2,len);
149 return strncmp(str1, str2, len);
152 /*************************************************************************
153 * StrCmpNW [NT 4.0:SHELL32.*]
155 INT WINAPI StrCmpNW ( LPCWSTR wstr1, LPCWSTR wstr2, INT len)
157 TRACE("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
158 return CRTDLL_wcsncmp(wstr1, wstr2, len);
161 /*************************************************************************
162 * StrCmpNIA [NT 4.0:SHELL32.*]
164 int WINAPI StrCmpNIA ( LPCSTR str1, LPCSTR str2, int len)
166 TRACE("%s %s %i stub\n", str1,str2,len);
167 return strncasecmp(str1, str2, len);
170 /*************************************************************************
171 * StrCmpNIW [NT 4.0:SHELL32.*]
173 int WINAPI StrCmpNIW ( LPCWSTR wstr1, LPCWSTR wstr2, int len)
175 TRACE("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
176 return CRTDLL__wcsnicmp(wstr1, wstr2, len);
179 /*************************************************************************
180 * StrStrA [SHLWAPI]
182 LPSTR WINAPI StrStrA(LPCSTR lpFirst, LPCSTR lpSrch)
184 while (*lpFirst)
186 LPCSTR p1 = lpFirst, p2 = lpSrch;
187 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
188 if (!*p2) return (LPSTR)lpFirst;
189 lpFirst++;
191 return NULL;
194 /*************************************************************************
195 * StrStrW [SHLWAPI]
197 LPWSTR WINAPI StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch)
199 while (*lpFirst)
201 LPCWSTR p1 = lpFirst, p2 = lpSrch;
202 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
203 if (!*p2) return (LPWSTR)lpFirst;
204 lpFirst++;
206 return NULL;
209 /*************************************************************************
210 * StrStrIA [SHLWAPI]
212 LPSTR WINAPI StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch)
214 while (*lpFirst)
216 LPCSTR p1 = lpFirst, p2 = lpSrch;
217 while (*p1 && *p2 && toupper(*p1) == toupper(*p2)) { p1++; p2++; }
218 if (!*p2) return (LPSTR)lpFirst;
219 lpFirst++;
221 return NULL;
224 /*************************************************************************
225 * StrStrIW [SHLWAPI]
227 LPWSTR WINAPI StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch)
229 while (*lpFirst)
231 LPCWSTR p1 = lpFirst, p2 = lpSrch;
232 while (*p1 && *p2 && CRTDLL_towupper(*p1) == CRTDLL_towupper(*p2)) { p1++; p2++; }
233 if (!*p2) return (LPWSTR)lpFirst;
234 lpFirst++;
236 return NULL;
239 /*************************************************************************
240 * StrToIntA [SHLWAPI]
242 int WINAPI StrToIntA(LPCSTR lpSrc)
244 TRACE("%s\n", lpSrc);
245 return atol(lpSrc);
248 /*************************************************************************
249 * StrToIntW [SHLWAPI]
251 int WINAPI StrToIntW(LPCWSTR lpSrc)
253 int ret;
254 LPSTR lpStr = HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc);
256 TRACE("%s\n", debugstr_w(lpSrc));
258 ret = atol(lpStr);
259 HeapFree(GetProcessHeap(),0,lpStr);
260 return ret;
263 /*************************************************************************
264 * StrDupA [SHLWAPI]
266 LPSTR WINAPI StrDupA (LPCSTR lpSrc)
268 int len = strlen(lpSrc);
269 LPSTR lpDest = (LPSTR) LocalAlloc(LMEM_FIXED, len+1);
271 TRACE("%s\n", lpSrc);
273 if (lpDest) strcpy(lpDest, lpSrc);
274 return lpDest;
277 /*************************************************************************
278 * StrDupW [SHLWAPI]
280 LPWSTR WINAPI StrDupW (LPCWSTR lpSrc)
282 int len = lstrlenW(lpSrc);
283 LPWSTR lpDest = (LPWSTR) LocalAlloc(LMEM_FIXED, sizeof(WCHAR) * (len+1));
285 TRACE("%s\n", debugstr_w(lpSrc));
287 if (lpDest) lstrcpyW(lpDest, lpSrc);
288 return lpDest;
291 /*************************************************************************
292 * StrCSpnA [SHLWAPI]
294 int WINAPI StrCSpnA (LPCSTR lpStr, LPCSTR lpSet)
296 int i,j, pos = strlen(lpStr);
298 TRACE("(%p %s %p %s)\n",
299 lpStr, debugstr_a(lpStr), lpSet, debugstr_a(lpSet));
301 for (i=0; i < strlen(lpSet) ; i++ )
303 for (j = 0; j < pos;j++)
305 if (lpStr[j] == lpSet[i])
307 pos = j;
311 TRACE("-- %u\n", pos);
312 return pos;
315 /*************************************************************************
316 * StrCSpnW [SHLWAPI]
318 int WINAPI StrCSpnW (LPCWSTR lpStr, LPCWSTR lpSet)
320 int i,j, pos = lstrlenW(lpStr);
322 TRACE("(%p %s %p %s)\n",
323 lpStr, debugstr_w(lpStr), lpSet, debugstr_w(lpSet));
325 for (i=0; i < lstrlenW(lpSet) ; i++ )
327 for (j = 0; j < pos;j++)
329 if (lpStr[j] == lpSet[i])
331 pos = j;
335 TRACE("-- %u\n", pos);
336 return pos;
339 /************************* OLESTR functions ****************************/
341 /************************************************************************
342 * StrToOleStr [SHELL32.163]
345 int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
347 TRACE("(%p, %p %s)\n",
348 lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString));
350 return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
353 int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString)
355 TRACE("(%p, %p %s)\n",
356 lpWideCharStr, lpWString, debugstr_w(lpWString));
358 if (lstrcpyW (lpWideCharStr, lpWString ))
359 { return lstrlenW (lpWideCharStr);
361 return 0;
364 BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString)
366 if (VERSION_OsIsUnicode())
367 return StrToOleStrW (lpWideCharStr, lpString);
368 return StrToOleStrA (lpWideCharStr, lpString);
371 /*************************************************************************
372 * StrToOleStrN [SHELL32.79]
373 * lpMulti, nMulti, nWide [IN]
374 * lpWide [OUT]
376 BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr)
378 TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr);
379 return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide);
381 BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr)
383 TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr);
385 if (lstrcpynW (lpWide, lpStrW, nWide))
386 { return lstrlenW (lpWide);
388 return 0;
391 BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr)
393 if (VERSION_OsIsUnicode())
394 return StrToOleStrNW (lpWide, nWide, lpStr, nStr);
395 return StrToOleStrNA (lpWide, nWide, lpStr, nStr);
398 /*************************************************************************
399 * OleStrToStrN [SHELL32.78]
401 BOOL WINAPI OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle)
403 TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle);
404 return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL);
407 BOOL WINAPI OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle)
409 TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle);
411 if (lstrcpynW ( lpwStr, lpOle, nwStr))
412 { return lstrlenW (lpwStr);
414 return 0;
417 BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn)
419 if (VERSION_OsIsUnicode())
420 return OleStrToStrNW (lpOut, nOut, lpIn, nIn);
421 return OleStrToStrNA (lpOut, nOut, lpIn, nIn);
424 /*************************************************************************
425 * StrFormatByteSizeA [SHLWAPI]
427 LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
428 { char buf[64];
429 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
430 if ( dw<1024L )
431 { sprintf (buf,"%3.1f bytes", (FLOAT)dw);
433 else if ( dw<1048576L)
434 { sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
436 else if ( dw < 1073741824L)
437 { sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
439 else
440 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
442 lstrcpynA (pszBuf, buf, cchBuf);
443 return pszBuf;
446 /*************************************************************************
447 * StrFormatByteSizeW [SHLWAPI]
449 LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
450 { char buf[64];
451 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
452 if ( dw<1024L )
453 { sprintf (buf,"%3.1f bytes", (FLOAT)dw);
455 else if ( dw<1048576L)
456 { sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
458 else if ( dw < 1073741824L)
459 { sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
461 else
462 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
464 lstrcpynAtoW (pszBuf, buf, cchBuf);
465 return pszBuf;