summaryrefslogtreecommitdiff
path: root/ACE/ace/OS_NS_dirent.h
blob: c9f581549a23c660e7411d5d963970416201a892 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// -*- C++ -*-

//=============================================================================
/**
 *  @file   OS_NS_dirent.h
 *
 *  $Id$
 *
 *  @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
 *  @author Jesper S. M|ller<stophph@diku.dk>
 *  @author and a cast of thousands...
 *
 *  Originally in OS.h.
 */
//=============================================================================

#ifndef ACE_OS_NS_DIRENT_H
# define ACE_OS_NS_DIRENT_H

# include /**/ "ace/pre.h"

# include "ace/config-all.h"

# if !defined (ACE_LACKS_PRAGMA_ONCE)
#  pragma once
# endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/os_include/os_dirent.h"
#include /**/ "ace/ACE_export.h"

#if defined (ACE_EXPORT_MACRO)
#  undef ACE_EXPORT_MACRO
#endif
#define ACE_EXPORT_MACRO ACE_Export

// Define the scandir() selector and comparator function types. Many platforms
// define these in terms of const pointers to dirent arrays/structs. Some
// platforms use void pointers instead. The ACE-exported API is defined in
// terms of the dirent-using function types, and if the OS-native scandir()
// uses void*, that's handled internal to the ACE_OS::scandir() wrapper using
// the ACE_SCANDIR_OS_COMPARATOR.
extern "C" {
#if defined (ACE_SCANDIR_CMP_USES_VOIDPTR)
  typedef int (*ACE_SCANDIR_OS_COMPARATOR)(void *f1, void *f2);
#elif defined (ACE_SCANDIR_CMP_USES_CONST_VOIDPTR)
  typedef int (*ACE_SCANDIR_OS_COMPARATOR)(const void *f1, const void *f2);
#endif /* ACE_SCANDIR_CMP_USES_VOIDPTR */
  typedef int (*ACE_SCANDIR_COMPARATOR)(const ACE_DIRENT **f1,
                                        const ACE_DIRENT **f2);

#if defined (ACE_SCANDIR_SEL_LACKS_CONST)
  typedef int (*ACE_SCANDIR_OS_SELECTOR)(ACE_DIRENT *filename);
#endif /* ACE_SCANDIR_SEL_LACKS_CONST */
  typedef int (*ACE_SCANDIR_SELECTOR)(const ACE_DIRENT *filename);
}

/*
 * We inline and undef some functions that may be implemented
 * as macros on some platforms. This way macro definitions will
 * be usable later as there is no way to save the macro definition
 * using the pre-processor.
 *
 */

#if !defined (ACE_LACKS_REWINDDIR)
#  if !defined (ACE_HAS_WREWINDDIR) || !defined (ACE_USES_WCHAR)
inline void ace_rewinddir_helper (ACE_DIR *dir)
{
#    if defined (rewinddir)
   rewinddir (dir);
#    undef rewinddir
#    else
  ::rewinddir (dir);
#    endif /* defined (rewinddir) */
}
#  endif /* !defined (ACE_HAS_WREWINDDIR) && !defined (ACE_USES_WCHAR) */
#endif /* ACE_LACKS_REWINDDIR */

ACE_BEGIN_VERSIONED_NAMESPACE_DECL

namespace ACE_OS {

  ACE_NAMESPACE_INLINE_FUNCTION
  void closedir (ACE_DIR *);

  ACE_NAMESPACE_INLINE_FUNCTION
  ACE_DIR *opendir (const ACE_TCHAR *filename);

  ACE_NAMESPACE_INLINE_FUNCTION
  struct ACE_DIRENT *readdir (ACE_DIR *);

  ACE_NAMESPACE_INLINE_FUNCTION
  int readdir_r (ACE_DIR *dirp,
                 struct ACE_DIRENT *entry,
                 struct ACE_DIRENT **result);

  ACE_NAMESPACE_INLINE_FUNCTION
  void rewinddir (ACE_DIR *);

  ACE_NAMESPACE_INLINE_FUNCTION
  int scandir (const ACE_TCHAR *dirname,
               struct ACE_DIRENT **namelist[],
               ACE_SCANDIR_SELECTOR selector,
               ACE_SCANDIR_COMPARATOR comparator);

  ACE_NAMESPACE_INLINE_FUNCTION
  int alphasort (const void *, const void *);

  ACE_NAMESPACE_INLINE_FUNCTION
  void seekdir (ACE_DIR *,
                long loc);

  ACE_NAMESPACE_INLINE_FUNCTION
  long telldir (ACE_DIR *);

  // Win32 emulation functions
#if defined (ACE_LACKS_OPENDIR)
  extern ACE_Export
  ACE_DIR *opendir_emulation (const ACE_TCHAR *filename);
#endif /* ACE_LACKS_OPENDIR */

#if !defined (ACE_HAS_SCANDIR)
  extern ACE_Export
  int scandir_emulation (const ACE_TCHAR *dirname,
                         ACE_DIRENT **namelist[],
                         ACE_SCANDIR_SELECTOR selector,
                         ACE_SCANDIR_COMPARATOR comparator);
#endif /* !ACE_HAS_SCANDIR */

#if defined (ACE_LACKS_CLOSEDIR)
  extern ACE_Export
  void closedir_emulation (ACE_DIR *);
#endif /* ACE_LACKS_CLOSEDIR */

#if defined (ACE_LACKS_READDIR)
  extern ACE_Export
  struct ACE_DIRENT *readdir_emulation (ACE_DIR *);
#endif /* ACE_LACKS_READDIR */

} /* namespace ACE_OS */

ACE_END_VERSIONED_NAMESPACE_DECL

# if defined (ACE_HAS_INLINED_OSCALLS)
#   if defined (ACE_INLINE)
#     undef ACE_INLINE
#   endif /* ACE_INLINE */
#   define ACE_INLINE inline
#   include "ace/OS_NS_dirent.inl"
# endif /* ACE_HAS_INLINED_OSCALLS */

# include /**/ "ace/post.h"
#endif /* ACE_OS_NS_DIRENT_H */