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