|
|
- /*
- * Test program to make sure that dirent compiles cleanly with C++
- *
- * Copyright (C) 1998-2019 Toni Ronkko
- * This file is part of dirent. Dirent may be freely distributed
- * under the MIT license. For all details and documentation, see
- * https://github.com/tronkko/dirent
- */
- #include <iostream>
- #include <string.h>
- #include <dirent.h>
- #include <assert.h>
- using namespace std;
-
-
- /* Filter and sort functions */
- static int only_readme (const struct dirent *entry);
-
-
- int
- main(
- int argc, char *argv[])
- {
- (void) argc;
- (void) argv;
-
- /* Basic directory retrieval */
- {
- DIR *dir;
- struct dirent *ent;
- int found = 0;
-
- /* Open directory */
- dir = opendir ("tests/1");
- if (dir == NULL) {
- cerr << "Directory tests/1 not found" << endl;
- abort ();
- }
-
- /* Read entries */
- while ((ent = readdir (dir)) != NULL) {
-
- /* Check each file */
- if (strcmp (ent->d_name, ".") == 0) {
- /* Directory itself */
- #ifdef _DIRENT_HAVE_D_TYPE
- assert (ent->d_type == DT_DIR);
- #endif
- #ifdef _DIRENT_HAVE_D_NAMLEN
- assert (ent->d_namlen == 1);
- #endif
- #ifdef _D_EXACT_NAMLEN
- assert (_D_EXACT_NAMLEN(ent) == 1);
- #endif
- #ifdef _D_ALLOC_NAMLEN
- assert (_D_ALLOC_NAMLEN(ent) > 1);
- #endif
- found += 1;
-
- } else if (strcmp (ent->d_name, "..") == 0) {
- /* Parent directory */
- #ifdef _DIRENT_HAVE_D_TYPE
- assert (ent->d_type == DT_DIR);
- #endif
- #ifdef _DIRENT_HAVE_D_NAMLEN
- assert (ent->d_namlen == 2);
- #endif
- #ifdef _D_EXACT_NAMLEN
- assert (_D_EXACT_NAMLEN(ent) == 2);
- #endif
- #ifdef _D_ALLOC_NAMLEN
- assert (_D_ALLOC_NAMLEN(ent) > 2);
- #endif
- found += 2;
-
- } else if (strcmp (ent->d_name, "file") == 0) {
- /* Regular file */
- #ifdef _DIRENT_HAVE_D_TYPE
- assert (ent->d_type == DT_REG);
- #endif
- #ifdef _DIRENT_HAVE_D_NAMLEN
- assert (ent->d_namlen == 4);
- #endif
- #ifdef _D_EXACT_NAMLEN
- assert (_D_EXACT_NAMLEN(ent) == 4);
- #endif
- #ifdef _D_ALLOC_NAMLEN
- assert (_D_ALLOC_NAMLEN(ent) > 4);
- #endif
- found += 4;
-
- } else if (strcmp (ent->d_name, "dir") == 0) {
- /* Just a directory */
- #ifdef _DIRENT_HAVE_D_TYPE
- assert (ent->d_type == DT_DIR);
- #endif
- #ifdef _DIRENT_HAVE_D_NAMLEN
- assert (ent->d_namlen == 3);
- #endif
- #ifdef _D_EXACT_NAMLEN
- assert (_D_EXACT_NAMLEN(ent) == 3);
- #endif
- #ifdef _D_ALLOC_NAMLEN
- assert (_D_ALLOC_NAMLEN(ent) > 3);
- #endif
- found += 8;
-
- } else {
- /* Other file */
- cerr << "Unexpected file " << ent->d_name << endl;
- abort ();
- }
-
- }
-
- /* Make sure that all files were found */
- assert (found == 0xf);
-
- closedir (dir);
- }
-
- /* Basic scan with simple filter function */
- {
- struct dirent **files;
- int n;
- int i;
-
- /* Read directory entries */
- n = scandir ("tests/3", &files, only_readme, alphasort);
- assert (n == 1);
-
- /* Make sure that the filter works */
- assert (strcmp (files[0]->d_name, "README.txt") == 0);
-
- /* Release file names */
- for (i = 0; i < n; i++) {
- free (files[i]);
- }
- free (files);
- }
-
-
- cout << "OK" << endl;
- return EXIT_SUCCESS;
- }
-
- /* Only pass README.txt file */
- static int
- only_readme (const struct dirent *entry)
- {
- int pass;
-
- if (strcmp (entry->d_name, "README.txt") == 0) {
- pass = 1;
- } else {
- pass = 0;
- }
-
- return pass;
- }
|