GRASS 8 Programmer's Manual 8.6.0dev(2026)-56a9afeb9f
Loading...
Searching...
No Matches
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
6typedef ptrdiff_t handle_type; /* C99's intptr_t not sufficiently portable */
7
8struct 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
15DIR *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
54int 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
75struct 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
92void 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
ptrdiff_t handle_type
Definition msvc/dirent.c:6
DIR * opendir(const char *name)
Definition msvc/dirent.c:15
void rewinddir(DIR *dir)
Definition msvc/dirent.c:92
struct dirent * readdir(DIR *dir)
Definition msvc/dirent.c:75
int closedir(DIR *dir)
Definition msvc/dirent.c:54
const char * name
Definition named_colr.c:6
#define strcpy
Definition parson.c:66
void * malloc(unsigned)
void free(void *)
char * d_name
Definition dirent.h:21