blob: 8c952f350a9646696ab008995b46f9e4a753a2b4 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <io.h>
#include <direct.h>
#include <dirent.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#define SUFFIX _T("*")
#define SLASH _T("\\")
_TDIR *
_topendir (const _TCHAR *szPath)
{
_TDIR *nd;
unsigned int rc;
_TCHAR szFullPath[MAX_PATH];
errno = 0;
if (!szPath)
{
errno = EFAULT;
return (_TDIR *) 0;
}
if (szPath[0] == _T('\0'))
{
errno = ENOTDIR;
return (_TDIR *) 0;
}
rc = GetFileAttributes (szPath);
if (rc == (unsigned int)-1)
{
errno = ENOENT;
return (_TDIR *) 0;
}
if (!(rc & FILE_ATTRIBUTE_DIRECTORY))
{
errno = ENOTDIR;
return (_TDIR *) 0;
}
_tfullpath (szFullPath,szPath,MAX_PATH);
nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen (szFullPath)
+ _tcslen (SLASH)
+ _tcslen (SUFFIX) + 1)
* sizeof (_TCHAR));
if (!nd)
{
errno = ENOMEM;
return (_TDIR *) 0;
}
_tcscpy (nd->dd_name,szFullPath);
if (nd->dd_name[0] != _T('\0')
&& _tcsrchr (nd->dd_name,_T('/')) != nd->dd_name
+ _tcslen (nd->dd_name) - 1
&& _tcsrchr (nd->dd_name,_T('\\')) != nd->dd_name
+ _tcslen (nd->dd_name) - 1)
{
_tcscat (nd->dd_name,SLASH);
}
_tcscat (nd->dd_name,SUFFIX);
nd->dd_handle = -1;
nd->dd_stat = 0;
nd->dd_dir.d_ino = 0;
nd->dd_dir.d_reclen = 0;
nd->dd_dir.d_namlen = 0;
memset (nd->dd_dir.d_name,0,FILENAME_MAX);
return nd;
}
struct _tdirent *
_treaddir (_TDIR * dirp)
{
errno = 0;
if (!dirp)
{
errno = EFAULT;
return (struct _tdirent *) 0;
}
if (dirp->dd_stat < 0)
{
return (struct _tdirent *) 0;
}
else if (dirp->dd_stat == 0)
{
dirp->dd_handle = _tfindfirst (dirp->dd_name,&(dirp->dd_dta));
if (dirp->dd_handle == -1)
{
dirp->dd_stat = -1;
}
else
{
dirp->dd_stat = 1;
}
}
else
{
if (_tfindnext (dirp->dd_handle,&(dirp->dd_dta)))
{
DWORD winerr = GetLastError ();
if (winerr == ERROR_NO_MORE_FILES)
errno = 0;
_findclose (dirp->dd_handle);
dirp->dd_handle = -1;
dirp->dd_stat = -1;
}
else
{
dirp->dd_stat++;
}
}
if (dirp->dd_stat > 0)
{
dirp->dd_dir.d_namlen = _tcslen (dirp->dd_dta.name);
_tcscpy (dirp->dd_dir.d_name,dirp->dd_dta.name);
return &dirp->dd_dir;
}
return (struct _tdirent *) 0;
}
int
_tclosedir (_TDIR * dirp)
{
int rc;
errno = 0;
rc = 0;
if (!dirp)
{
errno = EFAULT;
return -1;
}
if (dirp->dd_handle != -1)
{
rc = _findclose (dirp->dd_handle);
}
free (dirp);
return rc;
}
void
_trewinddir (_TDIR * dirp)
{
errno = 0;
if (!dirp)
{
errno = EFAULT;
return;
}
if (dirp->dd_handle != -1)
{
_findclose (dirp->dd_handle);
}
dirp->dd_handle = -1;
dirp->dd_stat = 0;
}
long
_ttelldir (_TDIR * dirp)
{
errno = 0;
if (!dirp)
{
errno = EFAULT;
return -1;
}
return dirp->dd_stat;
}
void
_tseekdir (_TDIR * dirp,long lPos)
{
errno = 0;
if (!dirp)
{
errno = EFAULT;
return;
}
if (lPos < -1)
{
errno = EINVAL;
return;
}
else if (lPos == -1)
{
if (dirp->dd_handle != -1)
{
_findclose (dirp->dd_handle);
}
dirp->dd_handle = -1;
dirp->dd_stat = -1;
}
else
{
_trewinddir (dirp);
while ((dirp->dd_stat < lPos) && _treaddir (dirp));
}
}