14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #ifndef _SFHDR_H 234887Schin #define _SFHDR_H 1 244887Schin #if !defined(_BLD_sfio) && !defined(_BLD_stdio) 254887Schin #define _BLD_sfio 1 264887Schin #endif 274887Schin 284887Schin /* Internal definitions for sfio. 294887Schin ** Written by Kiem-Phong Vo 304887Schin */ 314887Schin 324887Schin #define _next next 334887Schin #define _endw endw 344887Schin #define _endr endr 354887Schin #define _endb endb 364887Schin #define _push push 374887Schin #define _flags flags 384887Schin #define _file file 394887Schin #define _data data 404887Schin #define _size size 414887Schin #define _val val 424887Schin 434887Schin #include "FEATURE/sfio" 444887Schin #include "FEATURE/mmap" 454887Schin 464887Schin /* define va_list, etc. before including sfio_t.h (sfio.h) */ 474887Schin #if !_PACKAGE_ast 484887Schin 494887Schin /* some systems don't know large files */ 504887Schin #if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */ 514887Schin #undef _NO_LARGEFILE64_SOURCE 524887Schin #define _NO_LARGEFILE64_SOURCE 1 534887Schin #undef _LARGEFILE64_SOURCE 544887Schin #undef _LARGEFILE_SOURCE 554887Schin #endif 564887Schin 574887Schin #if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64 584887Schin #undef _LARGEFILE64_SOURCE 594887Schin #undef _LARGEFILE_SOURCE 604887Schin #undef _FILE_OFFSET_BITS 614887Schin #define _LARGEFILE64_SOURCE 1 /* enabling the *64 stuff */ 624887Schin #define _LARGEFILE_SOURCE 1 634887Schin #endif 644887Schin 654887Schin #if _hdr_stdarg 664887Schin #include <stdarg.h> 674887Schin #else 684887Schin #include <varargs.h> 694887Schin #endif 704887Schin #include "FEATURE/common" 714887Schin #if !__STD_C 724887Schin #define const 734887Schin #endif 744887Schin #endif /* !_PACKAGE_ast */ 754887Schin 764887Schin #include "sfio_t.h" 774887Schin 784887Schin /* note that the macro vt_threaded has effect on vthread.h */ 794887Schin #include <vthread.h> 804887Schin 814887Schin /* file system info */ 824887Schin #if _PACKAGE_ast 834887Schin 844887Schin #include <ast.h> 854887Schin #include <ast_time.h> 864887Schin #include <ast_tty.h> 874887Schin #include <ls.h> 884887Schin 894887Schin /* ast always provides multibyte handling */ 904887Schin #undef _hdr_wchar 914887Schin #undef _lib_mbrtowc 924887Schin #undef _lib_wcrtomb 934887Schin #define _hdr_wchar 1 944887Schin #define _lib_mbrtowc 1 954887Schin #define _lib_wcrtomb 1 964887Schin 974887Schin #if _mem_st_blksize_stat 984887Schin #define _stat_blksize 1 994887Schin #endif 1004887Schin 1014887Schin #if _lib_localeconv && _hdr_locale 1024887Schin #define _lib_locale 1 1034887Schin #endif 1044887Schin 1054887Schin #define sfoff_t off_t 1064887Schin #define sfstat_t struct stat 1074887Schin #define sysclosef close 1084887Schin #define syscreatf creat 1094887Schin #define sysdupf dup 1104887Schin #define sysfcntlf fcntl 1114887Schin #define sysfstatf fstat 1124887Schin #define sysftruncatef ftruncate 1134887Schin #define syslseekf lseek 1144887Schin #define sysmmapf mmap 1154887Schin #define sysmunmapf munmap 1164887Schin #define sysopenf open 1174887Schin #define syspipef pipe 1184887Schin #define sysreadf read 1194887Schin #define sysremovef remove 1204887Schin #define sysstatf stat 1214887Schin #define syswritef write 1224887Schin 1234887Schin #else /*!_PACKAGE_ast*/ 1244887Schin 1254887Schin /* when building the binary compatibility package, a number of header files 1264887Schin are not needed and they may get in the way so we remove them here. 1274887Schin */ 1284887Schin #if _SFBINARY_H 1294887Schin #undef _hdr_time 1304887Schin #undef _sys_time 1314887Schin #undef _sys_stat 1324887Schin #undef _hdr_stat 1334887Schin #undef _hdr_filio 1344887Schin #undef _sys_filio 1354887Schin #undef _lib_poll 1364887Schin #undef _stream_peek 1374887Schin #undef _socket_peek 1384887Schin #undef _hdr_vfork 1394887Schin #undef _sys_vfork 1404887Schin #undef _lib_vfork 1414887Schin #undef _hdr_values 1424887Schin #undef _hdr_math 1434887Schin #undef _sys_mman 1444887Schin #undef _hdr_mman 1454887Schin #undef _sys_ioctl 1464887Schin #endif 1474887Schin 1484887Schin #if _hdr_stdlib 1494887Schin #include <stdlib.h> 1504887Schin #endif 1514887Schin 1524887Schin #if _hdr_string 1534887Schin #include <string.h> 1544887Schin #endif 1554887Schin 1564887Schin #if _hdr_time 1574887Schin #include <time.h> 1584887Schin #endif 1594887Schin #if _sys_time 1604887Schin #include <sys/time.h> 1614887Schin #endif 1624887Schin 1634887Schin #if _sys_stat 1644887Schin #include <sys/stat.h> 1654887Schin #else 1664887Schin #if _hdr_stat 1674887Schin #include <stat.h> 1684887Schin #ifndef _sys_stat 1694887Schin #define _sys_stat 1 1704887Schin #endif 1714887Schin #endif 1724887Schin #endif /*_sys_stat*/ 1734887Schin 1744887Schin #ifndef _sys_stat 1754887Schin #define _sys_stat 0 1764887Schin #endif 1774887Schin 1784887Schin #include <fcntl.h> 1794887Schin 1804887Schin #ifndef F_SETFD 1814887Schin #ifndef FIOCLEX 1824887Schin #if _hdr_filio 1834887Schin #include <filio.h> 1844887Schin #else 1854887Schin #if _sys_filio 1864887Schin #include <sys/filio.h> 1874887Schin #endif /*_sys_filio*/ 1884887Schin #endif /*_hdr_filio*/ 1894887Schin #endif /*_FIOCLEX*/ 1904887Schin #endif /*F_SETFD*/ 1914887Schin 1924887Schin #if _hdr_unistd 1934887Schin #include <unistd.h> 1944887Schin #endif 1954887Schin 1964887Schin #if !_LARGEFILE64_SOURCE /* turn off the *64 stuff */ 1974887Schin #undef _typ_off64_t 1984887Schin #undef _typ_struct_stat64 1994887Schin #undef _lib_creat64 2004887Schin #undef _lib_open64 2014887Schin #undef _lib_close64 2024887Schin #undef _lib_stat64 2034887Schin #undef _lib_fstat64 2044887Schin #undef _lib_ftruncate64 2054887Schin #undef _lib_lseek64 2064887Schin #undef _lib_mmap64 2074887Schin #undef _lib_munmap64 2084887Schin #endif /*!_LARGEFILE64_SOURCE */ 2094887Schin 2104887Schin /* see if we can use memory mapping for io */ 2114887Schin #if _LARGEFILE64_SOURCE && !_lib_mmap64 2124887Schin #undef _mmap_worthy 2134887Schin #endif 2144887Schin #if !_mmap_worthy 2154887Schin #undef _hdr_mman 2164887Schin #undef _sys_mman 2174887Schin #endif 2184887Schin #if _hdr_mman 2194887Schin #include <mman.h> 2204887Schin #endif 2214887Schin #if _sys_mman 2224887Schin #include <sys/mman.h> 2234887Schin #endif 2244887Schin 2254887Schin /* standardize system calls and types dealing with files */ 2264887Schin #if _typ_off64_t 2274887Schin #define sfoff_t off64_t 2284887Schin #else 2294887Schin #define sfoff_t off_t 2304887Schin #endif 2314887Schin #if _typ_struct_stat64 2324887Schin #define sfstat_t struct stat64 2334887Schin #else 2344887Schin #define sfstat_t struct stat 2354887Schin #endif 2364887Schin #if _lib_lseek64 2374887Schin #define syslseekf lseek64 2384887Schin #else 2394887Schin #define syslseekf lseek 2404887Schin #endif 2414887Schin #if _lib_stat64 2424887Schin #define sysstatf stat64 2434887Schin #else 2444887Schin #define sysstatf stat 2454887Schin #endif 2464887Schin #if _lib_fstat64 2474887Schin #define sysfstatf fstat64 2484887Schin #else 2494887Schin #define sysfstatf fstat 2504887Schin #endif 2514887Schin #if _lib_mmap64 2524887Schin #define sysmmapf mmap64 2534887Schin #else 2544887Schin #define sysmmapf mmap 2554887Schin #endif 2564887Schin #if _lib_munmap64 2574887Schin #define sysmunmapf munmap64 2584887Schin #else 2594887Schin #define sysmunmapf munmap 2604887Schin #endif 2614887Schin #if _lib_open64 2624887Schin #define sysopenf open64 2634887Schin #else 2644887Schin #define sysopenf open 2654887Schin #endif 2664887Schin #if _lib_creat64 2674887Schin #define syscreatf creat64 2684887Schin #else 2694887Schin #define syscreatf creat 2704887Schin #endif 2714887Schin #if _lib_close64 2724887Schin #define sysclosef close64 2734887Schin #else 2744887Schin #define sysclosef close 2754887Schin #endif 2764887Schin #if _lib_ftruncate64 2774887Schin #undef _lib_ftruncate 2784887Schin #define _lib_ftruncate 1 2794887Schin #define sysftruncatef ftruncate64 2804887Schin #endif 2814887Schin #if !_lib_ftruncate64 && _lib_ftruncate 2824887Schin #define sysftruncatef ftruncate 2834887Schin #endif 2844887Schin #if _lib_remove 2854887Schin #define sysremovef remove 2864887Schin #else 2874887Schin #define sysremovef unlink 2884887Schin #endif 2894887Schin 2904887Schin #define sysreadf read 2914887Schin #define syswritef write 2924887Schin #define syspipef pipe 2934887Schin #define sysdupf dup 2944887Schin #define sysfcntlf fcntl 2954887Schin 2964887Schin #endif /*_PACKAGE_ast*/ 2974887Schin 2984887Schin #if !_mmap_worthy 2994887Schin #undef MAP_TYPE 3004887Schin #endif 3014887Schin 3024887Schin #include "FEATURE/float" 3034887Schin 3044887Schin #include <errno.h> 3054887Schin #include <ctype.h> 3064887Schin 3074887Schin /* deal with multi-byte character and string conversions */ 3084887Schin #if _PACKAGE_ast 3094887Schin 3104887Schin #include <wchar.h> 3114887Schin 3124887Schin #define _has_multibyte 1 3134887Schin 3144887Schin #define SFMBMAX mbmax() 3154887Schin #define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t)) 3164887Schin #define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t)) 3174887Schin #define SFMBSET(lhs,v) (lhs = (v)) 3184887Schin #define SFMBLEN(s,mb) mbsize(s) 3194887Schin #define SFMBDCL(ms) mbstate_t ms; 3204887Schin 3214887Schin #else 3224887Schin 3234887Schin #if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc 3244887Schin #define _has_multibyte 1 /* Xopen-compliant */ 3254887Schin #include <wchar.h> 3264887Schin #define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t)) 3274887Schin #define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t)) 3284887Schin #define SFMBSET(lhs,v) (lhs = (v)) 3294887Schin #define SFMBDCL(mb) mbstate_t mb; 3304887Schin #define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) ) 3314887Schin #endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/ 3324887Schin 3334887Schin #if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb 3344887Schin #define _has_multibyte 2 /* no shift states */ 3354887Schin #include <wchar.h> 3364887Schin #undef mbrtowc 3374887Schin #define mbrtowc(wp,s,n,mb) mbtowc(wp, s, n) 3384887Schin #undef wcrtomb 3394887Schin #define wcrtomb(s,wc,mb) wctomb(s, wc) 3404887Schin #define SFMBCPY(to,fr) 3414887Schin #define SFMBCLR(mb) 3424887Schin #define SFMBSET(lhs,v) 3434887Schin #define SFMBDCL(mb) 3444887Schin #define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) ) 3454887Schin #endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/ 3464887Schin 3474887Schin #ifdef MB_CUR_MAX 3484887Schin #define SFMBMAX MB_CUR_MAX 3494887Schin #else 3504887Schin #define SFMBMAX sizeof(Sflong_t) 3514887Schin #endif 3524887Schin 3534887Schin #endif /* _PACKAGE_ast */ 3544887Schin 3554887Schin #if !_has_multibyte 3564887Schin #define _has_multibyte 0 /* no multibyte support */ 3574887Schin #define SFMBCPY(to,fr) 3584887Schin #define SFMBCLR(mb) 3594887Schin #define SFMBSET(lhs,v) 3604887Schin #define SFMBLEN(s,mb) (*(s) ? 1 : 0) 3614887Schin #define SFMBDCL(mb) 3624887Schin #endif /* _has_multibyte */ 3634887Schin 3648462SApril.Chin@Sun.COM /* dealing with streams that might be accessed concurrently */ 3654887Schin #if vt_threaded 3664887Schin 3678462SApril.Chin@Sun.COM #define SFMTXdecl(ff,_mf_) Sfio_t* _mf_ = (ff) 3688462SApril.Chin@Sun.COM #define SFMTXbegin(ff,_mf_,rv) \ 3698462SApril.Chin@Sun.COM { if((ff)->_flags&SF_MTSAFE) \ 3708462SApril.Chin@Sun.COM { (_mf_) = (ff); \ 3718462SApril.Chin@Sun.COM if(sfmutex((ff), SFMTX_LOCK) != 0) return(rv); \ 3728462SApril.Chin@Sun.COM if(_Sfnotify) \ 3738462SApril.Chin@Sun.COM { (*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \ 3748462SApril.Chin@Sun.COM if(!(ff)) (ff) = (_mf_); \ 3758462SApril.Chin@Sun.COM } \ 3768462SApril.Chin@Sun.COM } \ 3778462SApril.Chin@Sun.COM } 3788462SApril.Chin@Sun.COM #define SFMTXend(ff,_mf_) \ 3798462SApril.Chin@Sun.COM { if((ff)->_flags&SF_MTSAFE) \ 3808462SApril.Chin@Sun.COM { if(_Sfnotify) \ 3818462SApril.Chin@Sun.COM (*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \ 3828462SApril.Chin@Sun.COM sfmutex((ff), SFMTX_UNLOCK); \ 3838462SApril.Chin@Sun.COM (ff) = (_mf_); \ 3848462SApril.Chin@Sun.COM } \ 3858462SApril.Chin@Sun.COM } 3864887Schin 3878462SApril.Chin@Sun.COM #define SFONCE() (_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef)) 3888462SApril.Chin@Sun.COM 3898462SApril.Chin@Sun.COM #define SFMTXLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0) 3908462SApril.Chin@Sun.COM #define SFMTXUNLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0) 3914887Schin 3928462SApril.Chin@Sun.COM #define SFMTXDECL(ff) SFMTXdecl((ff), _mtxf1_) 3938462SApril.Chin@Sun.COM #define SFMTXBEGIN(ff,v) { SFMTXbegin((ff), _mtxf1_, (v) ); } 3948462SApril.Chin@Sun.COM #define SFMTXEND(ff) { SFMTXend(ff, _mtxf1_); } 3958462SApril.Chin@Sun.COM #define SFMTXENTER(ff,v) { if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); } 3968462SApril.Chin@Sun.COM #define SFMTXRETURN(ff,v) { SFMTXEND(ff); return(v); } 3978462SApril.Chin@Sun.COM 3988462SApril.Chin@Sun.COM #define SFMTXDECL2(ff) SFMTXdecl((ff), _mtxf2_) 3998462SApril.Chin@Sun.COM #define SFMTXBEGIN2(ff,v) { SFMTXbegin((ff), _mtxf2_, (v) ); } 4008462SApril.Chin@Sun.COM #define SFMTXEND2(ff) { SFMTXend((ff), _mtxf2_); } 4018462SApril.Chin@Sun.COM 4024887Schin #define POOLMTXLOCK(p) ( vtmtxlock(&(p)->mutex) ) 4034887Schin #define POOLMTXUNLOCK(p) ( vtmtxunlock(&(p)->mutex) ) 4048462SApril.Chin@Sun.COM #define POOLMTXENTER(p) { POOLMTXLOCK(p); } 4058462SApril.Chin@Sun.COM #define POOLMTXRETURN(p,rv) { POOLMTXUNLOCK(p); return(rv); } 4064887Schin 4074887Schin #else /*!vt_threaded*/ 4084887Schin 4094887Schin #undef SF_MTSAFE /* no need to worry about thread-safety */ 4104887Schin #define SF_MTSAFE 0 4114887Schin 4124887Schin #define SFONCE() /*(0)*/ 4134887Schin 4144887Schin #define SFMTXLOCK(f) /*(0)*/ 4154887Schin #define SFMTXUNLOCK(f) /*(0)*/ 4168462SApril.Chin@Sun.COM 4178462SApril.Chin@Sun.COM #define SFMTXDECL(ff) /*(0)*/ 4188462SApril.Chin@Sun.COM #define SFMTXBEGIN(ff,v) /*(0)*/ 4198462SApril.Chin@Sun.COM #define SFMTXEND(ff) /*(0)*/ 4208462SApril.Chin@Sun.COM #define SFMTXENTER(ff,v) { if(!(ff)) return(v); } 4218462SApril.Chin@Sun.COM #define SFMTXRETURN(ff,v) { return(v); } 4228462SApril.Chin@Sun.COM 4238462SApril.Chin@Sun.COM #define SFMTXDECL2(ff) /*(0)*/ 4248462SApril.Chin@Sun.COM #define SFMTXBEGIN2(ff,v) /*(0)*/ 4258462SApril.Chin@Sun.COM #define SFMTXEND2(ff) /*(0)*/ 4264887Schin 4274887Schin #define POOLMTXLOCK(p) 4284887Schin #define POOLMTXUNLOCK(p) 4298462SApril.Chin@Sun.COM #define POOLMTXENTER(p) 4304887Schin #define POOLMTXRETURN(p,v) { return(v); } 4314887Schin 4324887Schin #endif /*vt_threaded*/ 4334887Schin 4344887Schin 4354887Schin /* functions for polling readiness of streams */ 4364887Schin #if _lib_select 4374887Schin #undef _lib_poll 4384887Schin #else 4394887Schin #if _lib_poll_fd_1 || _lib_poll_fd_2 4404887Schin #define _lib_poll 1 4414887Schin #endif 4424887Schin #endif /*_lib_select_*/ 4434887Schin 4444887Schin #if _lib_poll 4454887Schin #include <poll.h> 4464887Schin 4474887Schin #if _lib_poll_fd_1 4484887Schin #define SFPOLL(pfd,n,tm) poll((pfd),(ulong)(n),(tm)) 4494887Schin #else 4504887Schin #define SFPOLL(pfd,n,tm) poll((ulong)(n),(pfd),(tm)) 4514887Schin #endif 4524887Schin #endif /*_lib_poll*/ 4534887Schin 4544887Schin #if _stream_peek 4554887Schin #include <stropts.h> 4564887Schin #endif 4574887Schin 4584887Schin #if _socket_peek 4594887Schin #include <sys/socket.h> 4604887Schin #endif 4614887Schin 4624887Schin /* to test for executable access mode of a file */ 4634887Schin #ifndef X_OK 4644887Schin #define X_OK 01 4654887Schin #endif 4664887Schin 4674887Schin /* alternative process forking */ 4684887Schin #if _lib_vfork && !defined(fork) && !defined(sparc) && !defined(__sparc) 4694887Schin #if _hdr_vfork 4704887Schin #include <vfork.h> 4714887Schin #endif 4724887Schin #if _sys_vfork 4734887Schin #include <sys/vfork.h> 4744887Schin #endif 4754887Schin #define fork vfork 4764887Schin #endif 4774887Schin 4784887Schin /* to get rid of pesky compiler warnings */ 4794887Schin #if __STD_C 4804887Schin #define NOTUSED(x) (void)(x) 4814887Schin #else 4824887Schin #define NOTUSED(x) (&x,1) 4834887Schin #endif 4844887Schin 4854887Schin /* Private flags in the "bits" field */ 4864887Schin #define SF_MMAP 00000001 /* in memory mapping mode */ 4874887Schin #define SF_BOTH 00000002 /* both read/write */ 4884887Schin #define SF_HOLE 00000004 /* a hole of zero's was created */ 4894887Schin #define SF_NULL 00000010 /* stream is /dev/null */ 4904887Schin #define SF_SEQUENTIAL 00000020 /* sequential access */ 4914887Schin #define SF_JUSTSEEK 00000040 /* just did a sfseek */ 4924887Schin #define SF_PRIVATE 00000100 /* private stream to Sfio, no mutex */ 4934887Schin #define SF_ENDING 00000200 /* no re-io on interrupts at closing */ 4944887Schin #define SF_WIDE 00000400 /* in wide mode - stdio only */ 4954887Schin 4964887Schin /* "bits" flags that must be cleared in sfclrlock */ 4974887Schin #define SF_TMPBITS 00170000 4984887Schin #define SF_DCDOWN 00010000 /* recurse down the discipline stack */ 4994887Schin 5004887Schin #define SF_WCFORMAT 00020000 /* wchar_t formatting - stdio only */ 5014887Schin #if _has_multibyte 5024887Schin #define SFWCSET(f) ((f)->bits |= SF_WCFORMAT) 5034887Schin #define SFWCGET(f,v) (((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) ) 5044887Schin #else 5054887Schin #define SFWCSET(f) 5064887Schin #define SFWCGET(f,v) 5074887Schin #endif 5084887Schin 5094887Schin #define SF_MVSIZE 00040000 /* f->size was reset in sfmove() */ 5104887Schin #define SFMVSET(f) (((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) ) 5114887Schin #define SFMVUNSET(f) (!((f)->bits&SF_MVSIZE) ? 0 : \ 5124887Schin (((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) ) 5134887Schin 5144887Schin #define SFCLRBITS(f) (SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) ) 5154887Schin 5164887Schin 5174887Schin /* bits for the mode field, SF_INIT defined in sfio_t.h */ 5184887Schin #define SF_RC 00000010 /* peeking for a record */ 5194887Schin #define SF_RV 00000020 /* reserve without read or most write */ 5204887Schin #define SF_LOCK 00000040 /* stream is locked for io op */ 5214887Schin #define SF_PUSH 00000100 /* stream has been pushed */ 5224887Schin #define SF_POOL 00000200 /* stream is in a pool but not current */ 5234887Schin #define SF_PEEK 00000400 /* there is a pending peek */ 5244887Schin #define SF_PKRD 00001000 /* did a peek read */ 5254887Schin #define SF_GETR 00002000 /* did a getr on this stream */ 5264887Schin #define SF_SYNCED 00004000 /* stream was synced */ 5274887Schin #define SF_STDIO 00010000 /* given up the buffer to stdio */ 5284887Schin #define SF_AVAIL 00020000 /* was closed, available for reuse */ 5294887Schin #define SF_LOCAL 00100000 /* sentinel for a local call */ 5304887Schin 5314887Schin #ifdef DEBUG 5324887Schin #define ASSERT(p) ((p) ? 0 : (abort(),0) ) 5334887Schin #else 5344887Schin #define ASSERT(p) 5354887Schin #endif 5364887Schin 5374887Schin /* short-hands */ 5384887Schin #define NIL(t) ((t)0) 5394887Schin #define reg register 5404887Schin #ifndef uchar 5414887Schin #define uchar unsigned char 5424887Schin #endif 5434887Schin #ifndef ulong 5444887Schin #define ulong unsigned long 5454887Schin #endif 5464887Schin #ifndef uint 5474887Schin #define uint unsigned int 5484887Schin #endif 5494887Schin #ifndef ushort 5504887Schin #define ushort unsigned short 5514887Schin #endif 5524887Schin 5534887Schin #define SECOND 1000 /* millisecond units */ 5544887Schin 5554887Schin /* macros do determine stream types from sfstat_t data */ 5564887Schin #ifndef S_IFMT 5574887Schin #define S_IFMT 0 5584887Schin #endif 5594887Schin #ifndef S_IFDIR 5604887Schin #define S_IFDIR 0 5614887Schin #endif 5624887Schin #ifndef S_IFREG 5634887Schin #define S_IFREG 0 5644887Schin #endif 5654887Schin #ifndef S_IFCHR 5664887Schin #define S_IFCHR 0 5674887Schin #endif 5684887Schin #ifndef S_IFIFO 5694887Schin #define S_IFIFO 0 5704887Schin #endif 5714887Schin 5724887Schin #ifndef S_ISDIR 5734887Schin #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) 5744887Schin #endif 5754887Schin #ifndef S_ISREG 5764887Schin #define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) 5774887Schin #endif 5784887Schin #ifndef S_ISCHR 5794887Schin #define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) 5804887Schin #endif 5814887Schin 5824887Schin #ifndef S_ISFIFO 5834887Schin # ifdef S_IFIFO 5848462SApril.Chin@Sun.COM # define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) 5854887Schin # else 5864887Schin # define S_ISFIFO(m) (0) 5874887Schin # endif 5884887Schin #endif 5894887Schin 5904887Schin #ifdef S_IRUSR 5914887Schin #define SF_CREATMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 5924887Schin #else 5934887Schin #define SF_CREATMODE 0666 5944887Schin #endif 5954887Schin 5964887Schin /* set close-on-exec */ 5974887Schin #ifdef F_SETFD 5984887Schin # ifndef FD_CLOEXEC 5994887Schin # define FD_CLOEXEC 1 6004887Schin # endif /*FD_CLOEXEC*/ 6014887Schin # define SETCLOEXEC(fd) ((void)fcntl((fd),F_SETFD,FD_CLOEXEC)) 6024887Schin #else 6034887Schin # ifdef FIOCLEX 6044887Schin # define SETCLOEXEC(fd) ((void)ioctl((fd),FIOCLEX,0)) 6054887Schin # else 6064887Schin # define SETCLOEXEC(fd) 6074887Schin # endif /*FIOCLEX*/ 6084887Schin #endif /*F_SETFD*/ 6094887Schin 6104887Schin /* a couple of error number that we use, default values are like Linux */ 6114887Schin #ifndef EINTR 6124887Schin #define EINTR 4 6134887Schin #endif 6144887Schin #ifndef EBADF 6154887Schin #define EBADF 9 6164887Schin #endif 6174887Schin #ifndef EAGAIN 6184887Schin #define EAGAIN 11 6194887Schin #endif 6204887Schin #ifndef ENOMEM 6214887Schin #define ENOMEM 12 6224887Schin #endif 6234887Schin #ifndef EINVAL 6244887Schin #define EINVAL 22 6254887Schin #endif 6264887Schin #ifndef ESPIPE 6274887Schin #define ESPIPE 29 6284887Schin #endif 6294887Schin 6304887Schin /* function to get the decimal point for local environment */ 6314887Schin #if !defined(SFSETLOCALE) && _PACKAGE_ast 6324887Schin #include "lclib.h" 6334887Schin #define SFSETLOCALE(dp,tp) \ 6344887Schin do if (*(dp) == 0) { \ 6354887Schin Lc_numeric_t* lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \ 6364887Schin *(dp) = lv->decimal; \ 6374887Schin if (tp) *(tp) = lv->thousand; \ 6384887Schin } while (0) 6394887Schin #endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/ 6404887Schin 6414887Schin #if !defined(SFSETLOCALE) && _lib_locale 6424887Schin #include <locale.h> 6434887Schin #define SFSETLOCALE(decimal,thousand) \ 6444887Schin do { struct lconv* lv; \ 6454887Schin if(*(decimal) == 0) \ 6464887Schin { *(decimal) = '.'; \ 6474887Schin if (thousand) *(thousand) = -1; \ 6484887Schin if((lv = localeconv())) \ 6494887Schin { if(lv->decimal_point && *lv->decimal_point) \ 6504887Schin *(decimal) = *(unsigned char*)lv->decimal_point; \ 6514887Schin if(thousand && lv->thousands_sep && *lv->thousands_sep) \ 6524887Schin *(thousand) = *(unsigned char*)lv->thousands_sep; \ 6534887Schin } \ 6544887Schin } \ 6554887Schin } while (0) 6564887Schin #endif /*!defined(SFSETLOCALE) && _lib_locale*/ 6574887Schin 6584887Schin #if !defined(SFSETLOCALE) 6594887Schin #define SFSETLOCALE(decimal,thousand) (*(decimal)='.') 6604887Schin #endif 6614887Schin 6624887Schin /* stream pool structure. */ 6634887Schin typedef struct _sfpool_s Sfpool_t; 6644887Schin struct _sfpool_s 6654887Schin { Sfpool_t* next; 6664887Schin int mode; /* type of pool */ 6674887Schin int s_sf; /* size of pool array */ 6684887Schin int n_sf; /* number currently in pool */ 6694887Schin Sfio_t** sf; /* array of streams */ 6704887Schin Sfio_t* array[3]; /* start with 3 */ 6714887Schin Vtmutex_t mutex; /* mutex lock object */ 6724887Schin }; 6734887Schin 6744887Schin /* reserve buffer structure */ 6754887Schin typedef struct _sfrsrv_s Sfrsrv_t; 6764887Schin struct _sfrsrv_s 6774887Schin { ssize_t slen; /* last string length */ 6784887Schin ssize_t size; /* buffer size */ 6794887Schin uchar data[1]; /* data buffer */ 6804887Schin }; 6814887Schin 6824887Schin /* co-process structure */ 6834887Schin typedef struct _sfproc_s Sfproc_t; 6844887Schin struct _sfproc_s 6854887Schin { int pid; /* process id */ 6864887Schin uchar* rdata; /* read data being cached */ 6874887Schin int ndata; /* size of cached data */ 6884887Schin int size; /* buffer size */ 6894887Schin int file; /* saved file descriptor */ 6904887Schin int sigp; /* sigpipe protection needed */ 6914887Schin }; 6924887Schin 6934887Schin /* extensions to sfvprintf/sfvscanf */ 6944887Schin #define FP_SET(fp,fn) (fp < 0 ? (fn += 1) : (fn = fp) ) 6954887Schin #define FP_WIDTH 0 6964887Schin #define FP_PRECIS 1 6974887Schin #define FP_BASE 2 6984887Schin #define FP_STR 3 6994887Schin #define FP_SIZE 4 7004887Schin #define FP_INDEX 5 /* index size */ 7014887Schin 7024887Schin typedef struct _fmt_s Fmt_t; 7034887Schin typedef struct _fmtpos_s Fmtpos_t; 7044887Schin typedef union 7054887Schin { int i, *ip; 7064887Schin long l, *lp; 7074887Schin short h, *hp; 7084887Schin uint ui; 7094887Schin ulong ul; 7104887Schin ushort uh; 7114887Schin Sflong_t ll, *llp; 7124887Schin Sfulong_t lu; 7134887Schin Sfdouble_t ld; 7144887Schin double d; 7154887Schin float f; 7164887Schin #if _has_multibyte 7174887Schin wchar_t wc; 7184887Schin wchar_t *ws, **wsp; 7194887Schin #endif 7204887Schin char c, *s, **sp; 7214887Schin uchar uc, *us, **usp; 7224887Schin Void_t *vp; 7234887Schin Sffmt_t *ft; 7244887Schin } Argv_t; 7254887Schin 7264887Schin struct _fmt_s 7274887Schin { char* form; /* format string */ 7284887Schin va_list args; /* corresponding arglist */ 7294887Schin SFMBDCL(mbs) /* multibyte parsing state */ 7304887Schin 7314887Schin char* oform; /* original format string */ 7324887Schin va_list oargs; /* original arg list */ 7334887Schin int argn; /* number of args already used */ 7344887Schin Fmtpos_t* fp; /* position list */ 7354887Schin 7364887Schin Sffmt_t* ft; /* formatting environment */ 7374887Schin Sffmtevent_f eventf; /* event function */ 7384887Schin Fmt_t* next; /* stack frame pointer */ 7394887Schin }; 7404887Schin 7414887Schin struct _fmtpos_s 7424887Schin { Sffmt_t ft; /* environment */ 7434887Schin Argv_t argv; /* argument value */ 7444887Schin int fmt; /* original format */ 7454887Schin int need[FP_INDEX]; /* positions depending on */ 7464887Schin }; 7474887Schin 7484887Schin #define LEFTP '(' 7494887Schin #define RIGHTP ')' 7504887Schin #define QUOTE '\'' 7514887Schin 7524887Schin #ifndef CHAR_BIT 7534887Schin #define CHAR_BIT 8 7544887Schin #endif 7554887Schin 7564887Schin #define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \ 7574887Schin ((ft->form = (char*)frm), va_copy(ft->args,ags), \ 7584887Schin (ft->fmt = fv), (ft->size = sz), \ 7594887Schin (ft->flags = (flgs&SFFMT_SET)), \ 7604887Schin (ft->width = wid), (ft->precis = pr), (ft->base = bs), \ 7614887Schin (ft->t_str = ts), (ft->n_str = ns) ) 7624887Schin #define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \ 7634887Schin ((frm = ft->form), va_copy(ags,ft->args), \ 7644887Schin (fv = ft->fmt), (sz = ft->size), \ 7654887Schin (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \ 7664887Schin (wid = ft->width), (pr = ft->precis), (bs = ft->base) ) 7674887Schin 7684887Schin /* format flags&types, must coexist with those in sfio.h */ 7694887Schin #define SFFMT_FORBIDDEN 000077777777 /* for sfio.h only */ 7704887Schin #define SFFMT_EFORMAT 001000000000 /* sfcvt converting %e */ 7714887Schin #define SFFMT_MINUS 002000000000 /* minus sign */ 7724887Schin #define SFFMT_AFORMAT 004000000000 /* sfcvt converting %a */ 7734887Schin #define SFFMT_UPPER 010000000000 /* sfcvt converting upper */ 7744887Schin 7754887Schin #define SFFMT_TYPES (SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\ 7764887Schin SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \ 7774887Schin SFFMT_TFLAG | SFFMT_ZFLAG ) 7784887Schin 7794887Schin /* type of elements to be converted */ 7804887Schin #define SFFMT_INT 001 /* %d,%i */ 7814887Schin #define SFFMT_UINT 002 /* %u,o,x etc. */ 7824887Schin #define SFFMT_FLOAT 004 /* %f,e,g etc. */ 7834887Schin #define SFFMT_CHAR 010 /* %c,C */ 7844887Schin #define SFFMT_POINTER 020 /* %p,n,s,S */ 7854887Schin #define SFFMT_CLASS 040 /* %[ */ 7864887Schin 7874887Schin /* local variables used across sf-functions */ 7884887Schin #define _Sfpage (_Sfextern.sf_page) 7894887Schin #define _Sfpool (_Sfextern.sf_pool) 7904887Schin #define _Sfpmove (_Sfextern.sf_pmove) 7914887Schin #define _Sfstack (_Sfextern.sf_stack) 7924887Schin #define _Sfnotify (_Sfextern.sf_notify) 7934887Schin #define _Sfstdsync (_Sfextern.sf_stdsync) 7944887Schin #define _Sfudisc (&(_Sfextern.sf_udisc)) 7954887Schin #define _Sfcleanup (_Sfextern.sf_cleanup) 7964887Schin #define _Sfexiting (_Sfextern.sf_exiting) 7974887Schin #define _Sfdone (_Sfextern.sf_done) 7984887Schin #define _Sfonce (_Sfextern.sf_once) 7994887Schin #define _Sfoncef (_Sfextern.sf_oncef) 8004887Schin #define _Sfmutex (_Sfextern.sf_mutex) 8014887Schin typedef struct _sfextern_s 8024887Schin { ssize_t sf_page; 8034887Schin struct _sfpool_s sf_pool; 8044887Schin int (*sf_pmove)_ARG_((Sfio_t*, int)); 8054887Schin Sfio_t* (*sf_stack)_ARG_((Sfio_t*, Sfio_t*)); 8068462SApril.Chin@Sun.COM void (*sf_notify)_ARG_((Sfio_t*, int, void*)); 8074887Schin int (*sf_stdsync)_ARG_((Sfio_t*)); 8084887Schin struct _sfdisc_s sf_udisc; 8094887Schin void (*sf_cleanup)_ARG_((void)); 8104887Schin int sf_exiting; 8114887Schin int sf_done; 8124887Schin Vtonce_t* sf_once; 8134887Schin void (*sf_oncef)_ARG_((void)); 8144887Schin Vtmutex_t* sf_mutex; 8154887Schin } Sfextern_t; 8164887Schin 8174887Schin /* get the real value of a byte in a coded long or ulong */ 8184887Schin #define SFUVALUE(v) (((ulong)(v))&(SF_MORE-1)) 8194887Schin #define SFSVALUE(v) ((( long)(v))&(SF_SIGN-1)) 8204887Schin #define SFBVALUE(v) (((ulong)(v))&(SF_BYTE-1)) 8214887Schin 8224887Schin /* pick this many bits in each iteration of double encoding */ 8234887Schin #define SF_PRECIS 7 8244887Schin 8254887Schin /* grain size for buffer increment */ 8264887Schin #define SF_GRAIN 1024 8274887Schin #define SF_PAGE ((ssize_t)(SF_GRAIN*sizeof(int)*2)) 8284887Schin 8294887Schin /* when the buffer is empty, certain io requests may be better done directly 8304887Schin on the given application buffers. The below condition determines when. 8314887Schin */ 8324887Schin #define SFDIRECT(f,n) (((ssize_t)(n) >= (f)->size) || \ 8334887Schin ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) ) 8344887Schin 8354887Schin /* number of pages to memory map at a time */ 8364887Schin #define SF_NMAP 4 8374887Schin 8384887Schin #ifndef MAP_VARIABLE 8394887Schin #define MAP_VARIABLE 0 8404887Schin #endif 8414887Schin #ifndef _mmap_fixed 8424887Schin #define _mmap_fixed 0 8434887Schin #endif 8444887Schin 8454887Schin /* set/unset sequential states for mmap */ 8464887Schin #if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL) 8474887Schin #define SFMMSEQON(f,a,s) \ 8484887Schin do { int oerrno = errno; \ 8494887Schin (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \ 8504887Schin errno = oerrno; \ 8514887Schin } while(0) 8524887Schin #define SFMMSEQOFF(f,a,s) \ 8534887Schin do { int oerrno = errno; \ 8544887Schin (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \ 8554887Schin errno = oerrno; \ 8564887Schin } while(0) 8574887Schin #else 8584887Schin #define SFMMSEQON(f,a,s) 8594887Schin #define SFMMSEQOFF(f,a,s) 8604887Schin #endif 8614887Schin 8624887Schin #define SFMUNMAP(f,a,s) (sysmunmapf((caddr_t)(a),(size_t)(s)), \ 8634887Schin ((f)->endb = (f)->endr = (f)->endw = (f)->next = \ 8644887Schin (f)->data = NIL(uchar*)) ) 8654887Schin 8664887Schin /* safe closing function */ 8674887Schin #define CLOSE(f) { while(sysclosef(f) < 0 && errno == EINTR) errno = 0; } 8684887Schin 8694887Schin /* the bottomless bit bucket */ 8704887Schin #define DEVNULL "/dev/null" 8714887Schin #define SFSETNULL(f) ((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL) 8724887Schin #define SFISNULL(f) ((f)->extent < 0 && ((f)->bits&SF_NULL) ) 8734887Schin 8744887Schin #define SFKILL(f) ((f)->mode = (SF_AVAIL|SF_LOCK) ) 8754887Schin #define SFKILLED(f) (((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) ) 8764887Schin 8774887Schin /* exception types */ 8784887Schin #define SF_EDONE 0 /* stop this operation and return */ 8794887Schin #define SF_EDISC 1 /* discipline says it's ok */ 8804887Schin #define SF_ESTACK 2 /* stack was popped */ 8814887Schin #define SF_ECONT 3 /* can continue normally */ 8824887Schin 8834887Schin #define SETLOCAL(f) ((f)->mode |= SF_LOCAL) 8844887Schin #define GETLOCAL(f,v) ((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v)) 8854887Schin #define SFWRALL(f) ((f)->mode |= SF_RV) 8864887Schin #define SFISALL(f,v) ((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \ 88710898Sroland.mainz@nrubsig.org ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) ) 8884887Schin #define SFSK(f,a,o,d) (SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d)) 8894887Schin #define SFRD(f,b,n,d) (SETLOCAL(f),sfrd(f,(Void_t*)b,n,d)) 8904887Schin #define SFWR(f,b,n,d) (SETLOCAL(f),sfwr(f,(Void_t*)b,n,d)) 8914887Schin #define SFSYNC(f) (SETLOCAL(f),sfsync(f)) 8924887Schin #define SFCLOSE(f) (SETLOCAL(f),sfclose(f)) 8934887Schin #define SFFLSBUF(f,n) (SETLOCAL(f),_sfflsbuf(f,n)) 8944887Schin #define SFFILBUF(f,n) (SETLOCAL(f),_sffilbuf(f,n)) 8954887Schin #define SFSETBUF(f,s,n) (SETLOCAL(f),sfsetbuf(f,s,n)) 8964887Schin #define SFWRITE(f,s,n) (SETLOCAL(f),sfwrite(f,s,n)) 8974887Schin #define SFREAD(f,s,n) (SETLOCAL(f),sfread(f,s,n)) 8984887Schin #define SFSEEK(f,p,t) (SETLOCAL(f),sfseek(f,p,t)) 8994887Schin #define SFNPUTC(f,c,n) (SETLOCAL(f),sfnputc(f,c,n)) 9004887Schin #define SFRAISE(f,e,d) (SETLOCAL(f),sfraise(f,e,d)) 9014887Schin 9024887Schin /* lock/open a stream */ 9034887Schin #define SFMODE(f,l) ((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) ) 9044887Schin #define SFLOCK(f,l) (void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data) 9054887Schin #define _SFOPENRD(f) ((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb) 9064887Schin #define _SFOPENWR(f) ((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb) 9074887Schin #define _SFOPEN(f) ((f)->mode == SF_READ ? _SFOPENRD(f) : \ 9084887Schin (f)->mode == SF_WRITE ? _SFOPENWR(f) : \ 9094887Schin ((f)->endw = (f)->endr = (f)->data) ) 9104887Schin #define SFOPEN(f,l) (void)((l) ? 0 : \ 9114887Schin ((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) ) 9124887Schin 9134887Schin /* check to see if the stream can be accessed */ 9144887Schin #define SFFROZEN(f) (((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \ 9154887Schin !((f)->mode&SF_STDIO) ? 0 : \ 9164887Schin _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) ) 9174887Schin 9184887Schin 9194887Schin /* set discipline code */ 9204887Schin #define SFDISC(f,dc,iof) \ 9214887Schin { Sfdisc_t* d; \ 9224887Schin if(!(dc)) \ 9234887Schin d = (dc) = (f)->disc; \ 9244887Schin else d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \ 9254887Schin while(d && !(d->iof)) d = d->disc; \ 9264887Schin if(d) (dc) = d; \ 9274887Schin } 9284887Schin #define SFDCRD(f,buf,n,dc,rv) \ 9294887Schin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 9304887Schin rv = (*dc->readf)(f,buf,n,dc); \ 9314887Schin if(!dcdown) f->bits &= ~SF_DCDOWN; \ 9324887Schin } 9334887Schin #define SFDCWR(f,buf,n,dc,rv) \ 9344887Schin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 9354887Schin rv = (*dc->writef)(f,buf,n,dc); \ 9364887Schin if(!dcdown) f->bits &= ~SF_DCDOWN; \ 9374887Schin } 9384887Schin #define SFDCSK(f,addr,type,dc,rv) \ 9394887Schin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 9404887Schin rv = (*dc->seekf)(f,addr,type,dc); \ 9414887Schin if(!dcdown) f->bits &= ~SF_DCDOWN; \ 9424887Schin } 9434887Schin 9444887Schin /* fast peek of a stream */ 9454887Schin #define _SFAVAIL(f,s,n) ((n) = (f)->endb - ((s) = (f)->next) ) 9464887Schin #define SFRPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ 9474887Schin ((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) ) 9484887Schin #define SFWPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ 9494887Schin ((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) ) 9504887Schin 9514887Schin /* more than this for a line buffer, we might as well flush */ 9524887Schin #define HIFORLINE 128 9534887Schin 9544887Schin /* string stream extent */ 9554887Schin #define SFSTRSIZE(f) { Sfoff_t s = (f)->next - (f)->data; \ 9564887Schin if(s > (f)->here) \ 9574887Schin { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \ 9584887Schin } 9594887Schin 9604887Schin /* control flags for open() */ 9614887Schin #ifdef O_CREAT 9624887Schin #define _has_oflags 1 9634887Schin #else /* for example, research UNIX */ 9644887Schin #define _has_oflags 0 9654887Schin #define O_CREAT 004 9664887Schin #define O_TRUNC 010 9674887Schin #define O_APPEND 020 9684887Schin #define O_EXCL 040 9694887Schin 9704887Schin #ifndef O_RDONLY 9714887Schin #define O_RDONLY 000 9724887Schin #endif 9734887Schin #ifndef O_WRONLY 9744887Schin #define O_WRONLY 001 9754887Schin #endif 9764887Schin #ifndef O_RDWR 9774887Schin #define O_RDWR 002 9784887Schin #endif 9794887Schin #endif /*O_CREAT*/ 9804887Schin 9814887Schin #ifndef O_BINARY 9824887Schin #define O_BINARY 000 9834887Schin #endif 9844887Schin #ifndef O_TEXT 9854887Schin #define O_TEXT 000 9864887Schin #endif 9874887Schin #ifndef O_TEMPORARY 9884887Schin #define O_TEMPORARY 000 9894887Schin #endif 9904887Schin 9914887Schin #define SF_RADIX 64 /* maximum integer conversion base */ 9924887Schin 9934887Schin #if _PACKAGE_ast 9944887Schin #define SF_MAXINT INT_MAX 9954887Schin #define SF_MAXLONG LONG_MAX 9964887Schin #else 9974887Schin #define SF_MAXINT ((int)(((uint)~0) >> 1)) 9984887Schin #define SF_MAXLONG ((long)(((ulong)~0L) >> 1)) 9994887Schin #endif 10004887Schin 10014887Schin #define SF_MAXCHAR ((uchar)(~0)) 10024887Schin 10034887Schin /* floating point to ascii conversion */ 10044887Schin #define SF_MAXEXP10 6 10054887Schin #define SF_MAXPOW10 (1 << SF_MAXEXP10) 10064887Schin #if !_ast_fltmax_double 10074887Schin #define SF_FDIGITS 1024 /* max allowed fractional digits */ 10084887Schin #define SF_IDIGITS (8*1024) /* max number of digits in int part */ 10094887Schin #else 10104887Schin #define SF_FDIGITS 256 /* max allowed fractional digits */ 10114887Schin #define SF_IDIGITS 1024 /* max number of digits in int part */ 10124887Schin #endif 10134887Schin #define SF_MAXDIGITS (((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int)) 10144887Schin 10154887Schin /* tables for numerical translation */ 10164887Schin #define _Sfpos10 (_Sftable.sf_pos10) 10174887Schin #define _Sfneg10 (_Sftable.sf_neg10) 10184887Schin #define _Sfdec (_Sftable.sf_dec) 10194887Schin #define _Sfdigits (_Sftable.sf_digits) 10204887Schin #define _Sfcvinitf (_Sftable.sf_cvinitf) 10214887Schin #define _Sfcvinit (_Sftable.sf_cvinit) 10224887Schin #define _Sffmtposf (_Sftable.sf_fmtposf) 10234887Schin #define _Sffmtintf (_Sftable.sf_fmtintf) 10244887Schin #define _Sfcv36 (_Sftable.sf_cv36) 10254887Schin #define _Sfcv64 (_Sftable.sf_cv64) 10264887Schin #define _Sftype (_Sftable.sf_type) 10274887Schin #define _Sfieee (&_Sftable.sf_ieee) 10284887Schin #define _Sffinf (_Sftable.sf_ieee.fltinf) 10294887Schin #define _Sfdinf (_Sftable.sf_ieee.dblinf) 10304887Schin #define _Sflinf (_Sftable.sf_ieee.ldblinf) 10314887Schin #define _Sffnan (_Sftable.sf_ieee.fltnan) 10324887Schin #define _Sfdnan (_Sftable.sf_ieee.dblnan) 10334887Schin #define _Sflnan (_Sftable.sf_ieee.ldblnan) 10344887Schin #define _Sffpow10 (_Sftable.sf_flt_pow10) 10354887Schin #define _Sfdpow10 (_Sftable.sf_dbl_pow10) 10364887Schin #define _Sflpow10 (_Sftable.sf_ldbl_pow10) 10374887Schin typedef struct _sfieee_s Sfieee_t; 10384887Schin struct _sfieee_s 10394887Schin { float fltnan; /* float NAN */ 10404887Schin float fltinf; /* float INF */ 10414887Schin double dblnan; /* double NAN */ 10424887Schin double dblinf; /* double INF */ 10434887Schin Sfdouble_t ldblnan; /* Sfdouble_t NAN */ 10444887Schin Sfdouble_t ldblinf; /* Sfdouble_t INF */ 10454887Schin }; 10464887Schin typedef struct _sftab_ 10474887Schin { Sfdouble_t sf_pos10[SF_MAXEXP10]; /* positive powers of 10 */ 10484887Schin Sfdouble_t sf_neg10[SF_MAXEXP10]; /* negative powers of 10 */ 10494887Schin uchar sf_dec[200]; /* ascii reps of values < 100 */ 10504887Schin char* sf_digits; /* digits for general bases */ 10514887Schin int (*sf_cvinitf)(); /* initialization function */ 10524887Schin int sf_cvinit; /* initialization state */ 10534887Schin Fmtpos_t* (*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int)); 10544887Schin char* (*sf_fmtintf)_ARG_((const char*,int*)); 10554887Schin float* sf_flt_pow10; /* float powers of 10 */ 10564887Schin double* sf_dbl_pow10; /* double powers of 10 */ 10574887Schin Sfdouble_t* sf_ldbl_pow10; /* Sfdouble_t powers of 10 */ 10584887Schin uchar sf_cv36[SF_MAXCHAR+1]; /* conversion for base [2-36] */ 10594887Schin uchar sf_cv64[SF_MAXCHAR+1]; /* conversion for base [37-64] */ 10604887Schin uchar sf_type[SF_MAXCHAR+1]; /* conversion formats&types */ 10614887Schin Sfieee_t sf_ieee; /* IEEE floating point constants*/ 10624887Schin } Sftab_t; 10634887Schin 10644887Schin /* thread-safe macro/function to initialize _Sfcv* conversion tables */ 10654887Schin #define SFCVINIT() (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) ) 10664887Schin 10674887Schin /* sfucvt() converts decimal integers to ASCII */ 10684887Schin #define SFDIGIT(v,scale,digit) \ 10694887Schin { if(v < 5*scale) \ 10704887Schin if(v < 2*scale) \ 10714887Schin if(v < 1*scale) \ 10724887Schin { digit = '0'; } \ 10734887Schin else { digit = '1'; v -= 1*scale; } \ 10744887Schin else if(v < 3*scale) \ 10754887Schin { digit = '2'; v -= 2*scale; } \ 10764887Schin else if(v < 4*scale) \ 10774887Schin { digit = '3'; v -= 3*scale; } \ 10784887Schin else { digit = '4'; v -= 4*scale; } \ 10794887Schin else if(v < 7*scale) \ 10804887Schin if(v < 6*scale) \ 10814887Schin { digit = '5'; v -= 5*scale; } \ 10824887Schin else { digit = '6'; v -= 6*scale; } \ 10834887Schin else if(v < 8*scale) \ 10844887Schin { digit = '7'; v -= 7*scale; } \ 10854887Schin else if(v < 9*scale) \ 10864887Schin { digit = '8'; v -= 8*scale; } \ 10874887Schin else { digit = '9'; v -= 9*scale; } \ 10884887Schin } 10894887Schin #define sfucvt(v,s,n,list,type,utype) \ 10904887Schin { while((utype)v >= 10000) \ 10914887Schin { n = v; v = (type)(((utype)v)/10000); \ 10924887Schin n = (type)((utype)n - ((utype)v)*10000); \ 10934887Schin s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \ 10944887Schin s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \ 10954887Schin } \ 10964887Schin if(v < 100) \ 10974887Schin { if(v < 10) \ 10984887Schin { s -= 1; s[0] = (char)('0'+v); \ 10994887Schin } else \ 11004887Schin { s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \ 11014887Schin } \ 11024887Schin } else \ 11034887Schin { if(v < 1000) \ 11044887Schin { s -= 3; SFDIGIT(v,100,s[0]); \ 11054887Schin s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \ 11064887Schin } else \ 11074887Schin { s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \ 11084887Schin s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \ 11094887Schin } \ 11104887Schin } \ 11114887Schin } 11124887Schin 11134887Schin /* handy functions */ 11144887Schin #undef min 11154887Schin #undef max 11164887Schin #define min(x,y) ((x) < (y) ? (x) : (y)) 11174887Schin #define max(x,y) ((x) > (y) ? (x) : (y)) 11184887Schin 11194887Schin /* fast functions for memory copy and memory clear */ 11204887Schin #if _PACKAGE_ast 11214887Schin #define memclear(s,n) memzero(s,n) 11224887Schin #else 11234887Schin #if _lib_bcopy && !_lib_memcpy 11244887Schin #define memcpy(to,fr,n) bcopy((fr),(to),(n)) 11254887Schin #endif 11264887Schin #if _lib_bzero && !_lib_memset 11274887Schin #define memclear(s,n) bzero((s),(n)) 11284887Schin #else 11294887Schin #define memclear(s,n) memset((s),'\0',(n)) 11304887Schin #endif 11314887Schin #endif /*_PACKAGE_ast*/ 11324887Schin 11334887Schin /* note that MEMCPY advances the associated pointers */ 11344887Schin #define MEMCPY(to,fr,n) \ 11354887Schin switch(n) \ 11364887Schin { default : memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; break; \ 11374887Schin case 7 : *to++ = *fr++; \ 11384887Schin case 6 : *to++ = *fr++; \ 11394887Schin case 5 : *to++ = *fr++; \ 11404887Schin case 4 : *to++ = *fr++; \ 11414887Schin case 3 : *to++ = *fr++; \ 11424887Schin case 2 : *to++ = *fr++; \ 11434887Schin case 1 : *to++ = *fr++; \ 11444887Schin } 11454887Schin #define MEMSET(s,c,n) \ 11464887Schin switch(n) \ 11474887Schin { default : memset((Void_t*)s,(int)c,n); s += n; break; \ 11484887Schin case 7 : *s++ = c; \ 11494887Schin case 6 : *s++ = c; \ 11504887Schin case 5 : *s++ = c; \ 11514887Schin case 4 : *s++ = c; \ 11524887Schin case 3 : *s++ = c; \ 11534887Schin case 2 : *s++ = c; \ 11544887Schin case 1 : *s++ = c; \ 11554887Schin } 11564887Schin 11574887Schin _BEGIN_EXTERNS_ 11584887Schin 11594887Schin extern Sftab_t _Sftable; 11604887Schin 11614887Schin extern int _sfpopen _ARG_((Sfio_t*, int, int, int)); 11624887Schin extern int _sfpclose _ARG_((Sfio_t*)); 11634887Schin extern int _sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*)); 11644887Schin extern Sfrsrv_t* _sfrsrv _ARG_((Sfio_t*, ssize_t)); 11654887Schin extern int _sfsetpool _ARG_((Sfio_t*)); 11668462SApril.Chin@Sun.COM extern char* _sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int)); 11674887Schin extern char** _sfgetpath _ARG_((char*)); 11684887Schin 11694887Schin #if _BLD_sfio && defined(__EXPORT__) 11704887Schin #define extern __EXPORT__ 11714887Schin #endif 11724887Schin #if !_BLD_sfio && defined(__IMPORT__) 11734887Schin #define extern extern __IMPORT__ 11744887Schin #endif 11754887Schin 11764887Schin extern Sfextern_t _Sfextern; 11774887Schin 11784887Schin extern int _sfmode _ARG_((Sfio_t*, int, int)); 11794887Schin extern int _sftype _ARG_((const char*, int*, int*)); 11804887Schin 11814887Schin #undef extern 11824887Schin 11834887Schin #ifndef errno 11844887Schin extern int errno; 11854887Schin #endif 11864887Schin 11874887Schin /* for portable encoding of double values */ 11884887Schin #ifndef frexpl 11894887Schin #if _ast_fltmax_double 11904887Schin #define frexpl frexp 11914887Schin #endif 11924887Schin #if !__STDC__ 11934887Schin extern Sfdouble_t frexpl _ARG_((Sfdouble_t, int*)); 11944887Schin #endif 11954887Schin #endif 11964887Schin #ifndef ldexpl 11974887Schin #if _ast_fltmax_double 11984887Schin #define ldexpl ldexp 11994887Schin #endif 12004887Schin #if !__STDC__ 12014887Schin extern Sfdouble_t ldexpl _ARG_((Sfdouble_t, int)); 12024887Schin #endif 12034887Schin #endif 12044887Schin 12054887Schin #if !_PACKAGE_ast 12064887Schin 12074887Schin #if !__STDC__ && !_hdr_stdlib 12084887Schin extern void abort _ARG_((void)); 12094887Schin extern int atexit _ARG_((void(*)(void))); 12104887Schin extern char* getenv _ARG_((const char*)); 12114887Schin extern void* malloc _ARG_((size_t)); 12124887Schin extern void* realloc _ARG_((void*, size_t)); 12134887Schin extern void free _ARG_((void*)); 12144887Schin extern size_t strlen _ARG_((const char*)); 12154887Schin extern char* strcpy _ARG_((char*, const char*)); 12164887Schin 12174887Schin extern Void_t* memset _ARG_((void*, int, size_t)); 12184887Schin extern Void_t* memchr _ARG_((const void*, int, size_t)); 12194887Schin extern Void_t* memccpy _ARG_((void*, const void*, int, size_t)); 12204887Schin #ifndef memcpy 12214887Schin extern Void_t* memcpy _ARG_((void*, const void*, size_t)); 12224887Schin #endif 12234887Schin #if !defined(strtod) 12244887Schin extern double strtod _ARG_((const char*, char**)); 12254887Schin #endif 12264887Schin #if !defined(remove) 12274887Schin extern int sysremovef _ARG_((const char*)); 12284887Schin #endif 12294887Schin #endif /* !__STDC__ && !_hdr_stdlib */ 12304887Schin 12314887Schin #if !_hdr_unistd 12324887Schin #if _proto_open && __cplusplus 12334887Schin extern int sysopenf _ARG_((const char*, int, ...)); 12344887Schin #endif 12354887Schin extern int sysclosef _ARG_((int)); 12364887Schin extern ssize_t sysreadf _ARG_((int, void*, size_t)); 12374887Schin extern ssize_t syswritef _ARG_((int, const void*, size_t)); 12384887Schin extern sfoff_t syslseekf _ARG_((int, sfoff_t, int)); 12394887Schin extern int sysdupf _ARG_((int)); 12404887Schin extern int syspipef _ARG_((int*)); 12414887Schin extern int sysaccessf _ARG_((const char*, int)); 12424887Schin extern int sysremovef _ARG_((const char*)); 12434887Schin extern int sysfstatf _ARG_((int, sfstat_t*)); 12444887Schin extern int sysstatf _ARG_((const char*, sfstat_t*)); 12454887Schin 12464887Schin extern int isatty _ARG_((int)); 12474887Schin 12484887Schin extern int wait _ARG_((int*)); 12494887Schin extern uint sleep _ARG_((uint)); 12504887Schin extern int execl _ARG_((const char*, const char*,...)); 12514887Schin extern int execv _ARG_((const char*, char**)); 12524887Schin #if !defined(fork) 12534887Schin extern int fork _ARG_((void)); 12544887Schin #endif 12554887Schin #if _lib_unlink 12564887Schin extern int unlink _ARG_((const char*)); 12574887Schin #endif 12584887Schin 12594887Schin #endif /*_hdr_unistd*/ 12604887Schin 12614887Schin #if _lib_bcopy && !_proto_bcopy 12624887Schin extern void bcopy _ARG_((const void*, void*, size_t)); 12634887Schin #endif 12644887Schin #if _lib_bzero && !_proto_bzero 12654887Schin extern void bzero _ARG_((void*, size_t)); 12664887Schin #endif 12674887Schin 12684887Schin extern time_t time _ARG_((time_t*)); 12694887Schin extern int waitpid _ARG_((int,int*,int)); 12704887Schin extern void _exit _ARG_((int)); 12714887Schin typedef int(* Onexit_f)_ARG_((void)); 12724887Schin extern Onexit_f onexit _ARG_((Onexit_f)); 12734887Schin 12744887Schin #if _lib_vfork && !_hdr_vfork && !_sys_vfork 12754887Schin extern pid_t vfork _ARG_((void)); 12764887Schin #endif /*_lib_vfork*/ 12774887Schin 12784887Schin #if _lib_poll 12794887Schin #if _lib_poll_fd_1 12804887Schin extern int poll _ARG_((struct pollfd*, ulong, int)); 12814887Schin #else 12824887Schin extern int poll _ARG_((ulong, struct pollfd*, int)); 12834887Schin #endif 12844887Schin #endif /*_lib_poll*/ 12854887Schin 12864887Schin #endif /* _PACKAGE_ast */ 12874887Schin 12884887Schin _END_EXTERNS_ 12894887Schin 12904887Schin #endif /*_SFHDR_H*/ 1291