Home | History | Annotate | Line # | Download | only in include
      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 (at) 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