GRASS GIS 8 Programmer's Manual  8.5.0dev(2025)-565e82de51
msvc/dirent.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <io.h>
3 #include <errno.h>
4 #include <dirent.h>
5 
6 typedef ptrdiff_t handle_type; /* C99's intptr_t not sufficiently portable */
7 
8 struct DIR {
9  handle_type handle; /* -1 for failed rewind */
10  struct _finddata_t info;
11  struct dirent result; /* d_name null iff first time */
12  char *name; /* null-terminated char string */
13 };
14 
15 DIR *opendir(const char *name)
16 {
17  DIR *dir = 0;
18 
19  if (name && name[0]) {
20  size_t base_length = strlen(name);
21  const char *all = /* search pattern must end with suitable wildcard */
22  strchr("/\\", name[base_length - 1]) ? "*" : "/*";
23  dir = (DIR *)malloc(sizeof *dir);
24  if (dir != 0 &&
25  (dir->name = (char *)malloc(base_length + strlen(all) + 1)) != 0) {
26  strcpy(dir->name, name);
27  strcat(dir->name, all);
28 
29  if ((dir->handle =
30  (handle_type)_findfirst(dir->name, &dir->info)) != -1) {
31  dir->result.d_name = 0;
32  }
33  else /* rollback */
34  {
35  free(dir->name);
36  free(dir);
37  dir = 0;
38  }
39  }
40  else /* rollback */
41  {
42  free(dir);
43  dir = 0;
44  errno = ENOMEM;
45  }
46  }
47  else {
48  errno = EINVAL;
49  }
50 
51  return dir;
52 }
53 
54 int closedir(DIR *dir)
55 {
56  int result = -1;
57 
58  if (dir) {
59  if (dir->handle != -1) {
60  result = _findclose(dir->handle);
61  }
62 
63  free(dir->name);
64  free(dir);
65  }
66 
67  if (result == -1) /* map all errors to EBADF */
68  {
69  errno = EBADF;
70  }
71 
72  return result;
73 }
74 
75 struct dirent *readdir(DIR *dir)
76 {
77  struct dirent *result = 0;
78 
79  if (dir && dir->handle != -1) {
80  if (!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1) {
81  result = &dir->result;
82  result->d_name = dir->info.name;
83  }
84  }
85  else {
86  errno = EBADF;
87  }
88 
89  return result;
90 }
91 
92 void rewinddir(DIR *dir)
93 {
94  if (dir && dir->handle != -1) {
95  _findclose(dir->handle);
96  dir->handle = (handle_type)_findfirst(dir->name, &dir->info);
97  dir->result.d_name = 0;
98  }
99  else {
100  errno = EBADF;
101  }
102 }
struct DIR DIR
Definition: dirent.h:18
DIR * opendir(const char *name)
Definition: msvc/dirent.c:15
ptrdiff_t handle_type
Definition: msvc/dirent.c:6
void rewinddir(DIR *dir)
Definition: msvc/dirent.c:92
int closedir(DIR *dir)
Definition: msvc/dirent.c:54
struct dirent * readdir(DIR *dir)
Definition: msvc/dirent.c:75
const char * name
Definition: named_colr.c:6
#define strcpy
Definition: parson.c:62
void * malloc(YYSIZE_T)
void free(void *)
Definition: dirent.h:20
char * d_name
Definition: dirent.h:21