in include/singa/utils/tinydir.h [291:372]
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file) {
if (dir == NULL || file == NULL) {
errno = EINVAL;
return -1;
}
#ifdef _WIN32
if (dir->_h == INVALID_HANDLE_VALUE)
#else
if (dir->_e == NULL)
#endif
{
errno = ENOENT;
return -1;
}
if (strlen(dir->path) +
strlen(
#ifdef _WIN32
dir->_f.cFileName
#else
dir->_e->d_name
#endif
) +
1 + _TINYDIR_PATH_EXTRA >=
_TINYDIR_PATH_MAX) {
/* the path for the file will be too long */
errno = ENAMETOOLONG;
return -1;
}
if (strlen(
#ifdef _WIN32
dir->_f.cFileName
#else
dir->_e->d_name
#endif
) >= _TINYDIR_FILENAME_MAX) {
errno = ENAMETOOLONG;
return -1;
}
strcpy(file->path, dir->path);
strcat(file->path, "/");
strcpy(file->name,
#ifdef _WIN32
dir->_f.cFileName
#else
dir->_e->d_name
#endif
);
strcat(file->path, file->name);
#ifndef _WIN32
if (stat(file->path, &file->_s) == -1) {
return -1;
}
#endif
_tinydir_get_ext(file);
file->is_dir =
#ifdef _WIN32
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
#else
S_ISDIR(file->_s.st_mode);
#endif
file->is_reg =
#ifdef _WIN32
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) ||
(!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) &&
#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) &&
#endif
#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) &&
#endif
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY));
#else
S_ISREG(file->_s.st_mode);
#endif
return 0;
}