sfhdr.h
来自「su 的源代码库」· C头文件 代码 · 共 1,230 行 · 第 1/3 页
H
1,230 行
#define SFKILL(f) ((f)->mode = (SF_AVAIL|SF_LOCK) )#define SFKILLED(f) (((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) )/* exception types */#define SF_EDONE 0 /* stop this operation and return */#define SF_EDISC 1 /* discipline says it's ok */#define SF_ESTACK 2 /* stack was popped */#define SF_ECONT 3 /* can continue normally */#define SETLOCAL(f) ((f)->mode |= SF_LOCAL)#define GETLOCAL(f,v) ((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v))#define SFWRALL(f) ((f)->mode |= SF_RV)#define SFISALL(f,v) ((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \ ((v) || (f)->extent < 0 || \ ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) )#define SFSK(f,a,o,d) (SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d))#define SFRD(f,b,n,d) (SETLOCAL(f),sfrd(f,(Void_t*)b,n,d))#define SFWR(f,b,n,d) (SETLOCAL(f),sfwr(f,(Void_t*)b,n,d))#define SFSYNC(f) (SETLOCAL(f),sfsync(f))#define SFCLOSE(f) (SETLOCAL(f),sfclose(f))#define SFFLSBUF(f,n) (SETLOCAL(f),_sfflsbuf(f,n))#define SFFILBUF(f,n) (SETLOCAL(f),_sffilbuf(f,n))#define SFSETBUF(f,s,n) (SETLOCAL(f),sfsetbuf(f,s,n))#define SFWRITE(f,s,n) (SETLOCAL(f),sfwrite(f,s,n))#define SFREAD(f,s,n) (SETLOCAL(f),sfread(f,s,n))#define SFSEEK(f,p,t) (SETLOCAL(f),sfseek(f,p,t))#define SFNPUTC(f,c,n) (SETLOCAL(f),sfnputc(f,c,n))#define SFRAISE(f,e,d) (SETLOCAL(f),sfraise(f,e,d))/* lock/open a stream */#define SFMODE(f,l) ((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) )#define SFLOCK(f,l) (void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data)#define _SFOPENRD(f) ((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb)#define _SFOPENWR(f) ((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb)#define _SFOPEN(f) ((f)->mode == SF_READ ? _SFOPENRD(f) : \ (f)->mode == SF_WRITE ? _SFOPENWR(f) : \ ((f)->endr = (f)->endr = (f)->data) )#define SFOPEN(f,l) (void)((l) ? 0 : \ ((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) )/* check to see if the stream can be accessed */#define SFFROZEN(f) (((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \ !((f)->mode&SF_STDIO) ? 0 : \ _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) )/* set discipline code */#define SFDISC(f,dc,iof) \ { Sfdisc_t* d; \ if(!(dc)) \ d = (dc) = (f)->disc; \ else d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \ while(d && !(d->iof)) d = d->disc; \ if(d) (dc) = d; \ }#define SFDCRD(f,buf,n,dc,rv) \ { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ rv = (*dc->readf)(f,buf,n,dc); \ if(!dcdown) f->bits &= ~SF_DCDOWN; \ }#define SFDCWR(f,buf,n,dc,rv) \ { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ rv = (*dc->writef)(f,buf,n,dc); \ if(!dcdown) f->bits &= ~SF_DCDOWN; \ }#define SFDCSK(f,addr,type,dc,rv) \ { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ rv = (*dc->seekf)(f,addr,type,dc); \ if(!dcdown) f->bits &= ~SF_DCDOWN; \ }/* fast peek of a stream */#define _SFAVAIL(f,s,n) ((n) = (f)->endb - ((s) = (f)->next) )#define SFRPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ ((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) )#define SFWPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ ((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) )/* more than this for a line buffer, we might as well flush */#define HIFORLINE 128/* string stream extent */#define SFSTRSIZE(f) { Sfoff_t s = (f)->next - (f)->data; \ if(s > (f)->here) \ { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \ }/* control flags for open() */#ifdef O_CREAT#define _has_oflags 1#else /* for example, research UNIX */#define _has_oflags 0#define O_CREAT 004#define O_TRUNC 010#define O_APPEND 020#define O_EXCL 040#ifndef O_RDONLY#define O_RDONLY 000#endif#ifndef O_WRONLY#define O_WRONLY 001#endif#ifndef O_RDWR#define O_RDWR 002#endif#endif /*O_CREAT*/#ifndef O_BINARY#define O_BINARY 000#endif#ifndef O_TEXT#define O_TEXT 000#endif#ifndef O_TEMPORARY#define O_TEMPORARY 000#endif#define SF_RADIX 64 /* maximum integer conversion base */#if _PACKAGE_ast#define SF_MAXINT INT_MAX#define SF_MAXLONG LONG_MAX#else#define SF_MAXINT ((int)(((uint)~0) >> 1))#define SF_MAXLONG ((long)(((ulong)~0L) >> 1))#endif#define SF_MAXCHAR ((uchar)(~0))/* floating point to ascii conversion */#define SF_MAXEXP10 6#define SF_MAXPOW10 (1 << SF_MAXEXP10)#if !_ast_fltmax_double#define SF_FDIGITS 1024 /* max allowed fractional digits */#define SF_IDIGITS (8*1024) /* max number of digits in int part */#else#define SF_FDIGITS 256 /* max allowed fractional digits */#define SF_IDIGITS 1024 /* max number of digits in int part */#endif#define SF_MAXDIGITS (((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int))/* tables for numerical translation */#define _Sfpos10 (_Sftable.sf_pos10)#define _Sfneg10 (_Sftable.sf_neg10)#define _Sfdec (_Sftable.sf_dec)#define _Sfdigits (_Sftable.sf_digits)#define _Sfcvinitf (_Sftable.sf_cvinitf)#define _Sfcvinit (_Sftable.sf_cvinit)#define _Sffmtposf (_Sftable.sf_fmtposf)#define _Sffmtintf (_Sftable.sf_fmtintf)#define _Sfcv36 (_Sftable.sf_cv36)#define _Sfcv64 (_Sftable.sf_cv64)#define _Sftype (_Sftable.sf_type)#define _Sffhuge (_Sftable.sf_flt_huge)#define _Sfdhuge (_Sftable.sf_dbl_huge)#define _Sflhuge (_Sftable.sf_ldbl_huge)#define _Sffpow10 (_Sftable.sf_flt_pow10)#define _Sfdpow10 (_Sftable.sf_dbl_pow10)#define _Sflpow10 (_Sftable.sf_ldbl_pow10)typedef struct _sftab_{ Sfdouble_t sf_pos10[SF_MAXEXP10]; /* positive powers of 10 */ Sfdouble_t sf_neg10[SF_MAXEXP10]; /* negative powers of 10 */ uchar sf_dec[200]; /* ascii reps of values < 100 */ char* sf_digits; /* digits for general bases */ int (*sf_cvinitf)(); /* initialization function */ int sf_cvinit; /* initialization state */ Fmtpos_t* (*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int)); char* (*sf_fmtintf)_ARG_((const char*,int*)); float* sf_flt_pow10; /* float powers of 10 */ double* sf_dbl_pow10; /* double powers of 10 */ Sfdouble_t* sf_ldbl_pow10; /* Sfdouble_t powers of 10 */ float sf_flt_huge; /* float HUGE_VALUE */ double sf_dbl_huge; /* double HUGE_VALUE */ Sfdouble_t sf_ldbl_huge; /* Sfdouble_t HUGE_VALUE */ uchar sf_cv36[SF_MAXCHAR+1]; /* conversion for base [2-36] */ uchar sf_cv64[SF_MAXCHAR+1]; /* conversion for base [37-64] */ uchar sf_type[SF_MAXCHAR+1]; /* conversion formats&types */} Sftab_t;/* thread-safe macro/function to initialize _Sfcv* conversion tables */#define SFCVINIT() (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) )/* sfucvt() converts decimal integers to ASCII */#define SFDIGIT(v,scale,digit) \ { if(v < 5*scale) \ if(v < 2*scale) \ if(v < 1*scale) \ { digit = '0'; } \ else { digit = '1'; v -= 1*scale; } \ else if(v < 3*scale) \ { digit = '2'; v -= 2*scale; } \ else if(v < 4*scale) \ { digit = '3'; v -= 3*scale; } \ else { digit = '4'; v -= 4*scale; } \ else if(v < 7*scale) \ if(v < 6*scale) \ { digit = '5'; v -= 5*scale; } \ else { digit = '6'; v -= 6*scale; } \ else if(v < 8*scale) \ { digit = '7'; v -= 7*scale; } \ else if(v < 9*scale) \ { digit = '8'; v -= 8*scale; } \ else { digit = '9'; v -= 9*scale; } \ }#define sfucvt(v,s,n,list,type,utype) \ { while((utype)v >= 10000) \ { n = v; v = (type)(((utype)v)/10000); \ n = (type)((utype)n - ((utype)v)*10000); \ s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \ s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \ } \ if(v < 100) \ { if(v < 10) \ { s -= 1; s[0] = (char)('0'+v); \ } else \ { s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \ } \ } else \ { if(v < 1000) \ { s -= 3; SFDIGIT(v,100,s[0]); \ s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \ } else \ { s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \ s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \ } \ } \ }/* handy functions */#undef min#undef max#define min(x,y) ((x) < (y) ? (x) : (y))#define max(x,y) ((x) > (y) ? (x) : (y))/* fast functions for memory copy and memory clear */#if _PACKAGE_ast#define memclear(s,n) memzero(s,n)#else#if _lib_bcopy && !_lib_memcpy#define memcpy(to,fr,n) bcopy((fr),(to),(n))#endif#if _lib_bzero && !_lib_memset#define memclear(s,n) bzero((s),(n))#else#define memclear(s,n) memset((s),'\0',(n))#endif#endif /*_PACKAGE_ast*//* note that MEMCPY advances the associated pointers */#define MEMCPY(to,fr,n) \ switch(n) \ { default : memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; break; \ case 7 : *to++ = *fr++; \ case 6 : *to++ = *fr++; \ case 5 : *to++ = *fr++; \ case 4 : *to++ = *fr++; \ case 3 : *to++ = *fr++; \ case 2 : *to++ = *fr++; \ case 1 : *to++ = *fr++; \ }#define MEMSET(s,c,n) \ switch(n) \ { default : memset((Void_t*)s,(int)c,n); s += n; break; \ case 7 : *s++ = c; \ case 6 : *s++ = c; \ case 5 : *s++ = c; \ case 4 : *s++ = c; \ case 3 : *s++ = c; \ case 2 : *s++ = c; \ case 1 : *s++ = c; \ }_BEGIN_EXTERNS_extern Sftab_t _Sftable;extern int _sfpopen _ARG_((Sfio_t*, int, int, int));extern int _sfpclose _ARG_((Sfio_t*));extern int _sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*));extern Sfrsrv_t* _sfrsrv _ARG_((Sfio_t*, ssize_t));extern int _sfsetpool _ARG_((Sfio_t*));extern char* _sfcvt _ARG_((Sfdouble_t,char*,size_t,int,int*,int*,int*,int));extern char** _sfgetpath _ARG_((char*));/* extern Sfdouble_t _sfdscan _ARG_((Void_t*, int(*)(Void_t*,int))); */#if _BLD_sfio && defined(__EXPORT__)#define extern __EXPORT__#endif#if !_BLD_sfio && defined(__IMPORT__)#define extern extern __IMPORT__#endifextern Sfextern_t _Sfextern;extern int _sfmode _ARG_((Sfio_t*, int, int));extern int _sftype _ARG_((const char*, int*, int*));#undef extern#ifndef errnoextern int errno;#endif/* for portable encoding of double values */#ifndef frexpl#if _ast_fltmax_double#define frexpl frexp#endif#if !__STDC__extern Sfdouble_t frexpl _ARG_((Sfdouble_t, int*));#endif#endif#ifndef ldexpl#if _ast_fltmax_double#define ldexpl ldexp#endif#if !__STDC__extern Sfdouble_t ldexpl _ARG_((Sfdouble_t, int));#endif#endif#if !_PACKAGE_ast#if !__STDC__ && !_hdr_stdlibextern void abort _ARG_((void));extern int atexit _ARG_((void(*)(void)));extern char* getenv _ARG_((const char*));extern void* malloc _ARG_((size_t));extern void* realloc _ARG_((void*, size_t));extern void free _ARG_((void*));extern size_t strlen _ARG_((const char*));extern char* strcpy _ARG_((char*, const char*));extern Void_t* memset _ARG_((void*, int, size_t));extern Void_t* memchr _ARG_((const void*, int, size_t));extern Void_t* memccpy _ARG_((void*, const void*, int, size_t));#ifndef memcpyextern Void_t* memcpy _ARG_((void*, const void*, size_t));#endif#if !defined(strtod)extern double strtod _ARG_((const char*, char**));#endif#if !defined(remove)extern int sysremovef _ARG_((const char*));#endif#endif /* !__STDC__ && !_hdr_stdlib */#if !_hdr_unistd#if _proto_open && __cplusplusextern int sysopenf _ARG_((const char*, int, ...));#endifextern int sysclosef _ARG_((int));extern ssize_t sysreadf _ARG_((int, void*, size_t));extern ssize_t syswritef _ARG_((int, const void*, size_t));extern sfoff_t syslseekf _ARG_((int, sfoff_t, int));extern int sysdupf _ARG_((int));extern int syspipef _ARG_((int*));extern int sysaccessf _ARG_((const char*, int));extern int sysremovef _ARG_((const char*));extern int sysfstatf _ARG_((int, sfstat_t*));extern int sysstatf _ARG_((const char*, sfstat_t*));extern int isatty _ARG_((int));extern int wait _ARG_((int*));extern uint sleep _ARG_((uint));extern int execl _ARG_((const char*, const char*,...));extern int execv _ARG_((const char*, char**));#if !defined(fork)extern int fork _ARG_((void));#endif#if _lib_unlinkextern int unlink _ARG_((const char*));#endif#endif /*_hdr_unistd*/#if _lib_bcopy && !_proto_bcopyextern void bcopy _ARG_((const void*, void*, size_t));#endif#if _lib_bzero && !_proto_bzeroextern void bzero _ARG_((void*, size_t));#endifextern time_t time _ARG_((time_t*));extern int waitpid _ARG_((int,int*,int));extern void _exit _ARG_((int));typedef int(* Onexit_f)_ARG_((void));extern Onexit_f onexit _ARG_((Onexit_f));#if _lib_vfork && !_hdr_vfork && !_sys_vforkextern pid_t vfork _ARG_((void));#endif /*_lib_vfork*/#if _lib_poll#if _lib_poll_fd_1extern int poll _ARG_((struct pollfd*, ulong, int));#elseextern int poll _ARG_((ulong, struct pollfd*, int));#endif#endif /*_lib_poll*/#endif /* _PACKAGE_ast */_END_EXTERNS_#endif /*_SFHDR_H*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?