📄 sfhdr.h
字号:
#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 + -