xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/sfio/sfhdr.h (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #ifndef _SFHDR_H
23*b30d1939SAndy Fiddaman #define _SFHDR_H	1
24*b30d1939SAndy Fiddaman #if !defined(_BLD_sfio) && !defined(_BLD_stdio)
25*b30d1939SAndy Fiddaman #define _BLD_sfio	1
26*b30d1939SAndy Fiddaman #endif
27*b30d1939SAndy Fiddaman 
28*b30d1939SAndy Fiddaman /*	Internal definitions for sfio.
29*b30d1939SAndy Fiddaman **	Written by Kiem-Phong Vo
30*b30d1939SAndy Fiddaman */
31*b30d1939SAndy Fiddaman 
32*b30d1939SAndy Fiddaman #define _next		next
33*b30d1939SAndy Fiddaman #define _endw		endw
34*b30d1939SAndy Fiddaman #define _endr		endr
35*b30d1939SAndy Fiddaman #define _endb		endb
36*b30d1939SAndy Fiddaman #define _push		push
37*b30d1939SAndy Fiddaman #define _flags		flags
38*b30d1939SAndy Fiddaman #define _file		file
39*b30d1939SAndy Fiddaman #define _data		data
40*b30d1939SAndy Fiddaman #define _size		size
41*b30d1939SAndy Fiddaman #define _val		val
42*b30d1939SAndy Fiddaman 
43*b30d1939SAndy Fiddaman #include	"FEATURE/sfio"
44*b30d1939SAndy Fiddaman #include	"FEATURE/mmap"
45*b30d1939SAndy Fiddaman 
46*b30d1939SAndy Fiddaman /* define va_list, etc. before including sfio_t.h (sfio.h) */
47*b30d1939SAndy Fiddaman #if !_PACKAGE_ast
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman /* some systems don't know large files */
50*b30d1939SAndy Fiddaman #if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */
51*b30d1939SAndy Fiddaman #undef _NO_LARGEFILE64_SOURCE
52*b30d1939SAndy Fiddaman #define _NO_LARGEFILE64_SOURCE	1
53*b30d1939SAndy Fiddaman #undef	_LARGEFILE64_SOURCE
54*b30d1939SAndy Fiddaman #undef	_LARGEFILE_SOURCE
55*b30d1939SAndy Fiddaman #endif
56*b30d1939SAndy Fiddaman 
57*b30d1939SAndy Fiddaman #if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64
58*b30d1939SAndy Fiddaman #undef	_LARGEFILE64_SOURCE
59*b30d1939SAndy Fiddaman #undef	_LARGEFILE_SOURCE
60*b30d1939SAndy Fiddaman #undef	_FILE_OFFSET_BITS
61*b30d1939SAndy Fiddaman #define _LARGEFILE64_SOURCE	1	/* enabling the *64 stuff */
62*b30d1939SAndy Fiddaman #define _LARGEFILE_SOURCE	1
63*b30d1939SAndy Fiddaman #endif
64*b30d1939SAndy Fiddaman 
65*b30d1939SAndy Fiddaman #if _hdr_stdarg
66*b30d1939SAndy Fiddaman #include	<stdarg.h>
67*b30d1939SAndy Fiddaman #else
68*b30d1939SAndy Fiddaman #include	<varargs.h>
69*b30d1939SAndy Fiddaman #endif
70*b30d1939SAndy Fiddaman #include	"FEATURE/common"
71*b30d1939SAndy Fiddaman #if !__STD_C
72*b30d1939SAndy Fiddaman #define const
73*b30d1939SAndy Fiddaman #endif
74*b30d1939SAndy Fiddaman #endif /* !_PACKAGE_ast */
75*b30d1939SAndy Fiddaman 
76*b30d1939SAndy Fiddaman #include	"sfio_t.h"
77*b30d1939SAndy Fiddaman 
78*b30d1939SAndy Fiddaman /* note that the macro vt_threaded has effect on vthread.h */
79*b30d1939SAndy Fiddaman #include	<vthread.h>
80*b30d1939SAndy Fiddaman 
81*b30d1939SAndy Fiddaman /* file system info */
82*b30d1939SAndy Fiddaman #if _PACKAGE_ast
83*b30d1939SAndy Fiddaman 
84*b30d1939SAndy Fiddaman #include	<ast.h>
85*b30d1939SAndy Fiddaman #include	<ast_time.h>
86*b30d1939SAndy Fiddaman #include	<ast_tty.h>
87*b30d1939SAndy Fiddaman #include	<ls.h>
88*b30d1939SAndy Fiddaman 
89*b30d1939SAndy Fiddaman /* ast always provides multibyte handling */
90*b30d1939SAndy Fiddaman #undef _hdr_wchar
91*b30d1939SAndy Fiddaman #undef _lib_mbrtowc
92*b30d1939SAndy Fiddaman #undef _lib_wcrtomb
93*b30d1939SAndy Fiddaman #define _hdr_wchar	1
94*b30d1939SAndy Fiddaman #define _lib_mbrtowc	1
95*b30d1939SAndy Fiddaman #define _lib_wcrtomb	1
96*b30d1939SAndy Fiddaman 
97*b30d1939SAndy Fiddaman #if _mem_st_blksize_stat
98*b30d1939SAndy Fiddaman #define _stat_blksize	1
99*b30d1939SAndy Fiddaman #endif
100*b30d1939SAndy Fiddaman 
101*b30d1939SAndy Fiddaman #if _lib_localeconv && _hdr_locale
102*b30d1939SAndy Fiddaman #define _lib_locale	1
103*b30d1939SAndy Fiddaman #endif
104*b30d1939SAndy Fiddaman 
105*b30d1939SAndy Fiddaman #define sfoff_t		off_t
106*b30d1939SAndy Fiddaman #define sfstat_t	struct stat
107*b30d1939SAndy Fiddaman #define sysclosef	close
108*b30d1939SAndy Fiddaman #define syscreatf	creat
109*b30d1939SAndy Fiddaman #define sysdupf		dup
110*b30d1939SAndy Fiddaman #define sysfcntlf	fcntl
111*b30d1939SAndy Fiddaman #define sysfstatf	fstat
112*b30d1939SAndy Fiddaman #define sysftruncatef	ftruncate
113*b30d1939SAndy Fiddaman #define syslseekf	lseek
114*b30d1939SAndy Fiddaman #define sysmmapf	mmap
115*b30d1939SAndy Fiddaman #define sysmunmapf	munmap
116*b30d1939SAndy Fiddaman #define sysopenf	open
117*b30d1939SAndy Fiddaman #define syspipef	pipe
118*b30d1939SAndy Fiddaman #define sysreadf	read
119*b30d1939SAndy Fiddaman #define sysremovef	remove
120*b30d1939SAndy Fiddaman #define sysstatf	stat
121*b30d1939SAndy Fiddaman #define syswritef	write
122*b30d1939SAndy Fiddaman 
123*b30d1939SAndy Fiddaman #else /*!_PACKAGE_ast*/
124*b30d1939SAndy Fiddaman 
125*b30d1939SAndy Fiddaman /* when building the binary compatibility package, a number of header files
126*b30d1939SAndy Fiddaman    are not needed and they may get in the way so we remove them here.
127*b30d1939SAndy Fiddaman */
128*b30d1939SAndy Fiddaman #if _SFBINARY_H
129*b30d1939SAndy Fiddaman #undef  _hdr_time
130*b30d1939SAndy Fiddaman #undef  _sys_time
131*b30d1939SAndy Fiddaman #undef  _sys_stat
132*b30d1939SAndy Fiddaman #undef  _hdr_stat
133*b30d1939SAndy Fiddaman #undef  _hdr_filio
134*b30d1939SAndy Fiddaman #undef  _sys_filio
135*b30d1939SAndy Fiddaman #undef  _lib_poll
136*b30d1939SAndy Fiddaman #undef  _stream_peek
137*b30d1939SAndy Fiddaman #undef  _socket_peek
138*b30d1939SAndy Fiddaman #undef  _hdr_vfork
139*b30d1939SAndy Fiddaman #undef  _sys_vfork
140*b30d1939SAndy Fiddaman #undef  _lib_vfork
141*b30d1939SAndy Fiddaman #undef  _hdr_values
142*b30d1939SAndy Fiddaman #undef  _hdr_math
143*b30d1939SAndy Fiddaman #undef  _sys_mman
144*b30d1939SAndy Fiddaman #undef  _hdr_mman
145*b30d1939SAndy Fiddaman #undef  _sys_ioctl
146*b30d1939SAndy Fiddaman #endif
147*b30d1939SAndy Fiddaman 
148*b30d1939SAndy Fiddaman #if _hdr_stdlib
149*b30d1939SAndy Fiddaman #include	<stdlib.h>
150*b30d1939SAndy Fiddaman #endif
151*b30d1939SAndy Fiddaman 
152*b30d1939SAndy Fiddaman #if _hdr_string
153*b30d1939SAndy Fiddaman #include	<string.h>
154*b30d1939SAndy Fiddaman #endif
155*b30d1939SAndy Fiddaman 
156*b30d1939SAndy Fiddaman #if _hdr_time
157*b30d1939SAndy Fiddaman #include	<time.h>
158*b30d1939SAndy Fiddaman #endif
159*b30d1939SAndy Fiddaman #if _sys_time
160*b30d1939SAndy Fiddaman #include	<sys/time.h>
161*b30d1939SAndy Fiddaman #endif
162*b30d1939SAndy Fiddaman 
163*b30d1939SAndy Fiddaman #if _sys_stat
164*b30d1939SAndy Fiddaman #include	<sys/stat.h>
165*b30d1939SAndy Fiddaman #else
166*b30d1939SAndy Fiddaman #if _hdr_stat
167*b30d1939SAndy Fiddaman #include	<stat.h>
168*b30d1939SAndy Fiddaman #ifndef _sys_stat
169*b30d1939SAndy Fiddaman #define	_sys_stat	1
170*b30d1939SAndy Fiddaman #endif
171*b30d1939SAndy Fiddaman #endif
172*b30d1939SAndy Fiddaman #endif /*_sys_stat*/
173*b30d1939SAndy Fiddaman 
174*b30d1939SAndy Fiddaman #ifndef _sys_stat
175*b30d1939SAndy Fiddaman #define _sys_stat	0
176*b30d1939SAndy Fiddaman #endif
177*b30d1939SAndy Fiddaman 
178*b30d1939SAndy Fiddaman #include	<fcntl.h>
179*b30d1939SAndy Fiddaman 
180*b30d1939SAndy Fiddaman #ifndef F_SETFD
181*b30d1939SAndy Fiddaman #ifndef FIOCLEX
182*b30d1939SAndy Fiddaman #if _hdr_filio
183*b30d1939SAndy Fiddaman #include	<filio.h>
184*b30d1939SAndy Fiddaman #else
185*b30d1939SAndy Fiddaman #if _sys_filio
186*b30d1939SAndy Fiddaman #include	<sys/filio.h>
187*b30d1939SAndy Fiddaman #endif /*_sys_filio*/
188*b30d1939SAndy Fiddaman #endif /*_hdr_filio*/
189*b30d1939SAndy Fiddaman #endif /*_FIOCLEX*/
190*b30d1939SAndy Fiddaman #endif /*F_SETFD*/
191*b30d1939SAndy Fiddaman 
192*b30d1939SAndy Fiddaman #if _hdr_unistd
193*b30d1939SAndy Fiddaman #include	<unistd.h>
194*b30d1939SAndy Fiddaman #endif
195*b30d1939SAndy Fiddaman 
196*b30d1939SAndy Fiddaman #if !_LARGEFILE64_SOURCE	/* turn off the *64 stuff */
197*b30d1939SAndy Fiddaman #undef	_typ_off64_t
198*b30d1939SAndy Fiddaman #undef	_typ_struct_stat64
199*b30d1939SAndy Fiddaman #undef	_lib_creat64
200*b30d1939SAndy Fiddaman #undef	_lib_open64
201*b30d1939SAndy Fiddaman #undef	_lib_close64
202*b30d1939SAndy Fiddaman #undef	_lib_stat64
203*b30d1939SAndy Fiddaman #undef	_lib_fstat64
204*b30d1939SAndy Fiddaman #undef	_lib_ftruncate64
205*b30d1939SAndy Fiddaman #undef	_lib_lseek64
206*b30d1939SAndy Fiddaman #undef	_lib_mmap64
207*b30d1939SAndy Fiddaman #undef	_lib_munmap64
208*b30d1939SAndy Fiddaman #endif /*!_LARGEFILE64_SOURCE */
209*b30d1939SAndy Fiddaman 
210*b30d1939SAndy Fiddaman /* see if we can use memory mapping for io */
211*b30d1939SAndy Fiddaman #if _LARGEFILE64_SOURCE && !_lib_mmap64
212*b30d1939SAndy Fiddaman #undef _mmap_worthy
213*b30d1939SAndy Fiddaman #endif
214*b30d1939SAndy Fiddaman #if !_mmap_worthy
215*b30d1939SAndy Fiddaman #undef _hdr_mman
216*b30d1939SAndy Fiddaman #undef _sys_mman
217*b30d1939SAndy Fiddaman #endif
218*b30d1939SAndy Fiddaman #if _hdr_mman
219*b30d1939SAndy Fiddaman #include	<mman.h>
220*b30d1939SAndy Fiddaman #endif
221*b30d1939SAndy Fiddaman #if _sys_mman
222*b30d1939SAndy Fiddaman #include	<sys/mman.h>
223*b30d1939SAndy Fiddaman #endif
224*b30d1939SAndy Fiddaman 
225*b30d1939SAndy Fiddaman /* standardize system calls and types dealing with files */
226*b30d1939SAndy Fiddaman #if _typ_off64_t
227*b30d1939SAndy Fiddaman #define sfoff_t		off64_t
228*b30d1939SAndy Fiddaman #else
229*b30d1939SAndy Fiddaman #define sfoff_t		off_t
230*b30d1939SAndy Fiddaman #endif
231*b30d1939SAndy Fiddaman #if _typ_struct_stat64
232*b30d1939SAndy Fiddaman #define sfstat_t	struct stat64
233*b30d1939SAndy Fiddaman #else
234*b30d1939SAndy Fiddaman #define sfstat_t	struct stat
235*b30d1939SAndy Fiddaman #endif
236*b30d1939SAndy Fiddaman #if _lib_lseek64
237*b30d1939SAndy Fiddaman #define syslseekf	lseek64
238*b30d1939SAndy Fiddaman #else
239*b30d1939SAndy Fiddaman #define syslseekf	lseek
240*b30d1939SAndy Fiddaman #endif
241*b30d1939SAndy Fiddaman #if _lib_stat64
242*b30d1939SAndy Fiddaman #define sysstatf	stat64
243*b30d1939SAndy Fiddaman #else
244*b30d1939SAndy Fiddaman #define sysstatf	stat
245*b30d1939SAndy Fiddaman #endif
246*b30d1939SAndy Fiddaman #if _lib_fstat64
247*b30d1939SAndy Fiddaman #define sysfstatf	fstat64
248*b30d1939SAndy Fiddaman #else
249*b30d1939SAndy Fiddaman #define sysfstatf	fstat
250*b30d1939SAndy Fiddaman #endif
251*b30d1939SAndy Fiddaman #if _lib_mmap64
252*b30d1939SAndy Fiddaman #define sysmmapf	mmap64
253*b30d1939SAndy Fiddaman #else
254*b30d1939SAndy Fiddaman #define sysmmapf	mmap
255*b30d1939SAndy Fiddaman #endif
256*b30d1939SAndy Fiddaman #if _lib_munmap64
257*b30d1939SAndy Fiddaman #define sysmunmapf	munmap64
258*b30d1939SAndy Fiddaman #else
259*b30d1939SAndy Fiddaman #define sysmunmapf	munmap
260*b30d1939SAndy Fiddaman #endif
261*b30d1939SAndy Fiddaman #if _lib_open64
262*b30d1939SAndy Fiddaman #define sysopenf	open64
263*b30d1939SAndy Fiddaman #else
264*b30d1939SAndy Fiddaman #define sysopenf	open
265*b30d1939SAndy Fiddaman #endif
266*b30d1939SAndy Fiddaman #if _lib_creat64
267*b30d1939SAndy Fiddaman #define syscreatf	creat64
268*b30d1939SAndy Fiddaman #else
269*b30d1939SAndy Fiddaman #define syscreatf	creat
270*b30d1939SAndy Fiddaman #endif
271*b30d1939SAndy Fiddaman #if _lib_close64
272*b30d1939SAndy Fiddaman #define sysclosef	close64
273*b30d1939SAndy Fiddaman #else
274*b30d1939SAndy Fiddaman #define sysclosef	close
275*b30d1939SAndy Fiddaman #endif
276*b30d1939SAndy Fiddaman #if _lib_ftruncate64
277*b30d1939SAndy Fiddaman #undef _lib_ftruncate
278*b30d1939SAndy Fiddaman #define _lib_ftruncate	1
279*b30d1939SAndy Fiddaman #define sysftruncatef	ftruncate64
280*b30d1939SAndy Fiddaman #endif
281*b30d1939SAndy Fiddaman #if !_lib_ftruncate64 && _lib_ftruncate
282*b30d1939SAndy Fiddaman #define sysftruncatef	ftruncate
283*b30d1939SAndy Fiddaman #endif
284*b30d1939SAndy Fiddaman #if _lib_remove
285*b30d1939SAndy Fiddaman #define sysremovef	remove
286*b30d1939SAndy Fiddaman #else
287*b30d1939SAndy Fiddaman #define sysremovef	unlink
288*b30d1939SAndy Fiddaman #endif
289*b30d1939SAndy Fiddaman 
290*b30d1939SAndy Fiddaman #define sysreadf	read
291*b30d1939SAndy Fiddaman #define syswritef	write
292*b30d1939SAndy Fiddaman #define syspipef	pipe
293*b30d1939SAndy Fiddaman #define sysdupf		dup
294*b30d1939SAndy Fiddaman #define sysfcntlf	fcntl
295*b30d1939SAndy Fiddaman 
296*b30d1939SAndy Fiddaman #endif /*_PACKAGE_ast*/
297*b30d1939SAndy Fiddaman 
298*b30d1939SAndy Fiddaman #if !_mmap_worthy
299*b30d1939SAndy Fiddaman #undef MAP_TYPE
300*b30d1939SAndy Fiddaman #endif
301*b30d1939SAndy Fiddaman 
302*b30d1939SAndy Fiddaman #include	"FEATURE/float"
303*b30d1939SAndy Fiddaman 
304*b30d1939SAndy Fiddaman #include	<errno.h>
305*b30d1939SAndy Fiddaman #include	<ctype.h>
306*b30d1939SAndy Fiddaman 
307*b30d1939SAndy Fiddaman /* deal with multi-byte character and string conversions */
308*b30d1939SAndy Fiddaman #if _PACKAGE_ast
309*b30d1939SAndy Fiddaman 
310*b30d1939SAndy Fiddaman #include	<wchar.h>
311*b30d1939SAndy Fiddaman 
312*b30d1939SAndy Fiddaman #define _has_multibyte		1
313*b30d1939SAndy Fiddaman 
314*b30d1939SAndy Fiddaman #define SFMBMAX			mbmax()
315*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr)		memcpy((to), (fr), sizeof(mbstate_t))
316*b30d1939SAndy Fiddaman #define SFMBCLR(mb)		memset((mb), 0,  sizeof(mbstate_t))
317*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v)		(lhs = (v))
318*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb)		mbsize(s)
319*b30d1939SAndy Fiddaman #define SFMBDCL(ms)		mbstate_t ms;
320*b30d1939SAndy Fiddaman 
321*b30d1939SAndy Fiddaman #else
322*b30d1939SAndy Fiddaman 
323*b30d1939SAndy Fiddaman #if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc
324*b30d1939SAndy Fiddaman #define _has_multibyte		1	/* Xopen-compliant	*/
325*b30d1939SAndy Fiddaman #if _typ___va_list && !defined(__va_list)
326*b30d1939SAndy Fiddaman #define __va_list	va_list
327*b30d1939SAndy Fiddaman #endif
328*b30d1939SAndy Fiddaman #include	<wchar.h>
329*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr)		memcpy((to), (fr), sizeof(mbstate_t))
330*b30d1939SAndy Fiddaman #define SFMBCLR(mb)		memset((mb), 0,  sizeof(mbstate_t))
331*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v)		(lhs = (v))
332*b30d1939SAndy Fiddaman #define SFMBDCL(mb)		mbstate_t mb;
333*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb)		mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
334*b30d1939SAndy Fiddaman #endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/
335*b30d1939SAndy Fiddaman 
336*b30d1939SAndy Fiddaman #if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb
337*b30d1939SAndy Fiddaman #define _has_multibyte		2	/* no shift states	*/
338*b30d1939SAndy Fiddaman #include	<wchar.h>
339*b30d1939SAndy Fiddaman #undef mbrtowc
340*b30d1939SAndy Fiddaman #define mbrtowc(wp,s,n,mb)	mbtowc(wp, s, n)
341*b30d1939SAndy Fiddaman #undef wcrtomb
342*b30d1939SAndy Fiddaman #define wcrtomb(s,wc,mb)	wctomb(s, wc)
343*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr)
344*b30d1939SAndy Fiddaman #define SFMBCLR(mb)
345*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v)
346*b30d1939SAndy Fiddaman #define SFMBDCL(mb)
347*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb)		mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
348*b30d1939SAndy Fiddaman #endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/
349*b30d1939SAndy Fiddaman 
350*b30d1939SAndy Fiddaman #ifdef MB_CUR_MAX
351*b30d1939SAndy Fiddaman #define SFMBMAX			MB_CUR_MAX
352*b30d1939SAndy Fiddaman #else
353*b30d1939SAndy Fiddaman #define SFMBMAX			sizeof(Sflong_t)
354*b30d1939SAndy Fiddaman #endif
355*b30d1939SAndy Fiddaman 
356*b30d1939SAndy Fiddaman #endif /* _PACKAGE_ast */
357*b30d1939SAndy Fiddaman 
358*b30d1939SAndy Fiddaman #if !_has_multibyte
359*b30d1939SAndy Fiddaman #define _has_multibyte		0	/* no multibyte support	*/
360*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr)
361*b30d1939SAndy Fiddaman #define SFMBCLR(mb)
362*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v)
363*b30d1939SAndy Fiddaman #define SFMBDCL(mb)
364*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb)		(*(s) ? 1 : 0)
365*b30d1939SAndy Fiddaman #endif /* _has_multibyte */
366*b30d1939SAndy Fiddaman 
367*b30d1939SAndy Fiddaman /* dealing with streams that might be accessed concurrently */
368*b30d1939SAndy Fiddaman #if vt_threaded
369*b30d1939SAndy Fiddaman 
370*b30d1939SAndy Fiddaman #define SFMTXdecl(ff,_mf_)	Sfio_t* _mf_ = (ff)
371*b30d1939SAndy Fiddaman #define SFMTXbegin(ff,_mf_,rv) \
372*b30d1939SAndy Fiddaman 	{	if((ff)->_flags&SF_MTSAFE) \
373*b30d1939SAndy Fiddaman 		{	(_mf_) = (ff); \
374*b30d1939SAndy Fiddaman 			if(sfmutex((ff), SFMTX_LOCK) != 0) return(rv); \
375*b30d1939SAndy Fiddaman 			if(_Sfnotify) \
376*b30d1939SAndy Fiddaman 			{	(*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \
377*b30d1939SAndy Fiddaman 				if(!(ff)) (ff) = (_mf_); \
378*b30d1939SAndy Fiddaman 			} \
379*b30d1939SAndy Fiddaman 		} \
380*b30d1939SAndy Fiddaman 	}
381*b30d1939SAndy Fiddaman #define SFMTXend(ff,_mf_) \
382*b30d1939SAndy Fiddaman 	{	if((ff)->_flags&SF_MTSAFE) \
383*b30d1939SAndy Fiddaman 		{	if(_Sfnotify) \
384*b30d1939SAndy Fiddaman 				(*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \
385*b30d1939SAndy Fiddaman 			sfmutex((ff), SFMTX_UNLOCK); \
386*b30d1939SAndy Fiddaman 			(ff) = (_mf_); \
387*b30d1939SAndy Fiddaman 		} \
388*b30d1939SAndy Fiddaman 	}
389*b30d1939SAndy Fiddaman 
390*b30d1939SAndy Fiddaman #define SFONCE()		(_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef))
391*b30d1939SAndy Fiddaman 
392*b30d1939SAndy Fiddaman #define SFMTXLOCK(f)		(((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0)
393*b30d1939SAndy Fiddaman #define SFMTXUNLOCK(f)		(((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0)
394*b30d1939SAndy Fiddaman 
395*b30d1939SAndy Fiddaman #define SFMTXDECL(ff)		SFMTXdecl((ff), _mtxf1_)
396*b30d1939SAndy Fiddaman #define SFMTXBEGIN(ff,v) 	{ SFMTXbegin((ff), _mtxf1_, (v) ); }
397*b30d1939SAndy Fiddaman #define SFMTXEND(ff)		{ SFMTXend(ff, _mtxf1_); }
398*b30d1939SAndy Fiddaman #define SFMTXENTER(ff,v) 	{ if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); }
399*b30d1939SAndy Fiddaman #define SFMTXRETURN(ff,v)	{ SFMTXEND(ff); return(v); }
400*b30d1939SAndy Fiddaman 
401*b30d1939SAndy Fiddaman #define SFMTXDECL2(ff)		SFMTXdecl((ff), _mtxf2_)
402*b30d1939SAndy Fiddaman #define SFMTXBEGIN2(ff,v) 	{ SFMTXbegin((ff), _mtxf2_, (v) ); }
403*b30d1939SAndy Fiddaman #define SFMTXEND2(ff)		{ SFMTXend((ff), _mtxf2_); }
404*b30d1939SAndy Fiddaman 
405*b30d1939SAndy Fiddaman #define POOLMTXLOCK(p)		( vtmtxlock(&(p)->mutex) )
406*b30d1939SAndy Fiddaman #define POOLMTXUNLOCK(p)	( vtmtxunlock(&(p)->mutex) )
407*b30d1939SAndy Fiddaman #define POOLMTXENTER(p)		{ POOLMTXLOCK(p); }
408*b30d1939SAndy Fiddaman #define POOLMTXRETURN(p,rv)	{ POOLMTXUNLOCK(p); return(rv); }
409*b30d1939SAndy Fiddaman 
410*b30d1939SAndy Fiddaman #else /*!vt_threaded*/
411*b30d1939SAndy Fiddaman 
412*b30d1939SAndy Fiddaman #undef SF_MTSAFE /* no need to worry about thread-safety */
413*b30d1939SAndy Fiddaman #define SF_MTSAFE		0
414*b30d1939SAndy Fiddaman 
415*b30d1939SAndy Fiddaman #define SFONCE()		/*(0)*/
416*b30d1939SAndy Fiddaman 
417*b30d1939SAndy Fiddaman #define SFMTXLOCK(f)		/*(0)*/
418*b30d1939SAndy Fiddaman #define SFMTXUNLOCK(f)		/*(0)*/
419*b30d1939SAndy Fiddaman 
420*b30d1939SAndy Fiddaman #define	SFMTXDECL(ff)		/*(0)*/
421*b30d1939SAndy Fiddaman #define SFMTXBEGIN(ff,v) 	/*(0)*/
422*b30d1939SAndy Fiddaman #define SFMTXEND(ff)		/*(0)*/
423*b30d1939SAndy Fiddaman #define SFMTXENTER(ff,v)	{ if(!(ff)) return(v); }
424*b30d1939SAndy Fiddaman #define SFMTXRETURN(ff,v)	{ return(v); }
425*b30d1939SAndy Fiddaman 
426*b30d1939SAndy Fiddaman #define SFMTXDECL2(ff)		/*(0)*/
427*b30d1939SAndy Fiddaman #define SFMTXBEGIN2(ff,v) 	/*(0)*/
428*b30d1939SAndy Fiddaman #define SFMTXEND2(ff)		/*(0)*/
429*b30d1939SAndy Fiddaman 
430*b30d1939SAndy Fiddaman #define POOLMTXLOCK(p)
431*b30d1939SAndy Fiddaman #define POOLMTXUNLOCK(p)
432*b30d1939SAndy Fiddaman #define POOLMTXENTER(p)
433*b30d1939SAndy Fiddaman #define POOLMTXRETURN(p,v)	{ return(v); }
434*b30d1939SAndy Fiddaman 
435*b30d1939SAndy Fiddaman #endif /*vt_threaded*/
436*b30d1939SAndy Fiddaman 
437*b30d1939SAndy Fiddaman 
438*b30d1939SAndy Fiddaman /* functions for polling readiness of streams */
439*b30d1939SAndy Fiddaman #if _lib_select
440*b30d1939SAndy Fiddaman #undef _lib_poll
441*b30d1939SAndy Fiddaman #if _sys_select
442*b30d1939SAndy Fiddaman #include	<sys/select.h>
443*b30d1939SAndy Fiddaman #endif
444*b30d1939SAndy Fiddaman #else
445*b30d1939SAndy Fiddaman #if _lib_poll_fd_1 || _lib_poll_fd_2
446*b30d1939SAndy Fiddaman #define _lib_poll	1
447*b30d1939SAndy Fiddaman #endif
448*b30d1939SAndy Fiddaman #endif /*_lib_select_*/
449*b30d1939SAndy Fiddaman 
450*b30d1939SAndy Fiddaman #if _lib_poll
451*b30d1939SAndy Fiddaman #include	<poll.h>
452*b30d1939SAndy Fiddaman 
453*b30d1939SAndy Fiddaman #if _lib_poll_fd_1
454*b30d1939SAndy Fiddaman #define SFPOLL(pfd,n,tm)	poll((pfd),(ulong)(n),(tm))
455*b30d1939SAndy Fiddaman #else
456*b30d1939SAndy Fiddaman #define SFPOLL(pfd,n,tm)	poll((ulong)(n),(pfd),(tm))
457*b30d1939SAndy Fiddaman #endif
458*b30d1939SAndy Fiddaman #endif /*_lib_poll*/
459*b30d1939SAndy Fiddaman 
460*b30d1939SAndy Fiddaman #if _stream_peek
461*b30d1939SAndy Fiddaman #include	<stropts.h>
462*b30d1939SAndy Fiddaman #endif
463*b30d1939SAndy Fiddaman 
464*b30d1939SAndy Fiddaman #if _socket_peek
465*b30d1939SAndy Fiddaman #include	<sys/socket.h>
466*b30d1939SAndy Fiddaman #endif
467*b30d1939SAndy Fiddaman 
468*b30d1939SAndy Fiddaman /* to test for executable access mode of a file */
469*b30d1939SAndy Fiddaman #ifndef X_OK
470*b30d1939SAndy Fiddaman #define X_OK	01
471*b30d1939SAndy Fiddaman #endif
472*b30d1939SAndy Fiddaman 
473*b30d1939SAndy Fiddaman /* alternative process forking */
474*b30d1939SAndy Fiddaman #if _lib_vfork && !defined(fork) && !defined(__sparc) && !defined(__sparc__)
475*b30d1939SAndy Fiddaman #if _hdr_vfork
476*b30d1939SAndy Fiddaman #include	<vfork.h>
477*b30d1939SAndy Fiddaman #endif
478*b30d1939SAndy Fiddaman #if _sys_vfork
479*b30d1939SAndy Fiddaman #include	<sys/vfork.h>
480*b30d1939SAndy Fiddaman #endif
481*b30d1939SAndy Fiddaman #define fork	vfork
482*b30d1939SAndy Fiddaman #endif
483*b30d1939SAndy Fiddaman 
484*b30d1939SAndy Fiddaman /* to get rid of pesky compiler warnings */
485*b30d1939SAndy Fiddaman #if __STD_C
486*b30d1939SAndy Fiddaman #define NOTUSED(x)	(void)(x)
487*b30d1939SAndy Fiddaman #else
488*b30d1939SAndy Fiddaman #define NOTUSED(x)	(&x,1)
489*b30d1939SAndy Fiddaman #endif
490*b30d1939SAndy Fiddaman 
491*b30d1939SAndy Fiddaman /* Private flags in the "bits" field */
492*b30d1939SAndy Fiddaman #define SF_MMAP		00000001	/* in memory mapping mode		*/
493*b30d1939SAndy Fiddaman #define SF_BOTH		00000002	/* both read/write			*/
494*b30d1939SAndy Fiddaman #define SF_HOLE		00000004	/* a hole of zero's was created		*/
495*b30d1939SAndy Fiddaman #define SF_NULL		00000010	/* stream is /dev/null			*/
496*b30d1939SAndy Fiddaman #define SF_SEQUENTIAL	00000020	/* sequential access			*/
497*b30d1939SAndy Fiddaman #define SF_JUSTSEEK	00000040	/* just did a sfseek			*/
498*b30d1939SAndy Fiddaman #define SF_PRIVATE	00000100	/* private stream to Sfio, no mutex	*/
499*b30d1939SAndy Fiddaman #define SF_ENDING	00000200	/* no re-io on interrupts at closing	*/
500*b30d1939SAndy Fiddaman #define SF_WIDE		00000400	/* in wide mode - stdio only		*/
501*b30d1939SAndy Fiddaman #define SF_PUTR		00001000	/* in sfputr()				*/
502*b30d1939SAndy Fiddaman 
503*b30d1939SAndy Fiddaman /* "bits" flags that must be cleared in sfclrlock */
504*b30d1939SAndy Fiddaman #define SF_TMPBITS	00170000
505*b30d1939SAndy Fiddaman #define SF_DCDOWN	00010000	/* recurse down the discipline stack	*/
506*b30d1939SAndy Fiddaman 
507*b30d1939SAndy Fiddaman #define SF_WCFORMAT	00020000	/* wchar_t formatting - stdio only	*/
508*b30d1939SAndy Fiddaman #if _has_multibyte
509*b30d1939SAndy Fiddaman #define SFWCSET(f)	((f)->bits |= SF_WCFORMAT)
510*b30d1939SAndy Fiddaman #define SFWCGET(f,v)	(((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) )
511*b30d1939SAndy Fiddaman #else
512*b30d1939SAndy Fiddaman #define SFWCSET(f)
513*b30d1939SAndy Fiddaman #define SFWCGET(f,v)
514*b30d1939SAndy Fiddaman #endif
515*b30d1939SAndy Fiddaman 
516*b30d1939SAndy Fiddaman #define SF_MVSIZE	00040000	/* f->size was reset in sfmove()	*/
517*b30d1939SAndy Fiddaman #define SFMVSET(f)	(((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) )
518*b30d1939SAndy Fiddaman #define SFMVUNSET(f)	(!((f)->bits&SF_MVSIZE) ? 0 : \
519*b30d1939SAndy Fiddaman 				(((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) )
520*b30d1939SAndy Fiddaman 
521*b30d1939SAndy Fiddaman #define SFCLRBITS(f)	(SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) )
522*b30d1939SAndy Fiddaman 
523*b30d1939SAndy Fiddaman 
524*b30d1939SAndy Fiddaman /* bits for the mode field, SF_INIT defined in sfio_t.h */
525*b30d1939SAndy Fiddaman #define SF_RC		00000010	/* peeking for a record			*/
526*b30d1939SAndy Fiddaman #define SF_RV		00000020	/* reserve without read	or most write	*/
527*b30d1939SAndy Fiddaman #define SF_LOCK		00000040	/* stream is locked for io op		*/
528*b30d1939SAndy Fiddaman #define SF_PUSH		00000100	/* stream has been pushed		*/
529*b30d1939SAndy Fiddaman #define SF_POOL		00000200	/* stream is in a pool but not current	*/
530*b30d1939SAndy Fiddaman #define SF_PEEK		00000400	/* there is a pending peek		*/
531*b30d1939SAndy Fiddaman #define SF_PKRD		00001000	/* did a peek read			*/
532*b30d1939SAndy Fiddaman #define SF_GETR		00002000	/* did a getr on this stream		*/
533*b30d1939SAndy Fiddaman #define SF_SYNCED	00004000	/* stream was synced			*/
534*b30d1939SAndy Fiddaman #define SF_STDIO	00010000	/* given up the buffer to stdio		*/
535*b30d1939SAndy Fiddaman #define SF_AVAIL	00020000	/* was closed, available for reuse	*/
536*b30d1939SAndy Fiddaman #define SF_LOCAL	00100000	/* sentinel for a local call		*/
537*b30d1939SAndy Fiddaman 
538*b30d1939SAndy Fiddaman #ifdef DEBUG
539*b30d1939SAndy Fiddaman #define ASSERT(p)	((p) ? 0 : (abort(),0) )
540*b30d1939SAndy Fiddaman #else
541*b30d1939SAndy Fiddaman #define ASSERT(p)
542*b30d1939SAndy Fiddaman #endif
543*b30d1939SAndy Fiddaman 
544*b30d1939SAndy Fiddaman /* short-hands */
545*b30d1939SAndy Fiddaman #define NIL(t)		((t)0)
546*b30d1939SAndy Fiddaman #define reg		register
547*b30d1939SAndy Fiddaman #ifndef uchar
548*b30d1939SAndy Fiddaman #define uchar		unsigned char
549*b30d1939SAndy Fiddaman #endif
550*b30d1939SAndy Fiddaman #ifndef ulong
551*b30d1939SAndy Fiddaman #define ulong		unsigned long
552*b30d1939SAndy Fiddaman #endif
553*b30d1939SAndy Fiddaman #ifndef uint
554*b30d1939SAndy Fiddaman #define uint		unsigned int
555*b30d1939SAndy Fiddaman #endif
556*b30d1939SAndy Fiddaman #ifndef ushort
557*b30d1939SAndy Fiddaman #define ushort		unsigned short
558*b30d1939SAndy Fiddaman #endif
559*b30d1939SAndy Fiddaman 
560*b30d1939SAndy Fiddaman #define SECOND		1000	/* millisecond units */
561*b30d1939SAndy Fiddaman 
562*b30d1939SAndy Fiddaman /* macros do determine stream types from sfstat_t data */
563*b30d1939SAndy Fiddaman #ifndef S_IFDIR
564*b30d1939SAndy Fiddaman #define S_IFDIR	0
565*b30d1939SAndy Fiddaman #endif
566*b30d1939SAndy Fiddaman #ifndef S_IFREG
567*b30d1939SAndy Fiddaman #define S_IFREG	0
568*b30d1939SAndy Fiddaman #endif
569*b30d1939SAndy Fiddaman #ifndef S_IFCHR
570*b30d1939SAndy Fiddaman #define S_IFCHR	0
571*b30d1939SAndy Fiddaman #endif
572*b30d1939SAndy Fiddaman #ifndef S_IFIFO
573*b30d1939SAndy Fiddaman #define S_IFIFO	0
574*b30d1939SAndy Fiddaman #endif
575*b30d1939SAndy Fiddaman #ifndef S_ISOCK
576*b30d1939SAndy Fiddaman #define S_ISOCK	0
577*b30d1939SAndy Fiddaman #endif
578*b30d1939SAndy Fiddaman 
579*b30d1939SAndy Fiddaman #ifndef S_IFMT
580*b30d1939SAndy Fiddaman #define S_IFMT	(S_IFDIR|S_IFREG|S_IFCHR|S_IFIFO|S_ISOCK)
581*b30d1939SAndy Fiddaman #endif
582*b30d1939SAndy Fiddaman 
583*b30d1939SAndy Fiddaman #ifndef S_ISDIR
584*b30d1939SAndy Fiddaman #define S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)
585*b30d1939SAndy Fiddaman #endif
586*b30d1939SAndy Fiddaman #ifndef S_ISREG
587*b30d1939SAndy Fiddaman #define S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)
588*b30d1939SAndy Fiddaman #endif
589*b30d1939SAndy Fiddaman #ifndef S_ISCHR
590*b30d1939SAndy Fiddaman #define S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)
591*b30d1939SAndy Fiddaman #endif
592*b30d1939SAndy Fiddaman 
593*b30d1939SAndy Fiddaman #ifndef S_ISFIFO
594*b30d1939SAndy Fiddaman #	if S_IFIFO
595*b30d1939SAndy Fiddaman #		define S_ISFIFO(m)	(((m)&S_IFMT) == S_IFIFO)
596*b30d1939SAndy Fiddaman #	else
597*b30d1939SAndy Fiddaman #		define S_ISFIFO(m)	(0)
598*b30d1939SAndy Fiddaman #	endif
599*b30d1939SAndy Fiddaman #endif
600*b30d1939SAndy Fiddaman 
601*b30d1939SAndy Fiddaman #ifdef S_IRUSR
602*b30d1939SAndy Fiddaman #define SF_CREATMODE	(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
603*b30d1939SAndy Fiddaman #else
604*b30d1939SAndy Fiddaman #define SF_CREATMODE	0666
605*b30d1939SAndy Fiddaman #endif
606*b30d1939SAndy Fiddaman 
607*b30d1939SAndy Fiddaman /* set close-on-exec */
608*b30d1939SAndy Fiddaman #ifdef F_SETFD
609*b30d1939SAndy Fiddaman #	ifndef FD_CLOEXEC
610*b30d1939SAndy Fiddaman #		define FD_CLOEXEC	1
611*b30d1939SAndy Fiddaman #	endif /*FD_CLOEXEC*/
612*b30d1939SAndy Fiddaman #	define SETCLOEXEC(fd)		((void)fcntl((fd),F_SETFD,FD_CLOEXEC))
613*b30d1939SAndy Fiddaman #else
614*b30d1939SAndy Fiddaman #	ifdef FIOCLEX
615*b30d1939SAndy Fiddaman #		define SETCLOEXEC(fd)	((void)ioctl((fd),FIOCLEX,0))
616*b30d1939SAndy Fiddaman #	else
617*b30d1939SAndy Fiddaman #		define SETCLOEXEC(fd)
618*b30d1939SAndy Fiddaman #	endif /*FIOCLEX*/
619*b30d1939SAndy Fiddaman #endif /*F_SETFD*/
620*b30d1939SAndy Fiddaman 
621*b30d1939SAndy Fiddaman #define SF_FD_CLOEXEC			0x0001
622*b30d1939SAndy Fiddaman 
623*b30d1939SAndy Fiddaman /* a couple of error number that we use, default values are like Linux */
624*b30d1939SAndy Fiddaman #ifndef EINTR
625*b30d1939SAndy Fiddaman #define EINTR	4
626*b30d1939SAndy Fiddaman #endif
627*b30d1939SAndy Fiddaman #ifndef EBADF
628*b30d1939SAndy Fiddaman #define EBADF	9
629*b30d1939SAndy Fiddaman #endif
630*b30d1939SAndy Fiddaman #ifndef EAGAIN
631*b30d1939SAndy Fiddaman #define EAGAIN	11
632*b30d1939SAndy Fiddaman #endif
633*b30d1939SAndy Fiddaman #ifndef ENOMEM
634*b30d1939SAndy Fiddaman #define ENOMEM	12
635*b30d1939SAndy Fiddaman #endif
636*b30d1939SAndy Fiddaman #ifndef EINVAL
637*b30d1939SAndy Fiddaman #define EINVAL	22
638*b30d1939SAndy Fiddaman #endif
639*b30d1939SAndy Fiddaman #ifndef ESPIPE
640*b30d1939SAndy Fiddaman #define ESPIPE	29
641*b30d1939SAndy Fiddaman #endif
642*b30d1939SAndy Fiddaman 
643*b30d1939SAndy Fiddaman /* function to get the decimal point for local environment */
644*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE) && _PACKAGE_ast
645*b30d1939SAndy Fiddaman #include "lclib.h"
646*b30d1939SAndy Fiddaman #define SFSETLOCALE(dp,tp) \
647*b30d1939SAndy Fiddaman 	do if (*(dp) == 0) { \
648*b30d1939SAndy Fiddaman 		Lc_numeric_t*	lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \
649*b30d1939SAndy Fiddaman 		*(dp) = lv->decimal; \
650*b30d1939SAndy Fiddaman 		*(tp) = lv->thousand; \
651*b30d1939SAndy Fiddaman 	} while (0)
652*b30d1939SAndy Fiddaman #endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/
653*b30d1939SAndy Fiddaman 
654*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE) && _lib_locale
655*b30d1939SAndy Fiddaman #include	<locale.h>
656*b30d1939SAndy Fiddaman #define SFSETLOCALE(decimal,thousand) \
657*b30d1939SAndy Fiddaman 	do { struct lconv*	lv; \
658*b30d1939SAndy Fiddaman 	  if(*(decimal) == 0) \
659*b30d1939SAndy Fiddaman 	  { *(decimal) = '.'; \
660*b30d1939SAndy Fiddaman 	    *(thousand) = -1; \
661*b30d1939SAndy Fiddaman 	    if((lv = localeconv())) \
662*b30d1939SAndy Fiddaman 	    { if(lv->decimal_point && *lv->decimal_point) \
663*b30d1939SAndy Fiddaman 	    	*(decimal) = *(unsigned char*)lv->decimal_point; \
664*b30d1939SAndy Fiddaman 	      if(lv->thousands_sep && *lv->thousands_sep) \
665*b30d1939SAndy Fiddaman 	    	*(thousand) = *(unsigned char*)lv->thousands_sep; \
666*b30d1939SAndy Fiddaman 	    } \
667*b30d1939SAndy Fiddaman 	  } \
668*b30d1939SAndy Fiddaman 	} while (0)
669*b30d1939SAndy Fiddaman #endif /*!defined(SFSETLOCALE) && _lib_locale*/
670*b30d1939SAndy Fiddaman 
671*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE)
672*b30d1939SAndy Fiddaman #define SFSETLOCALE(decimal,thousand)	(*(decimal)='.',*(thousand)=-1)
673*b30d1939SAndy Fiddaman #endif
674*b30d1939SAndy Fiddaman 
675*b30d1939SAndy Fiddaman /* stream pool structure. */
676*b30d1939SAndy Fiddaman typedef struct _sfpool_s	Sfpool_t;
677*b30d1939SAndy Fiddaman struct _sfpool_s
678*b30d1939SAndy Fiddaman {	Sfpool_t*	next;
679*b30d1939SAndy Fiddaman 	int		mode;		/* type of pool			*/
680*b30d1939SAndy Fiddaman 	int		s_sf;		/* size of pool array		*/
681*b30d1939SAndy Fiddaman 	int		n_sf;		/* number currently in pool	*/
682*b30d1939SAndy Fiddaman 	Sfio_t**	sf;		/* array of streams		*/
683*b30d1939SAndy Fiddaman 	Sfio_t*		array[3];	/* start with 3			*/
684*b30d1939SAndy Fiddaman 	Vtmutex_t	mutex;		/* mutex lock object		*/
685*b30d1939SAndy Fiddaman };
686*b30d1939SAndy Fiddaman 
687*b30d1939SAndy Fiddaman /* reserve buffer structure */
688*b30d1939SAndy Fiddaman typedef struct _sfrsrv_s	Sfrsrv_t;
689*b30d1939SAndy Fiddaman struct _sfrsrv_s
690*b30d1939SAndy Fiddaman {	ssize_t		slen;		/* last string length		*/
691*b30d1939SAndy Fiddaman 	ssize_t		size;		/* buffer size			*/
692*b30d1939SAndy Fiddaman 	uchar		data[1];	/* data buffer			*/
693*b30d1939SAndy Fiddaman };
694*b30d1939SAndy Fiddaman 
695*b30d1939SAndy Fiddaman /* co-process structure */
696*b30d1939SAndy Fiddaman typedef struct _sfproc_s	Sfproc_t;
697*b30d1939SAndy Fiddaman struct _sfproc_s
698*b30d1939SAndy Fiddaman {	int		pid;	/* process id			*/
699*b30d1939SAndy Fiddaman 	uchar*		rdata;	/* read data being cached	*/
700*b30d1939SAndy Fiddaman 	int		ndata;	/* size of cached data		*/
701*b30d1939SAndy Fiddaman 	int		size;	/* buffer size			*/
702*b30d1939SAndy Fiddaman 	int		file;	/* saved file descriptor	*/
703*b30d1939SAndy Fiddaman 	int		sigp;	/* sigpipe protection needed	*/
704*b30d1939SAndy Fiddaman };
705*b30d1939SAndy Fiddaman 
706*b30d1939SAndy Fiddaman /* extensions to sfvprintf/sfvscanf */
707*b30d1939SAndy Fiddaman #define FP_SET(fp,fn)	(fp < 0 ? (fn += 1) : (fn = fp) )
708*b30d1939SAndy Fiddaman #define FP_WIDTH	0
709*b30d1939SAndy Fiddaman #define FP_PRECIS	1
710*b30d1939SAndy Fiddaman #define FP_BASE		2
711*b30d1939SAndy Fiddaman #define FP_STR		3
712*b30d1939SAndy Fiddaman #define FP_SIZE		4
713*b30d1939SAndy Fiddaman #define FP_INDEX	5	/* index size	*/
714*b30d1939SAndy Fiddaman 
715*b30d1939SAndy Fiddaman typedef struct _fmt_s		Fmt_t;
716*b30d1939SAndy Fiddaman typedef struct _fmtpos_s	Fmtpos_t;
717*b30d1939SAndy Fiddaman typedef union
718*b30d1939SAndy Fiddaman {	int		i, *ip;
719*b30d1939SAndy Fiddaman 	long		l, *lp;
720*b30d1939SAndy Fiddaman 	short		h, *hp;
721*b30d1939SAndy Fiddaman 	uint		ui;
722*b30d1939SAndy Fiddaman 	ulong		ul;
723*b30d1939SAndy Fiddaman 	ushort		uh;
724*b30d1939SAndy Fiddaman 	Sflong_t	ll, *llp;
725*b30d1939SAndy Fiddaman 	Sfulong_t	lu;
726*b30d1939SAndy Fiddaman 	Sfdouble_t	ld;
727*b30d1939SAndy Fiddaman 	double		d;
728*b30d1939SAndy Fiddaman 	float		f;
729*b30d1939SAndy Fiddaman #if _has_multibyte
730*b30d1939SAndy Fiddaman 	wchar_t		wc;
731*b30d1939SAndy Fiddaman 	wchar_t		*ws, **wsp;
732*b30d1939SAndy Fiddaman #endif
733*b30d1939SAndy Fiddaman 	char		c, *s, **sp;
734*b30d1939SAndy Fiddaman 	uchar		uc, *us, **usp;
735*b30d1939SAndy Fiddaman 	Void_t		*vp;
736*b30d1939SAndy Fiddaman 	Sffmt_t		*ft;
737*b30d1939SAndy Fiddaman } Argv_t;
738*b30d1939SAndy Fiddaman 
739*b30d1939SAndy Fiddaman struct _fmt_s
740*b30d1939SAndy Fiddaman {	char*		form;		/* format string		*/
741*b30d1939SAndy Fiddaman 	va_list		args;		/* corresponding arglist	*/
742*b30d1939SAndy Fiddaman 	SFMBDCL(mbs)			/* multibyte parsing state	*/
743*b30d1939SAndy Fiddaman 
744*b30d1939SAndy Fiddaman 	char*		oform;		/* original format string	*/
745*b30d1939SAndy Fiddaman 	va_list		oargs;		/* original arg list		*/
746*b30d1939SAndy Fiddaman 	int		argn;		/* number of args already used	*/
747*b30d1939SAndy Fiddaman 	Fmtpos_t*	fp;		/* position list		*/
748*b30d1939SAndy Fiddaman 
749*b30d1939SAndy Fiddaman 	Sffmt_t*	ft;		/* formatting environment	*/
750*b30d1939SAndy Fiddaman 	Sffmtevent_f	eventf;		/* event function		*/
751*b30d1939SAndy Fiddaman 	Fmt_t*		next;		/* stack frame pointer		*/
752*b30d1939SAndy Fiddaman };
753*b30d1939SAndy Fiddaman 
754*b30d1939SAndy Fiddaman struct _fmtpos_s
755*b30d1939SAndy Fiddaman {	Sffmt_t	ft;			/* environment			*/
756*b30d1939SAndy Fiddaman 	Argv_t	argv;			/* argument value		*/
757*b30d1939SAndy Fiddaman 	int	fmt;			/* original format		*/
758*b30d1939SAndy Fiddaman 	int	need[FP_INDEX];		/* positions depending on	*/
759*b30d1939SAndy Fiddaman };
760*b30d1939SAndy Fiddaman 
761*b30d1939SAndy Fiddaman #define LEFTP		'('
762*b30d1939SAndy Fiddaman #define RIGHTP		')'
763*b30d1939SAndy Fiddaman #define QUOTE		'\''
764*b30d1939SAndy Fiddaman 
765*b30d1939SAndy Fiddaman #ifndef CHAR_BIT
766*b30d1939SAndy Fiddaman #define CHAR_BIT	8
767*b30d1939SAndy Fiddaman #endif
768*b30d1939SAndy Fiddaman 
769*b30d1939SAndy Fiddaman #define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \
770*b30d1939SAndy Fiddaman 	((ft->form = (char*)frm), va_copy(ft->args,ags), \
771*b30d1939SAndy Fiddaman 	 (ft->fmt = fv), (ft->size = sz), \
772*b30d1939SAndy Fiddaman 	 (ft->flags = (flgs&SFFMT_SET)), \
773*b30d1939SAndy Fiddaman 	 (ft->width = wid), (ft->precis = pr), (ft->base = bs), \
774*b30d1939SAndy Fiddaman 	 (ft->t_str = ts), (ft->n_str = ns) )
775*b30d1939SAndy Fiddaman #define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \
776*b30d1939SAndy Fiddaman 	((frm = ft->form), va_copy(ags,ft->args), \
777*b30d1939SAndy Fiddaman 	 (fv = ft->fmt), (sz = ft->size), \
778*b30d1939SAndy Fiddaman 	 (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \
779*b30d1939SAndy Fiddaman 	 (wid = ft->width), (pr = ft->precis), (bs = ft->base) )
780*b30d1939SAndy Fiddaman 
781*b30d1939SAndy Fiddaman /* format flags&types, must coexist with those in sfio.h */
782*b30d1939SAndy Fiddaman #define SFFMT_FORBIDDEN 000077777777	/* for sfio.h only		*/
783*b30d1939SAndy Fiddaman #define SFFMT_EFORMAT	001000000000	/* sfcvt converting %e		*/
784*b30d1939SAndy Fiddaman #define SFFMT_MINUS	002000000000	/* minus sign			*/
785*b30d1939SAndy Fiddaman #define SFFMT_AFORMAT	004000000000	/* sfcvt converting %a		*/
786*b30d1939SAndy Fiddaman #define SFFMT_UPPER	010000000000	/* sfcvt converting upper	*/
787*b30d1939SAndy Fiddaman 
788*b30d1939SAndy Fiddaman #define SFFMT_TYPES	(SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\
789*b30d1939SAndy Fiddaman 			 SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \
790*b30d1939SAndy Fiddaman 			 SFFMT_TFLAG | SFFMT_ZFLAG )
791*b30d1939SAndy Fiddaman 
792*b30d1939SAndy Fiddaman /* type of elements to be converted */
793*b30d1939SAndy Fiddaman #define SFFMT_INT	001		/* %d,%i 		*/
794*b30d1939SAndy Fiddaman #define SFFMT_UINT	002		/* %u,o,x etc.		*/
795*b30d1939SAndy Fiddaman #define SFFMT_FLOAT	004		/* %f,e,g etc.		*/
796*b30d1939SAndy Fiddaman #define SFFMT_CHAR	010		/* %c,C			*/
797*b30d1939SAndy Fiddaman #define SFFMT_POINTER	020		/* %p,n,s,S		*/
798*b30d1939SAndy Fiddaman #define SFFMT_CLASS	040		/* %[			*/
799*b30d1939SAndy Fiddaman 
800*b30d1939SAndy Fiddaman /* local variables used across sf-functions */
801*b30d1939SAndy Fiddaman typedef void  (*Sfnotify_f)_ARG_((Sfio_t*, int, void*));
802*b30d1939SAndy Fiddaman #define _Sfpage		(_Sfextern.sf_page)
803*b30d1939SAndy Fiddaman #define _Sfpool		(_Sfextern.sf_pool)
804*b30d1939SAndy Fiddaman #define _Sfpmove	(_Sfextern.sf_pmove)
805*b30d1939SAndy Fiddaman #define _Sfstack	(_Sfextern.sf_stack)
806*b30d1939SAndy Fiddaman #define _Sfnotify	(_Sfextern.sf_notify)
807*b30d1939SAndy Fiddaman #define _Sfstdsync	(_Sfextern.sf_stdsync)
808*b30d1939SAndy Fiddaman #define _Sfudisc	(&(_Sfextern.sf_udisc))
809*b30d1939SAndy Fiddaman #define _Sfcleanup	(_Sfextern.sf_cleanup)
810*b30d1939SAndy Fiddaman #define _Sfexiting	(_Sfextern.sf_exiting)
811*b30d1939SAndy Fiddaman #define _Sfdone		(_Sfextern.sf_done)
812*b30d1939SAndy Fiddaman #define _Sfonce		(_Sfextern.sf_once)
813*b30d1939SAndy Fiddaman #define _Sfoncef	(_Sfextern.sf_oncef)
814*b30d1939SAndy Fiddaman #define _Sfmutex	(_Sfextern.sf_mutex)
815*b30d1939SAndy Fiddaman typedef struct _sfextern_s
816*b30d1939SAndy Fiddaman {	ssize_t			sf_page;
817*b30d1939SAndy Fiddaman 	struct _sfpool_s	sf_pool;
818*b30d1939SAndy Fiddaman 	int			(*sf_pmove)_ARG_((Sfio_t*, int));
819*b30d1939SAndy Fiddaman 	Sfio_t*			(*sf_stack)_ARG_((Sfio_t*, Sfio_t*));
820*b30d1939SAndy Fiddaman 	void			(*sf_notify)_ARG_((Sfio_t*, int, void*));
821*b30d1939SAndy Fiddaman 	int			(*sf_stdsync)_ARG_((Sfio_t*));
822*b30d1939SAndy Fiddaman 	struct _sfdisc_s	sf_udisc;
823*b30d1939SAndy Fiddaman 	void			(*sf_cleanup)_ARG_((void));
824*b30d1939SAndy Fiddaman 	int			sf_exiting;
825*b30d1939SAndy Fiddaman 	int			sf_done;
826*b30d1939SAndy Fiddaman 	Vtonce_t*		sf_once;
827*b30d1939SAndy Fiddaman 	void			(*sf_oncef)_ARG_((void));
828*b30d1939SAndy Fiddaman 	Vtmutex_t*		sf_mutex;
829*b30d1939SAndy Fiddaman } Sfextern_t;
830*b30d1939SAndy Fiddaman 
831*b30d1939SAndy Fiddaman /* get the real value of a byte in a coded long or ulong */
832*b30d1939SAndy Fiddaman #define SFUVALUE(v)	(((ulong)(v))&(SF_MORE-1))
833*b30d1939SAndy Fiddaman #define SFSVALUE(v)	((( long)(v))&(SF_SIGN-1))
834*b30d1939SAndy Fiddaman #define SFBVALUE(v)	(((ulong)(v))&(SF_BYTE-1))
835*b30d1939SAndy Fiddaman 
836*b30d1939SAndy Fiddaman /* pick this many bits in each iteration of double encoding */
837*b30d1939SAndy Fiddaman #define SF_PRECIS	7
838*b30d1939SAndy Fiddaman 
839*b30d1939SAndy Fiddaman /* grain size for buffer increment */
840*b30d1939SAndy Fiddaman #define SF_GRAIN	1024
841*b30d1939SAndy Fiddaman #define SF_PAGE		((ssize_t)(SF_GRAIN*sizeof(int)*2))
842*b30d1939SAndy Fiddaman 
843*b30d1939SAndy Fiddaman /* when the buffer is empty, certain io requests may be better done directly
844*b30d1939SAndy Fiddaman    on the given application buffers. The below condition determines when.
845*b30d1939SAndy Fiddaman */
846*b30d1939SAndy Fiddaman #define SFDIRECT(f,n)	(((ssize_t)(n) >= (f)->size) || \
847*b30d1939SAndy Fiddaman 			 ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) )
848*b30d1939SAndy Fiddaman 
849*b30d1939SAndy Fiddaman /* number of pages to memory map at a time */
850*b30d1939SAndy Fiddaman #if _ptr_bits >= 64
851*b30d1939SAndy Fiddaman #define SF_NMAP		1024
852*b30d1939SAndy Fiddaman #else
853*b30d1939SAndy Fiddaman #define SF_NMAP		32
854*b30d1939SAndy Fiddaman #endif
855*b30d1939SAndy Fiddaman 
856*b30d1939SAndy Fiddaman #ifndef MAP_VARIABLE
857*b30d1939SAndy Fiddaman #define MAP_VARIABLE	0
858*b30d1939SAndy Fiddaman #endif
859*b30d1939SAndy Fiddaman #ifndef _mmap_fixed
860*b30d1939SAndy Fiddaman #define _mmap_fixed	0
861*b30d1939SAndy Fiddaman #endif
862*b30d1939SAndy Fiddaman 
863*b30d1939SAndy Fiddaman /* set/unset sequential states for mmap */
864*b30d1939SAndy Fiddaman #if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL)
865*b30d1939SAndy Fiddaman #define SFMMSEQON(f,a,s) \
866*b30d1939SAndy Fiddaman 		do { int oerrno = errno; \
867*b30d1939SAndy Fiddaman 		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \
868*b30d1939SAndy Fiddaman 		     errno = oerrno; \
869*b30d1939SAndy Fiddaman 		} while(0)
870*b30d1939SAndy Fiddaman #define SFMMSEQOFF(f,a,s) \
871*b30d1939SAndy Fiddaman 		do { int oerrno = errno; \
872*b30d1939SAndy Fiddaman 		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \
873*b30d1939SAndy Fiddaman 		     errno = oerrno; \
874*b30d1939SAndy Fiddaman 		} while(0)
875*b30d1939SAndy Fiddaman #else
876*b30d1939SAndy Fiddaman #define SFMMSEQON(f,a,s)
877*b30d1939SAndy Fiddaman #define SFMMSEQOFF(f,a,s)
878*b30d1939SAndy Fiddaman #endif
879*b30d1939SAndy Fiddaman 
880*b30d1939SAndy Fiddaman #define SFMUNMAP(f,a,s)		(sysmunmapf((caddr_t)(a),(size_t)(s)), \
881*b30d1939SAndy Fiddaman 				 ((f)->endb = (f)->endr = (f)->endw = (f)->next = \
882*b30d1939SAndy Fiddaman 				  (f)->data = NIL(uchar*)) )
883*b30d1939SAndy Fiddaman 
884*b30d1939SAndy Fiddaman /* safe closing function */
885*b30d1939SAndy Fiddaman #define CLOSE(f)	{ while(sysclosef(f) < 0 && errno == EINTR) errno = 0; }
886*b30d1939SAndy Fiddaman 
887*b30d1939SAndy Fiddaman /* the bottomless bit bucket */
888*b30d1939SAndy Fiddaman #define DEVNULL		"/dev/null"
889*b30d1939SAndy Fiddaman #define SFSETNULL(f)	((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL)
890*b30d1939SAndy Fiddaman #define SFISNULL(f)	((f)->extent < 0 && ((f)->bits&SF_NULL) )
891*b30d1939SAndy Fiddaman 
892*b30d1939SAndy Fiddaman #define SFKILL(f)	((f)->mode = (SF_AVAIL|SF_LOCK) )
893*b30d1939SAndy Fiddaman #define SFKILLED(f)	(((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) )
894*b30d1939SAndy Fiddaman 
895*b30d1939SAndy Fiddaman /* exception types */
896*b30d1939SAndy Fiddaman #define SF_EDONE	0	/* stop this operation and return	*/
897*b30d1939SAndy Fiddaman #define SF_EDISC	1	/* discipline says it's ok		*/
898*b30d1939SAndy Fiddaman #define SF_ESTACK	2	/* stack was popped			*/
899*b30d1939SAndy Fiddaman #define SF_ECONT	3	/* can continue normally		*/
900*b30d1939SAndy Fiddaman 
901*b30d1939SAndy Fiddaman #define SETLOCAL(f)	((f)->mode |= SF_LOCAL)
902*b30d1939SAndy Fiddaman #define GETLOCAL(f,v)	((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v))
903*b30d1939SAndy Fiddaman #define SFWRALL(f)	((f)->mode |= SF_RV)
904*b30d1939SAndy Fiddaman #define SFISALL(f,v)	((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \
905*b30d1939SAndy Fiddaman 			 ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) )
906*b30d1939SAndy Fiddaman #define SFSK(f,a,o,d)	(SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d))
907*b30d1939SAndy Fiddaman #define SFRD(f,b,n,d)	(SETLOCAL(f),sfrd(f,(Void_t*)b,n,d))
908*b30d1939SAndy Fiddaman #define SFWR(f,b,n,d)	(SETLOCAL(f),sfwr(f,(Void_t*)b,n,d))
909*b30d1939SAndy Fiddaman #define SFSYNC(f)	(SETLOCAL(f),sfsync(f))
910*b30d1939SAndy Fiddaman #define SFCLOSE(f)	(SETLOCAL(f),sfclose(f))
911*b30d1939SAndy Fiddaman #define SFFLSBUF(f,n)	(SETLOCAL(f),_sfflsbuf(f,n))
912*b30d1939SAndy Fiddaman #define SFFILBUF(f,n)	(SETLOCAL(f),_sffilbuf(f,n))
913*b30d1939SAndy Fiddaman #define SFSETBUF(f,s,n)	(SETLOCAL(f),sfsetbuf(f,s,n))
914*b30d1939SAndy Fiddaman #define SFWRITE(f,s,n)	(SETLOCAL(f),sfwrite(f,s,n))
915*b30d1939SAndy Fiddaman #define SFREAD(f,s,n)	(SETLOCAL(f),sfread(f,s,n))
916*b30d1939SAndy Fiddaman #define SFSEEK(f,p,t)	(SETLOCAL(f),sfseek(f,p,t))
917*b30d1939SAndy Fiddaman #define SFNPUTC(f,c,n)	(SETLOCAL(f),sfnputc(f,c,n))
918*b30d1939SAndy Fiddaman #define SFRAISE(f,e,d)	(SETLOCAL(f),sfraise(f,e,d))
919*b30d1939SAndy Fiddaman 
920*b30d1939SAndy Fiddaman /* lock/open a stream */
921*b30d1939SAndy Fiddaman #define SFMODE(f,l)	((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) )
922*b30d1939SAndy Fiddaman #define SFLOCK(f,l)	(void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data)
923*b30d1939SAndy Fiddaman #define _SFOPENRD(f)	((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb)
924*b30d1939SAndy Fiddaman #define _SFOPENWR(f)	((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb)
925*b30d1939SAndy Fiddaman #define _SFOPEN(f)	((f)->mode == SF_READ  ? _SFOPENRD(f) : \
926*b30d1939SAndy Fiddaman 			 (f)->mode == SF_WRITE ? _SFOPENWR(f) : \
927*b30d1939SAndy Fiddaman 			 ((f)->endw = (f)->endr = (f)->data) )
928*b30d1939SAndy Fiddaman #define SFOPEN(f,l)	(void)((l) ? 0 : \
929*b30d1939SAndy Fiddaman 				((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) )
930*b30d1939SAndy Fiddaman 
931*b30d1939SAndy Fiddaman /* check to see if the stream can be accessed */
932*b30d1939SAndy Fiddaman #define SFFROZEN(f)	(((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \
933*b30d1939SAndy Fiddaman 			 !((f)->mode&SF_STDIO) ? 0 : \
934*b30d1939SAndy Fiddaman 			 _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) )
935*b30d1939SAndy Fiddaman 
936*b30d1939SAndy Fiddaman 
937*b30d1939SAndy Fiddaman /* set discipline code */
938*b30d1939SAndy Fiddaman #define SFDISC(f,dc,iof) \
939*b30d1939SAndy Fiddaman 	{	Sfdisc_t* d; \
940*b30d1939SAndy Fiddaman 		if(!(dc)) \
941*b30d1939SAndy Fiddaman 			d = (dc) = (f)->disc; \
942*b30d1939SAndy Fiddaman 		else 	d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \
943*b30d1939SAndy Fiddaman 		while(d && !(d->iof))	d = d->disc; \
944*b30d1939SAndy Fiddaman 		if(d)	(dc) = d; \
945*b30d1939SAndy Fiddaman 	}
946*b30d1939SAndy Fiddaman #define SFDCRD(f,buf,n,dc,rv) \
947*b30d1939SAndy Fiddaman 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
948*b30d1939SAndy Fiddaman 		rv = (*dc->readf)(f,buf,n,dc); \
949*b30d1939SAndy Fiddaman 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
950*b30d1939SAndy Fiddaman 	}
951*b30d1939SAndy Fiddaman #define SFDCWR(f,buf,n,dc,rv) \
952*b30d1939SAndy Fiddaman 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
953*b30d1939SAndy Fiddaman 		rv = (*dc->writef)(f,buf,n,dc); \
954*b30d1939SAndy Fiddaman 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
955*b30d1939SAndy Fiddaman 	}
956*b30d1939SAndy Fiddaman #define SFDCSK(f,addr,type,dc,rv) \
957*b30d1939SAndy Fiddaman 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
958*b30d1939SAndy Fiddaman 		rv = (*dc->seekf)(f,addr,type,dc); \
959*b30d1939SAndy Fiddaman 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
960*b30d1939SAndy Fiddaman 	}
961*b30d1939SAndy Fiddaman 
962*b30d1939SAndy Fiddaman /* fast peek of a stream */
963*b30d1939SAndy Fiddaman #define _SFAVAIL(f,s,n)	((n) = (f)->endb - ((s) = (f)->next) )
964*b30d1939SAndy Fiddaman #define SFRPEEK(f,s,n)	(_SFAVAIL(f,s,n) > 0 ? (n) : \
965*b30d1939SAndy Fiddaman 				((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) )
966*b30d1939SAndy Fiddaman #define SFWPEEK(f,s,n)	(_SFAVAIL(f,s,n) > 0 ? (n) : \
967*b30d1939SAndy Fiddaman 				((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) )
968*b30d1939SAndy Fiddaman 
969*b30d1939SAndy Fiddaman /* more than this for a line buffer, we might as well flush */
970*b30d1939SAndy Fiddaman #define HIFORLINE	128
971*b30d1939SAndy Fiddaman 
972*b30d1939SAndy Fiddaman /* string stream extent */
973*b30d1939SAndy Fiddaman #define SFSTRSIZE(f)	{ Sfoff_t s = (f)->next - (f)->data; \
974*b30d1939SAndy Fiddaman 			  if(s > (f)->here) \
975*b30d1939SAndy Fiddaman 			    { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \
976*b30d1939SAndy Fiddaman 			}
977*b30d1939SAndy Fiddaman 
978*b30d1939SAndy Fiddaman /* control flags for open() */
979*b30d1939SAndy Fiddaman #ifdef O_CREAT
980*b30d1939SAndy Fiddaman #define _has_oflags	1
981*b30d1939SAndy Fiddaman #else	/* for example, research UNIX */
982*b30d1939SAndy Fiddaman #define _has_oflags	0
983*b30d1939SAndy Fiddaman #define O_CREAT		004
984*b30d1939SAndy Fiddaman #define O_TRUNC		010
985*b30d1939SAndy Fiddaman #define O_APPEND	020
986*b30d1939SAndy Fiddaman #define O_EXCL		040
987*b30d1939SAndy Fiddaman 
988*b30d1939SAndy Fiddaman #ifndef O_RDONLY
989*b30d1939SAndy Fiddaman #define	O_RDONLY	000
990*b30d1939SAndy Fiddaman #endif
991*b30d1939SAndy Fiddaman #ifndef O_WRONLY
992*b30d1939SAndy Fiddaman #define O_WRONLY	001
993*b30d1939SAndy Fiddaman #endif
994*b30d1939SAndy Fiddaman #ifndef O_RDWR
995*b30d1939SAndy Fiddaman #define O_RDWR		002
996*b30d1939SAndy Fiddaman #endif
997*b30d1939SAndy Fiddaman #endif /*O_CREAT*/
998*b30d1939SAndy Fiddaman 
999*b30d1939SAndy Fiddaman #ifndef O_BINARY
1000*b30d1939SAndy Fiddaman #define O_BINARY	000
1001*b30d1939SAndy Fiddaman #endif
1002*b30d1939SAndy Fiddaman #ifndef O_TEXT
1003*b30d1939SAndy Fiddaman #define O_TEXT		000
1004*b30d1939SAndy Fiddaman #endif
1005*b30d1939SAndy Fiddaman #ifndef O_TEMPORARY
1006*b30d1939SAndy Fiddaman #define O_TEMPORARY	000
1007*b30d1939SAndy Fiddaman #endif
1008*b30d1939SAndy Fiddaman 
1009*b30d1939SAndy Fiddaman #define	SF_RADIX	64	/* maximum integer conversion base */
1010*b30d1939SAndy Fiddaman 
1011*b30d1939SAndy Fiddaman #if _PACKAGE_ast
1012*b30d1939SAndy Fiddaman #define SF_MAXINT	INT_MAX
1013*b30d1939SAndy Fiddaman #define SF_MAXLONG	LONG_MAX
1014*b30d1939SAndy Fiddaman #else
1015*b30d1939SAndy Fiddaman #define SF_MAXINT	((int)(((uint)~0) >> 1))
1016*b30d1939SAndy Fiddaman #define SF_MAXLONG	((long)(((ulong)~0L) >> 1))
1017*b30d1939SAndy Fiddaman #endif
1018*b30d1939SAndy Fiddaman 
1019*b30d1939SAndy Fiddaman #define SF_MAXCHAR	((uchar)(~0))
1020*b30d1939SAndy Fiddaman 
1021*b30d1939SAndy Fiddaman /* floating point to ascii conversion */
1022*b30d1939SAndy Fiddaman #define SF_MAXEXP10	6
1023*b30d1939SAndy Fiddaman #define SF_MAXPOW10	(1 << SF_MAXEXP10)
1024*b30d1939SAndy Fiddaman #if !_ast_fltmax_double
1025*b30d1939SAndy Fiddaman #define SF_FDIGITS	1024		/* max allowed fractional digits */
1026*b30d1939SAndy Fiddaman #define SF_IDIGITS	(8*1024)	/* max number of digits in int part */
1027*b30d1939SAndy Fiddaman #else
1028*b30d1939SAndy Fiddaman #define SF_FDIGITS	256		/* max allowed fractional digits */
1029*b30d1939SAndy Fiddaman #define SF_IDIGITS	1024		/* max number of digits in int part */
1030*b30d1939SAndy Fiddaman #endif
1031*b30d1939SAndy Fiddaman #define SF_MAXDIGITS	(((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int))
1032*b30d1939SAndy Fiddaman 
1033*b30d1939SAndy Fiddaman /* tables for numerical translation */
1034*b30d1939SAndy Fiddaman #define _Sfpos10	(_Sftable.sf_pos10)
1035*b30d1939SAndy Fiddaman #define _Sfneg10	(_Sftable.sf_neg10)
1036*b30d1939SAndy Fiddaman #define _Sfdec		(_Sftable.sf_dec)
1037*b30d1939SAndy Fiddaman #define _Sfdigits	(_Sftable.sf_digits)
1038*b30d1939SAndy Fiddaman #define _Sfcvinitf	(_Sftable.sf_cvinitf)
1039*b30d1939SAndy Fiddaman #define _Sfcvinit	(_Sftable.sf_cvinit)
1040*b30d1939SAndy Fiddaman #define _Sffmtposf	(_Sftable.sf_fmtposf)
1041*b30d1939SAndy Fiddaman #define _Sffmtintf	(_Sftable.sf_fmtintf)
1042*b30d1939SAndy Fiddaman #define _Sfcv36		(_Sftable.sf_cv36)
1043*b30d1939SAndy Fiddaman #define _Sfcv64		(_Sftable.sf_cv64)
1044*b30d1939SAndy Fiddaman #define _Sftype		(_Sftable.sf_type)
1045*b30d1939SAndy Fiddaman #define _Sfieee		(&_Sftable.sf_ieee)
1046*b30d1939SAndy Fiddaman #define _Sffinf		(_Sftable.sf_ieee.fltinf)
1047*b30d1939SAndy Fiddaman #define _Sfdinf		(_Sftable.sf_ieee.dblinf)
1048*b30d1939SAndy Fiddaman #define _Sflinf		(_Sftable.sf_ieee.ldblinf)
1049*b30d1939SAndy Fiddaman #define _Sffnan		(_Sftable.sf_ieee.fltnan)
1050*b30d1939SAndy Fiddaman #define _Sfdnan		(_Sftable.sf_ieee.dblnan)
1051*b30d1939SAndy Fiddaman #define _Sflnan		(_Sftable.sf_ieee.ldblnan)
1052*b30d1939SAndy Fiddaman #define _Sffpow10	(_Sftable.sf_flt_pow10)
1053*b30d1939SAndy Fiddaman #define _Sfdpow10	(_Sftable.sf_dbl_pow10)
1054*b30d1939SAndy Fiddaman #define _Sflpow10	(_Sftable.sf_ldbl_pow10)
1055*b30d1939SAndy Fiddaman typedef struct _sfieee_s	Sfieee_t;
1056*b30d1939SAndy Fiddaman struct _sfieee_s
1057*b30d1939SAndy Fiddaman {	float		fltnan;		/* float NAN			*/
1058*b30d1939SAndy Fiddaman 	float		fltinf;		/* float INF			*/
1059*b30d1939SAndy Fiddaman 	double		dblnan;		/* double NAN			*/
1060*b30d1939SAndy Fiddaman 	double		dblinf;		/* double INF			*/
1061*b30d1939SAndy Fiddaman 	Sfdouble_t	ldblnan;	/* Sfdouble_t NAN		*/
1062*b30d1939SAndy Fiddaman 	Sfdouble_t	ldblinf;	/* Sfdouble_t INF		*/
1063*b30d1939SAndy Fiddaman };
1064*b30d1939SAndy Fiddaman typedef struct _sftab_
1065*b30d1939SAndy Fiddaman {	Sfdouble_t	sf_pos10[SF_MAXEXP10];	/* positive powers of 10	*/
1066*b30d1939SAndy Fiddaman 	Sfdouble_t	sf_neg10[SF_MAXEXP10];	/* negative powers of 10	*/
1067*b30d1939SAndy Fiddaman 	uchar		sf_dec[200];		/* ascii reps of values < 100	*/
1068*b30d1939SAndy Fiddaman 	char*		sf_digits;		/* digits for general bases	*/
1069*b30d1939SAndy Fiddaman 	int		(*sf_cvinitf)();	/* initialization function	*/
1070*b30d1939SAndy Fiddaman 	int		sf_cvinit;		/* initialization state		*/
1071*b30d1939SAndy Fiddaman 	Fmtpos_t*	(*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int));
1072*b30d1939SAndy Fiddaman 	char*		(*sf_fmtintf)_ARG_((const char*,int*));
1073*b30d1939SAndy Fiddaman 	float*		sf_flt_pow10;		/* float powers of 10		*/
1074*b30d1939SAndy Fiddaman 	double*		sf_dbl_pow10;		/* double powers of 10		*/
1075*b30d1939SAndy Fiddaman 	Sfdouble_t*	sf_ldbl_pow10;		/* Sfdouble_t powers of 10	*/
1076*b30d1939SAndy Fiddaman 	uchar		sf_cv36[SF_MAXCHAR+1];	/* conversion for base [2-36]	*/
1077*b30d1939SAndy Fiddaman 	uchar		sf_cv64[SF_MAXCHAR+1];	/* conversion for base [37-64]	*/
1078*b30d1939SAndy Fiddaman 	uchar		sf_type[SF_MAXCHAR+1];	/* conversion formats&types	*/
1079*b30d1939SAndy Fiddaman 	Sfieee_t	sf_ieee;		/* IEEE floating point constants*/
1080*b30d1939SAndy Fiddaman } Sftab_t;
1081*b30d1939SAndy Fiddaman 
1082*b30d1939SAndy Fiddaman /* thread-safe macro/function to initialize _Sfcv* conversion tables */
1083*b30d1939SAndy Fiddaman #define SFCVINIT()      (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) )
1084*b30d1939SAndy Fiddaman 
1085*b30d1939SAndy Fiddaman /* sfucvt() converts decimal integers to ASCII */
1086*b30d1939SAndy Fiddaman #define SFDIGIT(v,scale,digit) \
1087*b30d1939SAndy Fiddaman 	{ if(v < 5*scale) \
1088*b30d1939SAndy Fiddaman 		if(v < 2*scale) \
1089*b30d1939SAndy Fiddaman 			if(v < 1*scale) \
1090*b30d1939SAndy Fiddaman 				{ digit = '0'; } \
1091*b30d1939SAndy Fiddaman 			else	{ digit = '1'; v -= 1*scale; } \
1092*b30d1939SAndy Fiddaman 		else	if(v < 3*scale) \
1093*b30d1939SAndy Fiddaman 				{ digit = '2'; v -= 2*scale; } \
1094*b30d1939SAndy Fiddaman 			else if(v < 4*scale) \
1095*b30d1939SAndy Fiddaman 				{ digit = '3'; v -= 3*scale; } \
1096*b30d1939SAndy Fiddaman 			else	{ digit = '4'; v -= 4*scale; } \
1097*b30d1939SAndy Fiddaman 	  else	if(v < 7*scale) \
1098*b30d1939SAndy Fiddaman 			if(v < 6*scale) \
1099*b30d1939SAndy Fiddaman 				{ digit = '5'; v -= 5*scale; } \
1100*b30d1939SAndy Fiddaman 			else	{ digit = '6'; v -= 6*scale; } \
1101*b30d1939SAndy Fiddaman 		else	if(v < 8*scale) \
1102*b30d1939SAndy Fiddaman 				{ digit = '7'; v -= 7*scale; } \
1103*b30d1939SAndy Fiddaman 			else if(v < 9*scale) \
1104*b30d1939SAndy Fiddaman 				{ digit = '8'; v -= 8*scale; } \
1105*b30d1939SAndy Fiddaman 			else	{ digit = '9'; v -= 9*scale; } \
1106*b30d1939SAndy Fiddaman 	}
1107*b30d1939SAndy Fiddaman #define sfucvt(v,s,n,list,type,utype) \
1108*b30d1939SAndy Fiddaman 	{ while((utype)v >= 10000) \
1109*b30d1939SAndy Fiddaman 	  {	n = v; v = (type)(((utype)v)/10000); \
1110*b30d1939SAndy Fiddaman 		n = (type)((utype)n - ((utype)v)*10000); \
1111*b30d1939SAndy Fiddaman 	  	s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \
1112*b30d1939SAndy Fiddaman 			s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \
1113*b30d1939SAndy Fiddaman 	  } \
1114*b30d1939SAndy Fiddaman 	  if(v < 100) \
1115*b30d1939SAndy Fiddaman 	  { if(v < 10) \
1116*b30d1939SAndy Fiddaman 	    { 	s -= 1; s[0] = (char)('0'+v); \
1117*b30d1939SAndy Fiddaman 	    } else \
1118*b30d1939SAndy Fiddaman 	    { 	s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \
1119*b30d1939SAndy Fiddaman 	    } \
1120*b30d1939SAndy Fiddaman 	  } else \
1121*b30d1939SAndy Fiddaman 	  { if(v < 1000) \
1122*b30d1939SAndy Fiddaman 	    { 	s -= 3; SFDIGIT(v,100,s[0]); \
1123*b30d1939SAndy Fiddaman 			s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \
1124*b30d1939SAndy Fiddaman 	    } else \
1125*b30d1939SAndy Fiddaman 	    {	s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \
1126*b30d1939SAndy Fiddaman 			s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \
1127*b30d1939SAndy Fiddaman 	    } \
1128*b30d1939SAndy Fiddaman 	  } \
1129*b30d1939SAndy Fiddaman 	}
1130*b30d1939SAndy Fiddaman 
1131*b30d1939SAndy Fiddaman /* handy functions */
1132*b30d1939SAndy Fiddaman #undef min
1133*b30d1939SAndy Fiddaman #undef max
1134*b30d1939SAndy Fiddaman #define min(x,y)	((x) < (y) ? (x) : (y))
1135*b30d1939SAndy Fiddaman #define max(x,y)	((x) > (y) ? (x) : (y))
1136*b30d1939SAndy Fiddaman 
1137*b30d1939SAndy Fiddaman /* fast functions for memory copy and memory clear */
1138*b30d1939SAndy Fiddaman #if _PACKAGE_ast
1139*b30d1939SAndy Fiddaman #define memclear(s,n)	memzero(s,n)
1140*b30d1939SAndy Fiddaman #else
1141*b30d1939SAndy Fiddaman #if _lib_bcopy && !_lib_memcpy
1142*b30d1939SAndy Fiddaman #define memcpy(to,fr,n)	bcopy((fr),(to),(n))
1143*b30d1939SAndy Fiddaman #endif
1144*b30d1939SAndy Fiddaman #if _lib_bzero && !_lib_memset
1145*b30d1939SAndy Fiddaman #define memclear(s,n)	bzero((s),(n))
1146*b30d1939SAndy Fiddaman #else
1147*b30d1939SAndy Fiddaman #define memclear(s,n)	memset((s),'\0',(n))
1148*b30d1939SAndy Fiddaman #endif
1149*b30d1939SAndy Fiddaman #endif /*_PACKAGE_ast*/
1150*b30d1939SAndy Fiddaman 
1151*b30d1939SAndy Fiddaman /* note that MEMCPY advances the associated pointers */
1152*b30d1939SAndy Fiddaman #define MEMCPY(to,fr,n) \
1153*b30d1939SAndy Fiddaman 	{ memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; }
1154*b30d1939SAndy Fiddaman #define MEMSET(s,c,n) \
1155*b30d1939SAndy Fiddaman 	{ memset((Void_t*)s,(int)c,n); s += n; }
1156*b30d1939SAndy Fiddaman 
1157*b30d1939SAndy Fiddaman _BEGIN_EXTERNS_
1158*b30d1939SAndy Fiddaman 
1159*b30d1939SAndy Fiddaman extern Sftab_t		_Sftable;
1160*b30d1939SAndy Fiddaman 
1161*b30d1939SAndy Fiddaman extern int		_sfpopen _ARG_((Sfio_t*, int, int, int));
1162*b30d1939SAndy Fiddaman extern int		_sfpclose _ARG_((Sfio_t*));
1163*b30d1939SAndy Fiddaman extern int		_sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*));
1164*b30d1939SAndy Fiddaman extern Sfrsrv_t*	_sfrsrv _ARG_((Sfio_t*, ssize_t));
1165*b30d1939SAndy Fiddaman extern int		_sfsetpool _ARG_((Sfio_t*));
1166*b30d1939SAndy Fiddaman extern char*		_sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int));
1167*b30d1939SAndy Fiddaman extern char**		_sfgetpath _ARG_((char*));
1168*b30d1939SAndy Fiddaman 
1169*b30d1939SAndy Fiddaman #if _BLD_sfio && defined(__EXPORT__)
1170*b30d1939SAndy Fiddaman #define extern		__EXPORT__
1171*b30d1939SAndy Fiddaman #endif
1172*b30d1939SAndy Fiddaman #if !_BLD_sfio && defined(__IMPORT__)
1173*b30d1939SAndy Fiddaman #define extern		extern __IMPORT__
1174*b30d1939SAndy Fiddaman #endif
1175*b30d1939SAndy Fiddaman 
1176*b30d1939SAndy Fiddaman extern Sfextern_t	_Sfextern;
1177*b30d1939SAndy Fiddaman 
1178*b30d1939SAndy Fiddaman extern int		_sfmode _ARG_((Sfio_t*, int, int));
1179*b30d1939SAndy Fiddaman extern int		_sftype _ARG_((const char*, int*, int*, int*));
1180*b30d1939SAndy Fiddaman 
1181*b30d1939SAndy Fiddaman #undef	extern
1182*b30d1939SAndy Fiddaman 
1183*b30d1939SAndy Fiddaman #ifndef errno
1184*b30d1939SAndy Fiddaman extern int		errno;
1185*b30d1939SAndy Fiddaman #endif
1186*b30d1939SAndy Fiddaman 
1187*b30d1939SAndy Fiddaman /* for portable encoding of double values */
1188*b30d1939SAndy Fiddaman #ifndef frexpl
1189*b30d1939SAndy Fiddaman #if _ast_fltmax_double
1190*b30d1939SAndy Fiddaman #define frexpl		frexp
1191*b30d1939SAndy Fiddaman #endif
1192*b30d1939SAndy Fiddaman #if !_lib_frexpl
1193*b30d1939SAndy Fiddaman extern Sfdouble_t	frexpl _ARG_((Sfdouble_t, int*));
1194*b30d1939SAndy Fiddaman #endif
1195*b30d1939SAndy Fiddaman #endif
1196*b30d1939SAndy Fiddaman #ifndef ldexpl
1197*b30d1939SAndy Fiddaman #if _ast_fltmax_double
1198*b30d1939SAndy Fiddaman #define ldexpl		ldexp
1199*b30d1939SAndy Fiddaman #endif
1200*b30d1939SAndy Fiddaman #if !_lib_ldexpl
1201*b30d1939SAndy Fiddaman extern Sfdouble_t	ldexpl _ARG_((Sfdouble_t, int));
1202*b30d1939SAndy Fiddaman #endif
1203*b30d1939SAndy Fiddaman #endif
1204*b30d1939SAndy Fiddaman 
1205*b30d1939SAndy Fiddaman #if !_PACKAGE_ast
1206*b30d1939SAndy Fiddaman 
1207*b30d1939SAndy Fiddaman #if !__STDC__ && !_hdr_stdlib
1208*b30d1939SAndy Fiddaman extern void	abort _ARG_((void));
1209*b30d1939SAndy Fiddaman extern int	atexit _ARG_((void(*)(void)));
1210*b30d1939SAndy Fiddaman extern char*	getenv _ARG_((const char*));
1211*b30d1939SAndy Fiddaman extern void*	malloc _ARG_((size_t));
1212*b30d1939SAndy Fiddaman extern void*	realloc _ARG_((void*, size_t));
1213*b30d1939SAndy Fiddaman extern void	free _ARG_((void*));
1214*b30d1939SAndy Fiddaman extern size_t	strlen _ARG_((const char*));
1215*b30d1939SAndy Fiddaman extern char*	strcpy _ARG_((char*, const char*));
1216*b30d1939SAndy Fiddaman 
1217*b30d1939SAndy Fiddaman extern Void_t*	memset _ARG_((void*, int, size_t));
1218*b30d1939SAndy Fiddaman extern Void_t*	memchr _ARG_((const void*, int, size_t));
1219*b30d1939SAndy Fiddaman extern Void_t*	memccpy _ARG_((void*, const void*, int, size_t));
1220*b30d1939SAndy Fiddaman #ifndef memcpy
1221*b30d1939SAndy Fiddaman extern Void_t*	memcpy _ARG_((void*, const void*, size_t));
1222*b30d1939SAndy Fiddaman #endif
1223*b30d1939SAndy Fiddaman #if !defined(strtod)
1224*b30d1939SAndy Fiddaman extern double	strtod _ARG_((const char*, char**));
1225*b30d1939SAndy Fiddaman #endif
1226*b30d1939SAndy Fiddaman #if !defined(remove)
1227*b30d1939SAndy Fiddaman extern int	sysremovef _ARG_((const char*));
1228*b30d1939SAndy Fiddaman #endif
1229*b30d1939SAndy Fiddaman #endif /* !__STDC__ && !_hdr_stdlib */
1230*b30d1939SAndy Fiddaman 
1231*b30d1939SAndy Fiddaman #if !_hdr_unistd
1232*b30d1939SAndy Fiddaman #if _proto_open && __cplusplus
1233*b30d1939SAndy Fiddaman extern int	sysopenf _ARG_((const char*, int, ...));
1234*b30d1939SAndy Fiddaman #endif
1235*b30d1939SAndy Fiddaman extern int	sysclosef _ARG_((int));
1236*b30d1939SAndy Fiddaman extern ssize_t	sysreadf _ARG_((int, void*, size_t));
1237*b30d1939SAndy Fiddaman extern ssize_t	syswritef _ARG_((int, const void*, size_t));
1238*b30d1939SAndy Fiddaman extern sfoff_t	syslseekf _ARG_((int, sfoff_t, int));
1239*b30d1939SAndy Fiddaman extern int	sysdupf _ARG_((int));
1240*b30d1939SAndy Fiddaman extern int	syspipef _ARG_((int*));
1241*b30d1939SAndy Fiddaman extern int	sysaccessf _ARG_((const char*, int));
1242*b30d1939SAndy Fiddaman extern int	sysremovef _ARG_((const char*));
1243*b30d1939SAndy Fiddaman extern int	sysfstatf _ARG_((int, sfstat_t*));
1244*b30d1939SAndy Fiddaman extern int	sysstatf _ARG_((const char*, sfstat_t*));
1245*b30d1939SAndy Fiddaman 
1246*b30d1939SAndy Fiddaman extern int	isatty _ARG_((int));
1247*b30d1939SAndy Fiddaman 
1248*b30d1939SAndy Fiddaman extern int	wait _ARG_((int*));
1249*b30d1939SAndy Fiddaman extern uint	sleep _ARG_((uint));
1250*b30d1939SAndy Fiddaman extern int	execl _ARG_((const char*, const char*,...));
1251*b30d1939SAndy Fiddaman extern int	execv _ARG_((const char*, char**));
1252*b30d1939SAndy Fiddaman #if !defined(fork)
1253*b30d1939SAndy Fiddaman extern int	fork _ARG_((void));
1254*b30d1939SAndy Fiddaman #endif
1255*b30d1939SAndy Fiddaman #if _lib_unlink
1256*b30d1939SAndy Fiddaman extern int	unlink _ARG_((const char*));
1257*b30d1939SAndy Fiddaman #endif
1258*b30d1939SAndy Fiddaman 
1259*b30d1939SAndy Fiddaman #endif /*_hdr_unistd*/
1260*b30d1939SAndy Fiddaman 
1261*b30d1939SAndy Fiddaman #if _lib_bcopy && !_proto_bcopy
1262*b30d1939SAndy Fiddaman extern void	bcopy _ARG_((const void*, void*, size_t));
1263*b30d1939SAndy Fiddaman #endif
1264*b30d1939SAndy Fiddaman #if _lib_bzero && !_proto_bzero
1265*b30d1939SAndy Fiddaman extern void	bzero _ARG_((void*, size_t));
1266*b30d1939SAndy Fiddaman #endif
1267*b30d1939SAndy Fiddaman 
1268*b30d1939SAndy Fiddaman extern time_t	time _ARG_((time_t*));
1269*b30d1939SAndy Fiddaman extern int	waitpid _ARG_((int,int*,int));
1270*b30d1939SAndy Fiddaman extern void	_exit _ARG_((int));
1271*b30d1939SAndy Fiddaman typedef int(*	Onexit_f)_ARG_((void));
1272*b30d1939SAndy Fiddaman extern Onexit_f	onexit _ARG_((Onexit_f));
1273*b30d1939SAndy Fiddaman 
1274*b30d1939SAndy Fiddaman #if _lib_vfork && !_hdr_vfork && !_sys_vfork
1275*b30d1939SAndy Fiddaman extern pid_t	vfork _ARG_((void));
1276*b30d1939SAndy Fiddaman #endif /*_lib_vfork*/
1277*b30d1939SAndy Fiddaman 
1278*b30d1939SAndy Fiddaman #if _lib_poll
1279*b30d1939SAndy Fiddaman #if _lib_poll_fd_1
1280*b30d1939SAndy Fiddaman extern int	poll _ARG_((struct pollfd*, ulong, int));
1281*b30d1939SAndy Fiddaman #else
1282*b30d1939SAndy Fiddaman extern int	poll _ARG_((ulong, struct pollfd*, int));
1283*b30d1939SAndy Fiddaman #endif
1284*b30d1939SAndy Fiddaman #endif /*_lib_poll*/
1285*b30d1939SAndy Fiddaman 
1286*b30d1939SAndy Fiddaman #endif /* _PACKAGE_ast */
1287*b30d1939SAndy Fiddaman 
1288*b30d1939SAndy Fiddaman _END_EXTERNS_
1289*b30d1939SAndy Fiddaman 
1290*b30d1939SAndy Fiddaman #endif /*_SFHDR_H*/
1291