Imported Upstream version 1.22.4
[platform/upstream/groff.git] / src / include / nonposix.h
1 /* -*- C -*- */
2 /* Copyright (C) 2000-2018 Free Software Foundation, Inc.
3      Written by Eli Zaretskii (eliz@is.elta.co.il)
4
5 This file is part of groff.
6
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program.  If not, see <http://www.gnu.org/licenses/>. */
19
20 /* This header file compartmentalize all idiosyncrasies of non-Posix
21    systems, such as MS-DOS, MS-Windows, etc.  It should be loaded after
22    the system headers like stdio.h to protect against warnings and error
23    messages w.r.t. redefining macros. */
24
25 #if defined _MSC_VER
26 # ifndef _WIN32
27 #  define _WIN32
28 # endif
29 #endif
30
31 #if defined(__MSDOS__) || defined(__EMX__) \
32     || (defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__))
33
34 /* Binary I/O nuisances. */
35 # include <fcntl.h>
36 # include <io.h>
37 # ifdef HAVE_UNISTD_H
38 #  include <unistd.h>
39 # endif
40 # ifndef STDIN_FILENO
41 #  define STDIN_FILENO  0
42 #  define STDOUT_FILENO 1
43 #  define STDERR_FILENO 2
44 # endif
45 # ifdef HAVE_DIRECT_H
46 #  include <direct.h>
47 # endif
48 # ifdef HAVE_PROCESS_H
49 #  include <process.h>
50 # endif
51 # if defined(_MSC_VER) || defined(__MINGW32__)
52 #  define POPEN_RT      "rt"
53 #  define POPEN_WT      "wt"
54 #  define popen(c,m)    _popen(c,m)
55 #  define pclose(p)     _pclose(p)
56 #  define pipe(pfd)     _pipe((pfd),0,_O_BINARY|_O_NOINHERIT)
57 #  define mkdir(p,m)    _mkdir(p)
58 #  define setmode(f,m)  _setmode(f,m)
59 #  define WAIT(s,p,m)   _cwait(s,p,m)
60 #  define creat(p,m)    _creat(p,m)
61 #  define read(f,b,s)   _read(f,b,s)
62 #  define write(f,b,s)  _write(f,b,s)
63 #  define dup(f)        _dup(f)
64 #  define dup2(f1,f2)   _dup2(f1,f2)
65 #  define close(f)      _close(f)
66 #  define isatty(f)     _isatty(f)
67 #  define access(p,m)   _access(p,m)
68 # endif
69 # define SET_BINARY(f)  do {if (!isatty(f)) setmode(f,O_BINARY);} while(0)
70 # define FOPEN_RB       "rb"
71 # define FOPEN_WB       "wb"
72 # define FOPEN_RWB      "wb+"
73 # ifndef O_BINARY
74 #  ifdef _O_BINARY
75 #   define O_BINARY     (_O_BINARY)
76 #  endif
77 # endif
78
79 /* The system shell.  Groff assumes a Unixy shell, but non-Posix
80    systems don't have standard places where it lives, and might not
81    have it installed to begin with.  We want to give them some leeway.  */
82 # ifdef __EMX__
83 #  define getcwd(b,s)   _getcwd2(b,s)
84 # else
85 #  define BSHELL        (system_shell_name())
86 #  define BSHELL_DASH_C (system_shell_dash_c())
87 #  define IS_BSHELL(s)  (is_system_shell(s))
88 # endif
89
90 /* The separator for directories in PATH and other environment
91    variables.  */
92 # define PATH_SEP       ";"
93 # define PATH_SEP_CHAR  ';'
94
95 /* Characters that separate directories in a path name.  */
96 # define DIR_SEPS       "/\\:"
97
98 /* How to tell if the argument is an absolute file name.  */
99 # define IS_ABSOLUTE(f) \
100  ((f)[0] == '/' || (f)[0] == '\\' || (f)[0] && (f)[1] == ':')
101
102 /* The executable extension.  */
103 # define EXE_EXT        ".exe"
104
105 /* Possible executable extensions.  */
106 # define PATH_EXT       ".com;.exe;.bat;.cmd"
107
108 /* The system null device.  */
109 # define NULL_DEV       "NUL"
110
111 /* The default place to create temporary files.  */
112 # ifndef P_tmpdir
113 #  ifdef _P_tmpdir
114 #   define P_tmpdir     _P_tmpdir
115 #  else
116 #   define P_tmpdir     "c:/temp"
117 #  endif
118 # endif
119
120 /* Prototypes.  */
121 # ifdef __cplusplus
122   extern "C" {
123 # endif
124     char       * system_shell_name(void);
125     const char * system_shell_dash_c(void);
126     int          is_system_shell(const char *);
127 # ifdef __cplusplus
128   }
129 # endif
130
131 #endif
132
133 #if defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__)
134 /* Win32 implementations which use the Microsoft runtime library
135  * are prone to hanging when a pipe reader quits with unread data in the pipe.
136  * 'gtroff' avoids this, by invoking 'FLUSH_INPUT_PIPE()', defined as ... */
137 # define FLUSH_INPUT_PIPE(fd)                 \
138  do if (!isatty(fd))                          \
139  {                                            \
140    char drain[BUFSIZ];                        \
141    while (read(fd, drain, sizeof(drain)) > 0) \
142      ;                                        \
143  } while (0)
144
145 /* The Microsoft runtime library also has a broken argument passing mechanism,
146  * which may result in improper grouping of arguments passed to a child process
147  * by the 'spawn()' family of functions.  In 'groff', only the 'spawnvp()'
148  * function is affected; we work around this defect, by substituting a
149  * wrapper function in place of 'spawnvp()' calls. */
150
151 # ifdef __cplusplus
152   extern "C" {
153 # endif
154   int spawnvp_wrapper(int, char *, char **);
155 # ifdef __cplusplus
156   }
157 # endif
158 # ifndef SPAWN_FUNCTION_WRAPPERS
159 #  undef  spawnvp
160 #  define spawnvp      spawnvp_wrapper
161 #  undef  _spawnvp
162 #  define _spawnvp     spawnvp
163 # endif /* SPAWN_FUNCTION_WRAPPERS */
164
165 #else
166 /* Other implementations do not suffer from Microsoft runtime bugs,
167  * but 'gtroff' requires a dummy definition for FLUSH_INPUT_PIPE() */
168 # define FLUSH_INPUT_PIPE(fd)   do {} while(0)
169 #endif
170
171 /* Defaults, for Posix systems.  */
172
173 #ifndef SET_BINARY
174 # define SET_BINARY(f)  do {} while(0)
175 #endif
176 #ifndef FOPEN_RB
177 # define FOPEN_RB       "r"
178 #endif
179 #ifndef FOPEN_WB
180 # define FOPEN_WB       "w"
181 #endif
182 #ifndef FOPEN_RWB
183 # define FOPEN_RWB      "w+"
184 #endif
185 #ifndef POPEN_RT
186 # define POPEN_RT       "r"
187 #endif
188 #ifndef POPEN_WT
189 # define POPEN_WT       "w"
190 #endif
191 #ifndef O_BINARY
192 # define O_BINARY       0
193 #endif
194 #ifndef BSHELL
195 # define BSHELL         "/bin/sh"
196 #endif
197 #ifndef BSHELL_DASH_C
198 # define BSHELL_DASH_C  "-c"
199 #endif
200 #ifndef IS_BSHELL
201 # define IS_BSHELL(s)   ((s) && strcmp(s,BSHELL) == 0)
202 #endif
203 #ifndef PATH_SEP
204 # define PATH_SEP       ":"
205 # define PATH_SEP_CHAR  ':'
206 #endif
207 #ifndef DIR_SEPS
208 # define DIR_SEPS       "/"
209 #endif
210 #ifndef IS_ABSOLUTE
211 # define IS_ABSOLUTE(f) ((f)[0] == '/')
212 #endif
213 #ifndef EXE_EXT
214 # define EXE_EXT        ""
215 #endif
216 #ifndef PATH_EXT
217 # define PATH_EXT       ""
218 #endif
219 #ifndef NULL_DEV
220 # define NULL_DEV       "/dev/null"
221 #endif
222 #ifndef GS_NAME
223 # define GS_NAME        "gs"
224 #endif
225 #ifndef WAIT
226 # define WAIT(s,p,m)    wait(s)
227 #endif
228 #ifndef _WAIT_CHILD
229 # define _WAIT_CHILD    0
230 #endif