xref: /onnv-gate/usr/src/lib/libast/common/include/sfio.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 _SFIO_H
234887Schin #define _SFIO_H	1
244887Schin 
258462SApril.Chin@Sun.COM #define SFIO_VERSION	20080717L
264887Schin 
274887Schin /*	Public header file for the sfio library
284887Schin **
294887Schin **	Written by Kiem-Phong Vo
304887Schin */
314887Schin 
324887Schin typedef struct _sfio_s		Sfio_t;
334887Schin typedef struct _sfdisc_s	Sfdisc_t;
344887Schin 
354887Schin #if defined(_AST_STD_H) || defined(_PACKAGE_ast) && defined(_SFIO_PRIVATE)
364887Schin #include	<ast_std.h>
374887Schin #else
384887Schin #include	<ast_common.h>
394887Schin #endif /* _PACKAGE_ast */
404887Schin 
414887Schin /* Sfoff_t should be large enough for largest file address */
424887Schin #define Sfoff_t		intmax_t
434887Schin #define Sflong_t	intmax_t
444887Schin #define Sfulong_t	uintmax_t
454887Schin #define Sfdouble_t	_ast_fltmax_t
464887Schin 
474887Schin typedef ssize_t		(*Sfread_f)_ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));
484887Schin typedef ssize_t		(*Sfwrite_f)_ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));
494887Schin typedef Sfoff_t		(*Sfseek_f)_ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));
504887Schin typedef int		(*Sfexcept_f)_ARG_((Sfio_t*, int, Void_t*, Sfdisc_t*));
5110898Sroland.mainz@nrubsig.org typedef int		(*Sfwalk_f)_ARG_((Sfio_t*, Void_t*));
524887Schin 
534887Schin /* discipline structure */
544887Schin struct _sfdisc_s
554887Schin {	Sfread_f	readf;		/* read function		*/
564887Schin 	Sfwrite_f	writef;		/* write function		*/
574887Schin 	Sfseek_f	seekf;		/* seek function		*/
584887Schin 	Sfexcept_f	exceptf;	/* to handle exceptions		*/
594887Schin 	Sfdisc_t*	disc;		/* the continuing discipline	*/
604887Schin };
614887Schin 
624887Schin #include <sfio_s.h>
634887Schin 
644887Schin /* formatting environment */
654887Schin typedef struct _sffmt_s	Sffmt_t;
664887Schin typedef int		(*Sffmtext_f)_ARG_((Sfio_t*, Void_t*, Sffmt_t*));
674887Schin typedef int		(*Sffmtevent_f)_ARG_((Sfio_t*, int, Void_t*, Sffmt_t*));
684887Schin struct _sffmt_s
694887Schin {	long		version;/* version of this structure		*/
704887Schin 	Sffmtext_f	extf;	/* function to process arguments	*/
714887Schin 	Sffmtevent_f	eventf;	/* process events			*/
724887Schin 
734887Schin 	char*		form;	/* format string to stack		*/
744887Schin 	va_list	args;	/* corresponding arg list		*/
754887Schin 
764887Schin 	int		fmt;	/* format character			*/
774887Schin 	ssize_t		size;	/* object size				*/
784887Schin 	int		flags;	/* formatting flags			*/
794887Schin 	int		width;	/* width of field			*/
804887Schin 	int		precis;	/* precision required			*/
814887Schin 	int		base;	/* conversion base			*/
824887Schin 
834887Schin 	char*		t_str;	/* type string 				*/
844887Schin 	ssize_t		n_str;	/* length of t_str 			*/
854887Schin 
864887Schin 	Void_t*		mbs;	/* multibyte state for format string	*/
874887Schin 
884887Schin 	Void_t*		none;	/* unused for now			*/
894887Schin };
904887Schin #define sffmtversion(fe,type) \
914887Schin 		((type) ? ((fe)->version = SFIO_VERSION) : (fe)->version)
924887Schin 
934887Schin #define SFFMT_SSHORT	000000010 /* 'hh' flag, char			*/
944887Schin #define SFFMT_TFLAG	000000020 /* 't' flag, ptrdiff_t			*/
954887Schin #define SFFMT_ZFLAG	000000040 /* 'z' flag, size_t			*/
964887Schin 
974887Schin #define SFFMT_LEFT	000000100 /* left-justification			*/
984887Schin #define SFFMT_SIGN	000000200 /* must have a sign			*/
994887Schin #define SFFMT_BLANK	000000400 /* if not signed, prepend a blank	*/
1004887Schin #define SFFMT_ZERO	000001000 /* zero-padding on the left		*/
1014887Schin #define SFFMT_ALTER	000002000 /* alternate formatting		*/
1024887Schin #define SFFMT_THOUSAND	000004000 /* thousand grouping			*/
1034887Schin #define SFFMT_SKIP	000010000 /* skip assignment in scanf()		*/
1044887Schin #define SFFMT_SHORT	000020000 /* 'h' flag				*/
1054887Schin #define SFFMT_LONG	000040000 /* 'l' flag				*/
1064887Schin #define SFFMT_LLONG	000100000 /* 'll' flag				*/
1074887Schin #define SFFMT_LDOUBLE	000200000 /* 'L' flag				*/
1084887Schin #define SFFMT_VALUE	000400000 /* value is returned			*/
1094887Schin #define SFFMT_ARGPOS	001000000 /* getting arg for $ patterns		*/
1104887Schin #define SFFMT_IFLAG	002000000 /* 'I' flag				*/
1114887Schin #define SFFMT_JFLAG	004000000 /* 'j' flag, intmax_t			*/
1124887Schin #define SFFMT_CENTER	010000000 /* '=' flag, center justification	*/
1134887Schin #define SFFMT_SET	017777770 /* flags settable on calling extf	*/
1144887Schin 
1154887Schin /* for sfmutex() call */
1164887Schin #define SFMTX_LOCK	0	/* up mutex count			*/
1174887Schin #define SFMTX_TRYLOCK	1	/* try to up mutex count		*/
1184887Schin #define SFMTX_UNLOCK	2	/* down mutex count			*/
1194887Schin #define SFMTX_CLRLOCK	3	/* clear mutex count			*/
1204887Schin 
1214887Schin /* various constants */
1224887Schin #ifndef NULL
1234887Schin #define NULL		0
1244887Schin #endif
1254887Schin #ifndef EOF
1264887Schin #define EOF		(-1)
1274887Schin #endif
1284887Schin #ifndef SEEK_SET
1294887Schin #define SEEK_SET	0
1304887Schin #define SEEK_CUR	1
1314887Schin #define SEEK_END	2
1324887Schin #endif
1334887Schin 
1344887Schin /* bits for various types of files */
1354887Schin #define	SF_READ		0000001	/* open for reading			*/
1364887Schin #define SF_WRITE	0000002	/* open for writing			*/
1374887Schin #define SF_STRING	0000004	/* a string stream			*/
1384887Schin #define SF_APPENDWR	0000010	/* file is in append mode only		*/
1394887Schin #define SF_MALLOC	0000020	/* buffer is malloc-ed			*/
1404887Schin #define SF_LINE		0000040	/* line buffering			*/
1414887Schin #define SF_SHARE	0000100	/* stream with shared file descriptor 	*/
1424887Schin #define SF_EOF		0000200	/* eof was detected			*/
1434887Schin #define SF_ERROR	0000400	/* an error happened			*/
1444887Schin #define SF_STATIC	0001000	/* a stream that cannot be freed	*/
1454887Schin #define SF_IOCHECK	0002000	/* call exceptf before doing IO		*/
1464887Schin #define SF_PUBLIC	0004000	/* SF_SHARE and follow physical seek	*/
1474887Schin #define SF_MTSAFE	0010000	/* need thread safety			*/
1484887Schin #define SF_WHOLE	0020000	/* preserve wholeness of sfwrite/sfputr */
1494887Schin #define SF_IOINTR	0040000	/* return on interrupts			*/
1504887Schin #define SF_WCWIDTH	0100000	/* wcwidth display stream		*/
1514887Schin 
1524887Schin #define SF_FLAGS	0177177	/* PUBLIC FLAGS PASSABLE TO SFNEW()	*/
1534887Schin #define SF_SETS		0177163	/* flags passable to sfset()		*/
1544887Schin 
1554887Schin #ifndef _SF_NO_OBSOLETE
1564887Schin #define SF_BUFCONST	0400000 /* unused flag - for compatibility only	*/
1574887Schin #endif
1584887Schin 
1594887Schin /* for sfgetr/sfreserve to hold a record */
1604887Schin #define SF_LOCKR	0000010	/* lock record, stop access to stream	*/
1614887Schin #define SF_LASTR	0000020	/* get the last incomplete record	*/
1624887Schin 
1634887Schin /* exception events: SF_NEW(0), SF_READ(1), SF_WRITE(2) and the below 	*/
1644887Schin #define SF_SEEK		3	/* seek error				*/
1654887Schin #define SF_CLOSING	4	/* when stream is about to be closed	*/
1664887Schin #define SF_DPUSH	5	/* when discipline is being pushed	*/
1674887Schin #define SF_DPOP		6	/* when discipline is being popped	*/
1684887Schin #define SF_DPOLL	7	/* see if stream is ready for I/O	*/
1694887Schin #define SF_DBUFFER	8	/* buffer not empty during push or pop	*/
1704887Schin #define SF_SYNC		9	/* announcing start/end synchronization */
1714887Schin #define SF_PURGE	10	/* a sfpurge() call was issued		*/
1724887Schin #define SF_FINAL	11	/* closing is done except stream free	*/
1734887Schin #define SF_READY	12	/* a polled stream is ready		*/
1744887Schin #define SF_LOCKED	13	/* stream is in a locked state		*/
1754887Schin #define SF_ATEXIT	14	/* process is exiting			*/
1764887Schin #define SF_EVENT	100	/* start of user-defined events		*/
1774887Schin 
1784887Schin /* for stack and disciplines */
1794887Schin #define SF_POPSTACK	((Sfio_t*)0)	/* pop the stream stack		*/
1804887Schin #define SF_POPDISC	((Sfdisc_t*)0)	/* pop the discipline stack	*/
1814887Schin 
1824887Schin /* for the notify function and discipline exception */
1834887Schin #define SF_NEW		0	/* new stream				*/
1844887Schin #define SF_SETFD	(-1)	/* about to set the file descriptor 	*/
1858462SApril.Chin@Sun.COM #define SF_MTACCESS	(-2)	/* starting a multi-threaded stream	*/
1864887Schin 
1874887Schin #define SF_BUFSIZE	8192	/* default buffer size			*/
1884887Schin #define SF_UNBOUND	(-1)	/* unbounded buffer size		*/
1894887Schin 
1904887Schin /* namespace incursion workarounds -- migrate to the new names */
1914887Schin #if !_mac_SF_APPEND
1924887Schin #define SF_APPEND	SF_APPENDWR	/* BSDI sys/stat.h		*/
1934887Schin #endif
1944887Schin #if !_mac_SF_CLOSE
1954887Schin #define SF_CLOSE	SF_CLOSING	/* AIX sys/socket.h		*/
1964887Schin #endif
1974887Schin 
1984887Schin _BEGIN_EXTERNS_
1994887Schin 
2004887Schin /* standard in/out/err streams */
2014887Schin 
2024887Schin #if _BLD_sfio && defined(__EXPORT__)
2034887Schin #define extern		extern __EXPORT__
2044887Schin #endif
2054887Schin #if !_BLD_sfio && defined(__IMPORT__)
2064887Schin #define extern		extern __IMPORT__
2074887Schin #endif
2084887Schin 
2094887Schin extern ssize_t		_Sfi;
2104887Schin extern ssize_t		_Sfmaxr;
2114887Schin 
2124887Schin extern Sfio_t*		sfstdin;
2134887Schin extern Sfio_t*		sfstdout;
2144887Schin extern Sfio_t*		sfstderr;
2154887Schin 
2164887Schin #if _UWIN
2174887Schin #undef	extern
2184887Schin #endif
2194887Schin 
2204887Schin extern Sfio_t		_Sfstdin;
2214887Schin extern Sfio_t		_Sfstdout;
2224887Schin extern Sfio_t		_Sfstderr;
2234887Schin 
2244887Schin #undef	extern
2254887Schin 
2264887Schin #if _BLD_sfio && defined(__EXPORT__)
2274887Schin #define extern	__EXPORT__
2284887Schin #endif
2294887Schin 
2304887Schin extern Sfio_t*		sfnew _ARG_((Sfio_t*, Void_t*, size_t, int, int));
2314887Schin extern Sfio_t*		sfopen _ARG_((Sfio_t*, const char*, const char*));
2324887Schin extern Sfio_t*		sfpopen _ARG_((Sfio_t*, const char*, const char*));
2334887Schin extern Sfio_t*		sfstack _ARG_((Sfio_t*, Sfio_t*));
2344887Schin extern Sfio_t*		sfswap _ARG_((Sfio_t*, Sfio_t*));
2354887Schin extern Sfio_t*		sftmp _ARG_((size_t));
23610898Sroland.mainz@nrubsig.org extern int		sfwalk _ARG_((Sfwalk_f, Void_t*, int));
2374887Schin extern int		sfpurge _ARG_((Sfio_t*));
2384887Schin extern int		sfpoll _ARG_((Sfio_t**, int, int));
2394887Schin extern Void_t*		sfreserve _ARG_((Sfio_t*, ssize_t, int));
2404887Schin extern int		sfresize _ARG_((Sfio_t*, Sfoff_t));
2414887Schin extern int		sfsync _ARG_((Sfio_t*));
2424887Schin extern int		sfclrlock _ARG_((Sfio_t*));
2434887Schin extern Void_t*		sfsetbuf _ARG_((Sfio_t*, Void_t*, size_t));
2444887Schin extern Sfdisc_t*	sfdisc _ARG_((Sfio_t*,Sfdisc_t*));
2454887Schin extern int		sfraise _ARG_((Sfio_t*, int, Void_t*));
2468462SApril.Chin@Sun.COM extern int		sfnotify _ARG_((void(*)(Sfio_t*, int, void*)));
2474887Schin extern int		sfset _ARG_((Sfio_t*, int, int));
2484887Schin extern int		sfsetfd _ARG_((Sfio_t*, int));
2494887Schin extern Sfio_t*		sfpool _ARG_((Sfio_t*, Sfio_t*, int));
2504887Schin extern ssize_t		sfread _ARG_((Sfio_t*, Void_t*, size_t));
2514887Schin extern ssize_t		sfwrite _ARG_((Sfio_t*, const Void_t*, size_t));
2524887Schin extern Sfoff_t		sfmove _ARG_((Sfio_t*, Sfio_t*, Sfoff_t, int));
2534887Schin extern int		sfclose _ARG_((Sfio_t*));
2544887Schin extern Sfoff_t		sftell _ARG_((Sfio_t*));
2554887Schin extern Sfoff_t		sfseek _ARG_((Sfio_t*, Sfoff_t, int));
2564887Schin extern ssize_t		sfputr _ARG_((Sfio_t*, const char*, int));
2574887Schin extern char*		sfgetr _ARG_((Sfio_t*, int, int));
2584887Schin extern ssize_t		sfnputc _ARG_((Sfio_t*, int, size_t));
2594887Schin extern int		sfungetc _ARG_((Sfio_t*, int));
2604887Schin extern int		sfprintf _ARG_((Sfio_t*, const char*, ...));
2614887Schin extern char*		sfprints _ARG_((const char*, ...));
2624887Schin extern ssize_t		sfsprintf _ARG_((char*, size_t, const char*, ...));
2634887Schin extern ssize_t		sfvsprintf _ARG_((char*, size_t, const char*, va_list));
2644887Schin extern int		sfvprintf _ARG_((Sfio_t*, const char*, va_list));
2654887Schin extern int		sfscanf _ARG_((Sfio_t*, const char*, ...));
2664887Schin extern int		sfsscanf _ARG_((const char*, const char*, ...));
2674887Schin extern int		sfvsscanf _ARG_((const char*, const char*, va_list));
2684887Schin extern int		sfvscanf _ARG_((Sfio_t*, const char*, va_list));
2694887Schin 
2704887Schin /* mutex locking for thread-safety */
2714887Schin extern int		sfmutex _ARG_((Sfio_t*, int));
2724887Schin 
2734887Schin /* io functions with discipline continuation */
2744887Schin extern ssize_t		sfrd _ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));
2754887Schin extern ssize_t		sfwr _ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));
2764887Schin extern Sfoff_t		sfsk _ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));
2774887Schin extern ssize_t		sfpkrd _ARG_((int, Void_t*, size_t, int, long, int));
2784887Schin 
2794887Schin /* portable handling of primitive types */
2804887Schin extern int		sfdlen _ARG_((Sfdouble_t));
2814887Schin extern int		sfllen _ARG_((Sflong_t));
2824887Schin extern int		sfulen _ARG_((Sfulong_t));
2834887Schin 
2844887Schin extern int		sfputd _ARG_((Sfio_t*, Sfdouble_t));
2854887Schin extern int		sfputl _ARG_((Sfio_t*, Sflong_t));
2864887Schin extern int		sfputu _ARG_((Sfio_t*, Sfulong_t));
2874887Schin extern int		sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));
2884887Schin extern int		sfputc _ARG_((Sfio_t*, int));
2894887Schin 
2904887Schin extern Sfdouble_t	sfgetd _ARG_((Sfio_t*));
2914887Schin extern Sflong_t		sfgetl _ARG_((Sfio_t*));
2924887Schin extern Sfulong_t	sfgetu _ARG_((Sfio_t*));
2934887Schin extern Sfulong_t	sfgetm _ARG_((Sfio_t*, Sfulong_t));
2944887Schin extern int		sfgetc _ARG_((Sfio_t*));
2954887Schin 
2964887Schin extern int		_sfputd _ARG_((Sfio_t*, Sfdouble_t));
2974887Schin extern int		_sfputl _ARG_((Sfio_t*, Sflong_t));
2984887Schin extern int		_sfputu _ARG_((Sfio_t*, Sfulong_t));
2994887Schin extern int		_sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));
3004887Schin extern int		_sfflsbuf _ARG_((Sfio_t*, int));
3014887Schin 
3024887Schin extern int		_sffilbuf _ARG_((Sfio_t*, int));
3034887Schin 
3044887Schin extern int		_sfdlen _ARG_((Sfdouble_t));
3054887Schin extern int		_sfllen _ARG_((Sflong_t));
3064887Schin extern int		_sfulen _ARG_((Sfulong_t));
3074887Schin 
3084887Schin /* miscellaneous function analogues of fast in-line functions */
3094887Schin extern Sfoff_t		sfsize _ARG_((Sfio_t*));
3104887Schin extern int		sfclrerr _ARG_((Sfio_t*));
3114887Schin extern int		sfeof _ARG_((Sfio_t*));
3124887Schin extern int		sferror _ARG_((Sfio_t*));
3134887Schin extern int		sffileno _ARG_((Sfio_t*));
3144887Schin extern int		sfstacked _ARG_((Sfio_t*));
3154887Schin extern ssize_t		sfvalue _ARG_((Sfio_t*));
3164887Schin extern ssize_t		sfslen _ARG_((void));
3174887Schin extern ssize_t		sfmaxr _ARG_((ssize_t, int));
3184887Schin 
3194887Schin #undef extern
3204887Schin _END_EXTERNS_
3214887Schin 
3224887Schin /* coding long integers in a portable and compact fashion */
3234887Schin #define SF_SBITS	6
3244887Schin #define SF_UBITS	7
3254887Schin #define SF_BBITS	8
3264887Schin #define SF_SIGN		(1 << SF_SBITS)
3274887Schin #define SF_MORE		(1 << SF_UBITS)
3284887Schin #define SF_BYTE		(1 << SF_BBITS)
3294887Schin #define SF_U1		SF_MORE
3304887Schin #define SF_U2		(SF_U1*SF_U1)
3314887Schin #define SF_U3		(SF_U2*SF_U1)
3324887Schin #define SF_U4		(SF_U3*SF_U1)
3334887Schin 
3344887Schin #if __cplusplus
3354887Schin #define _SF_(f)		(f)
3364887Schin #else
3374887Schin #define _SF_(f)		((Sfio_t*)(f))
3384887Schin #endif
3394887Schin 
3404887Schin #define __sf_putd(f,v)		(_sfputd(_SF_(f),(Sfdouble_t)(v)))
3414887Schin #define __sf_putl(f,v)		(_sfputl(_SF_(f),(Sflong_t)(v)))
3424887Schin #define __sf_putu(f,v)		(_sfputu(_SF_(f),(Sfulong_t)(v)))
3434887Schin #define __sf_putm(f,v,m)	(_sfputm(_SF_(f),(Sfulong_t)(v),(Sfulong_t)(m)))
3444887Schin 
3454887Schin #define __sf_putc(f,c)	(_SF_(f)->_next >= _SF_(f)->_endw ? \
3464887Schin 			 _sfflsbuf(_SF_(f),(int)((unsigned char)(c))) : \
3474887Schin 			 (int)(*_SF_(f)->_next++ = (unsigned char)(c)) )
3484887Schin #define __sf_getc(f)	(_SF_(f)->_next >= _SF_(f)->_endr ? _sffilbuf(_SF_(f),0) : \
3494887Schin 			 (int)(*_SF_(f)->_next++) )
3504887Schin 
3514887Schin #define __sf_dlen(v)	(_sfdlen((Sfdouble_t)(v)) )
3524887Schin #define __sf_llen(v)	(_sfllen((Sflong_t)(v)) )
3534887Schin #define __sf_ulen(v)	((Sfulong_t)(v) < SF_U1 ? 1 : (Sfulong_t)(v) < SF_U2 ? 2 : \
3544887Schin 			 (Sfulong_t)(v) < SF_U3 ? 3 : (Sfulong_t)(v) < SF_U4 ? 4 : 5)
3554887Schin 
3564887Schin #define __sf_fileno(f)	(_SF_(f)->_file)
3574887Schin #define __sf_eof(f)	(_SF_(f)->_flags&SF_EOF)
3584887Schin #define __sf_error(f)	(_SF_(f)->_flags&SF_ERROR)
3594887Schin #define __sf_clrerr(f)	(_SF_(f)->_flags &= ~(SF_ERROR|SF_EOF))
3604887Schin #define __sf_stacked(f)	(_SF_(f)->_push != (Sfio_t*)0)
3614887Schin #define __sf_value(f)	(_SF_(f)->_val)
3624887Schin #define __sf_slen()	(_Sfi)
3634887Schin #define __sf_maxr(n,s)	((s)?((_Sfi=_Sfmaxr),(_Sfmaxr=(n)),_Sfi):_Sfmaxr)
3644887Schin 
3654887Schin #if defined(__INLINE__) && !_BLD_sfio
3664887Schin 
sfputd(Sfio_t * f,Sfdouble_t v)3674887Schin __INLINE__ int sfputd(Sfio_t* f, Sfdouble_t v)	{ return __sf_putd(f,v); }
sfputl(Sfio_t * f,Sflong_t v)3684887Schin __INLINE__ int sfputl(Sfio_t* f, Sflong_t v)	{ return __sf_putl(f,v); }
sfputu(Sfio_t * f,Sfulong_t v)3694887Schin __INLINE__ int sfputu(Sfio_t* f, Sfulong_t v)	{ return __sf_putu(f,v); }
sfputm(Sfio_t * f,Sfulong_t v,Sfulong_t m)3704887Schin __INLINE__ int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t m)
3714887Schin 						{ return __sf_putm(f,v,m); }
3724887Schin 
sfputc(Sfio_t * f,int c)3734887Schin __INLINE__ int sfputc(Sfio_t* f, int c)		{ return __sf_putc(f,c); }
sfgetc(Sfio_t * f)3744887Schin __INLINE__ int sfgetc(Sfio_t* f)		{ return __sf_getc(f); }
3754887Schin 
sfdlen(Sfdouble_t v)3764887Schin __INLINE__ int sfdlen(Sfdouble_t v)		{ return __sf_dlen(v); }
sfllen(Sflong_t v)3774887Schin __INLINE__ int sfllen(Sflong_t v)		{ return __sf_llen(v); }
sfulen(Sfulong_t v)3784887Schin __INLINE__ int sfulen(Sfulong_t v)		{ return __sf_ulen(v); }
3794887Schin 
sffileno(Sfio_t * f)3804887Schin __INLINE__ int sffileno(Sfio_t* f)		{ return __sf_fileno(f); }
sfeof(Sfio_t * f)3814887Schin __INLINE__ int sfeof(Sfio_t* f)			{ return __sf_eof(f); }
sferror(Sfio_t * f)3824887Schin __INLINE__ int sferror(Sfio_t* f)		{ return __sf_error(f); }
sfclrerr(Sfio_t * f)3834887Schin __INLINE__ int sfclrerr(Sfio_t* f)		{ return __sf_clrerr(f); }
sfstacked(Sfio_t * f)3844887Schin __INLINE__ int sfstacked(Sfio_t* f)		{ return __sf_stacked(f); }
sfvalue(Sfio_t * f)3854887Schin __INLINE__ ssize_t sfvalue(Sfio_t* f)		{ return __sf_value(f); }
sfslen()3864887Schin __INLINE__ ssize_t sfslen()			{ return __sf_slen(); }
sfmaxr(ssize_t n,int s)3874887Schin __INLINE__ ssize_t sfmaxr(ssize_t n, int s)	{ return __sf_maxr(n,s); }
3884887Schin 
3894887Schin #else
3904887Schin 
3914887Schin #define sfputd(f,v)				( __sf_putd((f),(v)) )
3924887Schin #define sfputl(f,v)				( __sf_putl((f),(v)) )
3934887Schin #define sfputu(f,v)				( __sf_putu((f),(v)) )
3944887Schin #define sfputm(f,v,m)				( __sf_putm((f),(v),(m)) )
3954887Schin 
3964887Schin #define sfputc(f,c)				( __sf_putc((f),(c)) )
3974887Schin #define sfgetc(f)				( __sf_getc(f) )
3984887Schin 
3994887Schin #define sfdlen(v)				( __sf_dlen(v) )
4004887Schin #define sfllen(v)				( __sf_llen(v) )
4014887Schin #define sfulen(v)				( __sf_ulen(v) )
4024887Schin 
4034887Schin #define sffileno(f)				( __sf_fileno(f) )
4044887Schin #define sfeof(f)				( __sf_eof(f) )
4054887Schin #define sferror(f)				( __sf_error(f) )
4064887Schin #define sfclrerr(f)				( __sf_clrerr(f) )
4074887Schin #define sfstacked(f)				( __sf_stacked(f) )
4084887Schin #define sfvalue(f)				( __sf_value(f) )
4094887Schin #define sfslen()				( __sf_slen() )
4104887Schin #define sfmaxr(n,s)				( __sf_maxr(n,s) )
4114887Schin 
4124887Schin #endif /*__INLINE__*/
4134887Schin 
4144887Schin #ifndef _SFSTR_H /* GSF's string manipulation stuff */
4154887Schin #define _SFSTR_H		1
4164887Schin 
4174887Schin #define sfstropen()		sfnew(0, 0, -1, -1, SF_READ|SF_WRITE|SF_STRING)
4184887Schin #define sfstrclose(f)		sfclose(f)
4194887Schin 
4204887Schin #define sfstrseek(f,p,m) \
4214887Schin 	( (m) == SEEK_SET ? \
4224887Schin 	 	(((p) < 0 || (p) > (f)->_size) ? (char*)0 : \
4234887Schin 		 (char*)((f)->_next = (f)->_data+(p)) ) \
4244887Schin 	: (m) == SEEK_CUR ? \
4254887Schin 		((f)->_next += (p), \
4264887Schin 		 (((f)->_next < (f)->_data || (f)->_next > (f)->_data+(f)->_size) ? \
4274887Schin 			((f)->_next -= (p), (char*)0) : (char*)(f)->_next ) ) \
4284887Schin 	: (m) == SEEK_END ? \
4294887Schin 		( ((p) > 0 || (f)->_size+(p) < 0) ? (char*)0 : \
4304887Schin 			(char*)((f)->_next = (f)->_data+(f)->_size+(p)) ) \
4314887Schin 	: (char*)0 \
4324887Schin 	)
4334887Schin 
4344887Schin #define sfstrsize(f)		((f)->_size)
4354887Schin #define sfstrtell(f)		((f)->_next - (f)->_data)
4364887Schin #define sfstrpend(f)		((f)->_size - sfstrtell())
4374887Schin #define sfstrbase(f)		((char*)(f)->_data)
4384887Schin 
4394887Schin #define sfstruse(f) \
4404887Schin 	(sfputc((f),0) < 0 ? (char*)0 : (char*)((f)->_next = (f)->_data) \
4414887Schin 	)
4424887Schin 
4434887Schin #define sfstrrsrv(f,n) \
4444887Schin 	(sfreserve((f),(n),SF_WRITE|SF_LOCKR), sfwrite((f),(f)->_next,0), \
4454887Schin 	 ((f)->_next+(n) <= (f)->_data+(f)->_size ? (char*)(f)->_next : (char*)0) \
4464887Schin 	)
4474887Schin 
4484887Schin #define sfstrbuf(f,b,n,m) \
4494887Schin 	(sfsetbuf((f),(b),(n)), ((f)->_flags |= (m) ? SF_MALLOC : 0), \
4504887Schin 	 ((f)->_data == (unsigned char*)(b) ? 0 : -1) \
4514887Schin 	)
4524887Schin 
4534887Schin #endif /* _SFSTR_H */
4544887Schin 
4554887Schin #endif /* _SFIO_H */
456