xref: /onnv-gate/usr/src/lib/libast/common/sfio/sfhdr.h (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #ifndef _SFHDR_H
234887Schin #define _SFHDR_H	1
244887Schin #if !defined(_BLD_sfio) && !defined(_BLD_stdio)
254887Schin #define _BLD_sfio	1
264887Schin #endif
274887Schin 
284887Schin /*	Internal definitions for sfio.
294887Schin **	Written by Kiem-Phong Vo
304887Schin */
314887Schin 
324887Schin #define _next		next
334887Schin #define _endw		endw
344887Schin #define _endr		endr
354887Schin #define _endb		endb
364887Schin #define _push		push
374887Schin #define _flags		flags
384887Schin #define _file		file
394887Schin #define _data		data
404887Schin #define _size		size
414887Schin #define _val		val
424887Schin 
434887Schin #include	"FEATURE/sfio"
444887Schin #include	"FEATURE/mmap"
454887Schin 
464887Schin /* define va_list, etc. before including sfio_t.h (sfio.h) */
474887Schin #if !_PACKAGE_ast
484887Schin 
494887Schin /* some systems don't know large files */
504887Schin #if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */
514887Schin #undef _NO_LARGEFILE64_SOURCE
524887Schin #define _NO_LARGEFILE64_SOURCE	1
534887Schin #undef	_LARGEFILE64_SOURCE
544887Schin #undef	_LARGEFILE_SOURCE
554887Schin #endif
564887Schin 
574887Schin #if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64
584887Schin #undef	_LARGEFILE64_SOURCE
594887Schin #undef	_LARGEFILE_SOURCE
604887Schin #undef	_FILE_OFFSET_BITS
614887Schin #define _LARGEFILE64_SOURCE	1	/* enabling the *64 stuff */
624887Schin #define _LARGEFILE_SOURCE	1
634887Schin #endif
644887Schin 
654887Schin #if _hdr_stdarg
664887Schin #include	<stdarg.h>
674887Schin #else
684887Schin #include	<varargs.h>
694887Schin #endif
704887Schin #include	"FEATURE/common"
714887Schin #if !__STD_C
724887Schin #define const
734887Schin #endif
744887Schin #endif /* !_PACKAGE_ast */
754887Schin 
764887Schin #include	"sfio_t.h"
774887Schin 
784887Schin /* note that the macro vt_threaded has effect on vthread.h */
794887Schin #include	<vthread.h>
804887Schin 
814887Schin /* file system info */
824887Schin #if _PACKAGE_ast
834887Schin 
844887Schin #include	<ast.h>
854887Schin #include	<ast_time.h>
864887Schin #include	<ast_tty.h>
874887Schin #include	<ls.h>
884887Schin 
894887Schin /* ast always provides multibyte handling */
904887Schin #undef _hdr_wchar
914887Schin #undef _lib_mbrtowc
924887Schin #undef _lib_wcrtomb
934887Schin #define _hdr_wchar	1
944887Schin #define _lib_mbrtowc	1
954887Schin #define _lib_wcrtomb	1
964887Schin 
974887Schin #if _mem_st_blksize_stat
984887Schin #define _stat_blksize	1
994887Schin #endif
1004887Schin 
1014887Schin #if _lib_localeconv && _hdr_locale
1024887Schin #define _lib_locale	1
1034887Schin #endif
1044887Schin 
1054887Schin #define sfoff_t		off_t
1064887Schin #define sfstat_t	struct stat
1074887Schin #define sysclosef	close
1084887Schin #define syscreatf	creat
1094887Schin #define sysdupf		dup
1104887Schin #define sysfcntlf	fcntl
1114887Schin #define sysfstatf	fstat
1124887Schin #define sysftruncatef	ftruncate
1134887Schin #define syslseekf	lseek
1144887Schin #define sysmmapf	mmap
1154887Schin #define sysmunmapf	munmap
1164887Schin #define sysopenf	open
1174887Schin #define syspipef	pipe
1184887Schin #define sysreadf	read
1194887Schin #define sysremovef	remove
1204887Schin #define sysstatf	stat
1214887Schin #define syswritef	write
1224887Schin 
1234887Schin #else /*!_PACKAGE_ast*/
1244887Schin 
1254887Schin /* when building the binary compatibility package, a number of header files
1264887Schin    are not needed and they may get in the way so we remove them here.
1274887Schin */
1284887Schin #if _SFBINARY_H
1294887Schin #undef  _hdr_time
1304887Schin #undef  _sys_time
1314887Schin #undef  _sys_stat
1324887Schin #undef  _hdr_stat
1334887Schin #undef  _hdr_filio
1344887Schin #undef  _sys_filio
1354887Schin #undef  _lib_poll
1364887Schin #undef  _stream_peek
1374887Schin #undef  _socket_peek
1384887Schin #undef  _hdr_vfork
1394887Schin #undef  _sys_vfork
1404887Schin #undef  _lib_vfork
1414887Schin #undef  _hdr_values
1424887Schin #undef  _hdr_math
1434887Schin #undef  _sys_mman
1444887Schin #undef  _hdr_mman
1454887Schin #undef  _sys_ioctl
1464887Schin #endif
1474887Schin 
1484887Schin #if _hdr_stdlib
1494887Schin #include	<stdlib.h>
1504887Schin #endif
1514887Schin 
1524887Schin #if _hdr_string
1534887Schin #include	<string.h>
1544887Schin #endif
1554887Schin 
1564887Schin #if _hdr_time
1574887Schin #include	<time.h>
1584887Schin #endif
1594887Schin #if _sys_time
1604887Schin #include	<sys/time.h>
1614887Schin #endif
1624887Schin 
1634887Schin #if _sys_stat
1644887Schin #include	<sys/stat.h>
1654887Schin #else
1664887Schin #if _hdr_stat
1674887Schin #include	<stat.h>
1684887Schin #ifndef _sys_stat
1694887Schin #define	_sys_stat	1
1704887Schin #endif
1714887Schin #endif
1724887Schin #endif /*_sys_stat*/
1734887Schin 
1744887Schin #ifndef _sys_stat
1754887Schin #define _sys_stat	0
1764887Schin #endif
1774887Schin 
1784887Schin #include	<fcntl.h>
1794887Schin 
1804887Schin #ifndef F_SETFD
1814887Schin #ifndef FIOCLEX
1824887Schin #if _hdr_filio
1834887Schin #include	<filio.h>
1844887Schin #else
1854887Schin #if _sys_filio
1864887Schin #include	<sys/filio.h>
1874887Schin #endif /*_sys_filio*/
1884887Schin #endif /*_hdr_filio*/
1894887Schin #endif /*_FIOCLEX*/
1904887Schin #endif /*F_SETFD*/
1914887Schin 
1924887Schin #if _hdr_unistd
1934887Schin #include	<unistd.h>
1944887Schin #endif
1954887Schin 
1964887Schin #if !_LARGEFILE64_SOURCE	/* turn off the *64 stuff */
1974887Schin #undef	_typ_off64_t
1984887Schin #undef	_typ_struct_stat64
1994887Schin #undef	_lib_creat64
2004887Schin #undef	_lib_open64
2014887Schin #undef	_lib_close64
2024887Schin #undef	_lib_stat64
2034887Schin #undef	_lib_fstat64
2044887Schin #undef	_lib_ftruncate64
2054887Schin #undef	_lib_lseek64
2064887Schin #undef	_lib_mmap64
2074887Schin #undef	_lib_munmap64
2084887Schin #endif /*!_LARGEFILE64_SOURCE */
2094887Schin 
2104887Schin /* see if we can use memory mapping for io */
2114887Schin #if _LARGEFILE64_SOURCE && !_lib_mmap64
2124887Schin #undef _mmap_worthy
2134887Schin #endif
2144887Schin #if !_mmap_worthy
2154887Schin #undef _hdr_mman
2164887Schin #undef _sys_mman
2174887Schin #endif
2184887Schin #if _hdr_mman
2194887Schin #include	<mman.h>
2204887Schin #endif
2214887Schin #if _sys_mman
2224887Schin #include	<sys/mman.h>
2234887Schin #endif
2244887Schin 
2254887Schin /* standardize system calls and types dealing with files */
2264887Schin #if _typ_off64_t
2274887Schin #define sfoff_t		off64_t
2284887Schin #else
2294887Schin #define sfoff_t		off_t
2304887Schin #endif
2314887Schin #if _typ_struct_stat64
2324887Schin #define sfstat_t	struct stat64
2334887Schin #else
2344887Schin #define sfstat_t	struct stat
2354887Schin #endif
2364887Schin #if _lib_lseek64
2374887Schin #define syslseekf	lseek64
2384887Schin #else
2394887Schin #define syslseekf	lseek
2404887Schin #endif
2414887Schin #if _lib_stat64
2424887Schin #define sysstatf	stat64
2434887Schin #else
2444887Schin #define sysstatf	stat
2454887Schin #endif
2464887Schin #if _lib_fstat64
2474887Schin #define sysfstatf	fstat64
2484887Schin #else
2494887Schin #define sysfstatf	fstat
2504887Schin #endif
2514887Schin #if _lib_mmap64
2524887Schin #define sysmmapf	mmap64
2534887Schin #else
2544887Schin #define sysmmapf	mmap
2554887Schin #endif
2564887Schin #if _lib_munmap64
2574887Schin #define sysmunmapf	munmap64
2584887Schin #else
2594887Schin #define sysmunmapf	munmap
2604887Schin #endif
2614887Schin #if _lib_open64
2624887Schin #define sysopenf	open64
2634887Schin #else
2644887Schin #define sysopenf	open
2654887Schin #endif
2664887Schin #if _lib_creat64
2674887Schin #define syscreatf	creat64
2684887Schin #else
2694887Schin #define syscreatf	creat
2704887Schin #endif
2714887Schin #if _lib_close64
2724887Schin #define sysclosef	close64
2734887Schin #else
2744887Schin #define sysclosef	close
2754887Schin #endif
2764887Schin #if _lib_ftruncate64
2774887Schin #undef _lib_ftruncate
2784887Schin #define _lib_ftruncate	1
2794887Schin #define sysftruncatef	ftruncate64
2804887Schin #endif
2814887Schin #if !_lib_ftruncate64 && _lib_ftruncate
2824887Schin #define sysftruncatef	ftruncate
2834887Schin #endif
2844887Schin #if _lib_remove
2854887Schin #define sysremovef	remove
2864887Schin #else
2874887Schin #define sysremovef	unlink
2884887Schin #endif
2894887Schin 
2904887Schin #define sysreadf	read
2914887Schin #define syswritef	write
2924887Schin #define syspipef	pipe
2934887Schin #define sysdupf		dup
2944887Schin #define sysfcntlf	fcntl
2954887Schin 
2964887Schin #endif /*_PACKAGE_ast*/
2974887Schin 
2984887Schin #if !_mmap_worthy
2994887Schin #undef MAP_TYPE
3004887Schin #endif
3014887Schin 
3024887Schin #include	"FEATURE/float"
3034887Schin 
3044887Schin #include	<errno.h>
3054887Schin #include	<ctype.h>
3064887Schin 
3074887Schin /* deal with multi-byte character and string conversions */
3084887Schin #if _PACKAGE_ast
3094887Schin 
3104887Schin #include	<wchar.h>
3114887Schin 
3124887Schin #define _has_multibyte		1
3134887Schin 
3144887Schin #define SFMBMAX			mbmax()
3154887Schin #define SFMBCPY(to,fr)		memcpy((to), (fr), sizeof(mbstate_t))
3164887Schin #define SFMBCLR(mb)		memset((mb), 0,  sizeof(mbstate_t))
3174887Schin #define SFMBSET(lhs,v)		(lhs = (v))
3184887Schin #define SFMBLEN(s,mb)		mbsize(s)
3194887Schin #define SFMBDCL(ms)		mbstate_t ms;
3204887Schin 
3214887Schin #else
3224887Schin 
3234887Schin #if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc
3244887Schin #define _has_multibyte		1	/* Xopen-compliant	*/
3254887Schin #include	<wchar.h>
3264887Schin #define SFMBCPY(to,fr)		memcpy((to), (fr), sizeof(mbstate_t))
3274887Schin #define SFMBCLR(mb)		memset((mb), 0,  sizeof(mbstate_t))
3284887Schin #define SFMBSET(lhs,v)		(lhs = (v))
3294887Schin #define SFMBDCL(mb)		mbstate_t mb;
3304887Schin #define SFMBLEN(s,mb)		mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
3314887Schin #endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/
3324887Schin 
3334887Schin #if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb
3344887Schin #define _has_multibyte		2	/* no shift states	*/
3354887Schin #include	<wchar.h>
3364887Schin #undef mbrtowc
3374887Schin #define mbrtowc(wp,s,n,mb)	mbtowc(wp, s, n)
3384887Schin #undef wcrtomb
3394887Schin #define wcrtomb(s,wc,mb)	wctomb(s, wc)
3404887Schin #define SFMBCPY(to,fr)
3414887Schin #define SFMBCLR(mb)
3424887Schin #define SFMBSET(lhs,v)
3434887Schin #define SFMBDCL(mb)
3444887Schin #define SFMBLEN(s,mb)		mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
3454887Schin #endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/
3464887Schin 
3474887Schin #ifdef MB_CUR_MAX
3484887Schin #define SFMBMAX			MB_CUR_MAX
3494887Schin #else
3504887Schin #define SFMBMAX			sizeof(Sflong_t)
3514887Schin #endif
3524887Schin 
3534887Schin #endif /* _PACKAGE_ast */
3544887Schin 
3554887Schin #if !_has_multibyte
3564887Schin #define _has_multibyte		0	/* no multibyte support	*/
3574887Schin #define SFMBCPY(to,fr)
3584887Schin #define SFMBCLR(mb)
3594887Schin #define SFMBSET(lhs,v)
3604887Schin #define SFMBLEN(s,mb)		(*(s) ? 1 : 0)
3614887Schin #define SFMBDCL(mb)
3624887Schin #endif /* _has_multibyte */
3634887Schin 
3648462SApril.Chin@Sun.COM /* dealing with streams that might be accessed concurrently */
3654887Schin #if vt_threaded
3664887Schin 
3678462SApril.Chin@Sun.COM #define SFMTXdecl(ff,_mf_)	Sfio_t* _mf_ = (ff)
3688462SApril.Chin@Sun.COM #define SFMTXbegin(ff,_mf_,rv) \
3698462SApril.Chin@Sun.COM 	{	if((ff)->_flags&SF_MTSAFE) \
3708462SApril.Chin@Sun.COM 		{	(_mf_) = (ff); \
3718462SApril.Chin@Sun.COM 			if(sfmutex((ff), SFMTX_LOCK) != 0) return(rv); \
3728462SApril.Chin@Sun.COM 			if(_Sfnotify) \
3738462SApril.Chin@Sun.COM 			{	(*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \
3748462SApril.Chin@Sun.COM 				if(!(ff)) (ff) = (_mf_); \
3758462SApril.Chin@Sun.COM 			} \
3768462SApril.Chin@Sun.COM 		} \
3778462SApril.Chin@Sun.COM 	}
3788462SApril.Chin@Sun.COM #define SFMTXend(ff,_mf_) \
3798462SApril.Chin@Sun.COM 	{	if((ff)->_flags&SF_MTSAFE) \
3808462SApril.Chin@Sun.COM 		{	if(_Sfnotify) \
3818462SApril.Chin@Sun.COM 				(*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \
3828462SApril.Chin@Sun.COM 			sfmutex((ff), SFMTX_UNLOCK); \
3838462SApril.Chin@Sun.COM 			(ff) = (_mf_); \
3848462SApril.Chin@Sun.COM 		} \
3858462SApril.Chin@Sun.COM 	}
3864887Schin 
3878462SApril.Chin@Sun.COM #define SFONCE()		(_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef))
3888462SApril.Chin@Sun.COM 
3898462SApril.Chin@Sun.COM #define SFMTXLOCK(f)		(((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0)
3908462SApril.Chin@Sun.COM #define SFMTXUNLOCK(f)		(((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0)
3914887Schin 
3928462SApril.Chin@Sun.COM #define SFMTXDECL(ff)		SFMTXdecl((ff), _mtxf1_)
3938462SApril.Chin@Sun.COM #define SFMTXBEGIN(ff,v) 	{ SFMTXbegin((ff), _mtxf1_, (v) ); }
3948462SApril.Chin@Sun.COM #define SFMTXEND(ff)		{ SFMTXend(ff, _mtxf1_); }
3958462SApril.Chin@Sun.COM #define SFMTXENTER(ff,v) 	{ if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); }
3968462SApril.Chin@Sun.COM #define SFMTXRETURN(ff,v)	{ SFMTXEND(ff); return(v); }
3978462SApril.Chin@Sun.COM 
3988462SApril.Chin@Sun.COM #define SFMTXDECL2(ff)		SFMTXdecl((ff), _mtxf2_)
3998462SApril.Chin@Sun.COM #define SFMTXBEGIN2(ff,v) 	{ SFMTXbegin((ff), _mtxf2_, (v) ); }
4008462SApril.Chin@Sun.COM #define SFMTXEND2(ff)		{ SFMTXend((ff), _mtxf2_); }
4018462SApril.Chin@Sun.COM 
4024887Schin #define POOLMTXLOCK(p)		( vtmtxlock(&(p)->mutex) )
4034887Schin #define POOLMTXUNLOCK(p)	( vtmtxunlock(&(p)->mutex) )
4048462SApril.Chin@Sun.COM #define POOLMTXENTER(p)		{ POOLMTXLOCK(p); }
4058462SApril.Chin@Sun.COM #define POOLMTXRETURN(p,rv)	{ POOLMTXUNLOCK(p); return(rv); }
4064887Schin 
4074887Schin #else /*!vt_threaded*/
4084887Schin 
4094887Schin #undef SF_MTSAFE /* no need to worry about thread-safety */
4104887Schin #define SF_MTSAFE		0
4114887Schin 
4124887Schin #define SFONCE()		/*(0)*/
4134887Schin 
4144887Schin #define SFMTXLOCK(f)		/*(0)*/
4154887Schin #define SFMTXUNLOCK(f)		/*(0)*/
4168462SApril.Chin@Sun.COM 
4178462SApril.Chin@Sun.COM #define	SFMTXDECL(ff)		/*(0)*/
4188462SApril.Chin@Sun.COM #define SFMTXBEGIN(ff,v) 	/*(0)*/
4198462SApril.Chin@Sun.COM #define SFMTXEND(ff)		/*(0)*/
4208462SApril.Chin@Sun.COM #define SFMTXENTER(ff,v)	{ if(!(ff)) return(v); }
4218462SApril.Chin@Sun.COM #define SFMTXRETURN(ff,v)	{ return(v); }
4228462SApril.Chin@Sun.COM 
4238462SApril.Chin@Sun.COM #define SFMTXDECL2(ff)		/*(0)*/
4248462SApril.Chin@Sun.COM #define SFMTXBEGIN2(ff,v) 	/*(0)*/
4258462SApril.Chin@Sun.COM #define SFMTXEND2(ff)		/*(0)*/
4264887Schin 
4274887Schin #define POOLMTXLOCK(p)
4284887Schin #define POOLMTXUNLOCK(p)
4298462SApril.Chin@Sun.COM #define POOLMTXENTER(p)
4304887Schin #define POOLMTXRETURN(p,v)	{ return(v); }
4314887Schin 
4324887Schin #endif /*vt_threaded*/
4334887Schin 
4344887Schin 
4354887Schin /* functions for polling readiness of streams */
4364887Schin #if _lib_select
4374887Schin #undef _lib_poll
4384887Schin #else
4394887Schin #if _lib_poll_fd_1 || _lib_poll_fd_2
4404887Schin #define _lib_poll	1
4414887Schin #endif
4424887Schin #endif /*_lib_select_*/
4434887Schin 
4444887Schin #if _lib_poll
4454887Schin #include	<poll.h>
4464887Schin 
4474887Schin #if _lib_poll_fd_1
4484887Schin #define SFPOLL(pfd,n,tm)	poll((pfd),(ulong)(n),(tm))
4494887Schin #else
4504887Schin #define SFPOLL(pfd,n,tm)	poll((ulong)(n),(pfd),(tm))
4514887Schin #endif
4524887Schin #endif /*_lib_poll*/
4534887Schin 
4544887Schin #if _stream_peek
4554887Schin #include	<stropts.h>
4564887Schin #endif
4574887Schin 
4584887Schin #if _socket_peek
4594887Schin #include	<sys/socket.h>
4604887Schin #endif
4614887Schin 
4624887Schin /* to test for executable access mode of a file */
4634887Schin #ifndef X_OK
4644887Schin #define X_OK	01
4654887Schin #endif
4664887Schin 
4674887Schin /* alternative process forking */
4684887Schin #if _lib_vfork && !defined(fork) && !defined(sparc) && !defined(__sparc)
4694887Schin #if _hdr_vfork
4704887Schin #include	<vfork.h>
4714887Schin #endif
4724887Schin #if _sys_vfork
4734887Schin #include	<sys/vfork.h>
4744887Schin #endif
4754887Schin #define fork	vfork
4764887Schin #endif
4774887Schin 
4784887Schin /* to get rid of pesky compiler warnings */
4794887Schin #if __STD_C
4804887Schin #define NOTUSED(x)	(void)(x)
4814887Schin #else
4824887Schin #define NOTUSED(x)	(&x,1)
4834887Schin #endif
4844887Schin 
4854887Schin /* Private flags in the "bits" field */
4864887Schin #define SF_MMAP		00000001	/* in memory mapping mode		*/
4874887Schin #define SF_BOTH		00000002	/* both read/write			*/
4884887Schin #define SF_HOLE		00000004	/* a hole of zero's was created		*/
4894887Schin #define SF_NULL		00000010	/* stream is /dev/null			*/
4904887Schin #define SF_SEQUENTIAL	00000020	/* sequential access			*/
4914887Schin #define SF_JUSTSEEK	00000040	/* just did a sfseek			*/
4924887Schin #define SF_PRIVATE	00000100	/* private stream to Sfio, no mutex	*/
4934887Schin #define SF_ENDING	00000200	/* no re-io on interrupts at closing	*/
4944887Schin #define SF_WIDE		00000400	/* in wide mode - stdio only		*/
4954887Schin 
4964887Schin /* "bits" flags that must be cleared in sfclrlock */
4974887Schin #define SF_TMPBITS	00170000
4984887Schin #define SF_DCDOWN	00010000	/* recurse down the discipline stack	*/
4994887Schin 
5004887Schin #define SF_WCFORMAT	00020000	/* wchar_t formatting - stdio only	*/
5014887Schin #if _has_multibyte
5024887Schin #define SFWCSET(f)	((f)->bits |= SF_WCFORMAT)
5034887Schin #define SFWCGET(f,v)	(((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) )
5044887Schin #else
5054887Schin #define SFWCSET(f)
5064887Schin #define SFWCGET(f,v)
5074887Schin #endif
5084887Schin 
5094887Schin #define SF_MVSIZE	00040000	/* f->size was reset in sfmove()	*/
5104887Schin #define SFMVSET(f)	(((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) )
5114887Schin #define SFMVUNSET(f)	(!((f)->bits&SF_MVSIZE) ? 0 : \
5124887Schin 				(((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) )
5134887Schin 
5144887Schin #define SFCLRBITS(f)	(SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) )
5154887Schin 
5164887Schin 
5174887Schin /* bits for the mode field, SF_INIT defined in sfio_t.h */
5184887Schin #define SF_RC		00000010	/* peeking for a record			*/
5194887Schin #define SF_RV		00000020	/* reserve without read	or most write	*/
5204887Schin #define SF_LOCK		00000040	/* stream is locked for io op		*/
5214887Schin #define SF_PUSH		00000100	/* stream has been pushed		*/
5224887Schin #define SF_POOL		00000200	/* stream is in a pool but not current	*/
5234887Schin #define SF_PEEK		00000400	/* there is a pending peek		*/
5244887Schin #define SF_PKRD		00001000	/* did a peek read			*/
5254887Schin #define SF_GETR		00002000	/* did a getr on this stream		*/
5264887Schin #define SF_SYNCED	00004000	/* stream was synced			*/
5274887Schin #define SF_STDIO	00010000	/* given up the buffer to stdio		*/
5284887Schin #define SF_AVAIL	00020000	/* was closed, available for reuse	*/
5294887Schin #define SF_LOCAL	00100000	/* sentinel for a local call		*/
5304887Schin 
5314887Schin #ifdef DEBUG
5324887Schin #define ASSERT(p)	((p) ? 0 : (abort(),0) )
5334887Schin #else
5344887Schin #define ASSERT(p)
5354887Schin #endif
5364887Schin 
5374887Schin /* short-hands */
5384887Schin #define NIL(t)		((t)0)
5394887Schin #define reg		register
5404887Schin #ifndef uchar
5414887Schin #define uchar		unsigned char
5424887Schin #endif
5434887Schin #ifndef ulong
5444887Schin #define ulong		unsigned long
5454887Schin #endif
5464887Schin #ifndef uint
5474887Schin #define uint		unsigned int
5484887Schin #endif
5494887Schin #ifndef ushort
5504887Schin #define ushort		unsigned short
5514887Schin #endif
5524887Schin 
5534887Schin #define SECOND		1000	/* millisecond units */
5544887Schin 
5554887Schin /* macros do determine stream types from sfstat_t data */
5564887Schin #ifndef S_IFMT
5574887Schin #define S_IFMT	0
5584887Schin #endif
5594887Schin #ifndef S_IFDIR
5604887Schin #define S_IFDIR	0
5614887Schin #endif
5624887Schin #ifndef S_IFREG
5634887Schin #define S_IFREG	0
5644887Schin #endif
5654887Schin #ifndef S_IFCHR
5664887Schin #define S_IFCHR	0
5674887Schin #endif
5684887Schin #ifndef S_IFIFO
5694887Schin #define S_IFIFO	0
5704887Schin #endif
5714887Schin 
5724887Schin #ifndef S_ISDIR
5734887Schin #define S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)
5744887Schin #endif
5754887Schin #ifndef S_ISREG
5764887Schin #define S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)
5774887Schin #endif
5784887Schin #ifndef S_ISCHR
5794887Schin #define S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)
5804887Schin #endif
5814887Schin 
5824887Schin #ifndef S_ISFIFO
5834887Schin #	ifdef S_IFIFO
5848462SApril.Chin@Sun.COM #		define S_ISFIFO(m)	(((m)&S_IFMT) == S_IFIFO)
5854887Schin #	else
5864887Schin #		define S_ISFIFO(m)	(0)
5874887Schin #	endif
5884887Schin #endif
5894887Schin 
5904887Schin #ifdef S_IRUSR
5914887Schin #define SF_CREATMODE	(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
5924887Schin #else
5934887Schin #define SF_CREATMODE	0666
5944887Schin #endif
5954887Schin 
5964887Schin /* set close-on-exec */
5974887Schin #ifdef F_SETFD
5984887Schin #	ifndef FD_CLOEXEC
5994887Schin #		define FD_CLOEXEC	1
6004887Schin #	endif /*FD_CLOEXEC*/
6014887Schin #	define SETCLOEXEC(fd)		((void)fcntl((fd),F_SETFD,FD_CLOEXEC))
6024887Schin #else
6034887Schin #	ifdef FIOCLEX
6044887Schin #		define SETCLOEXEC(fd)	((void)ioctl((fd),FIOCLEX,0))
6054887Schin #	else
6064887Schin #		define SETCLOEXEC(fd)
6074887Schin #	endif /*FIOCLEX*/
6084887Schin #endif /*F_SETFD*/
6094887Schin 
6104887Schin /* a couple of error number that we use, default values are like Linux */
6114887Schin #ifndef EINTR
6124887Schin #define EINTR	4
6134887Schin #endif
6144887Schin #ifndef EBADF
6154887Schin #define EBADF	9
6164887Schin #endif
6174887Schin #ifndef EAGAIN
6184887Schin #define EAGAIN	11
6194887Schin #endif
6204887Schin #ifndef ENOMEM
6214887Schin #define ENOMEM	12
6224887Schin #endif
6234887Schin #ifndef EINVAL
6244887Schin #define EINVAL	22
6254887Schin #endif
6264887Schin #ifndef ESPIPE
6274887Schin #define ESPIPE	29
6284887Schin #endif
6294887Schin 
6304887Schin /* function to get the decimal point for local environment */
6314887Schin #if !defined(SFSETLOCALE) && _PACKAGE_ast
6324887Schin #include "lclib.h"
6334887Schin #define SFSETLOCALE(dp,tp) \
6344887Schin 	do if (*(dp) == 0) { \
6354887Schin 		Lc_numeric_t*	lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \
6364887Schin 		*(dp) = lv->decimal; \
6374887Schin 		if (tp) *(tp) = lv->thousand; \
6384887Schin 	} while (0)
6394887Schin #endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/
6404887Schin 
6414887Schin #if !defined(SFSETLOCALE) && _lib_locale
6424887Schin #include	<locale.h>
6434887Schin #define SFSETLOCALE(decimal,thousand) \
6444887Schin 	do { struct lconv*	lv; \
6454887Schin 	  if(*(decimal) == 0) \
6464887Schin 	  { *(decimal) = '.'; \
6474887Schin 	    if (thousand) *(thousand) = -1; \
6484887Schin 	    if((lv = localeconv())) \
6494887Schin 	    { if(lv->decimal_point && *lv->decimal_point) \
6504887Schin 	    	*(decimal) = *(unsigned char*)lv->decimal_point; \
6514887Schin 	      if(thousand && lv->thousands_sep && *lv->thousands_sep) \
6524887Schin 	    	*(thousand) = *(unsigned char*)lv->thousands_sep; \
6534887Schin 	    } \
6544887Schin 	  } \
6554887Schin 	} while (0)
6564887Schin #endif /*!defined(SFSETLOCALE) && _lib_locale*/
6574887Schin 
6584887Schin #if !defined(SFSETLOCALE)
6594887Schin #define SFSETLOCALE(decimal,thousand)	(*(decimal)='.')
6604887Schin #endif
6614887Schin 
6624887Schin /* stream pool structure. */
6634887Schin typedef struct _sfpool_s	Sfpool_t;
6644887Schin struct _sfpool_s
6654887Schin {	Sfpool_t*	next;
6664887Schin 	int		mode;		/* type of pool			*/
6674887Schin 	int		s_sf;		/* size of pool array		*/
6684887Schin 	int		n_sf;		/* number currently in pool	*/
6694887Schin 	Sfio_t**	sf;		/* array of streams		*/
6704887Schin 	Sfio_t*		array[3];	/* start with 3			*/
6714887Schin 	Vtmutex_t	mutex;		/* mutex lock object		*/
6724887Schin };
6734887Schin 
6744887Schin /* reserve buffer structure */
6754887Schin typedef struct _sfrsrv_s	Sfrsrv_t;
6764887Schin struct _sfrsrv_s
6774887Schin {	ssize_t		slen;		/* last string length		*/
6784887Schin 	ssize_t		size;		/* buffer size			*/
6794887Schin 	uchar		data[1];	/* data buffer			*/
6804887Schin };
6814887Schin 
6824887Schin /* co-process structure */
6834887Schin typedef struct _sfproc_s	Sfproc_t;
6844887Schin struct _sfproc_s
6854887Schin {	int		pid;	/* process id			*/
6864887Schin 	uchar*		rdata;	/* read data being cached	*/
6874887Schin 	int		ndata;	/* size of cached data		*/
6884887Schin 	int		size;	/* buffer size			*/
6894887Schin 	int		file;	/* saved file descriptor	*/
6904887Schin 	int		sigp;	/* sigpipe protection needed	*/
6914887Schin };
6924887Schin 
6934887Schin /* extensions to sfvprintf/sfvscanf */
6944887Schin #define FP_SET(fp,fn)	(fp < 0 ? (fn += 1) : (fn = fp) )
6954887Schin #define FP_WIDTH	0
6964887Schin #define FP_PRECIS	1
6974887Schin #define FP_BASE		2
6984887Schin #define FP_STR		3
6994887Schin #define FP_SIZE		4
7004887Schin #define FP_INDEX	5	/* index size	*/
7014887Schin 
7024887Schin typedef struct _fmt_s		Fmt_t;
7034887Schin typedef struct _fmtpos_s	Fmtpos_t;
7044887Schin typedef union
7054887Schin {	int		i, *ip;
7064887Schin 	long		l, *lp;
7074887Schin 	short		h, *hp;
7084887Schin 	uint		ui;
7094887Schin 	ulong		ul;
7104887Schin 	ushort		uh;
7114887Schin 	Sflong_t	ll, *llp;
7124887Schin 	Sfulong_t	lu;
7134887Schin 	Sfdouble_t	ld;
7144887Schin 	double		d;
7154887Schin 	float		f;
7164887Schin #if _has_multibyte
7174887Schin 	wchar_t		wc;
7184887Schin 	wchar_t		*ws, **wsp;
7194887Schin #endif
7204887Schin 	char		c, *s, **sp;
7214887Schin 	uchar		uc, *us, **usp;
7224887Schin 	Void_t		*vp;
7234887Schin 	Sffmt_t		*ft;
7244887Schin } Argv_t;
7254887Schin 
7264887Schin struct _fmt_s
7274887Schin {	char*		form;		/* format string		*/
7284887Schin 	va_list		args;		/* corresponding arglist	*/
7294887Schin 	SFMBDCL(mbs)			/* multibyte parsing state	*/
7304887Schin 
7314887Schin 	char*		oform;		/* original format string	*/
7324887Schin 	va_list		oargs;		/* original arg list		*/
7334887Schin 	int		argn;		/* number of args already used	*/
7344887Schin 	Fmtpos_t*	fp;		/* position list		*/
7354887Schin 
7364887Schin 	Sffmt_t*	ft;		/* formatting environment	*/
7374887Schin 	Sffmtevent_f	eventf;		/* event function		*/
7384887Schin 	Fmt_t*		next;		/* stack frame pointer		*/
7394887Schin };
7404887Schin 
7414887Schin struct _fmtpos_s
7424887Schin {	Sffmt_t	ft;			/* environment			*/
7434887Schin 	Argv_t	argv;			/* argument value		*/
7444887Schin 	int	fmt;			/* original format		*/
7454887Schin 	int	need[FP_INDEX];		/* positions depending on	*/
7464887Schin };
7474887Schin 
7484887Schin #define LEFTP		'('
7494887Schin #define RIGHTP		')'
7504887Schin #define QUOTE		'\''
7514887Schin 
7524887Schin #ifndef CHAR_BIT
7534887Schin #define CHAR_BIT	8
7544887Schin #endif
7554887Schin 
7564887Schin #define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \
7574887Schin 	((ft->form = (char*)frm), va_copy(ft->args,ags), \
7584887Schin 	 (ft->fmt = fv), (ft->size = sz), \
7594887Schin 	 (ft->flags = (flgs&SFFMT_SET)), \
7604887Schin 	 (ft->width = wid), (ft->precis = pr), (ft->base = bs), \
7614887Schin 	 (ft->t_str = ts), (ft->n_str = ns) )
7624887Schin #define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \
7634887Schin 	((frm = ft->form), va_copy(ags,ft->args), \
7644887Schin 	 (fv = ft->fmt), (sz = ft->size), \
7654887Schin 	 (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \
7664887Schin 	 (wid = ft->width), (pr = ft->precis), (bs = ft->base) )
7674887Schin 
7684887Schin /* format flags&types, must coexist with those in sfio.h */
7694887Schin #define SFFMT_FORBIDDEN 000077777777	/* for sfio.h only		*/
7704887Schin #define SFFMT_EFORMAT	001000000000	/* sfcvt converting %e		*/
7714887Schin #define SFFMT_MINUS	002000000000	/* minus sign			*/
7724887Schin #define SFFMT_AFORMAT	004000000000	/* sfcvt converting %a		*/
7734887Schin #define SFFMT_UPPER	010000000000	/* sfcvt converting upper	*/
7744887Schin 
7754887Schin #define SFFMT_TYPES	(SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\
7764887Schin 			 SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \
7774887Schin 			 SFFMT_TFLAG | SFFMT_ZFLAG )
7784887Schin 
7794887Schin /* type of elements to be converted */
7804887Schin #define SFFMT_INT	001		/* %d,%i 		*/
7814887Schin #define SFFMT_UINT	002		/* %u,o,x etc.		*/
7824887Schin #define SFFMT_FLOAT	004		/* %f,e,g etc.		*/
7834887Schin #define SFFMT_CHAR	010		/* %c,C			*/
7844887Schin #define SFFMT_POINTER	020		/* %p,n,s,S		*/
7854887Schin #define SFFMT_CLASS	040		/* %[			*/
7864887Schin 
7874887Schin /* local variables used across sf-functions */
7884887Schin #define _Sfpage		(_Sfextern.sf_page)
7894887Schin #define _Sfpool		(_Sfextern.sf_pool)
7904887Schin #define _Sfpmove	(_Sfextern.sf_pmove)
7914887Schin #define _Sfstack	(_Sfextern.sf_stack)
7924887Schin #define _Sfnotify	(_Sfextern.sf_notify)
7934887Schin #define _Sfstdsync	(_Sfextern.sf_stdsync)
7944887Schin #define _Sfudisc	(&(_Sfextern.sf_udisc))
7954887Schin #define _Sfcleanup	(_Sfextern.sf_cleanup)
7964887Schin #define _Sfexiting	(_Sfextern.sf_exiting)
7974887Schin #define _Sfdone		(_Sfextern.sf_done)
7984887Schin #define _Sfonce		(_Sfextern.sf_once)
7994887Schin #define _Sfoncef	(_Sfextern.sf_oncef)
8004887Schin #define _Sfmutex	(_Sfextern.sf_mutex)
8014887Schin typedef struct _sfextern_s
8024887Schin {	ssize_t			sf_page;
8034887Schin 	struct _sfpool_s	sf_pool;
8044887Schin 	int			(*sf_pmove)_ARG_((Sfio_t*, int));
8054887Schin 	Sfio_t*			(*sf_stack)_ARG_((Sfio_t*, Sfio_t*));
8068462SApril.Chin@Sun.COM 	void			(*sf_notify)_ARG_((Sfio_t*, int, void*));
8074887Schin 	int			(*sf_stdsync)_ARG_((Sfio_t*));
8084887Schin 	struct _sfdisc_s	sf_udisc;
8094887Schin 	void			(*sf_cleanup)_ARG_((void));
8104887Schin 	int			sf_exiting;
8114887Schin 	int			sf_done;
8124887Schin 	Vtonce_t*		sf_once;
8134887Schin 	void			(*sf_oncef)_ARG_((void));
8144887Schin 	Vtmutex_t*		sf_mutex;
8154887Schin } Sfextern_t;
8164887Schin 
8174887Schin /* get the real value of a byte in a coded long or ulong */
8184887Schin #define SFUVALUE(v)	(((ulong)(v))&(SF_MORE-1))
8194887Schin #define SFSVALUE(v)	((( long)(v))&(SF_SIGN-1))
8204887Schin #define SFBVALUE(v)	(((ulong)(v))&(SF_BYTE-1))
8214887Schin 
8224887Schin /* pick this many bits in each iteration of double encoding */
8234887Schin #define SF_PRECIS	7
8244887Schin 
8254887Schin /* grain size for buffer increment */
8264887Schin #define SF_GRAIN	1024
8274887Schin #define SF_PAGE		((ssize_t)(SF_GRAIN*sizeof(int)*2))
8284887Schin 
8294887Schin /* when the buffer is empty, certain io requests may be better done directly
8304887Schin    on the given application buffers. The below condition determines when.
8314887Schin */
8324887Schin #define SFDIRECT(f,n)	(((ssize_t)(n) >= (f)->size) || \
8334887Schin 			 ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) )
8344887Schin 
8354887Schin /* number of pages to memory map at a time */
8364887Schin #define SF_NMAP		4
8374887Schin 
8384887Schin #ifndef MAP_VARIABLE
8394887Schin #define MAP_VARIABLE	0
8404887Schin #endif
8414887Schin #ifndef _mmap_fixed
8424887Schin #define _mmap_fixed	0
8434887Schin #endif
8444887Schin 
8454887Schin /* set/unset sequential states for mmap */
8464887Schin #if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL)
8474887Schin #define SFMMSEQON(f,a,s) \
8484887Schin 		do { int oerrno = errno; \
8494887Schin 		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \
8504887Schin 		     errno = oerrno; \
8514887Schin 		} while(0)
8524887Schin #define SFMMSEQOFF(f,a,s) \
8534887Schin 		do { int oerrno = errno; \
8544887Schin 		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \
8554887Schin 		     errno = oerrno; \
8564887Schin 		} while(0)
8574887Schin #else
8584887Schin #define SFMMSEQON(f,a,s)
8594887Schin #define SFMMSEQOFF(f,a,s)
8604887Schin #endif
8614887Schin 
8624887Schin #define SFMUNMAP(f,a,s)		(sysmunmapf((caddr_t)(a),(size_t)(s)), \
8634887Schin 				 ((f)->endb = (f)->endr = (f)->endw = (f)->next = \
8644887Schin 				  (f)->data = NIL(uchar*)) )
8654887Schin 
8664887Schin /* safe closing function */
8674887Schin #define CLOSE(f)	{ while(sysclosef(f) < 0 && errno == EINTR) errno = 0; }
8684887Schin 
8694887Schin /* the bottomless bit bucket */
8704887Schin #define DEVNULL		"/dev/null"
8714887Schin #define SFSETNULL(f)	((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL)
8724887Schin #define SFISNULL(f)	((f)->extent < 0 && ((f)->bits&SF_NULL) )
8734887Schin 
8744887Schin #define SFKILL(f)	((f)->mode = (SF_AVAIL|SF_LOCK) )
8754887Schin #define SFKILLED(f)	(((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) )
8764887Schin 
8774887Schin /* exception types */
8784887Schin #define SF_EDONE	0	/* stop this operation and return	*/
8794887Schin #define SF_EDISC	1	/* discipline says it's ok		*/
8804887Schin #define SF_ESTACK	2	/* stack was popped			*/
8814887Schin #define SF_ECONT	3	/* can continue normally		*/
8824887Schin 
8834887Schin #define SETLOCAL(f)	((f)->mode |= SF_LOCAL)
8844887Schin #define GETLOCAL(f,v)	((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v))
8854887Schin #define SFWRALL(f)	((f)->mode |= SF_RV)
8864887Schin #define SFISALL(f,v)	((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \
88710898Sroland.mainz@nrubsig.org 			 ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) )
8884887Schin #define SFSK(f,a,o,d)	(SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d))
8894887Schin #define SFRD(f,b,n,d)	(SETLOCAL(f),sfrd(f,(Void_t*)b,n,d))
8904887Schin #define SFWR(f,b,n,d)	(SETLOCAL(f),sfwr(f,(Void_t*)b,n,d))
8914887Schin #define SFSYNC(f)	(SETLOCAL(f),sfsync(f))
8924887Schin #define SFCLOSE(f)	(SETLOCAL(f),sfclose(f))
8934887Schin #define SFFLSBUF(f,n)	(SETLOCAL(f),_sfflsbuf(f,n))
8944887Schin #define SFFILBUF(f,n)	(SETLOCAL(f),_sffilbuf(f,n))
8954887Schin #define SFSETBUF(f,s,n)	(SETLOCAL(f),sfsetbuf(f,s,n))
8964887Schin #define SFWRITE(f,s,n)	(SETLOCAL(f),sfwrite(f,s,n))
8974887Schin #define SFREAD(f,s,n)	(SETLOCAL(f),sfread(f,s,n))
8984887Schin #define SFSEEK(f,p,t)	(SETLOCAL(f),sfseek(f,p,t))
8994887Schin #define SFNPUTC(f,c,n)	(SETLOCAL(f),sfnputc(f,c,n))
9004887Schin #define SFRAISE(f,e,d)	(SETLOCAL(f),sfraise(f,e,d))
9014887Schin 
9024887Schin /* lock/open a stream */
9034887Schin #define SFMODE(f,l)	((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) )
9044887Schin #define SFLOCK(f,l)	(void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data)
9054887Schin #define _SFOPENRD(f)	((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb)
9064887Schin #define _SFOPENWR(f)	((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb)
9074887Schin #define _SFOPEN(f)	((f)->mode == SF_READ  ? _SFOPENRD(f) : \
9084887Schin 			 (f)->mode == SF_WRITE ? _SFOPENWR(f) : \
9094887Schin 			 ((f)->endw = (f)->endr = (f)->data) )
9104887Schin #define SFOPEN(f,l)	(void)((l) ? 0 : \
9114887Schin 				((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) )
9124887Schin 
9134887Schin /* check to see if the stream can be accessed */
9144887Schin #define SFFROZEN(f)	(((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \
9154887Schin 			 !((f)->mode&SF_STDIO) ? 0 : \
9164887Schin 			 _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) )
9174887Schin 
9184887Schin 
9194887Schin /* set discipline code */
9204887Schin #define SFDISC(f,dc,iof) \
9214887Schin 	{	Sfdisc_t* d; \
9224887Schin 		if(!(dc)) \
9234887Schin 			d = (dc) = (f)->disc; \
9244887Schin 		else 	d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \
9254887Schin 		while(d && !(d->iof))	d = d->disc; \
9264887Schin 		if(d)	(dc) = d; \
9274887Schin 	}
9284887Schin #define SFDCRD(f,buf,n,dc,rv) \
9294887Schin 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
9304887Schin 		rv = (*dc->readf)(f,buf,n,dc); \
9314887Schin 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
9324887Schin 	}
9334887Schin #define SFDCWR(f,buf,n,dc,rv) \
9344887Schin 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
9354887Schin 		rv = (*dc->writef)(f,buf,n,dc); \
9364887Schin 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
9374887Schin 	}
9384887Schin #define SFDCSK(f,addr,type,dc,rv) \
9394887Schin 	{	int		dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
9404887Schin 		rv = (*dc->seekf)(f,addr,type,dc); \
9414887Schin 		if(!dcdown)	f->bits &= ~SF_DCDOWN; \
9424887Schin 	}
9434887Schin 
9444887Schin /* fast peek of a stream */
9454887Schin #define _SFAVAIL(f,s,n)	((n) = (f)->endb - ((s) = (f)->next) )
9464887Schin #define SFRPEEK(f,s,n)	(_SFAVAIL(f,s,n) > 0 ? (n) : \
9474887Schin 				((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) )
9484887Schin #define SFWPEEK(f,s,n)	(_SFAVAIL(f,s,n) > 0 ? (n) : \
9494887Schin 				((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) )
9504887Schin 
9514887Schin /* more than this for a line buffer, we might as well flush */
9524887Schin #define HIFORLINE	128
9534887Schin 
9544887Schin /* string stream extent */
9554887Schin #define SFSTRSIZE(f)	{ Sfoff_t s = (f)->next - (f)->data; \
9564887Schin 			  if(s > (f)->here) \
9574887Schin 			    { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \
9584887Schin 			}
9594887Schin 
9604887Schin /* control flags for open() */
9614887Schin #ifdef O_CREAT
9624887Schin #define _has_oflags	1
9634887Schin #else	/* for example, research UNIX */
9644887Schin #define _has_oflags	0
9654887Schin #define O_CREAT		004
9664887Schin #define O_TRUNC		010
9674887Schin #define O_APPEND	020
9684887Schin #define O_EXCL		040
9694887Schin 
9704887Schin #ifndef O_RDONLY
9714887Schin #define	O_RDONLY	000
9724887Schin #endif
9734887Schin #ifndef O_WRONLY
9744887Schin #define O_WRONLY	001
9754887Schin #endif
9764887Schin #ifndef O_RDWR
9774887Schin #define O_RDWR		002
9784887Schin #endif
9794887Schin #endif /*O_CREAT*/
9804887Schin 
9814887Schin #ifndef O_BINARY
9824887Schin #define O_BINARY	000
9834887Schin #endif
9844887Schin #ifndef O_TEXT
9854887Schin #define O_TEXT		000
9864887Schin #endif
9874887Schin #ifndef O_TEMPORARY
9884887Schin #define O_TEMPORARY	000
9894887Schin #endif
9904887Schin 
9914887Schin #define	SF_RADIX	64	/* maximum integer conversion base */
9924887Schin 
9934887Schin #if _PACKAGE_ast
9944887Schin #define SF_MAXINT	INT_MAX
9954887Schin #define SF_MAXLONG	LONG_MAX
9964887Schin #else
9974887Schin #define SF_MAXINT	((int)(((uint)~0) >> 1))
9984887Schin #define SF_MAXLONG	((long)(((ulong)~0L) >> 1))
9994887Schin #endif
10004887Schin 
10014887Schin #define SF_MAXCHAR	((uchar)(~0))
10024887Schin 
10034887Schin /* floating point to ascii conversion */
10044887Schin #define SF_MAXEXP10	6
10054887Schin #define SF_MAXPOW10	(1 << SF_MAXEXP10)
10064887Schin #if !_ast_fltmax_double
10074887Schin #define SF_FDIGITS	1024		/* max allowed fractional digits */
10084887Schin #define SF_IDIGITS	(8*1024)	/* max number of digits in int part */
10094887Schin #else
10104887Schin #define SF_FDIGITS	256		/* max allowed fractional digits */
10114887Schin #define SF_IDIGITS	1024		/* max number of digits in int part */
10124887Schin #endif
10134887Schin #define SF_MAXDIGITS	(((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int))
10144887Schin 
10154887Schin /* tables for numerical translation */
10164887Schin #define _Sfpos10	(_Sftable.sf_pos10)
10174887Schin #define _Sfneg10	(_Sftable.sf_neg10)
10184887Schin #define _Sfdec		(_Sftable.sf_dec)
10194887Schin #define _Sfdigits	(_Sftable.sf_digits)
10204887Schin #define _Sfcvinitf	(_Sftable.sf_cvinitf)
10214887Schin #define _Sfcvinit	(_Sftable.sf_cvinit)
10224887Schin #define _Sffmtposf	(_Sftable.sf_fmtposf)
10234887Schin #define _Sffmtintf	(_Sftable.sf_fmtintf)
10244887Schin #define _Sfcv36		(_Sftable.sf_cv36)
10254887Schin #define _Sfcv64		(_Sftable.sf_cv64)
10264887Schin #define _Sftype		(_Sftable.sf_type)
10274887Schin #define _Sfieee		(&_Sftable.sf_ieee)
10284887Schin #define _Sffinf		(_Sftable.sf_ieee.fltinf)
10294887Schin #define _Sfdinf		(_Sftable.sf_ieee.dblinf)
10304887Schin #define _Sflinf		(_Sftable.sf_ieee.ldblinf)
10314887Schin #define _Sffnan		(_Sftable.sf_ieee.fltnan)
10324887Schin #define _Sfdnan		(_Sftable.sf_ieee.dblnan)
10334887Schin #define _Sflnan		(_Sftable.sf_ieee.ldblnan)
10344887Schin #define _Sffpow10	(_Sftable.sf_flt_pow10)
10354887Schin #define _Sfdpow10	(_Sftable.sf_dbl_pow10)
10364887Schin #define _Sflpow10	(_Sftable.sf_ldbl_pow10)
10374887Schin typedef struct _sfieee_s	Sfieee_t;
10384887Schin struct _sfieee_s
10394887Schin {	float		fltnan;		/* float NAN			*/
10404887Schin 	float		fltinf;		/* float INF			*/
10414887Schin 	double		dblnan;		/* double NAN			*/
10424887Schin 	double		dblinf;		/* double INF			*/
10434887Schin 	Sfdouble_t	ldblnan;	/* Sfdouble_t NAN		*/
10444887Schin 	Sfdouble_t	ldblinf;	/* Sfdouble_t INF		*/
10454887Schin };
10464887Schin typedef struct _sftab_
10474887Schin {	Sfdouble_t	sf_pos10[SF_MAXEXP10];	/* positive powers of 10	*/
10484887Schin 	Sfdouble_t	sf_neg10[SF_MAXEXP10];	/* negative powers of 10	*/
10494887Schin 	uchar		sf_dec[200];		/* ascii reps of values < 100	*/
10504887Schin 	char*		sf_digits;		/* digits for general bases	*/
10514887Schin 	int		(*sf_cvinitf)();	/* initialization function	*/
10524887Schin 	int		sf_cvinit;		/* initialization state		*/
10534887Schin 	Fmtpos_t*	(*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int));
10544887Schin 	char*		(*sf_fmtintf)_ARG_((const char*,int*));
10554887Schin 	float*		sf_flt_pow10;		/* float powers of 10		*/
10564887Schin 	double*		sf_dbl_pow10;		/* double powers of 10		*/
10574887Schin 	Sfdouble_t*	sf_ldbl_pow10;		/* Sfdouble_t powers of 10	*/
10584887Schin 	uchar		sf_cv36[SF_MAXCHAR+1];	/* conversion for base [2-36]	*/
10594887Schin 	uchar		sf_cv64[SF_MAXCHAR+1];	/* conversion for base [37-64]	*/
10604887Schin 	uchar		sf_type[SF_MAXCHAR+1];	/* conversion formats&types	*/
10614887Schin 	Sfieee_t	sf_ieee;		/* IEEE floating point constants*/
10624887Schin } Sftab_t;
10634887Schin 
10644887Schin /* thread-safe macro/function to initialize _Sfcv* conversion tables */
10654887Schin #define SFCVINIT()      (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) )
10664887Schin 
10674887Schin /* sfucvt() converts decimal integers to ASCII */
10684887Schin #define SFDIGIT(v,scale,digit) \
10694887Schin 	{ if(v < 5*scale) \
10704887Schin 		if(v < 2*scale) \
10714887Schin 			if(v < 1*scale) \
10724887Schin 				{ digit = '0'; } \
10734887Schin 			else	{ digit = '1'; v -= 1*scale; } \
10744887Schin 		else	if(v < 3*scale) \
10754887Schin 				{ digit = '2'; v -= 2*scale; } \
10764887Schin 			else if(v < 4*scale) \
10774887Schin 				{ digit = '3'; v -= 3*scale; } \
10784887Schin 			else	{ digit = '4'; v -= 4*scale; } \
10794887Schin 	  else	if(v < 7*scale) \
10804887Schin 			if(v < 6*scale) \
10814887Schin 				{ digit = '5'; v -= 5*scale; } \
10824887Schin 			else	{ digit = '6'; v -= 6*scale; } \
10834887Schin 		else	if(v < 8*scale) \
10844887Schin 				{ digit = '7'; v -= 7*scale; } \
10854887Schin 			else if(v < 9*scale) \
10864887Schin 				{ digit = '8'; v -= 8*scale; } \
10874887Schin 			else	{ digit = '9'; v -= 9*scale; } \
10884887Schin 	}
10894887Schin #define sfucvt(v,s,n,list,type,utype) \
10904887Schin 	{ while((utype)v >= 10000) \
10914887Schin 	  {	n = v; v = (type)(((utype)v)/10000); \
10924887Schin 		n = (type)((utype)n - ((utype)v)*10000); \
10934887Schin 	  	s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \
10944887Schin 			s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \
10954887Schin 	  } \
10964887Schin 	  if(v < 100) \
10974887Schin 	  { if(v < 10) \
10984887Schin 	    { 	s -= 1; s[0] = (char)('0'+v); \
10994887Schin 	    } else \
11004887Schin 	    { 	s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \
11014887Schin 	    } \
11024887Schin 	  } else \
11034887Schin 	  { if(v < 1000) \
11044887Schin 	    { 	s -= 3; SFDIGIT(v,100,s[0]); \
11054887Schin 			s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \
11064887Schin 	    } else \
11074887Schin 	    {	s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \
11084887Schin 			s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \
11094887Schin 	    } \
11104887Schin 	  } \
11114887Schin 	}
11124887Schin 
11134887Schin /* handy functions */
11144887Schin #undef min
11154887Schin #undef max
11164887Schin #define min(x,y)	((x) < (y) ? (x) : (y))
11174887Schin #define max(x,y)	((x) > (y) ? (x) : (y))
11184887Schin 
11194887Schin /* fast functions for memory copy and memory clear */
11204887Schin #if _PACKAGE_ast
11214887Schin #define memclear(s,n)	memzero(s,n)
11224887Schin #else
11234887Schin #if _lib_bcopy && !_lib_memcpy
11244887Schin #define memcpy(to,fr,n)	bcopy((fr),(to),(n))
11254887Schin #endif
11264887Schin #if _lib_bzero && !_lib_memset
11274887Schin #define memclear(s,n)	bzero((s),(n))
11284887Schin #else
11294887Schin #define memclear(s,n)	memset((s),'\0',(n))
11304887Schin #endif
11314887Schin #endif /*_PACKAGE_ast*/
11324887Schin 
11334887Schin /* note that MEMCPY advances the associated pointers */
11344887Schin #define MEMCPY(to,fr,n) \
11354887Schin 	switch(n) \
11364887Schin 	{ default : memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; break; \
11374887Schin 	  case  7 : *to++ = *fr++; \
11384887Schin 	  case  6 : *to++ = *fr++; \
11394887Schin 	  case  5 : *to++ = *fr++; \
11404887Schin 	  case  4 : *to++ = *fr++; \
11414887Schin 	  case  3 : *to++ = *fr++; \
11424887Schin 	  case  2 : *to++ = *fr++; \
11434887Schin 	  case  1 : *to++ = *fr++; \
11444887Schin 	}
11454887Schin #define MEMSET(s,c,n) \
11464887Schin 	switch(n) \
11474887Schin 	{ default : memset((Void_t*)s,(int)c,n); s += n; break; \
11484887Schin 	  case  7 : *s++ = c; \
11494887Schin 	  case  6 : *s++ = c; \
11504887Schin 	  case  5 : *s++ = c; \
11514887Schin 	  case  4 : *s++ = c; \
11524887Schin 	  case  3 : *s++ = c; \
11534887Schin 	  case  2 : *s++ = c; \
11544887Schin 	  case  1 : *s++ = c; \
11554887Schin 	}
11564887Schin 
11574887Schin _BEGIN_EXTERNS_
11584887Schin 
11594887Schin extern Sftab_t		_Sftable;
11604887Schin 
11614887Schin extern int		_sfpopen _ARG_((Sfio_t*, int, int, int));
11624887Schin extern int		_sfpclose _ARG_((Sfio_t*));
11634887Schin extern int		_sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*));
11644887Schin extern Sfrsrv_t*	_sfrsrv _ARG_((Sfio_t*, ssize_t));
11654887Schin extern int		_sfsetpool _ARG_((Sfio_t*));
11668462SApril.Chin@Sun.COM extern char*		_sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int));
11674887Schin extern char**		_sfgetpath _ARG_((char*));
11684887Schin 
11694887Schin #if _BLD_sfio && defined(__EXPORT__)
11704887Schin #define extern		__EXPORT__
11714887Schin #endif
11724887Schin #if !_BLD_sfio && defined(__IMPORT__)
11734887Schin #define extern		extern __IMPORT__
11744887Schin #endif
11754887Schin 
11764887Schin extern Sfextern_t	_Sfextern;
11774887Schin 
11784887Schin extern int		_sfmode _ARG_((Sfio_t*, int, int));
11794887Schin extern int		_sftype _ARG_((const char*, int*, int*));
11804887Schin 
11814887Schin #undef	extern
11824887Schin 
11834887Schin #ifndef errno
11844887Schin extern int		errno;
11854887Schin #endif
11864887Schin 
11874887Schin /* for portable encoding of double values */
11884887Schin #ifndef frexpl
11894887Schin #if _ast_fltmax_double
11904887Schin #define frexpl		frexp
11914887Schin #endif
11924887Schin #if !__STDC__
11934887Schin extern Sfdouble_t	frexpl _ARG_((Sfdouble_t, int*));
11944887Schin #endif
11954887Schin #endif
11964887Schin #ifndef ldexpl
11974887Schin #if _ast_fltmax_double
11984887Schin #define ldexpl		ldexp
11994887Schin #endif
12004887Schin #if !__STDC__
12014887Schin extern Sfdouble_t	ldexpl _ARG_((Sfdouble_t, int));
12024887Schin #endif
12034887Schin #endif
12044887Schin 
12054887Schin #if !_PACKAGE_ast
12064887Schin 
12074887Schin #if !__STDC__ && !_hdr_stdlib
12084887Schin extern void	abort _ARG_((void));
12094887Schin extern int	atexit _ARG_((void(*)(void)));
12104887Schin extern char*	getenv _ARG_((const char*));
12114887Schin extern void*	malloc _ARG_((size_t));
12124887Schin extern void*	realloc _ARG_((void*, size_t));
12134887Schin extern void	free _ARG_((void*));
12144887Schin extern size_t	strlen _ARG_((const char*));
12154887Schin extern char*	strcpy _ARG_((char*, const char*));
12164887Schin 
12174887Schin extern Void_t*	memset _ARG_((void*, int, size_t));
12184887Schin extern Void_t*	memchr _ARG_((const void*, int, size_t));
12194887Schin extern Void_t*	memccpy _ARG_((void*, const void*, int, size_t));
12204887Schin #ifndef memcpy
12214887Schin extern Void_t*	memcpy _ARG_((void*, const void*, size_t));
12224887Schin #endif
12234887Schin #if !defined(strtod)
12244887Schin extern double	strtod _ARG_((const char*, char**));
12254887Schin #endif
12264887Schin #if !defined(remove)
12274887Schin extern int	sysremovef _ARG_((const char*));
12284887Schin #endif
12294887Schin #endif /* !__STDC__ && !_hdr_stdlib */
12304887Schin 
12314887Schin #if !_hdr_unistd
12324887Schin #if _proto_open && __cplusplus
12334887Schin extern int	sysopenf _ARG_((const char*, int, ...));
12344887Schin #endif
12354887Schin extern int	sysclosef _ARG_((int));
12364887Schin extern ssize_t	sysreadf _ARG_((int, void*, size_t));
12374887Schin extern ssize_t	syswritef _ARG_((int, const void*, size_t));
12384887Schin extern sfoff_t	syslseekf _ARG_((int, sfoff_t, int));
12394887Schin extern int	sysdupf _ARG_((int));
12404887Schin extern int	syspipef _ARG_((int*));
12414887Schin extern int	sysaccessf _ARG_((const char*, int));
12424887Schin extern int	sysremovef _ARG_((const char*));
12434887Schin extern int	sysfstatf _ARG_((int, sfstat_t*));
12444887Schin extern int	sysstatf _ARG_((const char*, sfstat_t*));
12454887Schin 
12464887Schin extern int	isatty _ARG_((int));
12474887Schin 
12484887Schin extern int	wait _ARG_((int*));
12494887Schin extern uint	sleep _ARG_((uint));
12504887Schin extern int	execl _ARG_((const char*, const char*,...));
12514887Schin extern int	execv _ARG_((const char*, char**));
12524887Schin #if !defined(fork)
12534887Schin extern int	fork _ARG_((void));
12544887Schin #endif
12554887Schin #if _lib_unlink
12564887Schin extern int	unlink _ARG_((const char*));
12574887Schin #endif
12584887Schin 
12594887Schin #endif /*_hdr_unistd*/
12604887Schin 
12614887Schin #if _lib_bcopy && !_proto_bcopy
12624887Schin extern void	bcopy _ARG_((const void*, void*, size_t));
12634887Schin #endif
12644887Schin #if _lib_bzero && !_proto_bzero
12654887Schin extern void	bzero _ARG_((void*, size_t));
12664887Schin #endif
12674887Schin 
12684887Schin extern time_t	time _ARG_((time_t*));
12694887Schin extern int	waitpid _ARG_((int,int*,int));
12704887Schin extern void	_exit _ARG_((int));
12714887Schin typedef int(*	Onexit_f)_ARG_((void));
12724887Schin extern Onexit_f	onexit _ARG_((Onexit_f));
12734887Schin 
12744887Schin #if _lib_vfork && !_hdr_vfork && !_sys_vfork
12754887Schin extern pid_t	vfork _ARG_((void));
12764887Schin #endif /*_lib_vfork*/
12774887Schin 
12784887Schin #if _lib_poll
12794887Schin #if _lib_poll_fd_1
12804887Schin extern int	poll _ARG_((struct pollfd*, ulong, int));
12814887Schin #else
12824887Schin extern int	poll _ARG_((ulong, struct pollfd*, int));
12834887Schin #endif
12844887Schin #endif /*_lib_poll*/
12854887Schin 
12864887Schin #endif /* _PACKAGE_ast */
12874887Schin 
12884887Schin _END_EXTERNS_
12894887Schin 
12904887Schin #endif /*_SFHDR_H*/
1291