1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: stat_.h 8022 2007-06-05 22:23:38Z giles $ */
15 /* Generic substitute for Unix sys/stat.h */
16 
17 #ifndef stat__INCLUDED
18 #  define stat__INCLUDED
19 
20 /* We must include std.h before any file that includes sys/types.h. */
21 #include "std.h"
22 
23 /* Metrowerks Standard Library doesn't use subdirs */
24 #ifdef __MWERKS__
25 #include <stat.h>
26 #else
27 #include <sys/stat.h>
28 #endif
29 
30 /*
31  * Many environments, including the MS-DOS compilers, don't define
32  * the st_blocks member of a stat structure.
33  */
34 #if defined(__SVR3) || defined(__EMX__) || defined(__DVX__) || defined(OSK) || defined(__MSDOS__) || defined(__QNX__) || defined(VMS) || defined(__WIN32__) || defined(__IBMC__) || defined(__BEOS__) || defined(Plan9) || defined(__WATCOMC__)
35 #  define stat_blocks(psbuf) (((psbuf)->st_size + 1023) >> 10)
36 #else
37 #  define stat_blocks(psbuf) ((psbuf)->st_blocks)
38 #endif
39 
40 /*
41  * Microsoft C uses _stat instead of stat,
42  * for both the function name and the structure name.
43  */
44 #ifdef _MSC_VER
45 #  define stat _stat
46 #endif
47 
48 /*
49  * Some (System V?) systems test for directories in a slightly different way.
50  */
51 #if defined(OSK) || !defined(S_ISDIR)
52 #  ifdef S_IFDIR
53 #    define stat_is_dir(stbuf) ((stbuf).st_mode & S_IFDIR)
54 #  else
55 #    ifdef _S_IFDIR
56 #      define stat_is_dir(stbuf) ((stbuf).st_mode & _S_IFDIR)
57 #    endif
58 #  endif
59 #else
60 #  define stat_is_dir(stbuf) S_ISDIR((stbuf).st_mode)
61 #endif
62 
63 /*
64  * Some systems have S_IFMT and S_IFCHR but not S_ISCHR.
65  */
66 #if !defined(S_ISCHR) || !defined(S_ISREG)
67 #  ifndef S_IFMT
68 #    ifdef _S_IFMT
69 #      define S_IFMT _S_IFMT
70 #      define S_IFCHR _S_IFCHR
71 #      define S_IFREG _S_IFREG
72 #    else
73 #    ifdef __S_IFMT
74 #      define S_IFMT __S_IFMT
75 #      define S_IFCHR __S_IFCHR
76 #      define S_IFREG __S_IFREG
77 #    endif
78 #    endif
79 #  endif
80 #  define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
81 #  define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
82 #endif
83 
84 /*
85  * Microsoft C doesn't define S_IRUSR or S_IWUSR.
86  */
87 #ifndef S_IRUSR
88 #  ifndef S_IREAD
89 #    define S_IRUSR _S_IREAD
90 #  else
91 #    define S_IRUSR S_IREAD
92 #  endif
93 #endif
94 #ifndef S_IWUSR
95 #  ifndef S_IWRITE
96 #    define S_IWUSR _S_IWRITE
97 #  else
98 #    define S_IWUSR S_IWRITE
99 #  endif
100 #endif
101 
102 #endif /* stat__INCLUDED */
103