8 #include "debugtools.h"
9 #include "winversion.h"
13 #include "wine/undocshell.h"
14 #include "wine/unicode.h"
16 DEFAULT_DEBUG_CHANNEL(shell
);
18 /************************* STRRET functions ****************************/
20 /*************************************************************************
21 * StrRetToStrN [SHELL32.96]
23 * converts a STRRET to a normal string
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
);
35 WideCharToMultiByte(CP_ACP
, 0, src
->u
.pOleStr
, -1, (LPSTR
)dest
, len
, NULL
, NULL
);
36 SHFree(src
->u
.pOleStr
);
40 lstrcpynA((LPSTR
)dest
, src
->u
.cStr
, len
);
44 lstrcpynA((LPSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
48 FIXME("unknown type!\n");
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
);
65 lstrcpynW((LPWSTR
)dest
, src
->u
.pOleStr
, len
);
66 SHFree(src
->u
.pOleStr
);
70 lstrcpynAtoW((LPWSTR
)dest
, src
->u
.cStr
, len
);
76 lstrcpynAtoW((LPWSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
81 FIXME("unknown type!\n");
83 { *(LPSTR
)dest
= '\0';
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
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
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 /*************************************************************************
127 LPSTR WINAPI
StrChrA (LPCSTR str
, INT c
)
129 TRACE("%s %i\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 strchrW(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 strncmpW(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 strncmpiW(wstr1
, wstr2
, len
);
179 /*************************************************************************
182 LPSTR WINAPI
StrStrA(LPCSTR lpFirst
, LPCSTR lpSrch
)
186 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
187 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
188 if (!*p2
) return (LPSTR
)lpFirst
;
194 /*************************************************************************
197 LPWSTR WINAPI
StrStrW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
201 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
202 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
203 if (!*p2
) return (LPWSTR
)lpFirst
;
209 /*************************************************************************
212 LPSTR WINAPI
StrStrIA(LPCSTR lpFirst
, LPCSTR lpSrch
)
216 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
217 while (*p1
&& *p2
&& toupper(*p1
) == toupper(*p2
)) { p1
++; p2
++; }
218 if (!*p2
) return (LPSTR
)lpFirst
;
224 /*************************************************************************
227 LPWSTR WINAPI
StrStrIW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
231 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
232 while (*p1
&& *p2
&& toupperW(*p1
) == toupperW(*p2
)) { p1
++; p2
++; }
233 if (!*p2
) return (LPWSTR
)lpFirst
;
239 /*************************************************************************
240 * StrToIntA [SHLWAPI]
242 int WINAPI
StrToIntA(LPCSTR lpSrc
)
244 TRACE("%s\n", lpSrc
);
248 /*************************************************************************
249 * StrToIntW [SHLWAPI]
251 int WINAPI
StrToIntW(LPCWSTR lpSrc
)
254 LPSTR lpStr
= HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc
);
256 TRACE("%s\n", debugstr_w(lpSrc
));
259 HeapFree(GetProcessHeap(),0,lpStr
);
263 /*************************************************************************
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
);
277 /*************************************************************************
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
);
291 /*************************************************************************
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
])
311 TRACE("-- %u\n", pos
);
315 /*************************************************************************
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
])
335 TRACE("-- %u\n", pos
);
339 /*************************************************************************
340 * StrCatBuffA [SHLWAPI]
342 * Appends back onto front, stopping when front is size-1 characters long.
346 LPSTR WINAPI
StrCatBuffA(LPSTR front
, LPCSTR back
, INT size
)
348 LPSTR dst
= front
+ lstrlenA(front
);
349 LPCSTR src
= back
, end
= front
+ size
- 1;
351 while(dst
< end
&& *src
)
357 /*************************************************************************
358 * StrCatBuffW [SHLWAPI]
360 * Appends back onto front, stopping when front is size-1 characters long.
364 LPWSTR WINAPI
StrCatBuffW(LPWSTR front
, LPCWSTR back
, INT size
)
366 LPWSTR dst
= front
+ lstrlenW(front
);
367 LPCWSTR src
= back
, end
= front
+ size
- 1;
369 while(dst
< end
&& *src
)
375 /************************* OLESTR functions ****************************/
377 /************************************************************************
378 * StrToOleStr [SHELL32.163]
381 int WINAPI
StrToOleStrA (LPWSTR lpWideCharStr
, LPCSTR lpMultiByteString
)
383 TRACE("(%p, %p %s)\n",
384 lpWideCharStr
, lpMultiByteString
, debugstr_a(lpMultiByteString
));
386 return MultiByteToWideChar(0, 0, lpMultiByteString
, -1, lpWideCharStr
, MAX_PATH
);
389 int WINAPI
StrToOleStrW (LPWSTR lpWideCharStr
, LPCWSTR lpWString
)
391 TRACE("(%p, %p %s)\n",
392 lpWideCharStr
, lpWString
, debugstr_w(lpWString
));
394 if (lstrcpyW (lpWideCharStr
, lpWString
))
395 { return lstrlenW (lpWideCharStr
);
400 BOOL WINAPI
StrToOleStrAW (LPWSTR lpWideCharStr
, LPCVOID lpString
)
402 if (VERSION_OsIsUnicode())
403 return StrToOleStrW (lpWideCharStr
, lpString
);
404 return StrToOleStrA (lpWideCharStr
, lpString
);
407 /*************************************************************************
408 * StrToOleStrN [SHELL32.79]
409 * lpMulti, nMulti, nWide [IN]
412 BOOL WINAPI
StrToOleStrNA (LPWSTR lpWide
, INT nWide
, LPCSTR lpStrA
, INT nStr
)
414 TRACE("(%p, %x, %s, %x)\n", lpWide
, nWide
, debugstr_an(lpStrA
,nStr
), nStr
);
415 return MultiByteToWideChar (0, 0, lpStrA
, nStr
, lpWide
, nWide
);
417 BOOL WINAPI
StrToOleStrNW (LPWSTR lpWide
, INT nWide
, LPCWSTR lpStrW
, INT nStr
)
419 TRACE("(%p, %x, %s, %x)\n", lpWide
, nWide
, debugstr_wn(lpStrW
, nStr
), nStr
);
421 if (lstrcpynW (lpWide
, lpStrW
, nWide
))
422 { return lstrlenW (lpWide
);
427 BOOL WINAPI
StrToOleStrNAW (LPWSTR lpWide
, INT nWide
, LPCVOID lpStr
, INT nStr
)
429 if (VERSION_OsIsUnicode())
430 return StrToOleStrNW (lpWide
, nWide
, lpStr
, nStr
);
431 return StrToOleStrNA (lpWide
, nWide
, lpStr
, nStr
);
434 /*************************************************************************
435 * OleStrToStrN [SHELL32.78]
437 BOOL WINAPI
OleStrToStrNA (LPSTR lpStr
, INT nStr
, LPCWSTR lpOle
, INT nOle
)
439 TRACE("(%p, %x, %s, %x)\n", lpStr
, nStr
, debugstr_wn(lpOle
,nOle
), nOle
);
440 return WideCharToMultiByte (0, 0, lpOle
, nOle
, lpStr
, nStr
, NULL
, NULL
);
443 BOOL WINAPI
OleStrToStrNW (LPWSTR lpwStr
, INT nwStr
, LPCWSTR lpOle
, INT nOle
)
445 TRACE("(%p, %x, %s, %x)\n", lpwStr
, nwStr
, debugstr_wn(lpOle
,nOle
), nOle
);
447 if (lstrcpynW ( lpwStr
, lpOle
, nwStr
))
448 { return lstrlenW (lpwStr
);
453 BOOL WINAPI
OleStrToStrNAW (LPVOID lpOut
, INT nOut
, LPCVOID lpIn
, INT nIn
)
455 if (VERSION_OsIsUnicode())
456 return OleStrToStrNW (lpOut
, nOut
, lpIn
, nIn
);
457 return OleStrToStrNA (lpOut
, nOut
, lpIn
, nIn
);
460 /*************************************************************************
461 * StrFormatByteSizeA [SHLWAPI]
463 LPSTR WINAPI
StrFormatByteSizeA ( DWORD dw
, LPSTR pszBuf
, UINT cchBuf
)
465 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
467 { sprintf (buf
,"%3.1f bytes", (FLOAT
)dw
);
469 else if ( dw
<1048576L)
470 { sprintf (buf
,"%3.1f KB", (FLOAT
)dw
/1024);
472 else if ( dw
< 1073741824L)
473 { sprintf (buf
,"%3.1f MB", (FLOAT
)dw
/1048576L);
476 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
478 lstrcpynA (pszBuf
, buf
, cchBuf
);
482 /*************************************************************************
483 * StrFormatByteSizeW [SHLWAPI]
485 LPWSTR WINAPI
StrFormatByteSizeW ( DWORD dw
, LPWSTR pszBuf
, UINT cchBuf
)
487 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
489 { sprintf (buf
,"%3.1f bytes", (FLOAT
)dw
);
491 else if ( dw
<1048576L)
492 { sprintf (buf
,"%3.1f KB", (FLOAT
)dw
/1024);
494 else if ( dw
< 1073741824L)
495 { sprintf (buf
,"%3.1f MB", (FLOAT
)dw
/1048576L);
498 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
500 lstrcpynAtoW (pszBuf
, buf
, cchBuf
);