mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-23 06:57:31 +08:00
130 lines
2.1 KiB
C++
130 lines
2.1 KiB
C++
|
/**
|
||
|
* Original file by the_viking, fixed by Rômulo Fernandes, fixed by Emmanuel Nars
|
||
|
* Should emulate windows finddata structure
|
||
|
*/
|
||
|
#if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(__WIN32)
|
||
|
#include "_findfirst.h"
|
||
|
#include "DS_List.h"
|
||
|
|
||
|
static DataStructures::List< _findinfo_t* > fileInfo;
|
||
|
|
||
|
/**
|
||
|
* _findfirst - equivalent
|
||
|
*/
|
||
|
long _findfirst(const char *name, _finddata_t *f)
|
||
|
{
|
||
|
|
||
|
// char* nameCopy = new char[sizeof(name)];
|
||
|
// memset(nameCopy, '\0', sizeof(nameCopy));
|
||
|
//
|
||
|
// strcpy(nameCopy, name);
|
||
|
//
|
||
|
// char* filter = new char[sizeof(nameCopy)];
|
||
|
// memset(filter, '\0', sizeof(filter));
|
||
|
|
||
|
int length = strlen(name)+1;
|
||
|
char* nameCopy = new char[length];
|
||
|
memset(nameCopy, '\0', length);
|
||
|
|
||
|
strcpy(nameCopy, name);
|
||
|
|
||
|
char* filter = new char[length];
|
||
|
memset(filter, '\0', length);
|
||
|
|
||
|
char* lastSep = strrchr(nameCopy,'/');
|
||
|
if(!lastSep)
|
||
|
{
|
||
|
strcpy(filter, nameCopy);
|
||
|
strcpy(nameCopy, ".");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(filter, lastSep+1);
|
||
|
*lastSep = 0;
|
||
|
}
|
||
|
|
||
|
DIR* dir = opendir(nameCopy);
|
||
|
|
||
|
if(!dir)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
_findinfo_t* fi = new _findinfo_t;
|
||
|
strcpy(fi->filter,filter);
|
||
|
fi->openedDir = dir;
|
||
|
|
||
|
while(true)
|
||
|
{
|
||
|
dirent* entry = readdir(dir);
|
||
|
if(entry == 0)
|
||
|
break;
|
||
|
|
||
|
if(fnmatch(fi->filter,entry->d_name, 200) == 0)
|
||
|
{
|
||
|
strcpy(f->name, entry->d_name);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
fileInfo.Insert(fi);
|
||
|
return fileInfo.Size()-1;
|
||
|
|
||
|
// return 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* _findnext - equivalent
|
||
|
*/
|
||
|
int _findnext(long h, _finddata_t *f)
|
||
|
{
|
||
|
|
||
|
_findinfo_t* fi = fileInfo[h];
|
||
|
|
||
|
while(true)
|
||
|
{
|
||
|
dirent* entry = readdir(fi->openedDir);
|
||
|
if(entry == 0)
|
||
|
return -1;
|
||
|
|
||
|
if(fnmatch(fi->filter,entry->d_name, 200) == 0)
|
||
|
{
|
||
|
strcpy(f->name, entry->d_name);
|
||
|
if (entry->d_type == DT_REG)
|
||
|
f->attrib = _A_NORMAL;
|
||
|
f->size = entry->d_reclen;
|
||
|
return 0;
|
||
|
}
|
||
|
if (entry->d_type == DT_DIR)
|
||
|
{
|
||
|
f->attrib = _A_SUBDIR;
|
||
|
strcpy(f->name, entry->d_name);
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* _findclose - equivalent
|
||
|
*/
|
||
|
int _findclose(long h)
|
||
|
{
|
||
|
if (fileInfo.Size()>h)
|
||
|
{
|
||
|
_findinfo_t* fi = fileInfo[h];
|
||
|
fileInfo.RemoveAtIndex(h);
|
||
|
delete fi;
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Error _findclose\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
#endif
|