int tinydir_readfile()

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;
}