Cleaned up a few inter-dll dependencies. Added a few imports.
[wine/multimedia.git] / dlls / shlwapi / string.c
blob8becbd43f5978268a01ae5b5ada88746bd2bab30
1 #include <ctype.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
6 #include "winerror.h"
7 #include "wine/undocshell.h"
8 #include "wine/unicode.h"
9 #include "heap.h"
10 #include "debugtools.h"
12 DEFAULT_DEBUG_CHANNEL(shell);
14 /*************************************************************************
15 * StrChrA [SHLWAPI]
17 LPSTR WINAPI StrChrA (LPCSTR str, INT c)
19 TRACE("%s %i\n", str,c);
20 return strchr(str, c);
23 /*************************************************************************
24 * StrChrW [SHLWAPI]
27 LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
29 TRACE("%s 0x%04x\n",debugstr_w(str),x);
30 return strchrW(str, x);
33 /*************************************************************************
34 * StrCmpNA [SHLWAPI]
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 /*************************************************************************
43 * StrCmpNW [SHLWAPI]
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 /*************************************************************************
52 * StrCmpNIA [SHLWAPI]
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 /*************************************************************************
61 * StrCmpNIW [SHLWAPI]
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 /*************************************************************************
70 * StrCatW [SHLWAPI]
72 LPWSTR WINAPI StrCatW( LPWSTR wstr1, LPCWSTR wstr2 )
74 return strcatW( wstr1, wstr2 );
78 /*************************************************************************
79 * StrCpyW [SHLWAPI]
81 LPWSTR WINAPI StrCpyW( LPWSTR wstr1, LPCWSTR wstr2 )
83 return strcpyW( wstr1, wstr2 );
87 /*************************************************************************
88 * StrStrA [SHLWAPI]
90 LPSTR WINAPI StrStrA(LPCSTR lpFirst, LPCSTR lpSrch)
92 while (*lpFirst)
94 LPCSTR p1 = lpFirst, p2 = lpSrch;
95 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
96 if (!*p2) return (LPSTR)lpFirst;
97 lpFirst++;
99 return NULL;
102 /*************************************************************************
103 * StrStrW [SHLWAPI]
105 LPWSTR WINAPI StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch)
107 while (*lpFirst)
109 LPCWSTR p1 = lpFirst, p2 = lpSrch;
110 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
111 if (!*p2) return (LPWSTR)lpFirst;
112 lpFirst++;
114 return NULL;
117 /*************************************************************************
118 * StrStrIA [SHLWAPI]
120 LPSTR WINAPI StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch)
122 while (*lpFirst)
124 LPCSTR p1 = lpFirst, p2 = lpSrch;
125 while (*p1 && *p2 && toupper(*p1) == toupper(*p2)) { p1++; p2++; }
126 if (!*p2) return (LPSTR)lpFirst;
127 lpFirst++;
129 return NULL;
132 /*************************************************************************
133 * StrStrIW [SHLWAPI]
135 LPWSTR WINAPI StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch)
137 while (*lpFirst)
139 LPCWSTR p1 = lpFirst, p2 = lpSrch;
140 while (*p1 && *p2 && toupperW(*p1) == toupperW(*p2)) { p1++; p2++; }
141 if (!*p2) return (LPWSTR)lpFirst;
142 lpFirst++;
144 return NULL;
147 /*************************************************************************
148 * StrToIntA [SHLWAPI]
150 int WINAPI StrToIntA(LPCSTR lpSrc)
152 TRACE("%s\n", lpSrc);
153 return atol(lpSrc);
156 /*************************************************************************
157 * StrToIntW [SHLWAPI]
159 int WINAPI StrToIntW(LPCWSTR lpSrc)
161 int ret;
162 LPSTR lpStr = HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc);
164 TRACE("%s\n", debugstr_w(lpSrc));
166 ret = atol(lpStr);
167 HeapFree(GetProcessHeap(),0,lpStr);
168 return ret;
171 /*************************************************************************
172 * StrDupA [SHLWAPI]
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);
182 return lpDest;
185 /*************************************************************************
186 * StrDupW [SHLWAPI]
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);
196 return lpDest;
199 /*************************************************************************
200 * StrCSpnA [SHLWAPI]
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])
215 pos = j;
219 TRACE("-- %u\n", pos);
220 return pos;
223 /*************************************************************************
224 * StrCSpnW [SHLWAPI]
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])
239 pos = j;
243 TRACE("-- %u\n", pos);
244 return 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;
264 lpGotIt = lpStart;
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.
292 * Returns front.
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)
301 *dst++ = *src++;
302 *dst = '\0';
303 return front;
306 /*************************************************************************
307 * StrCatBuffW [SHLWAPI]
309 * Appends back onto front, stopping when front is size-1 characters long.
310 * Returns front.
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)
319 *dst++ = *src++;
320 *dst = '\0';
321 return front;
324 /*************************************************************************
325 * StrRetToBufA [SHLWAPI.@]
327 * converts a STRRET to a normal string
329 * NOTES
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);
336 switch (src->uType)
338 case STRRET_WSTR:
339 WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
340 /* SHFree(src->u.pOleStr); FIXME: is this right? */
341 break;
343 case STRRET_CSTRA:
344 lstrcpynA((LPSTR)dest, src->u.cStr, len);
345 break;
347 case STRRET_OFFSETA:
348 lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
349 break;
351 default:
352 FIXME("unknown type!\n");
353 if (len)
355 *(LPSTR)dest = '\0';
357 return(FALSE);
359 return S_OK;
362 /*************************************************************************
363 * StrRetToBufW [SHLWAPI.@]
365 * converts a STRRET to a normal string
367 * NOTES
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);
374 switch (src->uType)
376 case STRRET_WSTR:
377 lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
378 /* SHFree(src->u.pOleStr); FIXME: is this right? */
379 break;
381 case STRRET_CSTRA:
382 lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
383 break;
385 case STRRET_OFFSETA:
386 if (pidl)
388 lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
390 break;
392 default:
393 FIXME("unknown type!\n");
394 if (len)
395 { *(LPSTR)dest = '\0';
397 return(FALSE);
399 return S_OK;
402 /*************************************************************************
403 * StrFormatByteSizeA [SHLWAPI]
405 LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
406 { char buf[64];
407 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
408 if ( dw<1024L )
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);
417 else
418 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
420 lstrcpynA (pszBuf, buf, cchBuf);
421 return pszBuf;
424 /*************************************************************************
425 * StrFormatByteSizeW [SHLWAPI]
427 LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR 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 lstrcpynAtoW (pszBuf, buf, cchBuf);
443 return pszBuf;
446 /*************************************************************************
447 * wnsprintfA [SHLWAPI]
449 int WINAPIV wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...)
451 va_list valist;
452 INT res;
454 va_start( valist, lpFmt );
455 res = wvsnprintfA( lpOut, cchLimitIn, lpFmt, valist );
456 va_end( valist );
457 return res;
460 /*************************************************************************
461 * wnsprintfW [SHLWAPI]
463 int WINAPIV wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...)
465 va_list valist;
466 INT res;
468 va_start( valist, lpFmt );
469 res = wvsnprintfW( lpOut, cchLimitIn, lpFmt, valist );
470 va_end( valist );
471 return res;