4 * Many of this functions are in SHLWAPI.DLL also
17 #include "winversion.h"
18 #include "shell32_main.h"
20 /*************************************************************************
21 * PathIsRoot [SHELL32.29]
23 BOOL32 WINAPI PathIsRoot32A(LPCSTR x)
24 { TRACE(shell,"%s\n",x);
25 if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
27 if (*x=='\\') /* "\" */
29 if (x[0]=='\\' && x[1]=='\\') /* UNC "\\<xx>\" */
30 { int foundbackslash = 0;
36 if (foundbackslash<=1) /* max 1 \ more ... */
41 BOOL32 WINAPI PathIsRoot32W(LPCWSTR x)
42 { TRACE(shell,"%s\n",debugstr_w(x));
43 if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
45 if (*x == (WCHAR) '\\') /* "\" */
47 if (x[0]==(WCHAR)'\\' && x[1]==(WCHAR)'\\') /* UNC "\\<xx>\" */
48 { int foundbackslash = 0;
51 { if (*x++==(WCHAR)'\\')
54 if (foundbackslash<=1) /* max 1 \ more ... */
59 BOOL32 WINAPI PathIsRoot32AW(LPCVOID x)
60 { if (VERSION_OsIsUnicode())
61 return PathIsRoot32W(x);
62 return PathIsRoot32A(x);
65 /*************************************************************************
66 * PathBuildRoot [SHELL32.30]
68 LPSTR WINAPI PathBuildRoot(LPSTR root,BYTE drive) {
69 TRACE(shell,"%p %i\n",root, drive);
75 /*************************************************************************
76 * PathFindExtension [SHELL32.31]
79 * returns pointer to last . in last pathcomponent or at \0.
81 LPCSTR WINAPI PathFindExtension32A(LPCSTR path)
82 { LPCSTR lastpoint = NULL;
83 TRACE(shell,"%p %s\n",path,path);
85 { if (*path=='\\'||*path==' ')
91 return lastpoint?lastpoint:path;
93 LPCWSTR WINAPI PathFindExtension32W(LPCWSTR path)
94 { LPCWSTR lastpoint = NULL;
95 TRACE(shell,"%p L%s\n",path,debugstr_w(path));
97 { if (*path==(WCHAR)'\\'||*path==(WCHAR)' ')
99 if (*path==(WCHAR)'.')
103 return lastpoint?lastpoint:path;
105 LPCVOID WINAPI PathFindExtension32AW(LPCVOID path)
106 { if (VERSION_OsIsUnicode())
107 return PathFindExtension32W(path);
108 return PathFindExtension32A(path);
112 /*************************************************************************
113 * PathAddBackslash [SHELL32.32]
116 * append \ if there is none
118 LPSTR WINAPI PathAddBackslash32A(LPSTR path)
120 TRACE(shell,"%p->%s\n",path,path);
123 if (len && path[len-1]!='\\')
130 LPWSTR WINAPI PathAddBackslash32W(LPWSTR path)
132 TRACE(shell,"%p->%s\n",path,debugstr_w(path));
134 len = lstrlen32W(path);
135 if (len && path[len-1]!=(WCHAR)'\\')
136 { path[len] = (WCHAR)'\\';
142 LPVOID WINAPI PathAddBackslash32AW(LPVOID path)
143 { if(VERSION_OsIsUnicode())
144 return PathAddBackslash32W(path);
145 return PathAddBackslash32A(path);
148 /*************************************************************************
149 * PathRemoveBlanks [SHELL32.33]
152 * remove spaces from beginning and end of passed string
154 LPSTR WINAPI PathRemoveBlanks32A(LPSTR str)
156 TRACE(shell,"%s\n",str);
169 LPWSTR WINAPI PathRemoveBlanks32W(LPWSTR str)
171 TRACE(shell,"%s\n",debugstr_w(str));
177 x=str+lstrlen32W(str)-1;
184 LPVOID WINAPI PathRemoveBlanks32AW(LPVOID str)
185 { if(VERSION_OsIsUnicode())
186 return PathRemoveBlanks32W(str);
187 return PathRemoveBlanks32A(str);
192 /*************************************************************************
193 * PathFindFilename [SHELL32.34]
196 * basename(char *fn);
198 LPCSTR WINAPI PathFindFilename32A(LPCSTR aptr)
202 TRACE(shell,"%s\n",aslash);
204 { if (((aptr[0]=='\\') || (aptr[0]==':')) && aptr[1] && aptr[1]!='\\')
211 LPCWSTR WINAPI PathFindFilename32W(LPCWSTR wptr)
215 TRACE(shell,"L%s\n",debugstr_w(wslash));
217 { if (((wptr[0]=='\\') || (wptr[0]==':')) && wptr[1] && wptr[1]!='\\')
223 LPCVOID WINAPI PathFindFilename32AW(LPCVOID fn)
225 if(VERSION_OsIsUnicode())
226 return PathFindFilename32W(fn);
227 return PathFindFilename32A(fn);
230 /*************************************************************************
231 * PathRemoveFileSpec [SHELL32.35]
234 * bool getpath(char *pathname); truncates passed argument to a valid path
235 * returns if the string was modified or not.
236 * "\foo\xx\foo"-> "\foo\xx"
240 DWORD WINAPI PathRemoveFileSpec(LPSTR fn) {
242 TRACE(shell,"%s\n",fn);
256 continue; /* already x++ed */
274 /*************************************************************************
275 * PathAppend [SHELL32.36]
278 * concat_paths(char*target,const char*add);
279 * concats "target\\add" and writes them to target
281 LPSTR WINAPI PathAppend(LPSTR x1,LPSTR x2) {
282 TRACE(shell,"%s %s\n",x1,x2);
283 while (x2[0]=='\\') x2++;
284 return PathCombine32A(x1,x1,x2);
287 /*************************************************************************
288 * PathCombine [SHELL32.37]
291 * if lpszFile='.' skip it
292 * szDest can be equal to lpszFile. Thats why we use sTemp
294 LPSTR WINAPI PathCombine32A(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile)
295 { char sTemp[MAX_PATH];
296 TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
299 if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) )
300 { strcpy(szDest,lpszDir);
304 /* if lpszFile is a complete path don't care about lpszDir */
305 if (PathIsRoot32A(lpszFile))
306 { strcpy(szDest,lpszFile);
308 strcpy(sTemp,lpszDir);
309 PathAddBackslash32A(sTemp);
310 strcat(sTemp,lpszFile);
311 strcpy(szDest,sTemp);
314 LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
315 { WCHAR sTemp[MAX_PATH];
316 TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
317 lpszFile, debugstr_w(lpszFile));
320 if (!lpszFile || !lpszFile[0] || (lpszFile[0]==(WCHAR)'.' && !lpszFile[1]) )
321 { lstrcpy32W(szDest,lpszDir);
325 /* if lpszFile is a complete path don't care about lpszDir */
326 if (PathIsRoot32W(lpszFile))
327 { lstrcpy32W(szDest,lpszFile);
329 lstrcpy32W(sTemp,lpszDir);
330 PathAddBackslash32W(sTemp);
331 lstrcat32W(sTemp,lpszFile);
332 lstrcpy32W(szDest,sTemp);
335 LPVOID WINAPI PathCombine32AW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile)
336 { if (VERSION_OsIsUnicode())
337 return PathCombine32W( szDest, lpszDir, lpszFile );
338 return PathCombine32A( szDest, lpszDir, lpszFile );
341 /*************************************************************************
342 * PathIsUNC [SHELL32.39]
345 * PathIsUNC(char*path);
347 BOOL32 WINAPI PathIsUNC32A(LPCSTR path)
348 { TRACE(shell,"%s\n",path);
350 if ((path[0]=='\\') && (path[1]=='\\'))
354 BOOL32 WINAPI PathIsUNC32W(LPCWSTR path)
355 { TRACE(shell,"%s\n",debugstr_w(path));
357 if ((path[0]=='\\') && (path[1]=='\\'))
361 BOOL32 WINAPI PathIsUNC32AW (LPCVOID path)
362 { if (VERSION_OsIsUnicode())
363 return PathIsUNC32W( path );
364 return PathIsUNC32A( path );
366 /*************************************************************************
367 * PathIsRelativ [SHELL32.40]
370 BOOL32 WINAPI PathIsRelative32A (LPCSTR path)
371 { TRACE(shell,"path=%s\n",path);
373 if (path && (path[0]!='\\' && path[1]==':'))
377 BOOL32 WINAPI PathIsRelative32W (LPCWSTR path)
378 { TRACE(shell,"path=%s\n",debugstr_w(path));
380 if (path && (path[0]!='\\' && path[1]==':'))
384 BOOL32 WINAPI PathIsRelative32AW (LPCVOID path)
385 { if (VERSION_OsIsUnicode())
386 return PathIsRelative32W( path );
387 return PathIsRelative32A( path );
389 /*************************************************************************
390 * PathIsExe [SHELL32.43]
393 BOOL32 WINAPI PathIsExe (LPCSTR path)
394 { TRACE(shell,"path=%s\n",path);
398 /*************************************************************************
399 * PathFileExists [SHELL32.45]
402 * file_exists(char *fn);
404 BOOL32 WINAPI PathFileExists(LPSTR fn) {
405 TRACE(shell,"%s\n",fn);
406 if (GetFileAttributes32A(fn)==-1)
411 /*************************************************************************
412 * PathMatchSpec [SHELL32.46]
418 BOOL32 WINAPI PathMatchSpec32A(LPCSTR name, LPCSTR mask)
421 TRACE(shell,"%s %s stub\n",name,mask);
424 while (*_name && *mask)
429 else if (*mask == '*')
431 while (*mask == '*') mask++; /* Skip consecutive '*' */
432 if (!*mask || *mask==';') return TRUE; /* '*' matches everything */
433 while (*_name && (toupper(*_name) != toupper(*mask))) _name++;
435 { while ( *mask && *mask != ';') mask++;
439 else if ( (*mask == '?') || (toupper(*mask) == toupper(*_name)) )
444 { while ( *mask && *mask != ';') mask++;
447 return (!*_name && (!*mask || *mask==';'));
449 BOOL32 WINAPI PathMatchSpec32W(LPCWSTR name, LPCWSTR mask)
453 TRACE(shell,"%s %s stub\n",debugstr_w(name),debugstr_w(mask));
455 lstrcpyAtoW(stemp,"*.*");
456 if (!lstrcmp32W( mask, stemp )) return 1;
459 while (*_name && *mask)
464 else if (*mask == '*')
466 while (*mask == '*') mask++; /* Skip consecutive '*' */
467 if (!*mask || *mask==';') return TRUE; /* '*' matches everything */
468 while (*_name && (towupper(*_name) != towupper(*mask))) _name++;
470 { while ( *mask && *mask != ';') mask++;
474 else if ( (*mask == '?') || (towupper(*mask) == towupper(*_name)) )
479 { while ( *mask && *mask != ';') mask++;
482 return (!*_name && (!*mask || *mask==';'));
484 BOOL32 WINAPI PathMatchSpec32AW(LPVOID name, LPVOID mask)
485 { if (VERSION_OsIsUnicode())
486 return PathMatchSpec32W( name, mask );
487 return PathMatchSpec32A( name, mask );
489 /*************************************************************************
490 * PathSetDlgItemPath32AW [SHELL32.48]
492 * use PathCompactPath to make sure, the path fits into the control
495 BOOL32 WINAPI PathSetDlgItemPath32A(HWND32 hDlg, int id, LPCSTR pszPath)
496 { TRACE(shell,"%x %x %s\n",hDlg, id, pszPath);
497 return SetDlgItemText32A(hDlg, id, pszPath);
499 BOOL32 WINAPI PathSetDlgItemPath32W(HWND32 hDlg, int id, LPCWSTR pszPath)
500 { TRACE(shell,"%x %x %s\n",hDlg, id, debugstr_w(pszPath));
501 return SetDlgItemText32W(hDlg, id, pszPath);
503 BOOL32 WINAPI PathSetDlgItemPath32AW(HWND32 hDlg, int id, LPCVOID pszPath)
504 { if (VERSION_OsIsUnicode())
505 return PathSetDlgItemPath32W(hDlg, id, pszPath);
506 return PathSetDlgItemPath32A(hDlg, id, pszPath);
509 /*************************************************************************
510 * PathResolve [SHELL32.51]
512 DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
513 FIXME(shell,"(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
517 /*************************************************************************
518 * PathGetArgs [SHELL32.52]
521 * look for next arg in string. handle "quoted" strings
522 * returns pointer to argument *AFTER* the space. Or to the \0.
524 LPVOID WINAPI PathGetArgs(LPVOID cmdline)
525 { BOOL32 qflag = FALSE;
529 if (VERSION_OsIsUnicode())
530 { TRACE(shell,"%sL\n",debugstr_w((LPWSTR)cmdline));
531 wptr=(LPWSTR) cmdline;
533 { if ((*wptr==' ') && !qflag)
539 return (LPVOID) wptr;
541 TRACE(shell,"%s\n",(LPSTR)cmdline);
542 aptr=(LPSTR) cmdline;
544 { if ((*aptr==' ') && !qflag)
550 return (LPVOID) aptr;
552 /*************************************************************************
553 * PathQuoteSpaces [SHELL32.55]
556 * basename(char *fn);
558 LPSTR WINAPI PathQuoteSpaces32A(LPCSTR aptr)
559 { FIXME(shell,"%s\n",aptr);
563 LPWSTR WINAPI PathQuoteSpaces32W(LPCWSTR wptr)
564 { FIXME(shell,"L%s\n",debugstr_w(wptr));
567 LPVOID WINAPI PathQuoteSpaces32AW (LPCVOID fn)
568 { if(VERSION_OsIsUnicode())
569 return PathQuoteSpaces32W(fn);
570 return PathQuoteSpaces32A(fn);
574 /*************************************************************************
575 * PathUnquoteSpaces [SHELL32.56]
578 * unquote string (remove ")
580 VOID WINAPI PathUnquoteSpaces(LPSTR str) {
581 DWORD len = lstrlen32A(str);
582 TRACE(shell,"%s\n",str);
583 if (*str!='"') return;
584 if (str[len-1]!='"') return;
586 lstrcpy32A(str,str+1);
590 /*************************************************************************
591 * PathGetDriveNumber32 [SHELL32.57]
594 HRESULT WINAPI PathGetDriveNumber32(LPSTR u)
595 { FIXME(shell,"%s stub\n",debugstr_a(u));
599 /*************************************************************************
600 * PathYetAnotherMakeUniqueName [SHELL32.75]
603 * exported by ordinal
605 BOOL32 WINAPI PathYetAnotherMakeUniqueName(LPDWORD x,LPDWORD y) {
606 FIXME(shell,"(%p,%p):stub.\n",x,y);
610 /*************************************************************************
611 * IsLFNDrive [SHELL32.119]
614 * exported by ordinal Name
616 BOOL32 WINAPI IsLFNDrive(LPCSTR path) {
619 if (!GetVolumeInformation32A(path,NULL,0,NULL,&fnlen,NULL,NULL,0))
623 /*************************************************************************
624 * PathFindOnPath [SHELL32.145]
626 BOOL32 WINAPI PathFindOnPath32A(LPSTR sFile, LPCSTR sOtherDirs)
627 { FIXME(shell,"%s %s\n",sFile, sOtherDirs);
630 BOOL32 WINAPI PathFindOnPath32W(LPWSTR sFile, LPCWSTR sOtherDirs)
631 { FIXME(shell,"%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
634 BOOL32 WINAPI PathFindOnPath32AW(LPVOID sFile, LPCVOID sOtherDirs)
635 { if (VERSION_OsIsUnicode())
636 return PathFindOnPath32W(sFile, sOtherDirs);
637 return PathFindOnPath32A(sFile, sOtherDirs);
640 /*************************************************************************
641 * PathGetExtension [SHELL32.158]
644 * exported by ordinal
646 LPCSTR WINAPI PathGetExtension32A(LPCSTR path,DWORD y,DWORD z)
647 { TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
648 path = PathFindExtension32A(path);
649 return *path?(path+1):path;
651 LPCWSTR WINAPI PathGetExtension32W(LPCWSTR path,DWORD y,DWORD z)
652 { TRACE(shell,"(L%s,%08lx,%08lx)\n",debugstr_w(path),y,z);
653 path = PathFindExtension32W(path);
654 return *path?(path+1):path;
656 LPCVOID WINAPI PathGetExtension32AW(LPCVOID path,DWORD y,DWORD z)
657 { if (VERSION_OsIsUnicode())
658 return PathGetExtension32W(path,y,z);
659 return PathGetExtension32A(path,y,z);
662 /*************************************************************************
663 * SheGetDirW [SHELL32.281]
666 HRESULT WINAPI SheGetDir32W(LPWSTR u, LPWSTR v)
667 { FIXME(shell,"%s %s stub\n",debugstr_w(u),debugstr_w(v) );
671 /*************************************************************************
672 * SheChangeDirW [SHELL32.274]
675 HRESULT WINAPI SheChangeDir32W(LPWSTR u)
676 { FIXME(shell,"(%s),stub\n",debugstr_w(u));
680 /*************************************************************************
681 * PathProcessCommand [SHELL32.653]
683 HRESULT WINAPI PathProcessCommand (DWORD u, DWORD v, DWORD w, DWORD x)
684 { FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x);