Removed shell.h. Cleaned up the nested includes mess in wine/obj_*.h.
[wine.git] / dlls / shlwapi / string.c
blobc9bd12a0a72832916a17a3ae22097553d72e1182
1 #include <ctype.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
6 #include "winerror.h"
7 #include "windef.h"
8 #include "winbase.h"
9 #include "wingdi.h"
10 #include "winuser.h"
11 #include "shlwapi.h"
12 #include "shlobj.h"
13 #include "wine/unicode.h"
14 #include "wine/winestring.h"
15 #include "heap.h"
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(shell);
20 /*************************************************************************
21 * StrChrA [SHLWAPI]
23 LPSTR WINAPI StrChrA (LPCSTR str, WORD c)
25 TRACE("%s %i\n", str,c);
26 return strchr(str, c);
29 /*************************************************************************
30 * StrChrW [SHLWAPI]
33 LPWSTR WINAPI StrChrW (LPCWSTR str, WCHAR x )
35 TRACE("%s 0x%04x\n",debugstr_w(str),x);
36 return strchrW(str, x);
39 /*************************************************************************
40 * StrCmpNA [SHLWAPI]
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 /*************************************************************************
49 * StrCmpNW [SHLWAPI]
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 /*************************************************************************
58 * StrCmpNIA [SHLWAPI]
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 /*************************************************************************
67 * StrCmpNIW [SHLWAPI]
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 /*************************************************************************
76 * StrCatW [SHLWAPI]
78 LPWSTR WINAPI StrCatW( LPWSTR wstr1, LPCWSTR wstr2 )
80 return strcatW( wstr1, wstr2 );
84 /*************************************************************************
85 * StrCpyW [SHLWAPI]
87 LPWSTR WINAPI StrCpyW( LPWSTR wstr1, LPCWSTR wstr2 )
89 return strcpyW( wstr1, wstr2 );
93 /*************************************************************************
94 * StrStrA [SHLWAPI]
96 LPSTR WINAPI StrStrA(LPCSTR lpFirst, LPCSTR lpSrch)
98 while (*lpFirst)
100 LPCSTR p1 = lpFirst, p2 = lpSrch;
101 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
102 if (!*p2) return (LPSTR)lpFirst;
103 lpFirst++;
105 return NULL;
108 /*************************************************************************
109 * StrStrW [SHLWAPI]
111 LPWSTR WINAPI StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch)
113 while (*lpFirst)
115 LPCWSTR p1 = lpFirst, p2 = lpSrch;
116 while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
117 if (!*p2) return (LPWSTR)lpFirst;
118 lpFirst++;
120 return NULL;
123 /*************************************************************************
124 * StrStrIA [SHLWAPI]
126 LPSTR WINAPI StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch)
128 while (*lpFirst)
130 LPCSTR p1 = lpFirst, p2 = lpSrch;
131 while (*p1 && *p2 && toupper(*p1) == toupper(*p2)) { p1++; p2++; }
132 if (!*p2) return (LPSTR)lpFirst;
133 lpFirst++;
135 return NULL;
138 /*************************************************************************
139 * StrStrIW [SHLWAPI]
141 LPWSTR WINAPI StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch)
143 while (*lpFirst)
145 LPCWSTR p1 = lpFirst, p2 = lpSrch;
146 while (*p1 && *p2 && toupperW(*p1) == toupperW(*p2)) { p1++; p2++; }
147 if (!*p2) return (LPWSTR)lpFirst;
148 lpFirst++;
150 return NULL;
153 /*************************************************************************
154 * StrToIntA [SHLWAPI]
156 int WINAPI StrToIntA(LPCSTR lpSrc)
158 TRACE("%s\n", lpSrc);
159 return atol(lpSrc);
162 /*************************************************************************
163 * StrToIntW [SHLWAPI]
165 int WINAPI StrToIntW(LPCWSTR lpSrc)
167 int ret;
168 LPSTR lpStr = HEAP_strdupWtoA(GetProcessHeap(),0,lpSrc);
170 TRACE("%s\n", debugstr_w(lpSrc));
172 ret = atol(lpStr);
173 HeapFree(GetProcessHeap(),0,lpStr);
174 return ret;
177 /*************************************************************************
178 * StrDupA [SHLWAPI]
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);
188 return lpDest;
191 /*************************************************************************
192 * StrDupW [SHLWAPI]
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);
202 return lpDest;
205 /*************************************************************************
206 * StrCSpnA [SHLWAPI]
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])
221 pos = j;
225 TRACE("-- %u\n", pos);
226 return pos;
229 /*************************************************************************
230 * StrCSpnW [SHLWAPI]
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])
245 pos = j;
249 TRACE("-- %u\n", pos);
250 return 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;
270 lpGotIt = lpStart;
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.
298 * Returns front.
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)
307 *dst++ = *src++;
308 *dst = '\0';
309 return front;
312 /*************************************************************************
313 * StrCatBuffW [SHLWAPI]
315 * Appends back onto front, stopping when front is size-1 characters long.
316 * Returns front.
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)
325 *dst++ = *src++;
326 *dst = '\0';
327 return front;
330 /*************************************************************************
331 * StrRetToBufA [SHLWAPI.@]
333 * converts a STRRET to a normal string
335 * NOTES
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);
342 switch (src->uType)
344 case STRRET_WSTR:
345 WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
346 /* SHFree(src->u.pOleStr); FIXME: is this right? */
347 break;
349 case STRRET_CSTRA:
350 lstrcpynA((LPSTR)dest, src->u.cStr, len);
351 break;
353 case STRRET_OFFSETA:
354 lstrcpynA((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
355 break;
357 default:
358 FIXME("unknown type!\n");
359 if (len)
361 *(LPSTR)dest = '\0';
363 return(FALSE);
365 return S_OK;
368 /*************************************************************************
369 * StrRetToBufW [SHLWAPI.@]
371 * converts a STRRET to a normal string
373 * NOTES
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);
380 switch (src->uType)
382 case STRRET_WSTR:
383 lstrcpynW((LPWSTR)dest, src->u.pOleStr, len);
384 /* SHFree(src->u.pOleStr); FIXME: is this right? */
385 break;
387 case STRRET_CSTRA:
388 lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
389 break;
391 case STRRET_OFFSETA:
392 if (pidl)
394 lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
396 break;
398 default:
399 FIXME("unknown type!\n");
400 if (len)
401 { *(LPSTR)dest = '\0';
403 return(FALSE);
405 return S_OK;
408 /*************************************************************************
409 * StrFormatByteSizeA [SHLWAPI]
411 LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
412 { char buf[64];
413 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
414 if ( dw<1024L )
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);
423 else
424 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
426 lstrcpynA (pszBuf, buf, cchBuf);
427 return pszBuf;
430 /*************************************************************************
431 * StrFormatByteSizeW [SHLWAPI]
433 LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
434 { char buf[64];
435 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
436 if ( dw<1024L )
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);
445 else
446 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
448 lstrcpynAtoW (pszBuf, buf, cchBuf);
449 return pszBuf;
452 /*************************************************************************
453 * wnsprintfA [SHLWAPI]
455 int WINAPIV wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...)
457 va_list valist;
458 INT res;
460 va_start( valist, lpFmt );
461 res = wvsnprintfA( lpOut, cchLimitIn, lpFmt, valist );
462 va_end( valist );
463 return res;
466 /*************************************************************************
467 * wnsprintfW [SHLWAPI]
469 int WINAPIV wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...)
471 va_list valist;
472 INT res;
474 va_start( valist, lpFmt );
475 res = wvsnprintfW( lpOut, cchLimitIn, lpFmt, valist );
476 va_end( valist );
477 return res;