⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sfhdr.h

📁 su 的源代码库
💻 H
📖 第 1 页 / 共 3 页
字号:
#ifndef X_OK#define X_OK	01#endif/* alternative process forking */#if _lib_vfork && !defined(fork) && !defined(sparc) && !defined(__sparc)#if _hdr_vfork#include	<vfork.h>#endif#if _sys_vfork#include	<sys/vfork.h>#endif#define fork	vfork#endif/* to get rid of pesky compiler warnings */#if __STD_C#define NOTUSED(x)	(void)(x)#else#define NOTUSED(x)	(&x,1)#endif/* Private flags in the "bits" field */#define SF_MMAP		00000001	/* in memory mapping mode		*/#define SF_BOTH		00000002	/* both read/write			*/#define SF_HOLE		00000004	/* a hole of zero's was created		*/#define SF_NULL		00000010	/* stream is /dev/null			*/#define SF_SEQUENTIAL	00000020	/* sequential access			*/#define SF_JUSTSEEK	00000040	/* just did a sfseek			*/#define SF_PRIVATE	00000100	/* private stream to Sfio, no mutex	*/#define SF_ENDING	00000200	/* no re-io on interrupts at closing	*/#define SF_WIDE		00000400	/* in wide mode - stdio only		*//* "bits" flags that must be cleared in sfclrlock */#define SF_TMPBITS	00170000#define SF_DCDOWN	00010000	/* recurse down the discipline stack	*/#define SF_WCFORMAT	00020000	/* wchar_t formatting - stdio only	*/#if _has_multibyte#define SFWCSET(f)	((f)->bits |= SF_WCFORMAT)#define SFWCGET(f,v)	(((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) )#else#define SFWCSET(f)#define SFWCGET(f,v)#endif#define SF_MVSIZE	00040000	/* f->size was reset in sfmove()	*/#define SFMVSET(f)	(((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) )#define SFMVUNSET(f)	(!((f)->bits&SF_MVSIZE) ? 0 : \				(((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) )#define SFCLRBITS(f)	(SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) )/* bits for the mode field, SF_INIT defined in sfio_t.h */#define SF_RC		00000010	/* peeking for a record			*/#define SF_RV		00000020	/* reserve without read	or most write	*/#define SF_LOCK		00000040	/* stream is locked for io op		*/#define SF_PUSH		00000100	/* stream has been pushed		*/#define SF_POOL		00000200	/* stream is in a pool but not current	*/#define SF_PEEK		00000400	/* there is a pending peek		*/#define SF_PKRD		00001000	/* did a peek read			*/#define SF_GETR		00002000	/* did a getr on this stream		*/#define SF_SYNCED	00004000	/* stream was synced			*/#define SF_STDIO	00010000	/* given up the buffer to stdio		*/#define SF_AVAIL	00020000	/* was closed, available for reuse	*/#define SF_LOCAL	00100000	/* sentinel for a local call		*/#ifdef DEBUG#define ASSERT(p)	((p) ? 0 : (abort(),0) )#else#define ASSERT(p)#endif/* short-hands */#define NIL(t)		((t)0)#define reg		register#ifndef uchar#define uchar		unsigned char#endif#ifndef ulong#define ulong		unsigned long#endif#ifndef uint#define uint		unsigned int#endif#ifndef ushort#define ushort		unsigned short#endif#define SECOND		1000	/* millisecond units *//* macros do determine stream types from sfstat_t data */#ifndef S_IFMT#define S_IFMT	0#endif#ifndef S_IFDIR#define S_IFDIR	0#endif#ifndef S_IFREG#define S_IFREG	0#endif#ifndef S_IFCHR#define S_IFCHR	0#endif#ifndef S_IFIFO#define S_IFIFO	0#endif#ifndef S_ISDIR#define S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)#endif#ifndef S_ISREG#define S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)#endif#ifndef S_ISCHR#define S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)#endif#ifndef S_ISFIFO#	ifdef S_IFIFO#		define S_ISFIFO(m)	(((m)&S_IFIFO) == S_IFIFO)#	else#		define S_ISFIFO(m)	(0)#	endif#endif#ifdef S_IRUSR#define SF_CREATMODE	(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)#else#define SF_CREATMODE	0666#endif/* set close-on-exec */#ifdef F_SETFD#	ifndef FD_CLOEXEC#		define FD_CLOEXEC	1#	endif /*FD_CLOEXEC*/#	define SETCLOEXEC(fd)		((void)fcntl((fd),F_SETFD,FD_CLOEXEC))#else#	ifdef FIOCLEX#		define SETCLOEXEC(fd)	((void)ioctl((fd),FIOCLEX,0))#	else#		define SETCLOEXEC(fd)#	endif /*FIOCLEX*/#endif /*F_SETFD*//* a couple of error number that we use, default values are like Linux */#ifndef EINTR#define EINTR	4#endif#ifndef EBADF#define EBADF	9#endif#ifndef EAGAIN#define EAGAIN	11#endif#ifndef ENOMEM#define ENOMEM	12#endif#ifndef EINVAL#define EINVAL	22#endif#ifndef ESPIPE#define ESPIPE	29#endif/* function to get the decimal point for local environment */#if !defined(SFSETLOCALE) && _PACKAGE_ast#include "lclib.h"#define SFSETLOCALE(dp,tp) \	do if (*(dp) == 0) { \		Lc_numeric_t*	lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \		*(dp) = lv->decimal; \		if (tp) *(tp) = lv->thousand; \	} while (0)#endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/#if !defined(SFSETLOCALE) && _lib_locale#include	<locale.h>#define SFSETLOCALE(decimal,thousand) \	do { struct lconv*	lv; \	  if(*(decimal) == 0) \	  { *(decimal) = '.'; \	    if (thousand) *(thousand) = -1; \	    if((lv = localeconv())) \	    { if(lv->decimal_point && *lv->decimal_point) \	    	*(decimal) = *(unsigned char*)lv->decimal_point; \	      if(thousand && lv->thousands_sep && *lv->thousands_sep) \	    	*(thousand) = *(unsigned char*)lv->thousands_sep; \	    } \	  } \	} while (0)#endif /*!defined(SFSETLOCALE) && _lib_locale*/#if !defined(SFSETLOCALE)#define SFSETLOCALE(decimal,thousand)	(*(decimal)='.')#endif/* stream pool structure. */typedef struct _sfpool_s	Sfpool_t;struct _sfpool_s{	Sfpool_t*	next;	int		mode;		/* type of pool			*/	int		s_sf;		/* size of pool array		*/	int		n_sf;		/* number currently in pool	*/	Sfio_t**	sf;		/* array of streams		*/	Sfio_t*		array[3];	/* start with 3			*/	Vtmutex_t	mutex;		/* mutex lock object		*/};/* reserve buffer structure */typedef struct _sfrsrv_s	Sfrsrv_t;struct _sfrsrv_s{	ssize_t		slen;		/* last string length		*/	ssize_t		size;		/* buffer size			*/	uchar		data[1];	/* data buffer			*/};/* co-process structure */typedef struct _sfproc_s	Sfproc_t;struct _sfproc_s{	int		pid;	/* process id			*/	uchar*		rdata;	/* read data being cached	*/	int		ndata;	/* size of cached data		*/	int		size;	/* buffer size			*/	int		file;	/* saved file descriptor	*/	int		sigp;	/* sigpipe protection needed	*/};/* extensions to sfvprintf/sfvscanf */#define FP_SET(fp,fn)	(fp < 0 ? (fn += 1) : (fn = fp) )#define FP_WIDTH	0#define FP_PRECIS	1#define FP_BASE		2#define FP_STR		3#define FP_SIZE		4#define FP_INDEX	5	/* index size	*/typedef struct _fmt_s		Fmt_t;typedef struct _fmtpos_s	Fmtpos_t;typedef union{	int		i, *ip;	long		l, *lp;	short		h, *hp;	uint		ui;	ulong		ul;	ushort		uh;	Sflong_t	ll, *llp;	Sfulong_t	lu;	Sfdouble_t	ld;	double		d;	float		f;#if _has_multibyte	wchar_t		wc;	wchar_t		*ws, **wsp;#endif	char		c, *s, **sp;	uchar		uc, *us, **usp;	Void_t		*vp;	Sffmt_t		*ft;} Argv_t;struct _fmt_s{	char*		form;		/* format string		*/	va_list		args;		/* corresponding arglist	*/	SFMBDCL(mbs)			/* multibyte parsing state	*/	char*		oform;		/* original format string	*/	va_list		oargs;		/* original arg list		*/	int		argn;		/* number of args already used	*/	Fmtpos_t*	fp;		/* position list		*/	Sffmt_t*	ft;		/* formatting environment	*/	Sffmtevent_f	eventf;		/* event function		*/	Fmt_t*		next;		/* stack frame pointer		*/};struct _fmtpos_s{	Sffmt_t	ft;			/* environment			*/	Argv_t	argv;			/* argument value		*/	int	fmt;			/* original format		*/	int	need[FP_INDEX];		/* positions depending on	*/};#define LEFTP		'('#define RIGHTP		')'#define QUOTE		'\''#ifndef CHAR_BIT#define CHAR_BIT	8#endif#define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \	((ft->form = (char*)frm), va_copy(ft->args,ags), \	 (ft->fmt = fv), (ft->size = sz), \	 (ft->flags = (flgs&SFFMT_SET)), \	 (ft->width = wid), (ft->precis = pr), (ft->base = bs), \	 (ft->t_str = ts), (ft->n_str = ns) )#define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \	((frm = ft->form), va_copy(ags,ft->args), \	 (fv = ft->fmt), (sz = ft->size), \	 (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \	 (wid = ft->width), (pr = ft->precis), (bs = ft->base) )/* format flags&types, must coexist with those in sfio.h */#define SFFMT_FORBIDDEN 000077777777	/* for sfio.h only		*/#define SFFMT_EFORMAT	001000000000	/* sfcvt converting %e		*/#define SFFMT_MINUS	002000000000	/* minus sign			*/#define SFFMT_AFORMAT	004000000000	/* sfcvt converting %a		*/#define SFFMT_UPPER	010000000000	/* sfcvt converting upper	*/#define SFFMT_TYPES	(SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\			 SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \			 SFFMT_TFLAG | SFFMT_ZFLAG )/* type of elements to be converted */#define SFFMT_INT	001		/* %d,%i 		*/#define SFFMT_UINT	002		/* %u,o,x etc.		*/#define SFFMT_FLOAT	004		/* %f,e,g etc.		*/#define SFFMT_CHAR	010		/* %c,C			*/#define SFFMT_POINTER	020		/* %p,n,s,S		*/#define SFFMT_CLASS	040		/* %[			*//* local variables used across sf-functions */#define _Sfpage		(_Sfextern.sf_page)#define _Sfpool		(_Sfextern.sf_pool)#define _Sfpmove	(_Sfextern.sf_pmove)#define _Sfstack	(_Sfextern.sf_stack)#define _Sfnotify	(_Sfextern.sf_notify)#define _Sfstdsync	(_Sfextern.sf_stdsync)#define _Sfudisc	(&(_Sfextern.sf_udisc))#define _Sfcleanup	(_Sfextern.sf_cleanup)#define _Sfexiting	(_Sfextern.sf_exiting)#define _Sfdone		(_Sfextern.sf_done)#define _Sfonce		(_Sfextern.sf_once)#define _Sfoncef	(_Sfextern.sf_oncef)#define _Sfmutex	(_Sfextern.sf_mutex)typedef struct _sfextern_s{	ssize_t			sf_page;	struct _sfpool_s	sf_pool;	int			(*sf_pmove)_ARG_((Sfio_t*, int));	Sfio_t*			(*sf_stack)_ARG_((Sfio_t*, Sfio_t*));	void			(*sf_notify)_ARG_((Sfio_t*, int, int));	int			(*sf_stdsync)_ARG_((Sfio_t*));	struct _sfdisc_s	sf_udisc;	void			(*sf_cleanup)_ARG_((void));	int			sf_exiting;	int			sf_done;	Vtonce_t*		sf_once;	void			(*sf_oncef)_ARG_((void));	Vtmutex_t*		sf_mutex;} Sfextern_t;/* get the real value of a byte in a coded long or ulong */#define SFUVALUE(v)	(((ulong)(v))&(SF_MORE-1))#define SFSVALUE(v)	((( long)(v))&(SF_SIGN-1))#define SFBVALUE(v)	(((ulong)(v))&(SF_BYTE-1))/* pick this many bits in each iteration of double encoding */#define SF_PRECIS	7/* grain size for buffer increment */#define SF_GRAIN	1024#define SF_PAGE		((ssize_t)(SF_GRAIN*sizeof(int)*2))/* when the buffer is empty, certain io requests may be better done directly   on the given application buffers. The below condition determines when.*/#define SFDIRECT(f,n)	(((ssize_t)(n) >= (f)->size) || \			 ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) )/* number of pages to memory map at a time */#define SF_NMAP		4#ifndef MAP_VARIABLE#define MAP_VARIABLE	0#endif#ifndef _mmap_fixed#define _mmap_fixed	0#endif/* set/unset sequential states for mmap */#if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL)#define SFMMSEQON(f,a,s) \		do { int oerrno = errno; \		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \		     errno = oerrno; \		} while(0)#define SFMMSEQOFF(f,a,s) \		do { int oerrno = errno; \		     (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \		     errno = oerrno; \		} while(0)#else#define SFMMSEQON(f,a,s)#define SFMMSEQOFF(f,a,s)#endif#define SFMUNMAP(f,a,s)		(sysmunmapf((caddr_t)(a),(size_t)(s)), \				 ((f)->endb = (f)->endr = (f)->endw = (f)->next = \				  (f)->data = NIL(uchar*)) )/* safe closing function */#define CLOSE(f)	{ while(sysclosef(f) < 0 && errno == EINTR) errno = 0; }/* the bottomless bit bucket */#define DEVNULL		"/dev/null"#define SFSETNULL(f)	((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL)#define SFISNULL(f)	((f)->extent < 0 && ((f)->bits&SF_NULL) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -