// Fichier `directory.h'
#include <string>
// Structures `DIR' et `dirent', opendir(...), readdir(...) et closedir(...).
#include <dirent.h>
// Structure `stat', stat(...) et macro IS_DIR(...).
#include <sys/stat.h>

class Directory {
	DIR * ptr_DIR_ ; // Pointeur sur une structure `DIR', définie dans `dirent.h'.
public :
	// Unique constructeur autorisé ; `opendir(...)' retourne le pointeur nul en cas
	// d'erreur.
	Directory (const std::string & chemin) : ptr_DIR_(opendir(chemin.c_str())) {}
	// Destructeur.
	~Directory () {
		if ( ptr_DIR_ != 0 ) {
			closedir(ptr_DIR_) ; } }
	// Test de l'échec : syntaxe `if ( ! directory ) { // Traitement de l'erreur...'.
	bool operator!() { return ptr_DIR_ == 0 ; }
	// Déclaration de la fonction amie.
	friend bool getentry(const Directory &, std::string &) ;
} ;
// Accès à l'entrée suivante du répertoire ; retourne `false' à la fin ou en cas
// d'erreur.
bool
getentry(
  const Directory & directory, // Argument en entrée, instance de Directory.
  std::string & nom)           // Argument en sortie, nom de l'entrée suivante.
{
	// Pointeur vers une structure `dirent', définie dans `dirent.h'.
	dirent * ptr_entry = readdir(directory.ptr_DIR_) ;
	// `readdir(...)' retourne le pointeur nul à la fin ou en cas d'erreur.
	if ( ptr_entry != 0 ) {
		// `d_name' est le membre de la structure `dirent' de type `char *'.
		nom = ptr_entry->d_name ; 
		return true ; }
	return false ;
}
bool
isdirectory(const std::string & chemin)
{
	// Structure `stat' définie dans `/sys/stat.h'. Il faut préfixer le nom du type par 
	// le mot `struct' parce que le fichier `/sys/stat.h' donne aussi le nom `stat' à
	// une fonction.
	struct stat ma_stat ;
	// La fonction `stat(...)' renseigne une structure `stat' pour le nom passé en 
	// premier argument ; elle retourne 0 en cas d'échec.
	if ( stat(chemin.c_str(), &ma_stat) != 0 ) {
		return false ; }
	// La macro `S_ISDIR', appliquée au membre `st_mode' d'une structure `stat', teste 
	// s'il s'agit d'un directory.
	return S_ISDIR(ma_stat.st_mode) ;
}
