da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Public header file for the sfio library
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_AST_STD_H) || defined(_PACKAGE_ast) && defined(_SFIO_PRIVATE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Sfoff_t should be large enough for largest file address */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef ssize_t (*Sfread_f)_ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef ssize_t (*Sfwrite_f)_ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef Sfoff_t (*Sfseek_f)_ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef int (*Sfexcept_f)_ARG_((Sfio_t*, int, Void_t*, Sfdisc_t*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztypedef int (*Sfwalk_f)_ARG_((Sfio_t*, Void_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* discipline structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* formatting environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef int (*Sffmtext_f)_ARG_((Sfio_t*, Void_t*, Sffmt_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef int (*Sffmtevent_f)_ARG_((Sfio_t*, int, Void_t*, Sffmt_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((type) ? ((fe)->version = SFIO_VERSION) : (fe)->version)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_BLANK 000000400 /* if not signed, prepend a blank */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_ZERO 000001000 /* zero-padding on the left */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_ALTER 000002000 /* alternate formatting */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_THOUSAND 000004000 /* thousand grouping */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_SKIP 000010000 /* skip assignment in scanf() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_ARGPOS 001000000 /* getting arg for $ patterns */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_CENTER 010000000 /* '=' flag, center justification */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_SET 017777770 /* flags settable on calling extf */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for sfmutex() call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* various constants */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* bits for various types of files */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_APPENDWR 0000010 /* file is in append mode only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_SHARE 0000100 /* stream with shared file descriptor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_STATIC 0001000 /* a stream that cannot be freed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_IOCHECK 0002000 /* call exceptf before doing IO */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PUBLIC 0004000 /* SF_SHARE and follow physical seek */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_WHOLE 0020000 /* preserve wholeness of sfwrite/sfputr */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FLAGS 0177177 /* PUBLIC FLAGS PASSABLE TO SFNEW() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_BUFCONST 0400000 /* unused flag - for compatibility only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for sfgetr/sfreserve to hold a record */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LOCKR 0000010 /* lock record, stop access to stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LASTR 0000020 /* get the last incomplete record */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* exception events: SF_NEW(0), SF_READ(1), SF_WRITE(2) and the below */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_CLOSING 4 /* when stream is about to be closed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_DPUSH 5 /* when discipline is being pushed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_DBUFFER 8 /* buffer not empty during push or pop */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_SYNC 9 /* announcing start/end synchronization */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FINAL 11 /* closing is done except stream free */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for stack and disciplines */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_POPSTACK ((Sfio_t*)0) /* pop the stream stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_POPDISC ((Sfdisc_t*)0) /* pop the discipline stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for the notify function and discipline exception */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_SETFD (-1) /* about to set the file descriptor */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SF_MTACCESS (-2) /* starting a multi-threaded stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* namespace incursion workarounds -- migrate to the new names */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* standard in/out/err streams */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern extern __IMPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfio_t* sfnew _ARG_((Sfio_t*, Void_t*, size_t, int, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfio_t* sfopen _ARG_((Sfio_t*, const char*, const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfio_t* sfpopen _ARG_((Sfio_t*, const char*, const char*));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzextern int sfwalk _ARG_((Sfwalk_f, Void_t*, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* sfreserve _ARG_((Sfio_t*, ssize_t, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* sfsetbuf _ARG_((Sfio_t*, Void_t*, size_t));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinextern int sfnotify _ARG_((void(*)(Sfio_t*, int, void*)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfread _ARG_((Sfio_t*, Void_t*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfwrite _ARG_((Sfio_t*, const Void_t*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfoff_t sfmove _ARG_((Sfio_t*, Sfio_t*, Sfoff_t, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfputr _ARG_((Sfio_t*, const char*, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfsprintf _ARG_((char*, size_t, const char*, ...));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfvsprintf _ARG_((char*, size_t, const char*, va_list));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sfvprintf _ARG_((Sfio_t*, const char*, va_list));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sfsscanf _ARG_((const char*, const char*, ...));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sfvsscanf _ARG_((const char*, const char*, va_list));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sfvscanf _ARG_((Sfio_t*, const char*, va_list));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* mutex locking for thread-safety */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* io functions with discipline continuation */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfrd _ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfwr _ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfoff_t sfsk _ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sfpkrd _ARG_((int, Void_t*, size_t, int, long, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* portable handling of primitive types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* miscellaneous function analogues of fast in-line functions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* coding long integers in a portable and compact fashion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_putd(f,v) (_sfputd(_SF_(f),(Sfdouble_t)(v)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_putu(f,v) (_sfputu(_SF_(f),(Sfulong_t)(v)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_putm(f,v,m) (_sfputm(_SF_(f),(Sfulong_t)(v),(Sfulong_t)(m)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_putc(f,c) (_SF_(f)->_next >= _SF_(f)->_endw ? \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_getc(f) (_SF_(f)->_next >= _SF_(f)->_endr ? _sffilbuf(_SF_(f),0) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_ulen(v) ((Sfulong_t)(v) < SF_U1 ? 1 : (Sfulong_t)(v) < SF_U2 ? 2 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (Sfulong_t)(v) < SF_U3 ? 3 : (Sfulong_t)(v) < SF_U4 ? 4 : 5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_clrerr(f) (_SF_(f)->_flags &= ~(SF_ERROR|SF_EOF))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __sf_maxr(n,s) ((s)?((_Sfi=_Sfmaxr),(_Sfmaxr=(n)),_Sfi):_Sfmaxr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfputd(Sfio_t* f, Sfdouble_t v) { return __sf_putd(f,v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfputl(Sfio_t* f, Sflong_t v) { return __sf_putl(f,v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfputu(Sfio_t* f, Sfulong_t v) { return __sf_putu(f,v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { return __sf_putm(f,v,m); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfputc(Sfio_t* f, int c) { return __sf_putc(f,c); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfgetc(Sfio_t* f) { return __sf_getc(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfdlen(Sfdouble_t v) { return __sf_dlen(v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfllen(Sflong_t v) { return __sf_llen(v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfulen(Sfulong_t v) { return __sf_ulen(v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sffileno(Sfio_t* f) { return __sf_fileno(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sferror(Sfio_t* f) { return __sf_error(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfclrerr(Sfio_t* f) { return __sf_clrerr(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ int sfstacked(Sfio_t* f) { return __sf_stacked(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ ssize_t sfvalue(Sfio_t* f) { return __sf_value(f); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin__INLINE__ ssize_t sfmaxr(ssize_t n, int s) { return __sf_maxr(n,s); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*__INLINE__*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfstropen() sfnew(0, 0, -1, -1, SF_READ|SF_WRITE|SF_STRING)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ( (m) == SEEK_SET ? \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (((p) < 0 || (p) > (f)->_size) ? (char*)0 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin : (m) == SEEK_CUR ? \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->_next += (p), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (((f)->_next < (f)->_data || (f)->_next > (f)->_data+(f)->_size) ? \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->_next -= (p), (char*)0) : (char*)(f)->_next ) ) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin : (m) == SEEK_END ? \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ( ((p) > 0 || (f)->_size+(p) < 0) ? (char*)0 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin : (char*)0 \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (sfputc((f),0) < 0 ? (char*)0 : (char*)((f)->_next = (f)->_data) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (sfreserve((f),(n),SF_WRITE|SF_LOCKR), sfwrite((f),(f)->_next,0), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->_next+(n) <= (f)->_data+(f)->_size ? (char*)(f)->_next : (char*)0) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (sfsetbuf((f),(b),(n)), ((f)->_flags |= (m) ? SF_MALLOC : 0), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _SFSTR_H */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _SFIO_H */