1998-11-25 17:47:05 +01:00
|
|
|
/*
|
|
|
|
* Path Functions
|
|
|
|
*
|
|
|
|
* Many of this functions are in SHLWAPI.DLL also
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include "debug.h"
|
|
|
|
#include "winnls.h"
|
|
|
|
#include "winversion.h"
|
1999-01-23 15:12:48 +01:00
|
|
|
|
|
|
|
#include "shlobj.h"
|
1998-11-25 17:47:05 +01:00
|
|
|
#include "shell32_main.h"
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathIsRoot [SHELL32.29]
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRootA(LPCSTR x)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"%s\n",x);
|
|
|
|
if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
|
|
|
|
return 1;
|
|
|
|
if (*x=='\\') /* "\" */
|
|
|
|
return 0;
|
|
|
|
if (x[0]=='\\' && x[1]=='\\') /* UNC "\\<xx>\" */
|
|
|
|
{ int foundbackslash = 0;
|
|
|
|
x=x+2;
|
|
|
|
while (*x)
|
|
|
|
{ if (*x++=='\\')
|
|
|
|
foundbackslash++;
|
|
|
|
}
|
|
|
|
if (foundbackslash<=1) /* max 1 \ more ... */
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRootW(LPCWSTR x)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"%s\n",debugstr_w(x));
|
|
|
|
if (*(x+1)==':' && *(x+2)=='\\') /* "X:\" */
|
|
|
|
return 1;
|
|
|
|
if (*x == (WCHAR) '\\') /* "\" */
|
|
|
|
return 0;
|
|
|
|
if (x[0]==(WCHAR)'\\' && x[1]==(WCHAR)'\\') /* UNC "\\<xx>\" */
|
|
|
|
{ int foundbackslash = 0;
|
|
|
|
x=x+2;
|
|
|
|
while (*x)
|
|
|
|
{ if (*x++==(WCHAR)'\\')
|
|
|
|
foundbackslash++;
|
|
|
|
}
|
|
|
|
if (foundbackslash<=1) /* max 1 \ more ... */
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRootAW(LPCVOID x)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathIsRootW(x);
|
|
|
|
return PathIsRootA(x);
|
1998-11-25 17:47:05 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
/*************************************************************************
|
|
|
|
* PathBuildRoot [SHELL32.30]
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathBuildRootA(LPSTR root,BYTE drive) {
|
1998-11-25 17:47:05 +01:00
|
|
|
TRACE(shell,"%p %i\n",root, drive);
|
|
|
|
strcpy(root,"A:\\");
|
|
|
|
root[0]+=drive;
|
|
|
|
return root;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathFindExtension [SHELL32.31]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* returns pointer to last . in last pathcomponent or at \0.
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCSTR WINAPI PathFindExtensionA(LPCSTR path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPCSTR lastpoint = NULL;
|
|
|
|
TRACE(shell,"%p %s\n",path,path);
|
|
|
|
while (*path)
|
|
|
|
{ if (*path=='\\'||*path==' ')
|
|
|
|
lastpoint=NULL;
|
|
|
|
if (*path=='.')
|
|
|
|
lastpoint=path;
|
|
|
|
path++;
|
|
|
|
}
|
|
|
|
return lastpoint?lastpoint:path;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCWSTR WINAPI PathFindExtensionW(LPCWSTR path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPCWSTR lastpoint = NULL;
|
|
|
|
TRACE(shell,"%p L%s\n",path,debugstr_w(path));
|
|
|
|
while (*path)
|
|
|
|
{ if (*path==(WCHAR)'\\'||*path==(WCHAR)' ')
|
|
|
|
lastpoint=NULL;
|
|
|
|
if (*path==(WCHAR)'.')
|
|
|
|
lastpoint=path;
|
|
|
|
path++;
|
|
|
|
}
|
|
|
|
return lastpoint?lastpoint:path;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCVOID WINAPI PathFindExtensionAW(LPCVOID path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathFindExtensionW(path);
|
|
|
|
return PathFindExtensionA(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathAddBackslash [SHELL32.32]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* append \ if there is none
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathAddBackslashA(LPSTR path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ int len;
|
|
|
|
TRACE(shell,"%p->%s\n",path,path);
|
|
|
|
|
|
|
|
len = strlen(path);
|
|
|
|
if (len && path[len-1]!='\\')
|
|
|
|
{ path[len] = '\\';
|
|
|
|
path[len+1]= 0x00;
|
|
|
|
return path+len+1;
|
|
|
|
}
|
|
|
|
return path+len;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPWSTR WINAPI PathAddBackslashW(LPWSTR path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ int len;
|
|
|
|
TRACE(shell,"%p->%s\n",path,debugstr_w(path));
|
|
|
|
|
1999-02-26 12:11:13 +01:00
|
|
|
len = lstrlenW(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
if (len && path[len-1]!=(WCHAR)'\\')
|
|
|
|
{ path[len] = (WCHAR)'\\';
|
|
|
|
path[len+1]= 0x00;
|
|
|
|
return path+len+1;
|
|
|
|
}
|
|
|
|
return path+len;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPVOID WINAPI PathAddBackslashAW(LPVOID path)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if(VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathAddBackslashW(path);
|
|
|
|
return PathAddBackslashA(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathRemoveBlanks [SHELL32.33]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* remove spaces from beginning and end of passed string
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathRemoveBlanksA(LPSTR str)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPSTR x = str;
|
|
|
|
TRACE(shell,"%s\n",str);
|
|
|
|
while (*x==' ') x++;
|
|
|
|
if (x!=str)
|
|
|
|
strcpy(str,x);
|
|
|
|
if (!*str)
|
|
|
|
return str;
|
|
|
|
x=str+strlen(str)-1;
|
|
|
|
while (*x==' ')
|
|
|
|
x--;
|
|
|
|
if (*x==' ')
|
|
|
|
*x='\0';
|
|
|
|
return x;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPWSTR WINAPI PathRemoveBlanksW(LPWSTR str)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPWSTR x = str;
|
|
|
|
TRACE(shell,"%s\n",debugstr_w(str));
|
|
|
|
while (*x==' ') x++;
|
|
|
|
if (x!=str)
|
1999-02-26 12:11:13 +01:00
|
|
|
lstrcpyW(str,x);
|
1998-11-25 17:47:05 +01:00
|
|
|
if (!*str)
|
|
|
|
return str;
|
1999-02-26 12:11:13 +01:00
|
|
|
x=str+lstrlenW(str)-1;
|
1998-11-25 17:47:05 +01:00
|
|
|
while (*x==' ')
|
|
|
|
x--;
|
|
|
|
if (*x==' ')
|
|
|
|
*x='\0';
|
|
|
|
return x;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPVOID WINAPI PathRemoveBlanksAW(LPVOID str)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if(VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathRemoveBlanksW(str);
|
|
|
|
return PathRemoveBlanksA(str);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathFindFilename [SHELL32.34]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* basename(char *fn);
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCSTR WINAPI PathFindFilenameA(LPCSTR aptr)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPCSTR aslash;
|
|
|
|
aslash = aptr;
|
|
|
|
|
|
|
|
TRACE(shell,"%s\n",aslash);
|
|
|
|
while (aptr[0])
|
|
|
|
{ if (((aptr[0]=='\\') || (aptr[0]==':')) && aptr[1] && aptr[1]!='\\')
|
|
|
|
aslash = aptr+1;
|
|
|
|
aptr++;
|
|
|
|
}
|
|
|
|
return aslash;
|
|
|
|
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCWSTR WINAPI PathFindFilenameW(LPCWSTR wptr)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPCWSTR wslash;
|
|
|
|
wslash = wptr;
|
|
|
|
|
|
|
|
TRACE(shell,"L%s\n",debugstr_w(wslash));
|
|
|
|
while (wptr[0])
|
|
|
|
{ if (((wptr[0]=='\\') || (wptr[0]==':')) && wptr[1] && wptr[1]!='\\')
|
|
|
|
wslash = wptr+1;
|
|
|
|
wptr++;
|
|
|
|
}
|
|
|
|
return wslash;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCVOID WINAPI PathFindFilenameAW(LPCVOID fn)
|
1998-11-25 17:47:05 +01:00
|
|
|
{
|
|
|
|
if(VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathFindFilenameW(fn);
|
|
|
|
return PathFindFilenameA(fn);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathRemoveFileSpec [SHELL32.35]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* bool getpath(char *pathname); truncates passed argument to a valid path
|
|
|
|
* returns if the string was modified or not.
|
|
|
|
* "\foo\xx\foo"-> "\foo\xx"
|
|
|
|
* "\" -> "\"
|
|
|
|
* "a:\foo" -> "a:\"
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
DWORD WINAPI PathRemoveFileSpecA(LPSTR fn) {
|
1998-11-25 17:47:05 +01:00
|
|
|
LPSTR x,cutplace;
|
|
|
|
TRACE(shell,"%s\n",fn);
|
|
|
|
if (!fn[0])
|
|
|
|
return 0;
|
|
|
|
x=fn;
|
|
|
|
cutplace = fn;
|
|
|
|
while (*x) {
|
|
|
|
if (*x=='\\') {
|
|
|
|
cutplace=x++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (*x==':') {
|
|
|
|
x++;
|
|
|
|
if (*x=='\\')
|
|
|
|
cutplace=++x;
|
|
|
|
continue; /* already x++ed */
|
|
|
|
}
|
|
|
|
x++;
|
|
|
|
}
|
|
|
|
if (!*cutplace)
|
|
|
|
return 0;
|
|
|
|
if (cutplace==fn) {
|
|
|
|
if (fn[0]=='\\') {
|
|
|
|
if (!fn[1])
|
|
|
|
return 0;
|
|
|
|
fn[0]='\0';
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*cutplace='\0';
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathAppend [SHELL32.36]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* concat_paths(char*target,const char*add);
|
|
|
|
* concats "target\\add" and writes them to target
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathAppendA(LPSTR x1,LPSTR x2) {
|
1998-11-25 17:47:05 +01:00
|
|
|
TRACE(shell,"%s %s\n",x1,x2);
|
|
|
|
while (x2[0]=='\\') x2++;
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathCombineA(x1,x1,x2);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathCombine [SHELL32.37]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* if lpszFile='.' skip it
|
|
|
|
* szDest can be equal to lpszFile. Thats why we use sTemp
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathCombineA(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ char sTemp[MAX_PATH];
|
|
|
|
TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
|
|
|
|
|
|
|
|
|
|
|
|
if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) )
|
|
|
|
{ strcpy(szDest,lpszDir);
|
|
|
|
return szDest;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if lpszFile is a complete path don't care about lpszDir */
|
1999-02-26 12:11:13 +01:00
|
|
|
if (PathIsRootA(lpszFile))
|
1998-11-25 17:47:05 +01:00
|
|
|
{ strcpy(szDest,lpszFile);
|
|
|
|
}
|
1998-12-11 12:06:50 +01:00
|
|
|
else
|
|
|
|
{ strcpy(sTemp,lpszDir);
|
1999-02-26 12:11:13 +01:00
|
|
|
PathAddBackslashA(sTemp);
|
1998-12-11 12:06:50 +01:00
|
|
|
strcat(sTemp,lpszFile);
|
|
|
|
strcpy(szDest,sTemp);
|
|
|
|
}
|
1998-11-25 17:47:05 +01:00
|
|
|
return szDest;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPWSTR WINAPI PathCombineW(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ WCHAR sTemp[MAX_PATH];
|
|
|
|
TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
|
|
|
|
lpszFile, debugstr_w(lpszFile));
|
|
|
|
|
|
|
|
|
|
|
|
if (!lpszFile || !lpszFile[0] || (lpszFile[0]==(WCHAR)'.' && !lpszFile[1]) )
|
1999-02-26 12:11:13 +01:00
|
|
|
{ lstrcpyW(szDest,lpszDir);
|
1998-11-25 17:47:05 +01:00
|
|
|
return szDest;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if lpszFile is a complete path don't care about lpszDir */
|
1999-02-26 12:11:13 +01:00
|
|
|
if (PathIsRootW(lpszFile))
|
|
|
|
{ lstrcpyW(szDest,lpszFile);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1998-12-11 12:06:50 +01:00
|
|
|
else
|
1999-02-26 12:11:13 +01:00
|
|
|
{ lstrcpyW(sTemp,lpszDir);
|
|
|
|
PathAddBackslashW(sTemp);
|
|
|
|
lstrcatW(sTemp,lpszFile);
|
|
|
|
lstrcpyW(szDest,sTemp);
|
1998-12-11 12:06:50 +01:00
|
|
|
}
|
1998-11-25 17:47:05 +01:00
|
|
|
return szDest;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathCombineW( szDest, lpszDir, lpszFile );
|
|
|
|
return PathCombineA( szDest, lpszDir, lpszFile );
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathIsUNC [SHELL32.39]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* PathIsUNC(char*path);
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsUNCA(LPCSTR path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ TRACE(shell,"%s\n",path);
|
|
|
|
|
1998-11-25 17:47:05 +01:00
|
|
|
if ((path[0]=='\\') && (path[1]=='\\'))
|
1998-12-01 09:55:13 +01:00
|
|
|
return TRUE;
|
1998-11-25 17:47:05 +01:00
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsUNCW(LPCWSTR path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ TRACE(shell,"%s\n",debugstr_w(path));
|
|
|
|
|
|
|
|
if ((path[0]=='\\') && (path[1]=='\\'))
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsUNCAW (LPCVOID path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathIsUNCW( path );
|
|
|
|
return PathIsUNCA( path );
|
1998-12-01 09:55:13 +01:00
|
|
|
}
|
|
|
|
/*************************************************************************
|
|
|
|
* PathIsRelativ [SHELL32.40]
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRelativeA (LPCSTR path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ TRACE(shell,"path=%s\n",path);
|
|
|
|
|
|
|
|
if (path && (path[0]!='\\' && path[1]==':'))
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRelativeW (LPCWSTR path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ TRACE(shell,"path=%s\n",debugstr_w(path));
|
|
|
|
|
|
|
|
if (path && (path[0]!='\\' && path[1]==':'))
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsRelativeAW (LPCVOID path)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathIsRelativeW( path );
|
|
|
|
return PathIsRelativeA( path );
|
1998-12-01 09:55:13 +01:00
|
|
|
}
|
1998-11-25 17:47:05 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* PathIsExe [SHELL32.43]
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsExeA (LPCSTR path)
|
1999-01-03 13:35:52 +01:00
|
|
|
{ FIXME(shell,"path=%s\n",path);
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsExeW (LPCWSTR path)
|
1999-01-03 13:35:52 +01:00
|
|
|
{ FIXME(shell,"path=%s\n",debugstr_w(path));
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathIsExeAW (LPCVOID path)
|
1999-01-03 13:35:52 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathIsExeW (path);
|
|
|
|
return PathIsExeA(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathFileExists [SHELL32.45]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* file_exists(char *fn);
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathFileExistsA(LPSTR fn) {
|
1998-11-25 17:47:05 +01:00
|
|
|
TRACE(shell,"%s\n",fn);
|
1999-02-26 12:11:13 +01:00
|
|
|
if (GetFileAttributesA(fn)==-1)
|
1998-11-25 17:47:05 +01:00
|
|
|
return FALSE;
|
|
|
|
else
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
/*************************************************************************
|
|
|
|
* PathMatchSpec [SHELL32.46]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* used from COMDLG32
|
|
|
|
*/
|
|
|
|
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathMatchSpecA(LPCSTR name, LPCSTR mask)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ LPCSTR _name;
|
|
|
|
|
|
|
|
TRACE(shell,"%s %s stub\n",name,mask);
|
|
|
|
|
|
|
|
_name = name;
|
|
|
|
while (*_name && *mask)
|
|
|
|
{ if (*mask ==';')
|
|
|
|
{ mask++;
|
|
|
|
_name = name;
|
|
|
|
}
|
|
|
|
else if (*mask == '*')
|
|
|
|
{ mask++;
|
|
|
|
while (*mask == '*') mask++; /* Skip consecutive '*' */
|
|
|
|
if (!*mask || *mask==';') return TRUE; /* '*' matches everything */
|
|
|
|
while (*_name && (toupper(*_name) != toupper(*mask))) _name++;
|
|
|
|
if (!*_name)
|
|
|
|
{ while ( *mask && *mask != ';') mask++;
|
|
|
|
_name = name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( (*mask == '?') || (toupper(*mask) == toupper(*_name)) )
|
|
|
|
{ mask++;
|
|
|
|
_name++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ while ( *mask && *mask != ';') mask++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (!*_name && (!*mask || *mask==';'));
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathMatchSpecW(LPCWSTR name, LPCWSTR mask)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ WCHAR stemp[4];
|
|
|
|
LPCWSTR _name;
|
|
|
|
|
|
|
|
TRACE(shell,"%s %s stub\n",debugstr_w(name),debugstr_w(mask));
|
|
|
|
|
|
|
|
lstrcpyAtoW(stemp,"*.*");
|
1999-02-26 12:11:13 +01:00
|
|
|
if (!lstrcmpW( mask, stemp )) return 1;
|
1998-11-25 17:47:05 +01:00
|
|
|
|
|
|
|
_name = name;
|
|
|
|
while (*_name && *mask)
|
|
|
|
{ if (*mask ==';')
|
|
|
|
{ mask++;
|
|
|
|
_name = name;
|
|
|
|
}
|
|
|
|
else if (*mask == '*')
|
|
|
|
{ mask++;
|
|
|
|
while (*mask == '*') mask++; /* Skip consecutive '*' */
|
|
|
|
if (!*mask || *mask==';') return TRUE; /* '*' matches everything */
|
|
|
|
while (*_name && (towupper(*_name) != towupper(*mask))) _name++;
|
|
|
|
if (!*_name)
|
|
|
|
{ while ( *mask && *mask != ';') mask++;
|
|
|
|
_name = name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( (*mask == '?') || (towupper(*mask) == towupper(*_name)) )
|
|
|
|
{ mask++;
|
|
|
|
_name++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ while ( *mask && *mask != ';') mask++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (!*_name && (!*mask || *mask==';'));
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathMatchSpecW( name, mask );
|
|
|
|
return PathMatchSpecA( name, mask );
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
/*************************************************************************
|
1999-03-13 18:10:36 +01:00
|
|
|
* PathSetDlgItemPathAW [SHELL32.48]
|
1998-11-25 17:47:05 +01:00
|
|
|
* NOTES
|
|
|
|
* use PathCompactPath to make sure, the path fits into the control
|
|
|
|
*/
|
|
|
|
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"%x %x %s\n",hDlg, id, pszPath);
|
1999-02-26 12:11:13 +01:00
|
|
|
return SetDlgItemTextA(hDlg, id, pszPath);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"%x %x %s\n",hDlg, id, debugstr_w(pszPath));
|
1999-02-26 12:11:13 +01:00
|
|
|
return SetDlgItemTextW(hDlg, id, pszPath);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathSetDlgItemPathW(hDlg, id, pszPath);
|
|
|
|
return PathSetDlgItemPathA(hDlg, id, pszPath);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
1999-01-31 11:00:26 +01:00
|
|
|
/*************************************************************************
|
1999-03-13 18:10:36 +01:00
|
|
|
* PathQualifyAW [SHELL32.49]
|
1999-01-31 11:00:26 +01:00
|
|
|
*/
|
|
|
|
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathQualifyA(LPCSTR pszPath)
|
1999-01-31 11:00:26 +01:00
|
|
|
{ TRACE(shell,"%s\n",pszPath);
|
|
|
|
return 0;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathQualifyW(LPCWSTR pszPath)
|
1999-01-31 11:00:26 +01:00
|
|
|
{ TRACE(shell,"%s\n",debugstr_w(pszPath));
|
|
|
|
return 0;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
|
1999-01-31 11:00:26 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathQualifyW(pszPath);
|
|
|
|
return PathQualifyA(pszPath);
|
1999-01-31 11:00:26 +01:00
|
|
|
}
|
|
|
|
|
1998-11-25 17:47:05 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* PathResolve [SHELL32.51]
|
|
|
|
*/
|
|
|
|
DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
|
|
|
|
FIXME(shell,"(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathGetArgs [SHELL32.52]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* look for next arg in string. handle "quoted" strings
|
|
|
|
* returns pointer to argument *AFTER* the space. Or to the \0.
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCSTR WINAPI PathGetArgsA(LPCSTR cmdline)
|
|
|
|
{ BOOL qflag = FALSE;
|
1999-01-03 13:35:52 +01:00
|
|
|
|
|
|
|
TRACE(shell,"%s\n",cmdline);
|
|
|
|
|
|
|
|
while (*cmdline)
|
|
|
|
{ if ((*cmdline==' ') && !qflag)
|
|
|
|
return cmdline+1;
|
|
|
|
if (*cmdline=='"')
|
|
|
|
qflag=!qflag;
|
|
|
|
cmdline++;
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1999-01-03 13:35:52 +01:00
|
|
|
return cmdline;
|
|
|
|
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCWSTR WINAPI PathGetArgsW(LPCWSTR cmdline)
|
|
|
|
{ BOOL qflag = FALSE;
|
1999-01-03 13:35:52 +01:00
|
|
|
|
|
|
|
TRACE(shell,"%sL\n",debugstr_w(cmdline));
|
|
|
|
|
|
|
|
while (*cmdline)
|
|
|
|
{ if ((*cmdline==' ') && !qflag)
|
|
|
|
return cmdline+1;
|
|
|
|
if (*cmdline=='"')
|
1998-11-25 17:47:05 +01:00
|
|
|
qflag=!qflag;
|
1999-01-03 13:35:52 +01:00
|
|
|
cmdline++;
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1999-01-03 13:35:52 +01:00
|
|
|
return cmdline;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCVOID WINAPI PathGetArgsAW(LPVOID cmdline)
|
1999-01-03 13:35:52 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathGetArgsW(cmdline);
|
|
|
|
return PathGetArgsA(cmdline);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
/*************************************************************************
|
|
|
|
* PathQuoteSpaces [SHELL32.55]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* basename(char *fn);
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPSTR WINAPI PathQuoteSpacesA(LPCSTR aptr)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ FIXME(shell,"%s\n",aptr);
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR wptr)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ FIXME(shell,"L%s\n",debugstr_w(wptr));
|
|
|
|
return 0;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPVOID WINAPI PathQuoteSpacesAW (LPCVOID fn)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if(VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathQuoteSpacesW(fn);
|
|
|
|
return PathQuoteSpacesA(fn);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathUnquoteSpaces [SHELL32.56]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* unquote string (remove ")
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
VOID WINAPI PathUnquoteSpacesA(LPSTR str)
|
|
|
|
{ DWORD len = lstrlenA(str);
|
1999-01-03 13:35:52 +01:00
|
|
|
TRACE(shell,"%s\n",str);
|
|
|
|
if (*str!='"')
|
|
|
|
return;
|
|
|
|
if (str[len-1]!='"')
|
|
|
|
return;
|
|
|
|
str[len-1]='\0';
|
1999-02-26 12:11:13 +01:00
|
|
|
lstrcpyA(str,str+1);
|
1999-01-03 13:35:52 +01:00
|
|
|
return;
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
VOID WINAPI PathUnquoteSpacesW(LPWSTR str)
|
|
|
|
{ DWORD len = lstrlenW(str);
|
1999-01-03 13:35:52 +01:00
|
|
|
|
|
|
|
TRACE(shell,"%s\n",debugstr_w(str));
|
|
|
|
|
|
|
|
if (*str!='"')
|
|
|
|
return;
|
|
|
|
if (str[len-1]!='"')
|
|
|
|
return;
|
|
|
|
str[len-1]='\0';
|
1999-02-26 12:11:13 +01:00
|
|
|
lstrcpyW(str,str+1);
|
1999-01-03 13:35:52 +01:00
|
|
|
return;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
VOID WINAPI PathUnquoteSpacesAW(LPVOID str)
|
1999-01-03 13:35:52 +01:00
|
|
|
{ if(VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
PathUnquoteSpacesW(str);
|
|
|
|
PathUnquoteSpacesA(str);
|
1999-01-03 13:35:52 +01:00
|
|
|
}
|
|
|
|
|
1998-11-25 17:47:05 +01:00
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathGetDriveNumber32 [SHELL32.57]
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
HRESULT WINAPI PathGetDriveNumber(LPSTR u)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ FIXME(shell,"%s stub\n",debugstr_a(u));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathYetAnotherMakeUniqueName [SHELL32.75]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* exported by ordinal
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathYetAnotherMakeUniqueNameA(LPDWORD x,LPDWORD y) {
|
1998-11-25 17:47:05 +01:00
|
|
|
FIXME(shell,"(%p,%p):stub.\n",x,y);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* IsLFNDrive [SHELL32.119]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* exported by ordinal Name
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI IsLFNDriveA(LPCSTR path) {
|
1998-11-25 17:47:05 +01:00
|
|
|
DWORD fnlen;
|
|
|
|
|
1999-02-26 12:11:13 +01:00
|
|
|
if (!GetVolumeInformationA(path,NULL,0,NULL,&fnlen,NULL,NULL,0))
|
1998-11-25 17:47:05 +01:00
|
|
|
return FALSE;
|
|
|
|
return fnlen>12;
|
|
|
|
}
|
1998-12-01 09:55:13 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* PathFindOnPath [SHELL32.145]
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathFindOnPathA(LPSTR sFile, LPCSTR sOtherDirs)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ FIXME(shell,"%s %s\n",sFile, sOtherDirs);
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathFindOnPathW(LPWSTR sFile, LPCWSTR sOtherDirs)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ FIXME(shell,"%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
|
|
|
|
return FALSE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
|
1998-12-01 09:55:13 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathFindOnPathW(sFile, sOtherDirs);
|
|
|
|
return PathFindOnPathA(sFile, sOtherDirs);
|
1998-12-01 09:55:13 +01:00
|
|
|
}
|
|
|
|
|
1998-11-25 17:47:05 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* PathGetExtension [SHELL32.158]
|
|
|
|
*
|
|
|
|
* NOTES
|
|
|
|
* exported by ordinal
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCSTR WINAPI PathGetExtensionA(LPCSTR path,DWORD y,DWORD z)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
|
1999-02-26 12:11:13 +01:00
|
|
|
path = PathFindExtensionA(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
return *path?(path+1):path;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCWSTR WINAPI PathGetExtensionW(LPCWSTR path,DWORD y,DWORD z)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ TRACE(shell,"(L%s,%08lx,%08lx)\n",debugstr_w(path),y,z);
|
1999-02-26 12:11:13 +01:00
|
|
|
path = PathFindExtensionW(path);
|
1998-11-25 17:47:05 +01:00
|
|
|
return *path?(path+1):path;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
LPCVOID WINAPI PathGetExtensionAW(LPCVOID path,DWORD y,DWORD z)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return PathGetExtensionW(path,y,z);
|
|
|
|
return PathGetExtensionA(path,y,z);
|
1998-11-25 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* SheGetDirW [SHELL32.281]
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ FIXME(shell,"%s %s stub\n",debugstr_w(u),debugstr_w(v) );
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* SheChangeDirW [SHELL32.274]
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
HRESULT WINAPI SheChangeDirW(LPWSTR u)
|
1998-11-25 17:47:05 +01:00
|
|
|
{ FIXME(shell,"(%s),stub\n",debugstr_w(u));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* PathProcessCommand [SHELL32.653]
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI PathProcessCommand (DWORD u, DWORD v, DWORD w, DWORD x)
|
|
|
|
{ FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x);
|
|
|
|
return 0;
|
|
|
|
}
|
1999-01-17 17:55:11 +01:00
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* SHGetSpecialFolderPath [SHELL32.175]
|
|
|
|
*
|
|
|
|
* converts csidl to path
|
|
|
|
*
|
|
|
|
*/
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI SHGetSpecialFolderPathA (DWORD x1,LPSTR szPath,DWORD csidl,DWORD x4)
|
1999-01-17 17:55:11 +01:00
|
|
|
{ LPITEMIDLIST pidl;
|
|
|
|
|
|
|
|
WARN(shell,"(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
|
|
|
|
|
|
|
|
SHGetSpecialFolderLocation(0, csidl, &pidl);
|
1999-02-26 12:11:13 +01:00
|
|
|
SHGetPathFromIDListA (pidl, szPath);
|
1999-01-17 17:55:11 +01:00
|
|
|
SHFree (pidl);
|
|
|
|
return TRUE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI SHGetSpecialFolderPathW (DWORD x1,LPWSTR szPath, DWORD csidl,DWORD x4)
|
1999-01-17 17:55:11 +01:00
|
|
|
{ LPITEMIDLIST pidl;
|
|
|
|
|
|
|
|
WARN(shell,"(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
|
|
|
|
|
|
|
|
SHGetSpecialFolderLocation(0, csidl, &pidl);
|
1999-02-26 12:11:13 +01:00
|
|
|
SHGetPathFromIDListW (pidl, szPath);
|
1999-01-17 17:55:11 +01:00
|
|
|
SHFree (pidl);
|
|
|
|
return TRUE;
|
|
|
|
}
|
1999-02-26 12:11:13 +01:00
|
|
|
BOOL WINAPI SHGetSpecialFolderPath (DWORD x1,LPVOID szPath,DWORD csidl,DWORD x4)
|
1999-01-17 17:55:11 +01:00
|
|
|
{ if (VERSION_OsIsUnicode())
|
1999-02-26 12:11:13 +01:00
|
|
|
return SHGetSpecialFolderPathW ( x1, szPath, csidl, x4);
|
|
|
|
return SHGetSpecialFolderPathA ( x1, szPath, csidl, x4);
|
1999-01-17 17:55:11 +01:00
|
|
|
}
|