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/* Internal definitions for sfio.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* define va_list, etc. before including sfio_t.h (sfio.h) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* some systems don't know large files */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _LARGEFILE64_SOURCE 1 /* enabling the *64 stuff */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define const
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !_PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* note that the macro vt_threaded has effect on vthread.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* file system info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* ast always provides multibyte handling */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /*!_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* when building the binary compatibility package, a number of header files
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin are not needed and they may get in the way so we remove them here.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_sys_stat*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_sys_filio*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_filio*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_FIOCLEX*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*F_SETFD*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!_LARGEFILE64_SOURCE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* see if we can use memory mapping for io */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* standardize system calls and types dealing with files */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* deal with multi-byte character and string conversions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _has_multibyte */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* dealing with streams that might be accessed concurrently */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { (*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFONCE() (_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXUNLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN(ff,v) { SFMTXbegin((ff), _mtxf1_, (v) ); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXENTER(ff,v) { if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXRETURN(ff,v) { SFMTXEND(ff); return(v); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN2(ff,v) { SFMTXbegin((ff), _mtxf2_, (v) ); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXEND2(ff) { SFMTXend((ff), _mtxf2_); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define POOLMTXRETURN(p,rv) { POOLMTXUNLOCK(p); return(rv); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /*!vt_threaded*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SF_MTSAFE /* no need to worry about thread-safety */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*vt_threaded*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* functions for polling readiness of streams */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_select_*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_poll*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* to test for executable access mode of a file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* alternative process forking */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_vfork && !defined(fork) && !defined(sparc) && !defined(__sparc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* to get rid of pesky compiler warnings */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Private flags in the "bits" field */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_HOLE 00000004 /* a hole of zero's was created */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PRIVATE 00000100 /* private stream to Sfio, no mutex */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_ENDING 00000200 /* no re-io on interrupts at closing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_WIDE 00000400 /* in wide mode - stdio only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* "bits" flags that must be cleared in sfclrlock */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_DCDOWN 00010000 /* recurse down the discipline stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_WCFORMAT 00020000 /* wchar_t formatting - stdio only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWCGET(f,v) (((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MVSIZE 00040000 /* f->size was reset in sfmove() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMVSET(f) (((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFCLRBITS(f) (SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* bits for the mode field, SF_INIT defined in sfio_t.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_RV 00000020 /* reserve without read or most write */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LOCK 00000040 /* stream is locked for io op */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_POOL 00000200 /* stream is in a pool but not current */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_GETR 00002000 /* did a getr on this stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_STDIO 00010000 /* given up the buffer to stdio */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_AVAIL 00020000 /* was closed, available for reuse */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LOCAL 00100000 /* sentinel for a local call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* short-hands */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* macros do determine stream types from sfstat_t data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_CREATMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set close-on-exec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /*FD_CLOEXEC*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define SETCLOEXEC(fd) ((void)fcntl((fd),F_SETFD,FD_CLOEXEC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /*FIOCLEX*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*F_SETFD*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* a couple of error number that we use, default values are like Linux */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* function to get the decimal point for local environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do if (*(dp) == 0) { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_numeric_t* lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(decimal) == 0) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(thousand && lv->thousands_sep && *lv->thousands_sep) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!defined(SFSETLOCALE) && _lib_locale*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(SFSETLOCALE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* stream pool structure. */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* reserve buffer structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* co-process structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* extensions to sfvprintf/sfvscanf */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (ft->width = wid), (ft->precis = pr), (ft->base = bs), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (wid = ft->width), (pr = ft->precis), (bs = ft->base) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* format flags&types, must coexist with those in sfio.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_FORBIDDEN 000077777777 /* for sfio.h only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_EFORMAT 001000000000 /* sfcvt converting %e */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_AFORMAT 004000000000 /* sfcvt converting %a */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_UPPER 010000000000 /* sfcvt converting upper */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_TYPES (SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* type of elements to be converted */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* local variables used across sf-functions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* get the real value of a byte in a coded long or ulong */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* pick this many bits in each iteration of double encoding */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* grain size for buffer increment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* when the buffer is empty, certain io requests may be better done directly
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on the given application buffers. The below condition determines when.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* number of pages to memory map at a time */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set/unset sequential states for mmap */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMUNMAP(f,a,s) (sysmunmapf((caddr_t)(a),(size_t)(s)), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* safe closing function */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CLOSE(f) { while(sysclosef(f) < 0 && errno == EINTR) errno = 0; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* the bottomless bit bucket */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETNULL(f) ((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFISNULL(f) ((f)->extent < 0 && ((f)->bits&SF_NULL) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFKILLED(f) (((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* exception types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GETLOCAL(f,v) ((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFISALL(f,v) ((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSK(f,a,o,d) (SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFRD(f,b,n,d) (SETLOCAL(f),sfrd(f,(Void_t*)b,n,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWR(f,b,n,d) (SETLOCAL(f),sfwr(f,(Void_t*)b,n,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* lock/open a stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMODE(f,l) ((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFLOCK(f,l) (void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPENRD(f) ((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPENWR(f) ((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPEN(f) ((f)->mode == SF_READ ? _SFOPENRD(f) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* check to see if the stream can be accessed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFROZEN(f) (((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set discipline code */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(d) (dc) = d; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* fast peek of a stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFAVAIL(f,s,n) ((n) = (f)->endb - ((s) = (f)->next) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* more than this for a line buffer, we might as well flush */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* string stream extent */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSTRSIZE(f) { Sfoff_t s = (f)->next - (f)->data; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(s > (f)->here) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* control flags for open() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /* for example, research UNIX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*O_CREAT*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_RADIX 64 /* maximum integer conversion base */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* floating point to ascii conversion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FDIGITS 1024 /* max allowed fractional digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_IDIGITS (8*1024) /* max number of digits in int part */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FDIGITS 256 /* max allowed fractional digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_IDIGITS 1024 /* max number of digits in int part */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXDIGITS (((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* tables for numerical translation */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Sfdouble_t sf_pos10[SF_MAXEXP10]; /* positive powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t sf_neg10[SF_MAXEXP10]; /* negative powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Fmtpos_t* (*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t* sf_ldbl_pow10; /* Sfdouble_t powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_cv36[SF_MAXCHAR+1]; /* conversion for base [2-36] */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_cv64[SF_MAXCHAR+1]; /* conversion for base [37-64] */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_type[SF_MAXCHAR+1]; /* conversion formats&types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* thread-safe macro/function to initialize _Sfcv* conversion tables */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFCVINIT() (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* sfucvt() converts decimal integers to ASCII */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 100) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(v < 10) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(v < 1000) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* handy functions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* fast functions for memory copy and memory clear */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* note that MEMCPY advances the associated pointers */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { default : memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; break; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { default : memset((Void_t*)s,(int)c,n); s += n; break; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 7 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 6 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 5 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 4 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 3 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 2 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 1 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinextern char* _sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern extern __IMPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for portable encoding of double values */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memchr _ARG_((const void*, int, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memccpy _ARG_((void*, const void*, int, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memcpy _ARG_((void*, const void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(strtod)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(remove)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !__STDC__ && !_hdr_stdlib */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t syswritef _ARG_((int, const void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(fork)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_unistd*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_vfork*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_poll*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_SFHDR_H*/