7 #include "wine/undocshell.h"
8 #include "wine/unicode.h"
10 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(shell
);
14 /*************************************************************************
17 LPSTR WINAPI
StrChrA (LPCSTR str
, INT c
)
19 TRACE("%s %i\n", str
,c
);
20 return strchr(str
, c
);
23 /*************************************************************************
27 LPWSTR WINAPI
StrChrW (LPWSTR str
, WCHAR x
)
29 TRACE("%s 0x%04x\n",debugstr_w(str
),x
);
30 return strchrW(str
, x
);
33 /*************************************************************************
36 INT WINAPI
StrCmpNA ( LPCSTR str1
, LPCSTR str2
, INT len
)
38 TRACE("%s %s %i stub\n", str1
,str2
,len
);
39 return strncmp(str1
, str2
, len
);
42 /*************************************************************************
45 INT WINAPI
StrCmpNW ( LPCWSTR wstr1
, LPCWSTR wstr2
, INT len
)
47 TRACE("%s %s %i stub\n", debugstr_w(wstr1
),debugstr_w(wstr2
),len
);
48 return strncmpW(wstr1
, wstr2
, len
);
51 /*************************************************************************
54 int WINAPI
StrCmpNIA ( LPCSTR str1
, LPCSTR str2
, int len
)
56 TRACE("%s %s %i stub\n", str1
,str2
,len
);
57 return strncasecmp(str1
, str2
, len
);
60 /*************************************************************************
63 int WINAPI
StrCmpNIW ( LPCWSTR wstr1
, LPCWSTR wstr2
, int len
)
65 TRACE("%s %s %i stub\n", debugstr_w(wstr1
),debugstr_w(wstr2
),len
);
66 return strncmpiW(wstr1
, wstr2
, len
);
69 /*************************************************************************
72 LPWSTR WINAPI
StrCatW( LPWSTR wstr1
, LPCWSTR wstr2
)
74 return strcatW( wstr1
, wstr2
);
78 /*************************************************************************
81 LPWSTR WINAPI
StrCpyW( LPWSTR wstr1
, LPCWSTR wstr2
)
83 return strcpyW( wstr1
, wstr2
);
87 /*************************************************************************
90 LPSTR WINAPI
StrStrA(LPCSTR lpFirst
, LPCSTR lpSrch
)
94 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
95 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
96 if (!*p2
) return (LPSTR
)lpFirst
;
102 /*************************************************************************
105 LPWSTR WINAPI
StrStrW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
109 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
110 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
111 if (!*p2
) return (LPWSTR
)lpFirst
;
117 /*************************************************************************
120 LPSTR WINAPI
StrStrIA(LPCSTR lpFirst
, LPCSTR lpSrch
)
124 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
125 while (*p1
&& *p2
&& toupper(*p1
) == toupper(*p2
)) { p1
++; p2
++; }
126 if (!*p2
) return (LPSTR
)lpFirst
;
132 /*************************************************************************
135 LPWSTR WINAPI
StrStrIW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
139 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
140 while (*p1
&& *p2
&& toupperW(*p1
) == toupperW(*p2
)) { p1
++; p2
++; }
141 if (!*p2
) return (LPWSTR
)lpFirst
;
147 /*************************************************************************
148 * StrToIntA [SHLWAPI]
150 int WINAPI
StrToIntA(LPCSTR lpSrc
)
152 TRACE("%s\n", lpSrc
);
156 /*************************************************************************
157 * StrToIntW [SHLWAPI]
159 int WINAPI
StrToIntW(LPCWSTR lpSrc
)
162 LPSTR lpStr
= HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc
);
164 TRACE("%s\n", debugstr_w(lpSrc
));
167 HeapFree(GetProcessHeap(),0,lpStr
);
171 /*************************************************************************
174 LPSTR WINAPI
StrDupA (LPCSTR lpSrc
)
176 int len
= strlen(lpSrc
);
177 LPSTR lpDest
= (LPSTR
) LocalAlloc(LMEM_FIXED
, len
+1);
179 TRACE("%s\n", lpSrc
);
181 if (lpDest
) strcpy(lpDest
, lpSrc
);
185 /*************************************************************************
188 LPWSTR WINAPI
StrDupW (LPCWSTR lpSrc
)
190 int len
= strlenW(lpSrc
);
191 LPWSTR lpDest
= (LPWSTR
) LocalAlloc(LMEM_FIXED
, sizeof(WCHAR
) * (len
+1));
193 TRACE("%s\n", debugstr_w(lpSrc
));
195 if (lpDest
) strcpyW(lpDest
, lpSrc
);
199 /*************************************************************************
202 int WINAPI
StrCSpnA (LPCSTR lpStr
, LPCSTR lpSet
)
204 int i
,j
, pos
= strlen(lpStr
);
206 TRACE("(%p %s %p %s)\n",
207 lpStr
, debugstr_a(lpStr
), lpSet
, debugstr_a(lpSet
));
209 for (i
=0; i
< strlen(lpSet
) ; i
++ )
211 for (j
= 0; j
< pos
;j
++)
213 if (lpStr
[j
] == lpSet
[i
])
219 TRACE("-- %u\n", pos
);
223 /*************************************************************************
226 int WINAPI
StrCSpnW (LPCWSTR lpStr
, LPCWSTR lpSet
)
228 int i
,j
, pos
= strlenW(lpStr
);
230 TRACE("(%p %s %p %s)\n",
231 lpStr
, debugstr_w(lpStr
), lpSet
, debugstr_w(lpSet
));
233 for (i
=0; i
< strlenW(lpSet
) ; i
++ )
235 for (j
= 0; j
< pos
;j
++)
237 if (lpStr
[j
] == lpSet
[i
])
243 TRACE("-- %u\n", pos
);
247 /**************************************************************************
248 * StrRChrA [SHLWAPI.@]
251 LPSTR WINAPI
StrRChrA( LPCSTR lpStart
, LPCSTR lpEnd
, WORD wMatch
)
253 LPCSTR lpGotIt
= NULL
;
254 BOOL dbcs
= IsDBCSLeadByte( LOBYTE(wMatch
) );
256 TRACE("(%p, %p, %x)\n", lpStart
, lpEnd
, wMatch
);
258 if (!lpEnd
) lpEnd
= lpStart
+ strlen(lpStart
);
260 for(; lpStart
< lpEnd
; lpStart
= CharNextA(lpStart
))
262 if (*lpStart
!= LOBYTE(wMatch
)) continue;
263 if (dbcs
&& lpStart
[1] != HIBYTE(wMatch
)) continue;
266 return (LPSTR
)lpGotIt
;
270 /**************************************************************************
271 * StrRChrW [SHLWAPI.@]
274 LPWSTR WINAPI
StrRChrW( LPCWSTR lpStart
, LPCWSTR lpEnd
, WORD wMatch
)
276 LPCWSTR lpGotIt
= NULL
;
278 TRACE("(%p, %p, %x)\n", lpStart
, lpEnd
, wMatch
);
279 if (!lpEnd
) lpEnd
= lpStart
+ strlenW(lpStart
);
281 for(; lpStart
< lpEnd
; lpStart
= CharNextW(lpStart
))
282 if (*lpStart
== wMatch
) lpGotIt
= lpStart
;
284 return (LPWSTR
)lpGotIt
;
288 /*************************************************************************
289 * StrCatBuffA [SHLWAPI]
291 * Appends back onto front, stopping when front is size-1 characters long.
295 LPSTR WINAPI
StrCatBuffA(LPSTR front
, LPCSTR back
, INT size
)
297 LPSTR dst
= front
+ strlen(front
);
298 LPCSTR src
= back
, end
= front
+ size
- 1;
300 while(dst
< end
&& *src
)
306 /*************************************************************************
307 * StrCatBuffW [SHLWAPI]
309 * Appends back onto front, stopping when front is size-1 characters long.
313 LPWSTR WINAPI
StrCatBuffW(LPWSTR front
, LPCWSTR back
, INT size
)
315 LPWSTR dst
= front
+ strlenW(front
);
316 LPCWSTR src
= back
, end
= front
+ size
- 1;
318 while(dst
< end
&& *src
)
324 /*************************************************************************
325 * StrRetToBufA [SHLWAPI.@]
327 * converts a STRRET to a normal string
330 * the pidl is for STRRET OFFSET
332 HRESULT WINAPI
StrRetToBufA (LPSTRRET src
, LPITEMIDLIST pidl
, LPSTR dest
, DWORD len
)
334 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest
,len
,src
,pidl
);
339 WideCharToMultiByte(CP_ACP
, 0, src
->u
.pOleStr
, -1, (LPSTR
)dest
, len
, NULL
, NULL
);
340 /* SHFree(src->u.pOleStr); FIXME: is this right? */
344 lstrcpynA((LPSTR
)dest
, src
->u
.cStr
, len
);
348 lstrcpynA((LPSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
352 FIXME("unknown type!\n");
362 /*************************************************************************
363 * StrRetToBufW [SHLWAPI.@]
365 * converts a STRRET to a normal string
368 * the pidl is for STRRET OFFSET
370 HRESULT WINAPI
StrRetToBufW (LPSTRRET src
, LPITEMIDLIST pidl
, LPWSTR dest
, DWORD len
)
372 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest
,len
,src
,pidl
);
377 lstrcpynW((LPWSTR
)dest
, src
->u
.pOleStr
, len
);
378 /* SHFree(src->u.pOleStr); FIXME: is this right? */
382 lstrcpynAtoW((LPWSTR
)dest
, src
->u
.cStr
, len
);
388 lstrcpynAtoW((LPWSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
393 FIXME("unknown type!\n");
395 { *(LPSTR
)dest
= '\0';
402 /*************************************************************************
403 * StrFormatByteSizeA [SHLWAPI]
405 LPSTR WINAPI
StrFormatByteSizeA ( DWORD dw
, LPSTR pszBuf
, UINT cchBuf
)
407 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
409 { sprintf (buf
,"%3.1f bytes", (FLOAT
)dw
);
411 else if ( dw
<1048576L)
412 { sprintf (buf
,"%3.1f KB", (FLOAT
)dw
/1024);
414 else if ( dw
< 1073741824L)
415 { sprintf (buf
,"%3.1f MB", (FLOAT
)dw
/1048576L);
418 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
420 lstrcpynA (pszBuf
, buf
, cchBuf
);
424 /*************************************************************************
425 * StrFormatByteSizeW [SHLWAPI]
427 LPWSTR WINAPI
StrFormatByteSizeW ( DWORD dw
, LPWSTR pszBuf
, UINT cchBuf
)
429 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
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);
440 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
442 lstrcpynAtoW (pszBuf
, buf
, cchBuf
);
446 /*************************************************************************
447 * wnsprintfA [SHLWAPI]
449 int WINAPIV
wnsprintfA(LPSTR lpOut
, int cchLimitIn
, LPCSTR lpFmt
, ...)
454 va_start( valist
, lpFmt
);
455 res
= wvsnprintfA( lpOut
, cchLimitIn
, lpFmt
, valist
);
460 /*************************************************************************
461 * wnsprintfW [SHLWAPI]
463 int WINAPIV
wnsprintfW(LPWSTR lpOut
, int cchLimitIn
, LPCWSTR lpFmt
, ...)
468 va_start( valist
, lpFmt
);
469 res
= wvsnprintfW( lpOut
, cchLimitIn
, lpFmt
, valist
);