13 #include "wine/unicode.h"
14 #include "wine/winestring.h"
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(shell
);
20 /*************************************************************************
23 LPSTR WINAPI
StrChrA (LPCSTR str
, WORD c
)
25 TRACE("%s %i\n", str
,c
);
26 return strchr(str
, c
);
29 /*************************************************************************
33 LPWSTR WINAPI
StrChrW (LPCWSTR str
, WCHAR x
)
35 TRACE("%s 0x%04x\n",debugstr_w(str
),x
);
36 return strchrW(str
, x
);
39 /*************************************************************************
42 INT WINAPI
StrCmpNA ( LPCSTR str1
, LPCSTR str2
, INT len
)
44 TRACE("%s %s %i stub\n", str1
,str2
,len
);
45 return strncmp(str1
, str2
, len
);
48 /*************************************************************************
51 INT WINAPI
StrCmpNW ( LPCWSTR wstr1
, LPCWSTR wstr2
, INT len
)
53 TRACE("%s %s %i stub\n", debugstr_w(wstr1
),debugstr_w(wstr2
),len
);
54 return strncmpW(wstr1
, wstr2
, len
);
57 /*************************************************************************
60 int WINAPI
StrCmpNIA ( LPCSTR str1
, LPCSTR str2
, int len
)
62 TRACE("%s %s %i stub\n", str1
,str2
,len
);
63 return strncasecmp(str1
, str2
, len
);
66 /*************************************************************************
69 int WINAPI
StrCmpNIW ( LPCWSTR wstr1
, LPCWSTR wstr2
, int len
)
71 TRACE("%s %s %i stub\n", debugstr_w(wstr1
),debugstr_w(wstr2
),len
);
72 return strncmpiW(wstr1
, wstr2
, len
);
75 /*************************************************************************
78 LPWSTR WINAPI
StrCatW( LPWSTR wstr1
, LPCWSTR wstr2
)
80 return strcatW( wstr1
, wstr2
);
84 /*************************************************************************
87 LPWSTR WINAPI
StrCpyW( LPWSTR wstr1
, LPCWSTR wstr2
)
89 return strcpyW( wstr1
, wstr2
);
93 /*************************************************************************
96 LPSTR WINAPI
StrStrA(LPCSTR lpFirst
, LPCSTR lpSrch
)
100 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
101 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
102 if (!*p2
) return (LPSTR
)lpFirst
;
108 /*************************************************************************
111 LPWSTR WINAPI
StrStrW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
115 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
116 while (*p1
&& *p2
&& *p1
== *p2
) { p1
++; p2
++; }
117 if (!*p2
) return (LPWSTR
)lpFirst
;
123 /*************************************************************************
126 LPSTR WINAPI
StrStrIA(LPCSTR lpFirst
, LPCSTR lpSrch
)
130 LPCSTR p1
= lpFirst
, p2
= lpSrch
;
131 while (*p1
&& *p2
&& toupper(*p1
) == toupper(*p2
)) { p1
++; p2
++; }
132 if (!*p2
) return (LPSTR
)lpFirst
;
138 /*************************************************************************
141 LPWSTR WINAPI
StrStrIW(LPCWSTR lpFirst
, LPCWSTR lpSrch
)
145 LPCWSTR p1
= lpFirst
, p2
= lpSrch
;
146 while (*p1
&& *p2
&& toupperW(*p1
) == toupperW(*p2
)) { p1
++; p2
++; }
147 if (!*p2
) return (LPWSTR
)lpFirst
;
153 /*************************************************************************
154 * StrToIntA [SHLWAPI]
156 int WINAPI
StrToIntA(LPCSTR lpSrc
)
158 TRACE("%s\n", lpSrc
);
162 /*************************************************************************
163 * StrToIntW [SHLWAPI]
165 int WINAPI
StrToIntW(LPCWSTR lpSrc
)
168 LPSTR lpStr
= HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc
);
170 TRACE("%s\n", debugstr_w(lpSrc
));
173 HeapFree(GetProcessHeap(),0,lpStr
);
177 /*************************************************************************
180 LPSTR WINAPI
StrDupA (LPCSTR lpSrc
)
182 int len
= strlen(lpSrc
);
183 LPSTR lpDest
= (LPSTR
) LocalAlloc(LMEM_FIXED
, len
+1);
185 TRACE("%s\n", lpSrc
);
187 if (lpDest
) strcpy(lpDest
, lpSrc
);
191 /*************************************************************************
194 LPWSTR WINAPI
StrDupW (LPCWSTR lpSrc
)
196 int len
= strlenW(lpSrc
);
197 LPWSTR lpDest
= (LPWSTR
) LocalAlloc(LMEM_FIXED
, sizeof(WCHAR
) * (len
+1));
199 TRACE("%s\n", debugstr_w(lpSrc
));
201 if (lpDest
) strcpyW(lpDest
, lpSrc
);
205 /*************************************************************************
208 int WINAPI
StrCSpnA (LPCSTR lpStr
, LPCSTR lpSet
)
210 int i
,j
, pos
= strlen(lpStr
);
212 TRACE("(%p %s %p %s)\n",
213 lpStr
, debugstr_a(lpStr
), lpSet
, debugstr_a(lpSet
));
215 for (i
=0; i
< strlen(lpSet
) ; i
++ )
217 for (j
= 0; j
< pos
;j
++)
219 if (lpStr
[j
] == lpSet
[i
])
225 TRACE("-- %u\n", pos
);
229 /*************************************************************************
232 int WINAPI
StrCSpnW (LPCWSTR lpStr
, LPCWSTR lpSet
)
234 int i
,j
, pos
= strlenW(lpStr
);
236 TRACE("(%p %s %p %s)\n",
237 lpStr
, debugstr_w(lpStr
), lpSet
, debugstr_w(lpSet
));
239 for (i
=0; i
< strlenW(lpSet
) ; i
++ )
241 for (j
= 0; j
< pos
;j
++)
243 if (lpStr
[j
] == lpSet
[i
])
249 TRACE("-- %u\n", pos
);
253 /**************************************************************************
254 * StrRChrA [SHLWAPI.@]
257 LPSTR WINAPI
StrRChrA( LPCSTR lpStart
, LPCSTR lpEnd
, WORD wMatch
)
259 LPCSTR lpGotIt
= NULL
;
260 BOOL dbcs
= IsDBCSLeadByte( LOBYTE(wMatch
) );
262 TRACE("(%p, %p, %x)\n", lpStart
, lpEnd
, wMatch
);
264 if (!lpEnd
) lpEnd
= lpStart
+ strlen(lpStart
);
266 for(; lpStart
< lpEnd
; lpStart
= CharNextA(lpStart
))
268 if (*lpStart
!= LOBYTE(wMatch
)) continue;
269 if (dbcs
&& lpStart
[1] != HIBYTE(wMatch
)) continue;
272 return (LPSTR
)lpGotIt
;
276 /**************************************************************************
277 * StrRChrW [SHLWAPI.@]
280 LPWSTR WINAPI
StrRChrW( LPCWSTR lpStart
, LPCWSTR lpEnd
, WORD wMatch
)
282 LPCWSTR lpGotIt
= NULL
;
284 TRACE("(%p, %p, %x)\n", lpStart
, lpEnd
, wMatch
);
285 if (!lpEnd
) lpEnd
= lpStart
+ strlenW(lpStart
);
287 for(; lpStart
< lpEnd
; lpStart
= CharNextW(lpStart
))
288 if (*lpStart
== wMatch
) lpGotIt
= lpStart
;
290 return (LPWSTR
)lpGotIt
;
294 /*************************************************************************
295 * StrCatBuffA [SHLWAPI]
297 * Appends back onto front, stopping when front is size-1 characters long.
301 LPSTR WINAPI
StrCatBuffA(LPSTR front
, LPCSTR back
, INT size
)
303 LPSTR dst
= front
+ strlen(front
);
304 LPCSTR src
= back
, end
= front
+ size
- 1;
306 while(dst
< end
&& *src
)
312 /*************************************************************************
313 * StrCatBuffW [SHLWAPI]
315 * Appends back onto front, stopping when front is size-1 characters long.
319 LPWSTR WINAPI
StrCatBuffW(LPWSTR front
, LPCWSTR back
, INT size
)
321 LPWSTR dst
= front
+ strlenW(front
);
322 LPCWSTR src
= back
, end
= front
+ size
- 1;
324 while(dst
< end
&& *src
)
330 /*************************************************************************
331 * StrRetToBufA [SHLWAPI.@]
333 * converts a STRRET to a normal string
336 * the pidl is for STRRET OFFSET
338 HRESULT WINAPI
StrRetToBufA (LPSTRRET src
, const ITEMIDLIST
*pidl
, LPSTR dest
, DWORD len
)
340 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest
,len
,src
,pidl
);
345 WideCharToMultiByte(CP_ACP
, 0, src
->u
.pOleStr
, -1, (LPSTR
)dest
, len
, NULL
, NULL
);
346 /* SHFree(src->u.pOleStr); FIXME: is this right? */
350 lstrcpynA((LPSTR
)dest
, src
->u
.cStr
, len
);
354 lstrcpynA((LPSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
358 FIXME("unknown type!\n");
368 /*************************************************************************
369 * StrRetToBufW [SHLWAPI.@]
371 * converts a STRRET to a normal string
374 * the pidl is for STRRET OFFSET
376 HRESULT WINAPI
StrRetToBufW (LPSTRRET src
, const ITEMIDLIST
*pidl
, LPWSTR dest
, DWORD len
)
378 TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest
,len
,src
,pidl
);
383 lstrcpynW((LPWSTR
)dest
, src
->u
.pOleStr
, len
);
384 /* SHFree(src->u.pOleStr); FIXME: is this right? */
388 lstrcpynAtoW((LPWSTR
)dest
, src
->u
.cStr
, len
);
394 lstrcpynAtoW((LPWSTR
)dest
, ((LPCSTR
)&pidl
->mkid
)+src
->u
.uOffset
, len
);
399 FIXME("unknown type!\n");
401 { *(LPSTR
)dest
= '\0';
408 /*************************************************************************
409 * StrFormatByteSizeA [SHLWAPI]
411 LPSTR WINAPI
StrFormatByteSizeA ( DWORD dw
, LPSTR pszBuf
, UINT cchBuf
)
413 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
415 { sprintf (buf
,"%3.1f bytes", (FLOAT
)dw
);
417 else if ( dw
<1048576L)
418 { sprintf (buf
,"%3.1f KB", (FLOAT
)dw
/1024);
420 else if ( dw
< 1073741824L)
421 { sprintf (buf
,"%3.1f MB", (FLOAT
)dw
/1048576L);
424 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
426 lstrcpynA (pszBuf
, buf
, cchBuf
);
430 /*************************************************************************
431 * StrFormatByteSizeW [SHLWAPI]
433 LPWSTR WINAPI
StrFormatByteSizeW ( DWORD dw
, LPWSTR pszBuf
, UINT cchBuf
)
435 TRACE("%lx %p %i\n", dw
, pszBuf
, cchBuf
);
437 { sprintf (buf
,"%3.1f bytes", (FLOAT
)dw
);
439 else if ( dw
<1048576L)
440 { sprintf (buf
,"%3.1f KB", (FLOAT
)dw
/1024);
442 else if ( dw
< 1073741824L)
443 { sprintf (buf
,"%3.1f MB", (FLOAT
)dw
/1048576L);
446 { sprintf (buf
,"%3.1f GB", (FLOAT
)dw
/1073741824L);
448 lstrcpynAtoW (pszBuf
, buf
, cchBuf
);
452 /*************************************************************************
453 * wnsprintfA [SHLWAPI]
455 int WINAPIV
wnsprintfA(LPSTR lpOut
, int cchLimitIn
, LPCSTR lpFmt
, ...)
460 va_start( valist
, lpFmt
);
461 res
= wvsnprintfA( lpOut
, cchLimitIn
, lpFmt
, valist
);
466 /*************************************************************************
467 * wnsprintfW [SHLWAPI]
469 int WINAPIV
wnsprintfW(LPWSTR lpOut
, int cchLimitIn
, LPCWSTR lpFmt
, ...)
474 va_start( valist
, lpFmt
);
475 res
= wvsnprintfW( lpOut
, cchLimitIn
, lpFmt
, valist
);