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 );