📄 sfio.h
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#ifndef _SFIO_H#define _SFIO_H 1#define SFIO_VERSION 20050201L/* Public header file for the sfio library**** Written by Kiem-Phong Vo*/typedef struct _sfio_s Sfio_t;typedef struct _sfdisc_s Sfdisc_t;#if defined(_AST_STD_H) || defined(_PACKAGE_ast) && defined(_SFIO_PRIVATE)#include <ast_std.h>#else#include <ast_common.h>#endif /* _PACKAGE_ast *//* Sfoff_t should be large enough for largest file address */#define Sfoff_t _ast_intmax_t#define Sflong_t _ast_intmax_t#define Sfulong_t unsigned _ast_intmax_t#define Sfdouble_t _ast_fltmax_ttypedef ssize_t (*Sfread_f)_ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));typedef ssize_t (*Sfwrite_f)_ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));typedef Sfoff_t (*Sfseek_f)_ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));typedef int (*Sfexcept_f)_ARG_((Sfio_t*, int, Void_t*, Sfdisc_t*));/* discipline structure */struct _sfdisc_s{ Sfread_f readf; /* read function */ Sfwrite_f writef; /* write function */ Sfseek_f seekf; /* seek function */ Sfexcept_f exceptf; /* to handle exceptions */ Sfdisc_t* disc; /* the continuing discipline */};#include <sfio_s.h>/* formatting environment */typedef struct _sffmt_s Sffmt_t;typedef int (*Sffmtext_f)_ARG_((Sfio_t*, Void_t*, Sffmt_t*));typedef int (*Sffmtevent_f)_ARG_((Sfio_t*, int, Void_t*, Sffmt_t*));struct _sffmt_s{ long version;/* version of this structure */ Sffmtext_f extf; /* function to process arguments */ Sffmtevent_f eventf; /* process events */ char* form; /* format string to stack */ _ast_va_list args; /* corresponding arg list */ int fmt; /* format character */ ssize_t size; /* object size */ int flags; /* formatting flags */ int width; /* width of field */ int precis; /* precision required */ int base; /* conversion base */ char* t_str; /* type string */ ssize_t n_str; /* length of t_str */ Void_t* mbs; /* multibyte state for format string */ Void_t* none; /* unused for now */};#define sffmtversion(fe,type) \ (type ? ((fe)->version = SFIO_VERSION) : (fe)->version)#define SFFMT_SSHORT 00000010 /* 'hh' flag, char */#define SFFMT_TFLAG 00000020 /* 't' flag, ptrdiff_t */#define SFFMT_ZFLAG 00000040 /* 'z' flag, size_t */#define SFFMT_LEFT 00000100 /* left-justification */#define SFFMT_SIGN 00000200 /* must have a sign */#define SFFMT_BLANK 00000400 /* if not signed, prepend a blank */#define SFFMT_ZERO 00001000 /* zero-padding on the left */#define SFFMT_ALTER 00002000 /* alternate formatting */#define SFFMT_THOUSAND 00004000 /* thousand grouping */#define SFFMT_SKIP 00010000 /* skip assignment in scanf() */#define SFFMT_SHORT 00020000 /* 'h' flag */#define SFFMT_LONG 00040000 /* 'l' flag */#define SFFMT_LLONG 00100000 /* 'll' flag */#define SFFMT_LDOUBLE 00200000 /* 'L' flag */#define SFFMT_VALUE 00400000 /* value is returned */#define SFFMT_ARGPOS 01000000 /* getting arg for $ patterns */#define SFFMT_IFLAG 02000000 /* 'I' flag */#define SFFMT_JFLAG 04000000 /* 'j' flag, intmax_t */#define SFFMT_SET 07777770 /* flags settable on calling extf *//* for sfmutex() call */#define SFMTX_LOCK 0 /* up mutex count */#define SFMTX_TRYLOCK 1 /* try to up mutex count */#define SFMTX_UNLOCK 2 /* down mutex count */#define SFMTX_CLRLOCK 3 /* clear mutex count *//* various constants */#ifndef NULL#define NULL 0#endif#ifndef EOF#define EOF (-1)#endif#ifndef SEEK_SET#define SEEK_SET 0#define SEEK_CUR 1#define SEEK_END 2#endif/* bits for various types of files */#define SF_READ 0000001 /* open for reading */#define SF_WRITE 0000002 /* open for writing */#define SF_STRING 0000004 /* a string stream */#define SF_APPENDWR 0000010 /* file is in append mode only */#define SF_MALLOC 0000020 /* buffer is malloc-ed */#define SF_LINE 0000040 /* line buffering */#define SF_SHARE 0000100 /* stream with shared file descriptor */#define SF_EOF 0000200 /* eof was detected */#define SF_ERROR 0000400 /* an error happened */#define SF_STATIC 0001000 /* a stream that cannot be freed */#define SF_IOCHECK 0002000 /* call exceptf before doing IO */#define SF_PUBLIC 0004000 /* SF_SHARE and follow physical seek */#define SF_MTSAFE 0010000 /* need thread safety */#define SF_WHOLE 0020000 /* preserve wholeness of sfwrite/sfputr */#define SF_IOINTR 0040000 /* return on interrupts */#define SF_FLAGS 0077177 /* PUBLIC FLAGS PASSABLE TO SFNEW() */#define SF_SETS 0077163 /* flags passable to sfset() */#ifndef _SF_NO_OBSOLETE#define SF_BUFCONST 0400000 /* unused flag - for compatibility only */#endif/* for sfgetr/sfreserve to hold a record */#define SF_LOCKR 0000010 /* lock record, stop access to stream */#define SF_LASTR 0000020 /* get the last incomplete record *//* exception events: SF_NEW(0), SF_READ(1), SF_WRITE(2) and the below */#define SF_SEEK 3 /* seek error */#define SF_CLOSING 4 /* when stream is about to be closed */#define SF_DPUSH 5 /* when discipline is being pushed */#define SF_DPOP 6 /* when discipline is being popped */#define SF_DPOLL 7 /* see if stream is ready for I/O */#define SF_DBUFFER 8 /* buffer not empty during push or pop */#define SF_SYNC 9 /* announcing start/end synchronization */#define SF_PURGE 10 /* a sfpurge() call was issued */#define SF_FINAL 11 /* closing is done except stream free */#define SF_READY 12 /* a polled stream is ready */#define SF_LOCKED 13 /* stream is in a locked state */#define SF_ATEXIT 14 /* process is exiting */#define SF_EVENT 100 /* start of user-defined events *//* for stack and disciplines */#define SF_POPSTACK ((Sfio_t*)0) /* pop the stream stack */#define SF_POPDISC ((Sfdisc_t*)0) /* pop the discipline stack *//* for the notify function and discipline exception */#define SF_NEW 0 /* new stream */#define SF_SETFD (-1) /* about to set the file descriptor */#define SF_BUFSIZE 8192 /* default buffer size */#define SF_UNBOUND (-1) /* unbounded buffer size *//* namespace incursion workarounds -- migrate to the new names */#if !_mac_SF_APPEND#define SF_APPEND SF_APPENDWR /* BSDI sys/stat.h */#endif#if !_mac_SF_CLOSE#define SF_CLOSE SF_CLOSING /* AIX sys/socket.h */#endif_BEGIN_EXTERNS_extern ssize_t _Sfi;/* standard in/out/err streams */#if _BLD_sfio && defined(__EXPORT__)#define extern extern __EXPORT__#endif#if !_BLD_sfio && defined(__IMPORT__)#define extern extern __IMPORT__#endifextern Sfio_t* sfstdin;extern Sfio_t* sfstdout;extern Sfio_t* sfstderr;#if _UWIN#undef extern#endifextern Sfio_t _Sfstdin;extern Sfio_t _Sfstdout;extern Sfio_t _Sfstderr;#undef extern#if _BLD_sfio && defined(__EXPORT__)#define extern __EXPORT__#endifextern Sfio_t* sfnew _ARG_((Sfio_t*, Void_t*, size_t, int, int));extern Sfio_t* sfopen _ARG_((Sfio_t*, const char*, const char*));extern Sfio_t* sfpopen _ARG_((Sfio_t*, const char*, const char*));extern Sfio_t* sfstack _ARG_((Sfio_t*, Sfio_t*));extern Sfio_t* sfswap _ARG_((Sfio_t*, Sfio_t*));extern Sfio_t* sftmp _ARG_((size_t));extern int sfpurge _ARG_((Sfio_t*));extern int sfpoll _ARG_((Sfio_t**, int, int));extern Void_t* sfreserve _ARG_((Sfio_t*, ssize_t, int));extern int sfresize _ARG_((Sfio_t*, Sfoff_t));extern int sfsync _ARG_((Sfio_t*));extern int sfclrlock _ARG_((Sfio_t*));extern Void_t* sfsetbuf _ARG_((Sfio_t*, Void_t*, size_t));extern Sfdisc_t* sfdisc _ARG_((Sfio_t*,Sfdisc_t*));extern int sfraise _ARG_((Sfio_t*, int, Void_t*));extern int sfnotify _ARG_((void(*)(Sfio_t*, int, int)));extern int sfset _ARG_((Sfio_t*, int, int));extern int sfsetfd _ARG_((Sfio_t*, int));extern Sfio_t* sfpool _ARG_((Sfio_t*, Sfio_t*, int));extern ssize_t sfread _ARG_((Sfio_t*, Void_t*, size_t));extern ssize_t sfwrite _ARG_((Sfio_t*, const Void_t*, size_t));extern Sfoff_t sfmove _ARG_((Sfio_t*, Sfio_t*, Sfoff_t, int));extern int sfclose _ARG_((Sfio_t*));extern Sfoff_t sftell _ARG_((Sfio_t*));extern Sfoff_t sfseek _ARG_((Sfio_t*, Sfoff_t, int));extern ssize_t sfputr _ARG_((Sfio_t*, const char*, int));extern char* sfgetr _ARG_((Sfio_t*, int, int));extern ssize_t sfnputc _ARG_((Sfio_t*, int, size_t));extern int sfungetc _ARG_((Sfio_t*, int));extern int sfprintf _ARG_((Sfio_t*, const char*, ...));extern char* sfprints _ARG_((const char*, ...));extern ssize_t sfsprintf _ARG_((char*, size_t, const char*, ...));extern ssize_t sfvsprintf _ARG_((char*, size_t, const char*, _ast_va_list));extern int sfvprintf _ARG_((Sfio_t*, const char*, _ast_va_list));extern int sfscanf _ARG_((Sfio_t*, const char*, ...));extern int sfsscanf _ARG_((const char*, const char*, ...));extern int sfvsscanf _ARG_((const char*, const char*, _ast_va_list));extern int sfvscanf _ARG_((Sfio_t*, const char*, _ast_va_list));/* mutex locking for thread-safety */extern int sfmutex _ARG_((Sfio_t*, int));/* io functions with discipline continuation */extern ssize_t sfrd _ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));extern ssize_t sfwr _ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));extern Sfoff_t sfsk _ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));extern ssize_t sfpkrd _ARG_((int, Void_t*, size_t, int, long, int));/* portable handling of primitive types */extern int sfdlen _ARG_((Sfdouble_t));extern int sfllen _ARG_((Sflong_t));extern int sfulen _ARG_((Sfulong_t));extern int sfputd _ARG_((Sfio_t*, Sfdouble_t));extern int sfputl _ARG_((Sfio_t*, Sflong_t));extern int sfputu _ARG_((Sfio_t*, Sfulong_t));extern int sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));extern int sfputc _ARG_((Sfio_t*, int));extern Sfdouble_t sfgetd _ARG_((Sfio_t*));extern Sflong_t sfgetl _ARG_((Sfio_t*));extern Sfulong_t sfgetu _ARG_((Sfio_t*));extern Sfulong_t sfgetm _ARG_((Sfio_t*, Sfulong_t));extern int sfgetc _ARG_((Sfio_t*));extern int _sfputd _ARG_((Sfio_t*, Sfdouble_t));extern int _sfputl _ARG_((Sfio_t*, Sflong_t));extern int _sfputu _ARG_((Sfio_t*, Sfulong_t));extern int _sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));extern int _sfflsbuf _ARG_((Sfio_t*, int));extern int _sffilbuf _ARG_((Sfio_t*, int));extern int _sfdlen _ARG_((Sfdouble_t));extern int _sfllen _ARG_((Sflong_t));extern int _sfulen _ARG_((Sfulong_t));/* miscellaneous function analogues of fast in-line functions */extern Sfoff_t sfsize _ARG_((Sfio_t*));extern int sfclrerr _ARG_((Sfio_t*));extern int sfeof _ARG_((Sfio_t*));extern int sferror _ARG_((Sfio_t*));extern int sffileno _ARG_((Sfio_t*));extern int sfstacked _ARG_((Sfio_t*));extern ssize_t sfvalue _ARG_((Sfio_t*));extern ssize_t sfslen _ARG_((void));#undef extern_END_EXTERNS_/* coding long integers in a portable and compact fashion */#define SF_SBITS 6#define SF_UBITS 7#define SF_BBITS 8#define SF_SIGN (1 << SF_SBITS)#define SF_MORE (1 << SF_UBITS)#define SF_BYTE (1 << SF_BBITS)#define SF_U1 SF_MORE#define SF_U2 (SF_U1*SF_U1)#define SF_U3 (SF_U2*SF_U1)#define SF_U4 (SF_U3*SF_U1)#if __cplusplus#define _SF_(f) (f)#else#define _SF_(f) ((Sfio_t*)(f))#endif#define __sf_putd(f,v) (_sfputd(_SF_(f),(Sfdouble_t)(v)))#define __sf_putl(f,v) (_sfputl(_SF_(f),(Sflong_t)(v)))#define __sf_putu(f,v) (_sfputu(_SF_(f),(Sfulong_t)(v)))#define __sf_putm(f,v,m) (_sfputm(_SF_(f),(Sfulong_t)(v),(Sfulong_t)(m)))#define __sf_putc(f,c) (_SF_(f)->_next >= _SF_(f)->_endw ? \ _sfflsbuf(_SF_(f),(int)((unsigned char)(c))) : \ (int)(*_SF_(f)->_next++ = (unsigned char)(c)) )#define __sf_getc(f) (_SF_(f)->_next >= _SF_(f)->_endr ? _sffilbuf(_SF_(f),0) : \ (int)(*_SF_(f)->_next++) )#define __sf_dlen(v) (_sfdlen((Sfdouble_t)(v)) )#define __sf_llen(v) (_sfllen((Sflong_t)(v)) )#define __sf_ulen(v) ((Sfulong_t)(v) < SF_U1 ? 1 : (Sfulong_t)(v) < SF_U2 ? 2 : \ (Sfulong_t)(v) < SF_U3 ? 3 : (Sfulong_t)(v) < SF_U4 ? 4 : 5)#define __sf_fileno(f) (_SF_(f)->_file)#define __sf_eof(f) (_SF_(f)->_flags&SF_EOF)#define __sf_error(f) (_SF_(f)->_flags&SF_ERROR)#define __sf_clrerr(f) (_SF_(f)->_flags &= ~(SF_ERROR|SF_EOF))#define __sf_stacked(f) (_SF_(f)->_push != (Sfio_t*)0)#define __sf_value(f) (_SF_(f)->_val)#define __sf_slen() (_Sfi)#if defined(__INLINE__) && !_BLD_sfio__INLINE__ int sfputd(Sfio_t* f, Sfdouble_t v) { return __sf_putd(f,v); }__INLINE__ int sfputl(Sfio_t* f, Sflong_t v) { return __sf_putl(f,v); }__INLINE__ int sfputu(Sfio_t* f, Sfulong_t v) { return __sf_putu(f,v); }__INLINE__ int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t m) { return __sf_putm(f,v,m); }__INLINE__ int sfputc(Sfio_t* f, int c) { return __sf_putc(f,c); }__INLINE__ int sfgetc(Sfio_t* f) { return __sf_getc(f); }__INLINE__ int sfdlen(Sfdouble_t v) { return __sf_dlen(v); }__INLINE__ int sfllen(Sflong_t v) { return __sf_llen(v); }__INLINE__ int sfulen(Sfulong_t v) { return __sf_ulen(v); }__INLINE__ int sffileno(Sfio_t* f) { return __sf_fileno(f); }__INLINE__ int sfeof(Sfio_t* f) { return __sf_eof(f); }__INLINE__ int sferror(Sfio_t* f) { return __sf_error(f); }__INLINE__ int sfclrerr(Sfio_t* f) { return __sf_clrerr(f); }__INLINE__ int sfstacked(Sfio_t* f) { return __sf_stacked(f); }__INLINE__ ssize_t sfvalue(Sfio_t* f) { return __sf_value(f); }#else#define sfputd(f,v) ( __sf_putd((f),(v)) )#define sfputl(f,v) ( __sf_putl((f),(v)) )#define sfputu(f,v) ( __sf_putu((f),(v)) )#define sfputm(f,v,m) ( __sf_putm((f),(v),(m)) )#define sfputc(f,c) ( __sf_putc((f),(c)) )#define sfgetc(f) ( __sf_getc(f) )#define sfdlen(v) ( __sf_dlen(v) )#define sfllen(v) ( __sf_llen(v) )#define sfulen(v) ( __sf_ulen(v) )#define sffileno(f) ( __sf_fileno(f) )#define sfeof(f) ( __sf_eof(f) )#define sferror(f) ( __sf_error(f) )#define sfclrerr(f) ( __sf_clrerr(f) )#define sfstacked(f) ( __sf_stacked(f) )#define sfvalue(f) ( __sf_value(f) )#define sfslen() ( __sf_slen() )#endif /*__INLINE__*/#ifndef _SFSTR_H /* GSF's string manipulation stuff */#define _SFSTR_H 1#define sfstropen() sfnew(0, 0, -1, -1, SF_READ|SF_WRITE|SF_STRING)#define sfstrclose(f) sfclose(f)#define sfstrseek(f,p,m) \ ( (m) == SEEK_SET ? \ (((p) < 0 || (p) > (f)->_size) ? (char*)0 : \ (char*)((f)->_next = (f)->_data+(p)) ) \ : (m) == SEEK_CUR ? \ ((f)->_next += (p), \ (((f)->_next < (f)->_data || (f)->_next > (f)->_data+(f)->_size) ? \ ((f)->_next -= (p), (char*)0) : (char*)(f)->_next ) ) \ : (m) == SEEK_END ? \ ( ((p) > 0 || (f)->_size+(p) < 0) ? (char*)0 : \ (char*)((f)->_next = (f)->_data+(f)->_size+(p)) ) \ : (char*)0 \ )#define sfstrsize(f) ((f)->_size)#define sfstrtell(f) ((f)->_next - (f)->_data)#define sfstrpend(f) ((f)->_size - sfstrtell())#define sfstrbase(f) ((char*)(f)->_data)#define sfstruse(f) \ (sfputc((f),0) < 0 ? (char*)0 : (char*)((f)->_next = (f)->_data) \ )#define sfstrrsrv(f,n) \ (sfreserve((f),(n),SF_WRITE|SF_LOCKR), sfwrite((f),(f)->_next,0), \ ((f)->_next+(n) <= (f)->_data+(f)->_size ? (char*)(f)->_next : (char*)0) \ )#define sfstrbuf(f,b,n,m) \ (sfsetbuf((f),(b),(n)), ((f)->_flags |= (m) ? SF_MALLOC : 0), \ ((f)->_data == (unsigned char*)(b) ? 0 : -1) \ )#endif /* _SFSTR_H */#endif /* _SFIO_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -