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
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
}
AMI_STREAM
Definition
ami_stream.h:153
dirent.h
DIR
struct DIR DIR
Definition
dirent.h:18
handle_type
ptrdiff_t handle_type
Definition
msvc/dirent.c:6
opendir
DIR * opendir(const char *name)
Definition
msvc/dirent.c:15
rewinddir
void rewinddir(DIR *dir)
Definition
msvc/dirent.c:92
readdir
struct dirent * readdir(DIR *dir)
Definition
msvc/dirent.c:75
closedir
int closedir(DIR *dir)
Definition
msvc/dirent.c:54
name
const char * name
Definition
named_colr.c:6
strcpy
#define strcpy
Definition
parson.c:66
malloc
void * malloc(unsigned)
free
void free(void *)
stdlib.h
dirent
Definition
dirent.h:20
dirent::d_name
char * d_name
Definition
dirent.h:21
msvc
dirent.c
Generated on Sat Apr 4 2026 17:44:23 for GRASS 8 Programmer's Manual by
1.9.8