1*b30d1939SAndy Fiddaman /*********************************************************************** 2*b30d1939SAndy Fiddaman * * 3*b30d1939SAndy Fiddaman * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2012 AT&T Intellectual Property * 5*b30d1939SAndy Fiddaman * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property * 8*b30d1939SAndy Fiddaman * * 9*b30d1939SAndy Fiddaman * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12*b30d1939SAndy Fiddaman * * 13*b30d1939SAndy Fiddaman * Information and Software Systems Research * 14*b30d1939SAndy Fiddaman * AT&T Research * 15*b30d1939SAndy Fiddaman * Florham Park NJ * 16*b30d1939SAndy Fiddaman * * 17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> * 18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> * 19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> * 20*b30d1939SAndy Fiddaman * * 21*b30d1939SAndy Fiddaman ***********************************************************************/ 22*b30d1939SAndy Fiddaman #ifndef _SFHDR_H 23*b30d1939SAndy Fiddaman #define _SFHDR_H 1 24*b30d1939SAndy Fiddaman #if !defined(_BLD_sfio) && !defined(_BLD_stdio) 25*b30d1939SAndy Fiddaman #define _BLD_sfio 1 26*b30d1939SAndy Fiddaman #endif 27*b30d1939SAndy Fiddaman 28*b30d1939SAndy Fiddaman /* Internal definitions for sfio. 29*b30d1939SAndy Fiddaman ** Written by Kiem-Phong Vo 30*b30d1939SAndy Fiddaman */ 31*b30d1939SAndy Fiddaman 32*b30d1939SAndy Fiddaman #define _next next 33*b30d1939SAndy Fiddaman #define _endw endw 34*b30d1939SAndy Fiddaman #define _endr endr 35*b30d1939SAndy Fiddaman #define _endb endb 36*b30d1939SAndy Fiddaman #define _push push 37*b30d1939SAndy Fiddaman #define _flags flags 38*b30d1939SAndy Fiddaman #define _file file 39*b30d1939SAndy Fiddaman #define _data data 40*b30d1939SAndy Fiddaman #define _size size 41*b30d1939SAndy Fiddaman #define _val val 42*b30d1939SAndy Fiddaman 43*b30d1939SAndy Fiddaman #include "FEATURE/sfio" 44*b30d1939SAndy Fiddaman #include "FEATURE/mmap" 45*b30d1939SAndy Fiddaman 46*b30d1939SAndy Fiddaman /* define va_list, etc. before including sfio_t.h (sfio.h) */ 47*b30d1939SAndy Fiddaman #if !_PACKAGE_ast 48*b30d1939SAndy Fiddaman 49*b30d1939SAndy Fiddaman /* some systems don't know large files */ 50*b30d1939SAndy Fiddaman #if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */ 51*b30d1939SAndy Fiddaman #undef _NO_LARGEFILE64_SOURCE 52*b30d1939SAndy Fiddaman #define _NO_LARGEFILE64_SOURCE 1 53*b30d1939SAndy Fiddaman #undef _LARGEFILE64_SOURCE 54*b30d1939SAndy Fiddaman #undef _LARGEFILE_SOURCE 55*b30d1939SAndy Fiddaman #endif 56*b30d1939SAndy Fiddaman 57*b30d1939SAndy Fiddaman #if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64 58*b30d1939SAndy Fiddaman #undef _LARGEFILE64_SOURCE 59*b30d1939SAndy Fiddaman #undef _LARGEFILE_SOURCE 60*b30d1939SAndy Fiddaman #undef _FILE_OFFSET_BITS 61*b30d1939SAndy Fiddaman #define _LARGEFILE64_SOURCE 1 /* enabling the *64 stuff */ 62*b30d1939SAndy Fiddaman #define _LARGEFILE_SOURCE 1 63*b30d1939SAndy Fiddaman #endif 64*b30d1939SAndy Fiddaman 65*b30d1939SAndy Fiddaman #if _hdr_stdarg 66*b30d1939SAndy Fiddaman #include <stdarg.h> 67*b30d1939SAndy Fiddaman #else 68*b30d1939SAndy Fiddaman #include <varargs.h> 69*b30d1939SAndy Fiddaman #endif 70*b30d1939SAndy Fiddaman #include "FEATURE/common" 71*b30d1939SAndy Fiddaman #if !__STD_C 72*b30d1939SAndy Fiddaman #define const 73*b30d1939SAndy Fiddaman #endif 74*b30d1939SAndy Fiddaman #endif /* !_PACKAGE_ast */ 75*b30d1939SAndy Fiddaman 76*b30d1939SAndy Fiddaman #include "sfio_t.h" 77*b30d1939SAndy Fiddaman 78*b30d1939SAndy Fiddaman /* note that the macro vt_threaded has effect on vthread.h */ 79*b30d1939SAndy Fiddaman #include <vthread.h> 80*b30d1939SAndy Fiddaman 81*b30d1939SAndy Fiddaman /* file system info */ 82*b30d1939SAndy Fiddaman #if _PACKAGE_ast 83*b30d1939SAndy Fiddaman 84*b30d1939SAndy Fiddaman #include <ast.h> 85*b30d1939SAndy Fiddaman #include <ast_time.h> 86*b30d1939SAndy Fiddaman #include <ast_tty.h> 87*b30d1939SAndy Fiddaman #include <ls.h> 88*b30d1939SAndy Fiddaman 89*b30d1939SAndy Fiddaman /* ast always provides multibyte handling */ 90*b30d1939SAndy Fiddaman #undef _hdr_wchar 91*b30d1939SAndy Fiddaman #undef _lib_mbrtowc 92*b30d1939SAndy Fiddaman #undef _lib_wcrtomb 93*b30d1939SAndy Fiddaman #define _hdr_wchar 1 94*b30d1939SAndy Fiddaman #define _lib_mbrtowc 1 95*b30d1939SAndy Fiddaman #define _lib_wcrtomb 1 96*b30d1939SAndy Fiddaman 97*b30d1939SAndy Fiddaman #if _mem_st_blksize_stat 98*b30d1939SAndy Fiddaman #define _stat_blksize 1 99*b30d1939SAndy Fiddaman #endif 100*b30d1939SAndy Fiddaman 101*b30d1939SAndy Fiddaman #if _lib_localeconv && _hdr_locale 102*b30d1939SAndy Fiddaman #define _lib_locale 1 103*b30d1939SAndy Fiddaman #endif 104*b30d1939SAndy Fiddaman 105*b30d1939SAndy Fiddaman #define sfoff_t off_t 106*b30d1939SAndy Fiddaman #define sfstat_t struct stat 107*b30d1939SAndy Fiddaman #define sysclosef close 108*b30d1939SAndy Fiddaman #define syscreatf creat 109*b30d1939SAndy Fiddaman #define sysdupf dup 110*b30d1939SAndy Fiddaman #define sysfcntlf fcntl 111*b30d1939SAndy Fiddaman #define sysfstatf fstat 112*b30d1939SAndy Fiddaman #define sysftruncatef ftruncate 113*b30d1939SAndy Fiddaman #define syslseekf lseek 114*b30d1939SAndy Fiddaman #define sysmmapf mmap 115*b30d1939SAndy Fiddaman #define sysmunmapf munmap 116*b30d1939SAndy Fiddaman #define sysopenf open 117*b30d1939SAndy Fiddaman #define syspipef pipe 118*b30d1939SAndy Fiddaman #define sysreadf read 119*b30d1939SAndy Fiddaman #define sysremovef remove 120*b30d1939SAndy Fiddaman #define sysstatf stat 121*b30d1939SAndy Fiddaman #define syswritef write 122*b30d1939SAndy Fiddaman 123*b30d1939SAndy Fiddaman #else /*!_PACKAGE_ast*/ 124*b30d1939SAndy Fiddaman 125*b30d1939SAndy Fiddaman /* when building the binary compatibility package, a number of header files 126*b30d1939SAndy Fiddaman are not needed and they may get in the way so we remove them here. 127*b30d1939SAndy Fiddaman */ 128*b30d1939SAndy Fiddaman #if _SFBINARY_H 129*b30d1939SAndy Fiddaman #undef _hdr_time 130*b30d1939SAndy Fiddaman #undef _sys_time 131*b30d1939SAndy Fiddaman #undef _sys_stat 132*b30d1939SAndy Fiddaman #undef _hdr_stat 133*b30d1939SAndy Fiddaman #undef _hdr_filio 134*b30d1939SAndy Fiddaman #undef _sys_filio 135*b30d1939SAndy Fiddaman #undef _lib_poll 136*b30d1939SAndy Fiddaman #undef _stream_peek 137*b30d1939SAndy Fiddaman #undef _socket_peek 138*b30d1939SAndy Fiddaman #undef _hdr_vfork 139*b30d1939SAndy Fiddaman #undef _sys_vfork 140*b30d1939SAndy Fiddaman #undef _lib_vfork 141*b30d1939SAndy Fiddaman #undef _hdr_values 142*b30d1939SAndy Fiddaman #undef _hdr_math 143*b30d1939SAndy Fiddaman #undef _sys_mman 144*b30d1939SAndy Fiddaman #undef _hdr_mman 145*b30d1939SAndy Fiddaman #undef _sys_ioctl 146*b30d1939SAndy Fiddaman #endif 147*b30d1939SAndy Fiddaman 148*b30d1939SAndy Fiddaman #if _hdr_stdlib 149*b30d1939SAndy Fiddaman #include <stdlib.h> 150*b30d1939SAndy Fiddaman #endif 151*b30d1939SAndy Fiddaman 152*b30d1939SAndy Fiddaman #if _hdr_string 153*b30d1939SAndy Fiddaman #include <string.h> 154*b30d1939SAndy Fiddaman #endif 155*b30d1939SAndy Fiddaman 156*b30d1939SAndy Fiddaman #if _hdr_time 157*b30d1939SAndy Fiddaman #include <time.h> 158*b30d1939SAndy Fiddaman #endif 159*b30d1939SAndy Fiddaman #if _sys_time 160*b30d1939SAndy Fiddaman #include <sys/time.h> 161*b30d1939SAndy Fiddaman #endif 162*b30d1939SAndy Fiddaman 163*b30d1939SAndy Fiddaman #if _sys_stat 164*b30d1939SAndy Fiddaman #include <sys/stat.h> 165*b30d1939SAndy Fiddaman #else 166*b30d1939SAndy Fiddaman #if _hdr_stat 167*b30d1939SAndy Fiddaman #include <stat.h> 168*b30d1939SAndy Fiddaman #ifndef _sys_stat 169*b30d1939SAndy Fiddaman #define _sys_stat 1 170*b30d1939SAndy Fiddaman #endif 171*b30d1939SAndy Fiddaman #endif 172*b30d1939SAndy Fiddaman #endif /*_sys_stat*/ 173*b30d1939SAndy Fiddaman 174*b30d1939SAndy Fiddaman #ifndef _sys_stat 175*b30d1939SAndy Fiddaman #define _sys_stat 0 176*b30d1939SAndy Fiddaman #endif 177*b30d1939SAndy Fiddaman 178*b30d1939SAndy Fiddaman #include <fcntl.h> 179*b30d1939SAndy Fiddaman 180*b30d1939SAndy Fiddaman #ifndef F_SETFD 181*b30d1939SAndy Fiddaman #ifndef FIOCLEX 182*b30d1939SAndy Fiddaman #if _hdr_filio 183*b30d1939SAndy Fiddaman #include <filio.h> 184*b30d1939SAndy Fiddaman #else 185*b30d1939SAndy Fiddaman #if _sys_filio 186*b30d1939SAndy Fiddaman #include <sys/filio.h> 187*b30d1939SAndy Fiddaman #endif /*_sys_filio*/ 188*b30d1939SAndy Fiddaman #endif /*_hdr_filio*/ 189*b30d1939SAndy Fiddaman #endif /*_FIOCLEX*/ 190*b30d1939SAndy Fiddaman #endif /*F_SETFD*/ 191*b30d1939SAndy Fiddaman 192*b30d1939SAndy Fiddaman #if _hdr_unistd 193*b30d1939SAndy Fiddaman #include <unistd.h> 194*b30d1939SAndy Fiddaman #endif 195*b30d1939SAndy Fiddaman 196*b30d1939SAndy Fiddaman #if !_LARGEFILE64_SOURCE /* turn off the *64 stuff */ 197*b30d1939SAndy Fiddaman #undef _typ_off64_t 198*b30d1939SAndy Fiddaman #undef _typ_struct_stat64 199*b30d1939SAndy Fiddaman #undef _lib_creat64 200*b30d1939SAndy Fiddaman #undef _lib_open64 201*b30d1939SAndy Fiddaman #undef _lib_close64 202*b30d1939SAndy Fiddaman #undef _lib_stat64 203*b30d1939SAndy Fiddaman #undef _lib_fstat64 204*b30d1939SAndy Fiddaman #undef _lib_ftruncate64 205*b30d1939SAndy Fiddaman #undef _lib_lseek64 206*b30d1939SAndy Fiddaman #undef _lib_mmap64 207*b30d1939SAndy Fiddaman #undef _lib_munmap64 208*b30d1939SAndy Fiddaman #endif /*!_LARGEFILE64_SOURCE */ 209*b30d1939SAndy Fiddaman 210*b30d1939SAndy Fiddaman /* see if we can use memory mapping for io */ 211*b30d1939SAndy Fiddaman #if _LARGEFILE64_SOURCE && !_lib_mmap64 212*b30d1939SAndy Fiddaman #undef _mmap_worthy 213*b30d1939SAndy Fiddaman #endif 214*b30d1939SAndy Fiddaman #if !_mmap_worthy 215*b30d1939SAndy Fiddaman #undef _hdr_mman 216*b30d1939SAndy Fiddaman #undef _sys_mman 217*b30d1939SAndy Fiddaman #endif 218*b30d1939SAndy Fiddaman #if _hdr_mman 219*b30d1939SAndy Fiddaman #include <mman.h> 220*b30d1939SAndy Fiddaman #endif 221*b30d1939SAndy Fiddaman #if _sys_mman 222*b30d1939SAndy Fiddaman #include <sys/mman.h> 223*b30d1939SAndy Fiddaman #endif 224*b30d1939SAndy Fiddaman 225*b30d1939SAndy Fiddaman /* standardize system calls and types dealing with files */ 226*b30d1939SAndy Fiddaman #if _typ_off64_t 227*b30d1939SAndy Fiddaman #define sfoff_t off64_t 228*b30d1939SAndy Fiddaman #else 229*b30d1939SAndy Fiddaman #define sfoff_t off_t 230*b30d1939SAndy Fiddaman #endif 231*b30d1939SAndy Fiddaman #if _typ_struct_stat64 232*b30d1939SAndy Fiddaman #define sfstat_t struct stat64 233*b30d1939SAndy Fiddaman #else 234*b30d1939SAndy Fiddaman #define sfstat_t struct stat 235*b30d1939SAndy Fiddaman #endif 236*b30d1939SAndy Fiddaman #if _lib_lseek64 237*b30d1939SAndy Fiddaman #define syslseekf lseek64 238*b30d1939SAndy Fiddaman #else 239*b30d1939SAndy Fiddaman #define syslseekf lseek 240*b30d1939SAndy Fiddaman #endif 241*b30d1939SAndy Fiddaman #if _lib_stat64 242*b30d1939SAndy Fiddaman #define sysstatf stat64 243*b30d1939SAndy Fiddaman #else 244*b30d1939SAndy Fiddaman #define sysstatf stat 245*b30d1939SAndy Fiddaman #endif 246*b30d1939SAndy Fiddaman #if _lib_fstat64 247*b30d1939SAndy Fiddaman #define sysfstatf fstat64 248*b30d1939SAndy Fiddaman #else 249*b30d1939SAndy Fiddaman #define sysfstatf fstat 250*b30d1939SAndy Fiddaman #endif 251*b30d1939SAndy Fiddaman #if _lib_mmap64 252*b30d1939SAndy Fiddaman #define sysmmapf mmap64 253*b30d1939SAndy Fiddaman #else 254*b30d1939SAndy Fiddaman #define sysmmapf mmap 255*b30d1939SAndy Fiddaman #endif 256*b30d1939SAndy Fiddaman #if _lib_munmap64 257*b30d1939SAndy Fiddaman #define sysmunmapf munmap64 258*b30d1939SAndy Fiddaman #else 259*b30d1939SAndy Fiddaman #define sysmunmapf munmap 260*b30d1939SAndy Fiddaman #endif 261*b30d1939SAndy Fiddaman #if _lib_open64 262*b30d1939SAndy Fiddaman #define sysopenf open64 263*b30d1939SAndy Fiddaman #else 264*b30d1939SAndy Fiddaman #define sysopenf open 265*b30d1939SAndy Fiddaman #endif 266*b30d1939SAndy Fiddaman #if _lib_creat64 267*b30d1939SAndy Fiddaman #define syscreatf creat64 268*b30d1939SAndy Fiddaman #else 269*b30d1939SAndy Fiddaman #define syscreatf creat 270*b30d1939SAndy Fiddaman #endif 271*b30d1939SAndy Fiddaman #if _lib_close64 272*b30d1939SAndy Fiddaman #define sysclosef close64 273*b30d1939SAndy Fiddaman #else 274*b30d1939SAndy Fiddaman #define sysclosef close 275*b30d1939SAndy Fiddaman #endif 276*b30d1939SAndy Fiddaman #if _lib_ftruncate64 277*b30d1939SAndy Fiddaman #undef _lib_ftruncate 278*b30d1939SAndy Fiddaman #define _lib_ftruncate 1 279*b30d1939SAndy Fiddaman #define sysftruncatef ftruncate64 280*b30d1939SAndy Fiddaman #endif 281*b30d1939SAndy Fiddaman #if !_lib_ftruncate64 && _lib_ftruncate 282*b30d1939SAndy Fiddaman #define sysftruncatef ftruncate 283*b30d1939SAndy Fiddaman #endif 284*b30d1939SAndy Fiddaman #if _lib_remove 285*b30d1939SAndy Fiddaman #define sysremovef remove 286*b30d1939SAndy Fiddaman #else 287*b30d1939SAndy Fiddaman #define sysremovef unlink 288*b30d1939SAndy Fiddaman #endif 289*b30d1939SAndy Fiddaman 290*b30d1939SAndy Fiddaman #define sysreadf read 291*b30d1939SAndy Fiddaman #define syswritef write 292*b30d1939SAndy Fiddaman #define syspipef pipe 293*b30d1939SAndy Fiddaman #define sysdupf dup 294*b30d1939SAndy Fiddaman #define sysfcntlf fcntl 295*b30d1939SAndy Fiddaman 296*b30d1939SAndy Fiddaman #endif /*_PACKAGE_ast*/ 297*b30d1939SAndy Fiddaman 298*b30d1939SAndy Fiddaman #if !_mmap_worthy 299*b30d1939SAndy Fiddaman #undef MAP_TYPE 300*b30d1939SAndy Fiddaman #endif 301*b30d1939SAndy Fiddaman 302*b30d1939SAndy Fiddaman #include "FEATURE/float" 303*b30d1939SAndy Fiddaman 304*b30d1939SAndy Fiddaman #include <errno.h> 305*b30d1939SAndy Fiddaman #include <ctype.h> 306*b30d1939SAndy Fiddaman 307*b30d1939SAndy Fiddaman /* deal with multi-byte character and string conversions */ 308*b30d1939SAndy Fiddaman #if _PACKAGE_ast 309*b30d1939SAndy Fiddaman 310*b30d1939SAndy Fiddaman #include <wchar.h> 311*b30d1939SAndy Fiddaman 312*b30d1939SAndy Fiddaman #define _has_multibyte 1 313*b30d1939SAndy Fiddaman 314*b30d1939SAndy Fiddaman #define SFMBMAX mbmax() 315*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t)) 316*b30d1939SAndy Fiddaman #define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t)) 317*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v) (lhs = (v)) 318*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb) mbsize(s) 319*b30d1939SAndy Fiddaman #define SFMBDCL(ms) mbstate_t ms; 320*b30d1939SAndy Fiddaman 321*b30d1939SAndy Fiddaman #else 322*b30d1939SAndy Fiddaman 323*b30d1939SAndy Fiddaman #if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc 324*b30d1939SAndy Fiddaman #define _has_multibyte 1 /* Xopen-compliant */ 325*b30d1939SAndy Fiddaman #if _typ___va_list && !defined(__va_list) 326*b30d1939SAndy Fiddaman #define __va_list va_list 327*b30d1939SAndy Fiddaman #endif 328*b30d1939SAndy Fiddaman #include <wchar.h> 329*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t)) 330*b30d1939SAndy Fiddaman #define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t)) 331*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v) (lhs = (v)) 332*b30d1939SAndy Fiddaman #define SFMBDCL(mb) mbstate_t mb; 333*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) ) 334*b30d1939SAndy Fiddaman #endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/ 335*b30d1939SAndy Fiddaman 336*b30d1939SAndy Fiddaman #if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb 337*b30d1939SAndy Fiddaman #define _has_multibyte 2 /* no shift states */ 338*b30d1939SAndy Fiddaman #include <wchar.h> 339*b30d1939SAndy Fiddaman #undef mbrtowc 340*b30d1939SAndy Fiddaman #define mbrtowc(wp,s,n,mb) mbtowc(wp, s, n) 341*b30d1939SAndy Fiddaman #undef wcrtomb 342*b30d1939SAndy Fiddaman #define wcrtomb(s,wc,mb) wctomb(s, wc) 343*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr) 344*b30d1939SAndy Fiddaman #define SFMBCLR(mb) 345*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v) 346*b30d1939SAndy Fiddaman #define SFMBDCL(mb) 347*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) ) 348*b30d1939SAndy Fiddaman #endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/ 349*b30d1939SAndy Fiddaman 350*b30d1939SAndy Fiddaman #ifdef MB_CUR_MAX 351*b30d1939SAndy Fiddaman #define SFMBMAX MB_CUR_MAX 352*b30d1939SAndy Fiddaman #else 353*b30d1939SAndy Fiddaman #define SFMBMAX sizeof(Sflong_t) 354*b30d1939SAndy Fiddaman #endif 355*b30d1939SAndy Fiddaman 356*b30d1939SAndy Fiddaman #endif /* _PACKAGE_ast */ 357*b30d1939SAndy Fiddaman 358*b30d1939SAndy Fiddaman #if !_has_multibyte 359*b30d1939SAndy Fiddaman #define _has_multibyte 0 /* no multibyte support */ 360*b30d1939SAndy Fiddaman #define SFMBCPY(to,fr) 361*b30d1939SAndy Fiddaman #define SFMBCLR(mb) 362*b30d1939SAndy Fiddaman #define SFMBSET(lhs,v) 363*b30d1939SAndy Fiddaman #define SFMBDCL(mb) 364*b30d1939SAndy Fiddaman #define SFMBLEN(s,mb) (*(s) ? 1 : 0) 365*b30d1939SAndy Fiddaman #endif /* _has_multibyte */ 366*b30d1939SAndy Fiddaman 367*b30d1939SAndy Fiddaman /* dealing with streams that might be accessed concurrently */ 368*b30d1939SAndy Fiddaman #if vt_threaded 369*b30d1939SAndy Fiddaman 370*b30d1939SAndy Fiddaman #define SFMTXdecl(ff,_mf_) Sfio_t* _mf_ = (ff) 371*b30d1939SAndy Fiddaman #define SFMTXbegin(ff,_mf_,rv) \ 372*b30d1939SAndy Fiddaman { if((ff)->_flags&SF_MTSAFE) \ 373*b30d1939SAndy Fiddaman { (_mf_) = (ff); \ 374*b30d1939SAndy Fiddaman if(sfmutex((ff), SFMTX_LOCK) != 0) return(rv); \ 375*b30d1939SAndy Fiddaman if(_Sfnotify) \ 376*b30d1939SAndy Fiddaman { (*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \ 377*b30d1939SAndy Fiddaman if(!(ff)) (ff) = (_mf_); \ 378*b30d1939SAndy Fiddaman } \ 379*b30d1939SAndy Fiddaman } \ 380*b30d1939SAndy Fiddaman } 381*b30d1939SAndy Fiddaman #define SFMTXend(ff,_mf_) \ 382*b30d1939SAndy Fiddaman { if((ff)->_flags&SF_MTSAFE) \ 383*b30d1939SAndy Fiddaman { if(_Sfnotify) \ 384*b30d1939SAndy Fiddaman (*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \ 385*b30d1939SAndy Fiddaman sfmutex((ff), SFMTX_UNLOCK); \ 386*b30d1939SAndy Fiddaman (ff) = (_mf_); \ 387*b30d1939SAndy Fiddaman } \ 388*b30d1939SAndy Fiddaman } 389*b30d1939SAndy Fiddaman 390*b30d1939SAndy Fiddaman #define SFONCE() (_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef)) 391*b30d1939SAndy Fiddaman 392*b30d1939SAndy Fiddaman #define SFMTXLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0) 393*b30d1939SAndy Fiddaman #define SFMTXUNLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0) 394*b30d1939SAndy Fiddaman 395*b30d1939SAndy Fiddaman #define SFMTXDECL(ff) SFMTXdecl((ff), _mtxf1_) 396*b30d1939SAndy Fiddaman #define SFMTXBEGIN(ff,v) { SFMTXbegin((ff), _mtxf1_, (v) ); } 397*b30d1939SAndy Fiddaman #define SFMTXEND(ff) { SFMTXend(ff, _mtxf1_); } 398*b30d1939SAndy Fiddaman #define SFMTXENTER(ff,v) { if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); } 399*b30d1939SAndy Fiddaman #define SFMTXRETURN(ff,v) { SFMTXEND(ff); return(v); } 400*b30d1939SAndy Fiddaman 401*b30d1939SAndy Fiddaman #define SFMTXDECL2(ff) SFMTXdecl((ff), _mtxf2_) 402*b30d1939SAndy Fiddaman #define SFMTXBEGIN2(ff,v) { SFMTXbegin((ff), _mtxf2_, (v) ); } 403*b30d1939SAndy Fiddaman #define SFMTXEND2(ff) { SFMTXend((ff), _mtxf2_); } 404*b30d1939SAndy Fiddaman 405*b30d1939SAndy Fiddaman #define POOLMTXLOCK(p) ( vtmtxlock(&(p)->mutex) ) 406*b30d1939SAndy Fiddaman #define POOLMTXUNLOCK(p) ( vtmtxunlock(&(p)->mutex) ) 407*b30d1939SAndy Fiddaman #define POOLMTXENTER(p) { POOLMTXLOCK(p); } 408*b30d1939SAndy Fiddaman #define POOLMTXRETURN(p,rv) { POOLMTXUNLOCK(p); return(rv); } 409*b30d1939SAndy Fiddaman 410*b30d1939SAndy Fiddaman #else /*!vt_threaded*/ 411*b30d1939SAndy Fiddaman 412*b30d1939SAndy Fiddaman #undef SF_MTSAFE /* no need to worry about thread-safety */ 413*b30d1939SAndy Fiddaman #define SF_MTSAFE 0 414*b30d1939SAndy Fiddaman 415*b30d1939SAndy Fiddaman #define SFONCE() /*(0)*/ 416*b30d1939SAndy Fiddaman 417*b30d1939SAndy Fiddaman #define SFMTXLOCK(f) /*(0)*/ 418*b30d1939SAndy Fiddaman #define SFMTXUNLOCK(f) /*(0)*/ 419*b30d1939SAndy Fiddaman 420*b30d1939SAndy Fiddaman #define SFMTXDECL(ff) /*(0)*/ 421*b30d1939SAndy Fiddaman #define SFMTXBEGIN(ff,v) /*(0)*/ 422*b30d1939SAndy Fiddaman #define SFMTXEND(ff) /*(0)*/ 423*b30d1939SAndy Fiddaman #define SFMTXENTER(ff,v) { if(!(ff)) return(v); } 424*b30d1939SAndy Fiddaman #define SFMTXRETURN(ff,v) { return(v); } 425*b30d1939SAndy Fiddaman 426*b30d1939SAndy Fiddaman #define SFMTXDECL2(ff) /*(0)*/ 427*b30d1939SAndy Fiddaman #define SFMTXBEGIN2(ff,v) /*(0)*/ 428*b30d1939SAndy Fiddaman #define SFMTXEND2(ff) /*(0)*/ 429*b30d1939SAndy Fiddaman 430*b30d1939SAndy Fiddaman #define POOLMTXLOCK(p) 431*b30d1939SAndy Fiddaman #define POOLMTXUNLOCK(p) 432*b30d1939SAndy Fiddaman #define POOLMTXENTER(p) 433*b30d1939SAndy Fiddaman #define POOLMTXRETURN(p,v) { return(v); } 434*b30d1939SAndy Fiddaman 435*b30d1939SAndy Fiddaman #endif /*vt_threaded*/ 436*b30d1939SAndy Fiddaman 437*b30d1939SAndy Fiddaman 438*b30d1939SAndy Fiddaman /* functions for polling readiness of streams */ 439*b30d1939SAndy Fiddaman #if _lib_select 440*b30d1939SAndy Fiddaman #undef _lib_poll 441*b30d1939SAndy Fiddaman #if _sys_select 442*b30d1939SAndy Fiddaman #include <sys/select.h> 443*b30d1939SAndy Fiddaman #endif 444*b30d1939SAndy Fiddaman #else 445*b30d1939SAndy Fiddaman #if _lib_poll_fd_1 || _lib_poll_fd_2 446*b30d1939SAndy Fiddaman #define _lib_poll 1 447*b30d1939SAndy Fiddaman #endif 448*b30d1939SAndy Fiddaman #endif /*_lib_select_*/ 449*b30d1939SAndy Fiddaman 450*b30d1939SAndy Fiddaman #if _lib_poll 451*b30d1939SAndy Fiddaman #include <poll.h> 452*b30d1939SAndy Fiddaman 453*b30d1939SAndy Fiddaman #if _lib_poll_fd_1 454*b30d1939SAndy Fiddaman #define SFPOLL(pfd,n,tm) poll((pfd),(ulong)(n),(tm)) 455*b30d1939SAndy Fiddaman #else 456*b30d1939SAndy Fiddaman #define SFPOLL(pfd,n,tm) poll((ulong)(n),(pfd),(tm)) 457*b30d1939SAndy Fiddaman #endif 458*b30d1939SAndy Fiddaman #endif /*_lib_poll*/ 459*b30d1939SAndy Fiddaman 460*b30d1939SAndy Fiddaman #if _stream_peek 461*b30d1939SAndy Fiddaman #include <stropts.h> 462*b30d1939SAndy Fiddaman #endif 463*b30d1939SAndy Fiddaman 464*b30d1939SAndy Fiddaman #if _socket_peek 465*b30d1939SAndy Fiddaman #include <sys/socket.h> 466*b30d1939SAndy Fiddaman #endif 467*b30d1939SAndy Fiddaman 468*b30d1939SAndy Fiddaman /* to test for executable access mode of a file */ 469*b30d1939SAndy Fiddaman #ifndef X_OK 470*b30d1939SAndy Fiddaman #define X_OK 01 471*b30d1939SAndy Fiddaman #endif 472*b30d1939SAndy Fiddaman 473*b30d1939SAndy Fiddaman /* alternative process forking */ 474*b30d1939SAndy Fiddaman #if _lib_vfork && !defined(fork) && !defined(__sparc) && !defined(__sparc__) 475*b30d1939SAndy Fiddaman #if _hdr_vfork 476*b30d1939SAndy Fiddaman #include <vfork.h> 477*b30d1939SAndy Fiddaman #endif 478*b30d1939SAndy Fiddaman #if _sys_vfork 479*b30d1939SAndy Fiddaman #include <sys/vfork.h> 480*b30d1939SAndy Fiddaman #endif 481*b30d1939SAndy Fiddaman #define fork vfork 482*b30d1939SAndy Fiddaman #endif 483*b30d1939SAndy Fiddaman 484*b30d1939SAndy Fiddaman /* to get rid of pesky compiler warnings */ 485*b30d1939SAndy Fiddaman #if __STD_C 486*b30d1939SAndy Fiddaman #define NOTUSED(x) (void)(x) 487*b30d1939SAndy Fiddaman #else 488*b30d1939SAndy Fiddaman #define NOTUSED(x) (&x,1) 489*b30d1939SAndy Fiddaman #endif 490*b30d1939SAndy Fiddaman 491*b30d1939SAndy Fiddaman /* Private flags in the "bits" field */ 492*b30d1939SAndy Fiddaman #define SF_MMAP 00000001 /* in memory mapping mode */ 493*b30d1939SAndy Fiddaman #define SF_BOTH 00000002 /* both read/write */ 494*b30d1939SAndy Fiddaman #define SF_HOLE 00000004 /* a hole of zero's was created */ 495*b30d1939SAndy Fiddaman #define SF_NULL 00000010 /* stream is /dev/null */ 496*b30d1939SAndy Fiddaman #define SF_SEQUENTIAL 00000020 /* sequential access */ 497*b30d1939SAndy Fiddaman #define SF_JUSTSEEK 00000040 /* just did a sfseek */ 498*b30d1939SAndy Fiddaman #define SF_PRIVATE 00000100 /* private stream to Sfio, no mutex */ 499*b30d1939SAndy Fiddaman #define SF_ENDING 00000200 /* no re-io on interrupts at closing */ 500*b30d1939SAndy Fiddaman #define SF_WIDE 00000400 /* in wide mode - stdio only */ 501*b30d1939SAndy Fiddaman #define SF_PUTR 00001000 /* in sfputr() */ 502*b30d1939SAndy Fiddaman 503*b30d1939SAndy Fiddaman /* "bits" flags that must be cleared in sfclrlock */ 504*b30d1939SAndy Fiddaman #define SF_TMPBITS 00170000 505*b30d1939SAndy Fiddaman #define SF_DCDOWN 00010000 /* recurse down the discipline stack */ 506*b30d1939SAndy Fiddaman 507*b30d1939SAndy Fiddaman #define SF_WCFORMAT 00020000 /* wchar_t formatting - stdio only */ 508*b30d1939SAndy Fiddaman #if _has_multibyte 509*b30d1939SAndy Fiddaman #define SFWCSET(f) ((f)->bits |= SF_WCFORMAT) 510*b30d1939SAndy Fiddaman #define SFWCGET(f,v) (((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) ) 511*b30d1939SAndy Fiddaman #else 512*b30d1939SAndy Fiddaman #define SFWCSET(f) 513*b30d1939SAndy Fiddaman #define SFWCGET(f,v) 514*b30d1939SAndy Fiddaman #endif 515*b30d1939SAndy Fiddaman 516*b30d1939SAndy Fiddaman #define SF_MVSIZE 00040000 /* f->size was reset in sfmove() */ 517*b30d1939SAndy Fiddaman #define SFMVSET(f) (((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) ) 518*b30d1939SAndy Fiddaman #define SFMVUNSET(f) (!((f)->bits&SF_MVSIZE) ? 0 : \ 519*b30d1939SAndy Fiddaman (((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) ) 520*b30d1939SAndy Fiddaman 521*b30d1939SAndy Fiddaman #define SFCLRBITS(f) (SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) ) 522*b30d1939SAndy Fiddaman 523*b30d1939SAndy Fiddaman 524*b30d1939SAndy Fiddaman /* bits for the mode field, SF_INIT defined in sfio_t.h */ 525*b30d1939SAndy Fiddaman #define SF_RC 00000010 /* peeking for a record */ 526*b30d1939SAndy Fiddaman #define SF_RV 00000020 /* reserve without read or most write */ 527*b30d1939SAndy Fiddaman #define SF_LOCK 00000040 /* stream is locked for io op */ 528*b30d1939SAndy Fiddaman #define SF_PUSH 00000100 /* stream has been pushed */ 529*b30d1939SAndy Fiddaman #define SF_POOL 00000200 /* stream is in a pool but not current */ 530*b30d1939SAndy Fiddaman #define SF_PEEK 00000400 /* there is a pending peek */ 531*b30d1939SAndy Fiddaman #define SF_PKRD 00001000 /* did a peek read */ 532*b30d1939SAndy Fiddaman #define SF_GETR 00002000 /* did a getr on this stream */ 533*b30d1939SAndy Fiddaman #define SF_SYNCED 00004000 /* stream was synced */ 534*b30d1939SAndy Fiddaman #define SF_STDIO 00010000 /* given up the buffer to stdio */ 535*b30d1939SAndy Fiddaman #define SF_AVAIL 00020000 /* was closed, available for reuse */ 536*b30d1939SAndy Fiddaman #define SF_LOCAL 00100000 /* sentinel for a local call */ 537*b30d1939SAndy Fiddaman 538*b30d1939SAndy Fiddaman #ifdef DEBUG 539*b30d1939SAndy Fiddaman #define ASSERT(p) ((p) ? 0 : (abort(),0) ) 540*b30d1939SAndy Fiddaman #else 541*b30d1939SAndy Fiddaman #define ASSERT(p) 542*b30d1939SAndy Fiddaman #endif 543*b30d1939SAndy Fiddaman 544*b30d1939SAndy Fiddaman /* short-hands */ 545*b30d1939SAndy Fiddaman #define NIL(t) ((t)0) 546*b30d1939SAndy Fiddaman #define reg register 547*b30d1939SAndy Fiddaman #ifndef uchar 548*b30d1939SAndy Fiddaman #define uchar unsigned char 549*b30d1939SAndy Fiddaman #endif 550*b30d1939SAndy Fiddaman #ifndef ulong 551*b30d1939SAndy Fiddaman #define ulong unsigned long 552*b30d1939SAndy Fiddaman #endif 553*b30d1939SAndy Fiddaman #ifndef uint 554*b30d1939SAndy Fiddaman #define uint unsigned int 555*b30d1939SAndy Fiddaman #endif 556*b30d1939SAndy Fiddaman #ifndef ushort 557*b30d1939SAndy Fiddaman #define ushort unsigned short 558*b30d1939SAndy Fiddaman #endif 559*b30d1939SAndy Fiddaman 560*b30d1939SAndy Fiddaman #define SECOND 1000 /* millisecond units */ 561*b30d1939SAndy Fiddaman 562*b30d1939SAndy Fiddaman /* macros do determine stream types from sfstat_t data */ 563*b30d1939SAndy Fiddaman #ifndef S_IFDIR 564*b30d1939SAndy Fiddaman #define S_IFDIR 0 565*b30d1939SAndy Fiddaman #endif 566*b30d1939SAndy Fiddaman #ifndef S_IFREG 567*b30d1939SAndy Fiddaman #define S_IFREG 0 568*b30d1939SAndy Fiddaman #endif 569*b30d1939SAndy Fiddaman #ifndef S_IFCHR 570*b30d1939SAndy Fiddaman #define S_IFCHR 0 571*b30d1939SAndy Fiddaman #endif 572*b30d1939SAndy Fiddaman #ifndef S_IFIFO 573*b30d1939SAndy Fiddaman #define S_IFIFO 0 574*b30d1939SAndy Fiddaman #endif 575*b30d1939SAndy Fiddaman #ifndef S_ISOCK 576*b30d1939SAndy Fiddaman #define S_ISOCK 0 577*b30d1939SAndy Fiddaman #endif 578*b30d1939SAndy Fiddaman 579*b30d1939SAndy Fiddaman #ifndef S_IFMT 580*b30d1939SAndy Fiddaman #define S_IFMT (S_IFDIR|S_IFREG|S_IFCHR|S_IFIFO|S_ISOCK) 581*b30d1939SAndy Fiddaman #endif 582*b30d1939SAndy Fiddaman 583*b30d1939SAndy Fiddaman #ifndef S_ISDIR 584*b30d1939SAndy Fiddaman #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) 585*b30d1939SAndy Fiddaman #endif 586*b30d1939SAndy Fiddaman #ifndef S_ISREG 587*b30d1939SAndy Fiddaman #define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) 588*b30d1939SAndy Fiddaman #endif 589*b30d1939SAndy Fiddaman #ifndef S_ISCHR 590*b30d1939SAndy Fiddaman #define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) 591*b30d1939SAndy Fiddaman #endif 592*b30d1939SAndy Fiddaman 593*b30d1939SAndy Fiddaman #ifndef S_ISFIFO 594*b30d1939SAndy Fiddaman # if S_IFIFO 595*b30d1939SAndy Fiddaman # define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) 596*b30d1939SAndy Fiddaman # else 597*b30d1939SAndy Fiddaman # define S_ISFIFO(m) (0) 598*b30d1939SAndy Fiddaman # endif 599*b30d1939SAndy Fiddaman #endif 600*b30d1939SAndy Fiddaman 601*b30d1939SAndy Fiddaman #ifdef S_IRUSR 602*b30d1939SAndy Fiddaman #define SF_CREATMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 603*b30d1939SAndy Fiddaman #else 604*b30d1939SAndy Fiddaman #define SF_CREATMODE 0666 605*b30d1939SAndy Fiddaman #endif 606*b30d1939SAndy Fiddaman 607*b30d1939SAndy Fiddaman /* set close-on-exec */ 608*b30d1939SAndy Fiddaman #ifdef F_SETFD 609*b30d1939SAndy Fiddaman # ifndef FD_CLOEXEC 610*b30d1939SAndy Fiddaman # define FD_CLOEXEC 1 611*b30d1939SAndy Fiddaman # endif /*FD_CLOEXEC*/ 612*b30d1939SAndy Fiddaman # define SETCLOEXEC(fd) ((void)fcntl((fd),F_SETFD,FD_CLOEXEC)) 613*b30d1939SAndy Fiddaman #else 614*b30d1939SAndy Fiddaman # ifdef FIOCLEX 615*b30d1939SAndy Fiddaman # define SETCLOEXEC(fd) ((void)ioctl((fd),FIOCLEX,0)) 616*b30d1939SAndy Fiddaman # else 617*b30d1939SAndy Fiddaman # define SETCLOEXEC(fd) 618*b30d1939SAndy Fiddaman # endif /*FIOCLEX*/ 619*b30d1939SAndy Fiddaman #endif /*F_SETFD*/ 620*b30d1939SAndy Fiddaman 621*b30d1939SAndy Fiddaman #define SF_FD_CLOEXEC 0x0001 622*b30d1939SAndy Fiddaman 623*b30d1939SAndy Fiddaman /* a couple of error number that we use, default values are like Linux */ 624*b30d1939SAndy Fiddaman #ifndef EINTR 625*b30d1939SAndy Fiddaman #define EINTR 4 626*b30d1939SAndy Fiddaman #endif 627*b30d1939SAndy Fiddaman #ifndef EBADF 628*b30d1939SAndy Fiddaman #define EBADF 9 629*b30d1939SAndy Fiddaman #endif 630*b30d1939SAndy Fiddaman #ifndef EAGAIN 631*b30d1939SAndy Fiddaman #define EAGAIN 11 632*b30d1939SAndy Fiddaman #endif 633*b30d1939SAndy Fiddaman #ifndef ENOMEM 634*b30d1939SAndy Fiddaman #define ENOMEM 12 635*b30d1939SAndy Fiddaman #endif 636*b30d1939SAndy Fiddaman #ifndef EINVAL 637*b30d1939SAndy Fiddaman #define EINVAL 22 638*b30d1939SAndy Fiddaman #endif 639*b30d1939SAndy Fiddaman #ifndef ESPIPE 640*b30d1939SAndy Fiddaman #define ESPIPE 29 641*b30d1939SAndy Fiddaman #endif 642*b30d1939SAndy Fiddaman 643*b30d1939SAndy Fiddaman /* function to get the decimal point for local environment */ 644*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE) && _PACKAGE_ast 645*b30d1939SAndy Fiddaman #include "lclib.h" 646*b30d1939SAndy Fiddaman #define SFSETLOCALE(dp,tp) \ 647*b30d1939SAndy Fiddaman do if (*(dp) == 0) { \ 648*b30d1939SAndy Fiddaman Lc_numeric_t* lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \ 649*b30d1939SAndy Fiddaman *(dp) = lv->decimal; \ 650*b30d1939SAndy Fiddaman *(tp) = lv->thousand; \ 651*b30d1939SAndy Fiddaman } while (0) 652*b30d1939SAndy Fiddaman #endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/ 653*b30d1939SAndy Fiddaman 654*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE) && _lib_locale 655*b30d1939SAndy Fiddaman #include <locale.h> 656*b30d1939SAndy Fiddaman #define SFSETLOCALE(decimal,thousand) \ 657*b30d1939SAndy Fiddaman do { struct lconv* lv; \ 658*b30d1939SAndy Fiddaman if(*(decimal) == 0) \ 659*b30d1939SAndy Fiddaman { *(decimal) = '.'; \ 660*b30d1939SAndy Fiddaman *(thousand) = -1; \ 661*b30d1939SAndy Fiddaman if((lv = localeconv())) \ 662*b30d1939SAndy Fiddaman { if(lv->decimal_point && *lv->decimal_point) \ 663*b30d1939SAndy Fiddaman *(decimal) = *(unsigned char*)lv->decimal_point; \ 664*b30d1939SAndy Fiddaman if(lv->thousands_sep && *lv->thousands_sep) \ 665*b30d1939SAndy Fiddaman *(thousand) = *(unsigned char*)lv->thousands_sep; \ 666*b30d1939SAndy Fiddaman } \ 667*b30d1939SAndy Fiddaman } \ 668*b30d1939SAndy Fiddaman } while (0) 669*b30d1939SAndy Fiddaman #endif /*!defined(SFSETLOCALE) && _lib_locale*/ 670*b30d1939SAndy Fiddaman 671*b30d1939SAndy Fiddaman #if !defined(SFSETLOCALE) 672*b30d1939SAndy Fiddaman #define SFSETLOCALE(decimal,thousand) (*(decimal)='.',*(thousand)=-1) 673*b30d1939SAndy Fiddaman #endif 674*b30d1939SAndy Fiddaman 675*b30d1939SAndy Fiddaman /* stream pool structure. */ 676*b30d1939SAndy Fiddaman typedef struct _sfpool_s Sfpool_t; 677*b30d1939SAndy Fiddaman struct _sfpool_s 678*b30d1939SAndy Fiddaman { Sfpool_t* next; 679*b30d1939SAndy Fiddaman int mode; /* type of pool */ 680*b30d1939SAndy Fiddaman int s_sf; /* size of pool array */ 681*b30d1939SAndy Fiddaman int n_sf; /* number currently in pool */ 682*b30d1939SAndy Fiddaman Sfio_t** sf; /* array of streams */ 683*b30d1939SAndy Fiddaman Sfio_t* array[3]; /* start with 3 */ 684*b30d1939SAndy Fiddaman Vtmutex_t mutex; /* mutex lock object */ 685*b30d1939SAndy Fiddaman }; 686*b30d1939SAndy Fiddaman 687*b30d1939SAndy Fiddaman /* reserve buffer structure */ 688*b30d1939SAndy Fiddaman typedef struct _sfrsrv_s Sfrsrv_t; 689*b30d1939SAndy Fiddaman struct _sfrsrv_s 690*b30d1939SAndy Fiddaman { ssize_t slen; /* last string length */ 691*b30d1939SAndy Fiddaman ssize_t size; /* buffer size */ 692*b30d1939SAndy Fiddaman uchar data[1]; /* data buffer */ 693*b30d1939SAndy Fiddaman }; 694*b30d1939SAndy Fiddaman 695*b30d1939SAndy Fiddaman /* co-process structure */ 696*b30d1939SAndy Fiddaman typedef struct _sfproc_s Sfproc_t; 697*b30d1939SAndy Fiddaman struct _sfproc_s 698*b30d1939SAndy Fiddaman { int pid; /* process id */ 699*b30d1939SAndy Fiddaman uchar* rdata; /* read data being cached */ 700*b30d1939SAndy Fiddaman int ndata; /* size of cached data */ 701*b30d1939SAndy Fiddaman int size; /* buffer size */ 702*b30d1939SAndy Fiddaman int file; /* saved file descriptor */ 703*b30d1939SAndy Fiddaman int sigp; /* sigpipe protection needed */ 704*b30d1939SAndy Fiddaman }; 705*b30d1939SAndy Fiddaman 706*b30d1939SAndy Fiddaman /* extensions to sfvprintf/sfvscanf */ 707*b30d1939SAndy Fiddaman #define FP_SET(fp,fn) (fp < 0 ? (fn += 1) : (fn = fp) ) 708*b30d1939SAndy Fiddaman #define FP_WIDTH 0 709*b30d1939SAndy Fiddaman #define FP_PRECIS 1 710*b30d1939SAndy Fiddaman #define FP_BASE 2 711*b30d1939SAndy Fiddaman #define FP_STR 3 712*b30d1939SAndy Fiddaman #define FP_SIZE 4 713*b30d1939SAndy Fiddaman #define FP_INDEX 5 /* index size */ 714*b30d1939SAndy Fiddaman 715*b30d1939SAndy Fiddaman typedef struct _fmt_s Fmt_t; 716*b30d1939SAndy Fiddaman typedef struct _fmtpos_s Fmtpos_t; 717*b30d1939SAndy Fiddaman typedef union 718*b30d1939SAndy Fiddaman { int i, *ip; 719*b30d1939SAndy Fiddaman long l, *lp; 720*b30d1939SAndy Fiddaman short h, *hp; 721*b30d1939SAndy Fiddaman uint ui; 722*b30d1939SAndy Fiddaman ulong ul; 723*b30d1939SAndy Fiddaman ushort uh; 724*b30d1939SAndy Fiddaman Sflong_t ll, *llp; 725*b30d1939SAndy Fiddaman Sfulong_t lu; 726*b30d1939SAndy Fiddaman Sfdouble_t ld; 727*b30d1939SAndy Fiddaman double d; 728*b30d1939SAndy Fiddaman float f; 729*b30d1939SAndy Fiddaman #if _has_multibyte 730*b30d1939SAndy Fiddaman wchar_t wc; 731*b30d1939SAndy Fiddaman wchar_t *ws, **wsp; 732*b30d1939SAndy Fiddaman #endif 733*b30d1939SAndy Fiddaman char c, *s, **sp; 734*b30d1939SAndy Fiddaman uchar uc, *us, **usp; 735*b30d1939SAndy Fiddaman Void_t *vp; 736*b30d1939SAndy Fiddaman Sffmt_t *ft; 737*b30d1939SAndy Fiddaman } Argv_t; 738*b30d1939SAndy Fiddaman 739*b30d1939SAndy Fiddaman struct _fmt_s 740*b30d1939SAndy Fiddaman { char* form; /* format string */ 741*b30d1939SAndy Fiddaman va_list args; /* corresponding arglist */ 742*b30d1939SAndy Fiddaman SFMBDCL(mbs) /* multibyte parsing state */ 743*b30d1939SAndy Fiddaman 744*b30d1939SAndy Fiddaman char* oform; /* original format string */ 745*b30d1939SAndy Fiddaman va_list oargs; /* original arg list */ 746*b30d1939SAndy Fiddaman int argn; /* number of args already used */ 747*b30d1939SAndy Fiddaman Fmtpos_t* fp; /* position list */ 748*b30d1939SAndy Fiddaman 749*b30d1939SAndy Fiddaman Sffmt_t* ft; /* formatting environment */ 750*b30d1939SAndy Fiddaman Sffmtevent_f eventf; /* event function */ 751*b30d1939SAndy Fiddaman Fmt_t* next; /* stack frame pointer */ 752*b30d1939SAndy Fiddaman }; 753*b30d1939SAndy Fiddaman 754*b30d1939SAndy Fiddaman struct _fmtpos_s 755*b30d1939SAndy Fiddaman { Sffmt_t ft; /* environment */ 756*b30d1939SAndy Fiddaman Argv_t argv; /* argument value */ 757*b30d1939SAndy Fiddaman int fmt; /* original format */ 758*b30d1939SAndy Fiddaman int need[FP_INDEX]; /* positions depending on */ 759*b30d1939SAndy Fiddaman }; 760*b30d1939SAndy Fiddaman 761*b30d1939SAndy Fiddaman #define LEFTP '(' 762*b30d1939SAndy Fiddaman #define RIGHTP ')' 763*b30d1939SAndy Fiddaman #define QUOTE '\'' 764*b30d1939SAndy Fiddaman 765*b30d1939SAndy Fiddaman #ifndef CHAR_BIT 766*b30d1939SAndy Fiddaman #define CHAR_BIT 8 767*b30d1939SAndy Fiddaman #endif 768*b30d1939SAndy Fiddaman 769*b30d1939SAndy Fiddaman #define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \ 770*b30d1939SAndy Fiddaman ((ft->form = (char*)frm), va_copy(ft->args,ags), \ 771*b30d1939SAndy Fiddaman (ft->fmt = fv), (ft->size = sz), \ 772*b30d1939SAndy Fiddaman (ft->flags = (flgs&SFFMT_SET)), \ 773*b30d1939SAndy Fiddaman (ft->width = wid), (ft->precis = pr), (ft->base = bs), \ 774*b30d1939SAndy Fiddaman (ft->t_str = ts), (ft->n_str = ns) ) 775*b30d1939SAndy Fiddaman #define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \ 776*b30d1939SAndy Fiddaman ((frm = ft->form), va_copy(ags,ft->args), \ 777*b30d1939SAndy Fiddaman (fv = ft->fmt), (sz = ft->size), \ 778*b30d1939SAndy Fiddaman (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \ 779*b30d1939SAndy Fiddaman (wid = ft->width), (pr = ft->precis), (bs = ft->base) ) 780*b30d1939SAndy Fiddaman 781*b30d1939SAndy Fiddaman /* format flags&types, must coexist with those in sfio.h */ 782*b30d1939SAndy Fiddaman #define SFFMT_FORBIDDEN 000077777777 /* for sfio.h only */ 783*b30d1939SAndy Fiddaman #define SFFMT_EFORMAT 001000000000 /* sfcvt converting %e */ 784*b30d1939SAndy Fiddaman #define SFFMT_MINUS 002000000000 /* minus sign */ 785*b30d1939SAndy Fiddaman #define SFFMT_AFORMAT 004000000000 /* sfcvt converting %a */ 786*b30d1939SAndy Fiddaman #define SFFMT_UPPER 010000000000 /* sfcvt converting upper */ 787*b30d1939SAndy Fiddaman 788*b30d1939SAndy Fiddaman #define SFFMT_TYPES (SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\ 789*b30d1939SAndy Fiddaman SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \ 790*b30d1939SAndy Fiddaman SFFMT_TFLAG | SFFMT_ZFLAG ) 791*b30d1939SAndy Fiddaman 792*b30d1939SAndy Fiddaman /* type of elements to be converted */ 793*b30d1939SAndy Fiddaman #define SFFMT_INT 001 /* %d,%i */ 794*b30d1939SAndy Fiddaman #define SFFMT_UINT 002 /* %u,o,x etc. */ 795*b30d1939SAndy Fiddaman #define SFFMT_FLOAT 004 /* %f,e,g etc. */ 796*b30d1939SAndy Fiddaman #define SFFMT_CHAR 010 /* %c,C */ 797*b30d1939SAndy Fiddaman #define SFFMT_POINTER 020 /* %p,n,s,S */ 798*b30d1939SAndy Fiddaman #define SFFMT_CLASS 040 /* %[ */ 799*b30d1939SAndy Fiddaman 800*b30d1939SAndy Fiddaman /* local variables used across sf-functions */ 801*b30d1939SAndy Fiddaman typedef void (*Sfnotify_f)_ARG_((Sfio_t*, int, void*)); 802*b30d1939SAndy Fiddaman #define _Sfpage (_Sfextern.sf_page) 803*b30d1939SAndy Fiddaman #define _Sfpool (_Sfextern.sf_pool) 804*b30d1939SAndy Fiddaman #define _Sfpmove (_Sfextern.sf_pmove) 805*b30d1939SAndy Fiddaman #define _Sfstack (_Sfextern.sf_stack) 806*b30d1939SAndy Fiddaman #define _Sfnotify (_Sfextern.sf_notify) 807*b30d1939SAndy Fiddaman #define _Sfstdsync (_Sfextern.sf_stdsync) 808*b30d1939SAndy Fiddaman #define _Sfudisc (&(_Sfextern.sf_udisc)) 809*b30d1939SAndy Fiddaman #define _Sfcleanup (_Sfextern.sf_cleanup) 810*b30d1939SAndy Fiddaman #define _Sfexiting (_Sfextern.sf_exiting) 811*b30d1939SAndy Fiddaman #define _Sfdone (_Sfextern.sf_done) 812*b30d1939SAndy Fiddaman #define _Sfonce (_Sfextern.sf_once) 813*b30d1939SAndy Fiddaman #define _Sfoncef (_Sfextern.sf_oncef) 814*b30d1939SAndy Fiddaman #define _Sfmutex (_Sfextern.sf_mutex) 815*b30d1939SAndy Fiddaman typedef struct _sfextern_s 816*b30d1939SAndy Fiddaman { ssize_t sf_page; 817*b30d1939SAndy Fiddaman struct _sfpool_s sf_pool; 818*b30d1939SAndy Fiddaman int (*sf_pmove)_ARG_((Sfio_t*, int)); 819*b30d1939SAndy Fiddaman Sfio_t* (*sf_stack)_ARG_((Sfio_t*, Sfio_t*)); 820*b30d1939SAndy Fiddaman void (*sf_notify)_ARG_((Sfio_t*, int, void*)); 821*b30d1939SAndy Fiddaman int (*sf_stdsync)_ARG_((Sfio_t*)); 822*b30d1939SAndy Fiddaman struct _sfdisc_s sf_udisc; 823*b30d1939SAndy Fiddaman void (*sf_cleanup)_ARG_((void)); 824*b30d1939SAndy Fiddaman int sf_exiting; 825*b30d1939SAndy Fiddaman int sf_done; 826*b30d1939SAndy Fiddaman Vtonce_t* sf_once; 827*b30d1939SAndy Fiddaman void (*sf_oncef)_ARG_((void)); 828*b30d1939SAndy Fiddaman Vtmutex_t* sf_mutex; 829*b30d1939SAndy Fiddaman } Sfextern_t; 830*b30d1939SAndy Fiddaman 831*b30d1939SAndy Fiddaman /* get the real value of a byte in a coded long or ulong */ 832*b30d1939SAndy Fiddaman #define SFUVALUE(v) (((ulong)(v))&(SF_MORE-1)) 833*b30d1939SAndy Fiddaman #define SFSVALUE(v) ((( long)(v))&(SF_SIGN-1)) 834*b30d1939SAndy Fiddaman #define SFBVALUE(v) (((ulong)(v))&(SF_BYTE-1)) 835*b30d1939SAndy Fiddaman 836*b30d1939SAndy Fiddaman /* pick this many bits in each iteration of double encoding */ 837*b30d1939SAndy Fiddaman #define SF_PRECIS 7 838*b30d1939SAndy Fiddaman 839*b30d1939SAndy Fiddaman /* grain size for buffer increment */ 840*b30d1939SAndy Fiddaman #define SF_GRAIN 1024 841*b30d1939SAndy Fiddaman #define SF_PAGE ((ssize_t)(SF_GRAIN*sizeof(int)*2)) 842*b30d1939SAndy Fiddaman 843*b30d1939SAndy Fiddaman /* when the buffer is empty, certain io requests may be better done directly 844*b30d1939SAndy Fiddaman on the given application buffers. The below condition determines when. 845*b30d1939SAndy Fiddaman */ 846*b30d1939SAndy Fiddaman #define SFDIRECT(f,n) (((ssize_t)(n) >= (f)->size) || \ 847*b30d1939SAndy Fiddaman ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) ) 848*b30d1939SAndy Fiddaman 849*b30d1939SAndy Fiddaman /* number of pages to memory map at a time */ 850*b30d1939SAndy Fiddaman #if _ptr_bits >= 64 851*b30d1939SAndy Fiddaman #define SF_NMAP 1024 852*b30d1939SAndy Fiddaman #else 853*b30d1939SAndy Fiddaman #define SF_NMAP 32 854*b30d1939SAndy Fiddaman #endif 855*b30d1939SAndy Fiddaman 856*b30d1939SAndy Fiddaman #ifndef MAP_VARIABLE 857*b30d1939SAndy Fiddaman #define MAP_VARIABLE 0 858*b30d1939SAndy Fiddaman #endif 859*b30d1939SAndy Fiddaman #ifndef _mmap_fixed 860*b30d1939SAndy Fiddaman #define _mmap_fixed 0 861*b30d1939SAndy Fiddaman #endif 862*b30d1939SAndy Fiddaman 863*b30d1939SAndy Fiddaman /* set/unset sequential states for mmap */ 864*b30d1939SAndy Fiddaman #if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL) 865*b30d1939SAndy Fiddaman #define SFMMSEQON(f,a,s) \ 866*b30d1939SAndy Fiddaman do { int oerrno = errno; \ 867*b30d1939SAndy Fiddaman (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \ 868*b30d1939SAndy Fiddaman errno = oerrno; \ 869*b30d1939SAndy Fiddaman } while(0) 870*b30d1939SAndy Fiddaman #define SFMMSEQOFF(f,a,s) \ 871*b30d1939SAndy Fiddaman do { int oerrno = errno; \ 872*b30d1939SAndy Fiddaman (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \ 873*b30d1939SAndy Fiddaman errno = oerrno; \ 874*b30d1939SAndy Fiddaman } while(0) 875*b30d1939SAndy Fiddaman #else 876*b30d1939SAndy Fiddaman #define SFMMSEQON(f,a,s) 877*b30d1939SAndy Fiddaman #define SFMMSEQOFF(f,a,s) 878*b30d1939SAndy Fiddaman #endif 879*b30d1939SAndy Fiddaman 880*b30d1939SAndy Fiddaman #define SFMUNMAP(f,a,s) (sysmunmapf((caddr_t)(a),(size_t)(s)), \ 881*b30d1939SAndy Fiddaman ((f)->endb = (f)->endr = (f)->endw = (f)->next = \ 882*b30d1939SAndy Fiddaman (f)->data = NIL(uchar*)) ) 883*b30d1939SAndy Fiddaman 884*b30d1939SAndy Fiddaman /* safe closing function */ 885*b30d1939SAndy Fiddaman #define CLOSE(f) { while(sysclosef(f) < 0 && errno == EINTR) errno = 0; } 886*b30d1939SAndy Fiddaman 887*b30d1939SAndy Fiddaman /* the bottomless bit bucket */ 888*b30d1939SAndy Fiddaman #define DEVNULL "/dev/null" 889*b30d1939SAndy Fiddaman #define SFSETNULL(f) ((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL) 890*b30d1939SAndy Fiddaman #define SFISNULL(f) ((f)->extent < 0 && ((f)->bits&SF_NULL) ) 891*b30d1939SAndy Fiddaman 892*b30d1939SAndy Fiddaman #define SFKILL(f) ((f)->mode = (SF_AVAIL|SF_LOCK) ) 893*b30d1939SAndy Fiddaman #define SFKILLED(f) (((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) ) 894*b30d1939SAndy Fiddaman 895*b30d1939SAndy Fiddaman /* exception types */ 896*b30d1939SAndy Fiddaman #define SF_EDONE 0 /* stop this operation and return */ 897*b30d1939SAndy Fiddaman #define SF_EDISC 1 /* discipline says it's ok */ 898*b30d1939SAndy Fiddaman #define SF_ESTACK 2 /* stack was popped */ 899*b30d1939SAndy Fiddaman #define SF_ECONT 3 /* can continue normally */ 900*b30d1939SAndy Fiddaman 901*b30d1939SAndy Fiddaman #define SETLOCAL(f) ((f)->mode |= SF_LOCAL) 902*b30d1939SAndy Fiddaman #define GETLOCAL(f,v) ((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v)) 903*b30d1939SAndy Fiddaman #define SFWRALL(f) ((f)->mode |= SF_RV) 904*b30d1939SAndy Fiddaman #define SFISALL(f,v) ((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \ 905*b30d1939SAndy Fiddaman ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) ) 906*b30d1939SAndy Fiddaman #define SFSK(f,a,o,d) (SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d)) 907*b30d1939SAndy Fiddaman #define SFRD(f,b,n,d) (SETLOCAL(f),sfrd(f,(Void_t*)b,n,d)) 908*b30d1939SAndy Fiddaman #define SFWR(f,b,n,d) (SETLOCAL(f),sfwr(f,(Void_t*)b,n,d)) 909*b30d1939SAndy Fiddaman #define SFSYNC(f) (SETLOCAL(f),sfsync(f)) 910*b30d1939SAndy Fiddaman #define SFCLOSE(f) (SETLOCAL(f),sfclose(f)) 911*b30d1939SAndy Fiddaman #define SFFLSBUF(f,n) (SETLOCAL(f),_sfflsbuf(f,n)) 912*b30d1939SAndy Fiddaman #define SFFILBUF(f,n) (SETLOCAL(f),_sffilbuf(f,n)) 913*b30d1939SAndy Fiddaman #define SFSETBUF(f,s,n) (SETLOCAL(f),sfsetbuf(f,s,n)) 914*b30d1939SAndy Fiddaman #define SFWRITE(f,s,n) (SETLOCAL(f),sfwrite(f,s,n)) 915*b30d1939SAndy Fiddaman #define SFREAD(f,s,n) (SETLOCAL(f),sfread(f,s,n)) 916*b30d1939SAndy Fiddaman #define SFSEEK(f,p,t) (SETLOCAL(f),sfseek(f,p,t)) 917*b30d1939SAndy Fiddaman #define SFNPUTC(f,c,n) (SETLOCAL(f),sfnputc(f,c,n)) 918*b30d1939SAndy Fiddaman #define SFRAISE(f,e,d) (SETLOCAL(f),sfraise(f,e,d)) 919*b30d1939SAndy Fiddaman 920*b30d1939SAndy Fiddaman /* lock/open a stream */ 921*b30d1939SAndy Fiddaman #define SFMODE(f,l) ((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) ) 922*b30d1939SAndy Fiddaman #define SFLOCK(f,l) (void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data) 923*b30d1939SAndy Fiddaman #define _SFOPENRD(f) ((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb) 924*b30d1939SAndy Fiddaman #define _SFOPENWR(f) ((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb) 925*b30d1939SAndy Fiddaman #define _SFOPEN(f) ((f)->mode == SF_READ ? _SFOPENRD(f) : \ 926*b30d1939SAndy Fiddaman (f)->mode == SF_WRITE ? _SFOPENWR(f) : \ 927*b30d1939SAndy Fiddaman ((f)->endw = (f)->endr = (f)->data) ) 928*b30d1939SAndy Fiddaman #define SFOPEN(f,l) (void)((l) ? 0 : \ 929*b30d1939SAndy Fiddaman ((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) ) 930*b30d1939SAndy Fiddaman 931*b30d1939SAndy Fiddaman /* check to see if the stream can be accessed */ 932*b30d1939SAndy Fiddaman #define SFFROZEN(f) (((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \ 933*b30d1939SAndy Fiddaman !((f)->mode&SF_STDIO) ? 0 : \ 934*b30d1939SAndy Fiddaman _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) ) 935*b30d1939SAndy Fiddaman 936*b30d1939SAndy Fiddaman 937*b30d1939SAndy Fiddaman /* set discipline code */ 938*b30d1939SAndy Fiddaman #define SFDISC(f,dc,iof) \ 939*b30d1939SAndy Fiddaman { Sfdisc_t* d; \ 940*b30d1939SAndy Fiddaman if(!(dc)) \ 941*b30d1939SAndy Fiddaman d = (dc) = (f)->disc; \ 942*b30d1939SAndy Fiddaman else d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \ 943*b30d1939SAndy Fiddaman while(d && !(d->iof)) d = d->disc; \ 944*b30d1939SAndy Fiddaman if(d) (dc) = d; \ 945*b30d1939SAndy Fiddaman } 946*b30d1939SAndy Fiddaman #define SFDCRD(f,buf,n,dc,rv) \ 947*b30d1939SAndy Fiddaman { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 948*b30d1939SAndy Fiddaman rv = (*dc->readf)(f,buf,n,dc); \ 949*b30d1939SAndy Fiddaman if(!dcdown) f->bits &= ~SF_DCDOWN; \ 950*b30d1939SAndy Fiddaman } 951*b30d1939SAndy Fiddaman #define SFDCWR(f,buf,n,dc,rv) \ 952*b30d1939SAndy Fiddaman { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 953*b30d1939SAndy Fiddaman rv = (*dc->writef)(f,buf,n,dc); \ 954*b30d1939SAndy Fiddaman if(!dcdown) f->bits &= ~SF_DCDOWN; \ 955*b30d1939SAndy Fiddaman } 956*b30d1939SAndy Fiddaman #define SFDCSK(f,addr,type,dc,rv) \ 957*b30d1939SAndy Fiddaman { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \ 958*b30d1939SAndy Fiddaman rv = (*dc->seekf)(f,addr,type,dc); \ 959*b30d1939SAndy Fiddaman if(!dcdown) f->bits &= ~SF_DCDOWN; \ 960*b30d1939SAndy Fiddaman } 961*b30d1939SAndy Fiddaman 962*b30d1939SAndy Fiddaman /* fast peek of a stream */ 963*b30d1939SAndy Fiddaman #define _SFAVAIL(f,s,n) ((n) = (f)->endb - ((s) = (f)->next) ) 964*b30d1939SAndy Fiddaman #define SFRPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ 965*b30d1939SAndy Fiddaman ((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) ) 966*b30d1939SAndy Fiddaman #define SFWPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \ 967*b30d1939SAndy Fiddaman ((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) ) 968*b30d1939SAndy Fiddaman 969*b30d1939SAndy Fiddaman /* more than this for a line buffer, we might as well flush */ 970*b30d1939SAndy Fiddaman #define HIFORLINE 128 971*b30d1939SAndy Fiddaman 972*b30d1939SAndy Fiddaman /* string stream extent */ 973*b30d1939SAndy Fiddaman #define SFSTRSIZE(f) { Sfoff_t s = (f)->next - (f)->data; \ 974*b30d1939SAndy Fiddaman if(s > (f)->here) \ 975*b30d1939SAndy Fiddaman { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \ 976*b30d1939SAndy Fiddaman } 977*b30d1939SAndy Fiddaman 978*b30d1939SAndy Fiddaman /* control flags for open() */ 979*b30d1939SAndy Fiddaman #ifdef O_CREAT 980*b30d1939SAndy Fiddaman #define _has_oflags 1 981*b30d1939SAndy Fiddaman #else /* for example, research UNIX */ 982*b30d1939SAndy Fiddaman #define _has_oflags 0 983*b30d1939SAndy Fiddaman #define O_CREAT 004 984*b30d1939SAndy Fiddaman #define O_TRUNC 010 985*b30d1939SAndy Fiddaman #define O_APPEND 020 986*b30d1939SAndy Fiddaman #define O_EXCL 040 987*b30d1939SAndy Fiddaman 988*b30d1939SAndy Fiddaman #ifndef O_RDONLY 989*b30d1939SAndy Fiddaman #define O_RDONLY 000 990*b30d1939SAndy Fiddaman #endif 991*b30d1939SAndy Fiddaman #ifndef O_WRONLY 992*b30d1939SAndy Fiddaman #define O_WRONLY 001 993*b30d1939SAndy Fiddaman #endif 994*b30d1939SAndy Fiddaman #ifndef O_RDWR 995*b30d1939SAndy Fiddaman #define O_RDWR 002 996*b30d1939SAndy Fiddaman #endif 997*b30d1939SAndy Fiddaman #endif /*O_CREAT*/ 998*b30d1939SAndy Fiddaman 999*b30d1939SAndy Fiddaman #ifndef O_BINARY 1000*b30d1939SAndy Fiddaman #define O_BINARY 000 1001*b30d1939SAndy Fiddaman #endif 1002*b30d1939SAndy Fiddaman #ifndef O_TEXT 1003*b30d1939SAndy Fiddaman #define O_TEXT 000 1004*b30d1939SAndy Fiddaman #endif 1005*b30d1939SAndy Fiddaman #ifndef O_TEMPORARY 1006*b30d1939SAndy Fiddaman #define O_TEMPORARY 000 1007*b30d1939SAndy Fiddaman #endif 1008*b30d1939SAndy Fiddaman 1009*b30d1939SAndy Fiddaman #define SF_RADIX 64 /* maximum integer conversion base */ 1010*b30d1939SAndy Fiddaman 1011*b30d1939SAndy Fiddaman #if _PACKAGE_ast 1012*b30d1939SAndy Fiddaman #define SF_MAXINT INT_MAX 1013*b30d1939SAndy Fiddaman #define SF_MAXLONG LONG_MAX 1014*b30d1939SAndy Fiddaman #else 1015*b30d1939SAndy Fiddaman #define SF_MAXINT ((int)(((uint)~0) >> 1)) 1016*b30d1939SAndy Fiddaman #define SF_MAXLONG ((long)(((ulong)~0L) >> 1)) 1017*b30d1939SAndy Fiddaman #endif 1018*b30d1939SAndy Fiddaman 1019*b30d1939SAndy Fiddaman #define SF_MAXCHAR ((uchar)(~0)) 1020*b30d1939SAndy Fiddaman 1021*b30d1939SAndy Fiddaman /* floating point to ascii conversion */ 1022*b30d1939SAndy Fiddaman #define SF_MAXEXP10 6 1023*b30d1939SAndy Fiddaman #define SF_MAXPOW10 (1 << SF_MAXEXP10) 1024*b30d1939SAndy Fiddaman #if !_ast_fltmax_double 1025*b30d1939SAndy Fiddaman #define SF_FDIGITS 1024 /* max allowed fractional digits */ 1026*b30d1939SAndy Fiddaman #define SF_IDIGITS (8*1024) /* max number of digits in int part */ 1027*b30d1939SAndy Fiddaman #else 1028*b30d1939SAndy Fiddaman #define SF_FDIGITS 256 /* max allowed fractional digits */ 1029*b30d1939SAndy Fiddaman #define SF_IDIGITS 1024 /* max number of digits in int part */ 1030*b30d1939SAndy Fiddaman #endif 1031*b30d1939SAndy Fiddaman #define SF_MAXDIGITS (((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int)) 1032*b30d1939SAndy Fiddaman 1033*b30d1939SAndy Fiddaman /* tables for numerical translation */ 1034*b30d1939SAndy Fiddaman #define _Sfpos10 (_Sftable.sf_pos10) 1035*b30d1939SAndy Fiddaman #define _Sfneg10 (_Sftable.sf_neg10) 1036*b30d1939SAndy Fiddaman #define _Sfdec (_Sftable.sf_dec) 1037*b30d1939SAndy Fiddaman #define _Sfdigits (_Sftable.sf_digits) 1038*b30d1939SAndy Fiddaman #define _Sfcvinitf (_Sftable.sf_cvinitf) 1039*b30d1939SAndy Fiddaman #define _Sfcvinit (_Sftable.sf_cvinit) 1040*b30d1939SAndy Fiddaman #define _Sffmtposf (_Sftable.sf_fmtposf) 1041*b30d1939SAndy Fiddaman #define _Sffmtintf (_Sftable.sf_fmtintf) 1042*b30d1939SAndy Fiddaman #define _Sfcv36 (_Sftable.sf_cv36) 1043*b30d1939SAndy Fiddaman #define _Sfcv64 (_Sftable.sf_cv64) 1044*b30d1939SAndy Fiddaman #define _Sftype (_Sftable.sf_type) 1045*b30d1939SAndy Fiddaman #define _Sfieee (&_Sftable.sf_ieee) 1046*b30d1939SAndy Fiddaman #define _Sffinf (_Sftable.sf_ieee.fltinf) 1047*b30d1939SAndy Fiddaman #define _Sfdinf (_Sftable.sf_ieee.dblinf) 1048*b30d1939SAndy Fiddaman #define _Sflinf (_Sftable.sf_ieee.ldblinf) 1049*b30d1939SAndy Fiddaman #define _Sffnan (_Sftable.sf_ieee.fltnan) 1050*b30d1939SAndy Fiddaman #define _Sfdnan (_Sftable.sf_ieee.dblnan) 1051*b30d1939SAndy Fiddaman #define _Sflnan (_Sftable.sf_ieee.ldblnan) 1052*b30d1939SAndy Fiddaman #define _Sffpow10 (_Sftable.sf_flt_pow10) 1053*b30d1939SAndy Fiddaman #define _Sfdpow10 (_Sftable.sf_dbl_pow10) 1054*b30d1939SAndy Fiddaman #define _Sflpow10 (_Sftable.sf_ldbl_pow10) 1055*b30d1939SAndy Fiddaman typedef struct _sfieee_s Sfieee_t; 1056*b30d1939SAndy Fiddaman struct _sfieee_s 1057*b30d1939SAndy Fiddaman { float fltnan; /* float NAN */ 1058*b30d1939SAndy Fiddaman float fltinf; /* float INF */ 1059*b30d1939SAndy Fiddaman double dblnan; /* double NAN */ 1060*b30d1939SAndy Fiddaman double dblinf; /* double INF */ 1061*b30d1939SAndy Fiddaman Sfdouble_t ldblnan; /* Sfdouble_t NAN */ 1062*b30d1939SAndy Fiddaman Sfdouble_t ldblinf; /* Sfdouble_t INF */ 1063*b30d1939SAndy Fiddaman }; 1064*b30d1939SAndy Fiddaman typedef struct _sftab_ 1065*b30d1939SAndy Fiddaman { Sfdouble_t sf_pos10[SF_MAXEXP10]; /* positive powers of 10 */ 1066*b30d1939SAndy Fiddaman Sfdouble_t sf_neg10[SF_MAXEXP10]; /* negative powers of 10 */ 1067*b30d1939SAndy Fiddaman uchar sf_dec[200]; /* ascii reps of values < 100 */ 1068*b30d1939SAndy Fiddaman char* sf_digits; /* digits for general bases */ 1069*b30d1939SAndy Fiddaman int (*sf_cvinitf)(); /* initialization function */ 1070*b30d1939SAndy Fiddaman int sf_cvinit; /* initialization state */ 1071*b30d1939SAndy Fiddaman Fmtpos_t* (*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int)); 1072*b30d1939SAndy Fiddaman char* (*sf_fmtintf)_ARG_((const char*,int*)); 1073*b30d1939SAndy Fiddaman float* sf_flt_pow10; /* float powers of 10 */ 1074*b30d1939SAndy Fiddaman double* sf_dbl_pow10; /* double powers of 10 */ 1075*b30d1939SAndy Fiddaman Sfdouble_t* sf_ldbl_pow10; /* Sfdouble_t powers of 10 */ 1076*b30d1939SAndy Fiddaman uchar sf_cv36[SF_MAXCHAR+1]; /* conversion for base [2-36] */ 1077*b30d1939SAndy Fiddaman uchar sf_cv64[SF_MAXCHAR+1]; /* conversion for base [37-64] */ 1078*b30d1939SAndy Fiddaman uchar sf_type[SF_MAXCHAR+1]; /* conversion formats&types */ 1079*b30d1939SAndy Fiddaman Sfieee_t sf_ieee; /* IEEE floating point constants*/ 1080*b30d1939SAndy Fiddaman } Sftab_t; 1081*b30d1939SAndy Fiddaman 1082*b30d1939SAndy Fiddaman /* thread-safe macro/function to initialize _Sfcv* conversion tables */ 1083*b30d1939SAndy Fiddaman #define SFCVINIT() (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) ) 1084*b30d1939SAndy Fiddaman 1085*b30d1939SAndy Fiddaman /* sfucvt() converts decimal integers to ASCII */ 1086*b30d1939SAndy Fiddaman #define SFDIGIT(v,scale,digit) \ 1087*b30d1939SAndy Fiddaman { if(v < 5*scale) \ 1088*b30d1939SAndy Fiddaman if(v < 2*scale) \ 1089*b30d1939SAndy Fiddaman if(v < 1*scale) \ 1090*b30d1939SAndy Fiddaman { digit = '0'; } \ 1091*b30d1939SAndy Fiddaman else { digit = '1'; v -= 1*scale; } \ 1092*b30d1939SAndy Fiddaman else if(v < 3*scale) \ 1093*b30d1939SAndy Fiddaman { digit = '2'; v -= 2*scale; } \ 1094*b30d1939SAndy Fiddaman else if(v < 4*scale) \ 1095*b30d1939SAndy Fiddaman { digit = '3'; v -= 3*scale; } \ 1096*b30d1939SAndy Fiddaman else { digit = '4'; v -= 4*scale; } \ 1097*b30d1939SAndy Fiddaman else if(v < 7*scale) \ 1098*b30d1939SAndy Fiddaman if(v < 6*scale) \ 1099*b30d1939SAndy Fiddaman { digit = '5'; v -= 5*scale; } \ 1100*b30d1939SAndy Fiddaman else { digit = '6'; v -= 6*scale; } \ 1101*b30d1939SAndy Fiddaman else if(v < 8*scale) \ 1102*b30d1939SAndy Fiddaman { digit = '7'; v -= 7*scale; } \ 1103*b30d1939SAndy Fiddaman else if(v < 9*scale) \ 1104*b30d1939SAndy Fiddaman { digit = '8'; v -= 8*scale; } \ 1105*b30d1939SAndy Fiddaman else { digit = '9'; v -= 9*scale; } \ 1106*b30d1939SAndy Fiddaman } 1107*b30d1939SAndy Fiddaman #define sfucvt(v,s,n,list,type,utype) \ 1108*b30d1939SAndy Fiddaman { while((utype)v >= 10000) \ 1109*b30d1939SAndy Fiddaman { n = v; v = (type)(((utype)v)/10000); \ 1110*b30d1939SAndy Fiddaman n = (type)((utype)n - ((utype)v)*10000); \ 1111*b30d1939SAndy Fiddaman s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \ 1112*b30d1939SAndy Fiddaman s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \ 1113*b30d1939SAndy Fiddaman } \ 1114*b30d1939SAndy Fiddaman if(v < 100) \ 1115*b30d1939SAndy Fiddaman { if(v < 10) \ 1116*b30d1939SAndy Fiddaman { s -= 1; s[0] = (char)('0'+v); \ 1117*b30d1939SAndy Fiddaman } else \ 1118*b30d1939SAndy Fiddaman { s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \ 1119*b30d1939SAndy Fiddaman } \ 1120*b30d1939SAndy Fiddaman } else \ 1121*b30d1939SAndy Fiddaman { if(v < 1000) \ 1122*b30d1939SAndy Fiddaman { s -= 3; SFDIGIT(v,100,s[0]); \ 1123*b30d1939SAndy Fiddaman s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \ 1124*b30d1939SAndy Fiddaman } else \ 1125*b30d1939SAndy Fiddaman { s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \ 1126*b30d1939SAndy Fiddaman s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \ 1127*b30d1939SAndy Fiddaman } \ 1128*b30d1939SAndy Fiddaman } \ 1129*b30d1939SAndy Fiddaman } 1130*b30d1939SAndy Fiddaman 1131*b30d1939SAndy Fiddaman /* handy functions */ 1132*b30d1939SAndy Fiddaman #undef min 1133*b30d1939SAndy Fiddaman #undef max 1134*b30d1939SAndy Fiddaman #define min(x,y) ((x) < (y) ? (x) : (y)) 1135*b30d1939SAndy Fiddaman #define max(x,y) ((x) > (y) ? (x) : (y)) 1136*b30d1939SAndy Fiddaman 1137*b30d1939SAndy Fiddaman /* fast functions for memory copy and memory clear */ 1138*b30d1939SAndy Fiddaman #if _PACKAGE_ast 1139*b30d1939SAndy Fiddaman #define memclear(s,n) memzero(s,n) 1140*b30d1939SAndy Fiddaman #else 1141*b30d1939SAndy Fiddaman #if _lib_bcopy && !_lib_memcpy 1142*b30d1939SAndy Fiddaman #define memcpy(to,fr,n) bcopy((fr),(to),(n)) 1143*b30d1939SAndy Fiddaman #endif 1144*b30d1939SAndy Fiddaman #if _lib_bzero && !_lib_memset 1145*b30d1939SAndy Fiddaman #define memclear(s,n) bzero((s),(n)) 1146*b30d1939SAndy Fiddaman #else 1147*b30d1939SAndy Fiddaman #define memclear(s,n) memset((s),'\0',(n)) 1148*b30d1939SAndy Fiddaman #endif 1149*b30d1939SAndy Fiddaman #endif /*_PACKAGE_ast*/ 1150*b30d1939SAndy Fiddaman 1151*b30d1939SAndy Fiddaman /* note that MEMCPY advances the associated pointers */ 1152*b30d1939SAndy Fiddaman #define MEMCPY(to,fr,n) \ 1153*b30d1939SAndy Fiddaman { memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; } 1154*b30d1939SAndy Fiddaman #define MEMSET(s,c,n) \ 1155*b30d1939SAndy Fiddaman { memset((Void_t*)s,(int)c,n); s += n; } 1156*b30d1939SAndy Fiddaman 1157*b30d1939SAndy Fiddaman _BEGIN_EXTERNS_ 1158*b30d1939SAndy Fiddaman 1159*b30d1939SAndy Fiddaman extern Sftab_t _Sftable; 1160*b30d1939SAndy Fiddaman 1161*b30d1939SAndy Fiddaman extern int _sfpopen _ARG_((Sfio_t*, int, int, int)); 1162*b30d1939SAndy Fiddaman extern int _sfpclose _ARG_((Sfio_t*)); 1163*b30d1939SAndy Fiddaman extern int _sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*)); 1164*b30d1939SAndy Fiddaman extern Sfrsrv_t* _sfrsrv _ARG_((Sfio_t*, ssize_t)); 1165*b30d1939SAndy Fiddaman extern int _sfsetpool _ARG_((Sfio_t*)); 1166*b30d1939SAndy Fiddaman extern char* _sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int)); 1167*b30d1939SAndy Fiddaman extern char** _sfgetpath _ARG_((char*)); 1168*b30d1939SAndy Fiddaman 1169*b30d1939SAndy Fiddaman #if _BLD_sfio && defined(__EXPORT__) 1170*b30d1939SAndy Fiddaman #define extern __EXPORT__ 1171*b30d1939SAndy Fiddaman #endif 1172*b30d1939SAndy Fiddaman #if !_BLD_sfio && defined(__IMPORT__) 1173*b30d1939SAndy Fiddaman #define extern extern __IMPORT__ 1174*b30d1939SAndy Fiddaman #endif 1175*b30d1939SAndy Fiddaman 1176*b30d1939SAndy Fiddaman extern Sfextern_t _Sfextern; 1177*b30d1939SAndy Fiddaman 1178*b30d1939SAndy Fiddaman extern int _sfmode _ARG_((Sfio_t*, int, int)); 1179*b30d1939SAndy Fiddaman extern int _sftype _ARG_((const char*, int*, int*, int*)); 1180*b30d1939SAndy Fiddaman 1181*b30d1939SAndy Fiddaman #undef extern 1182*b30d1939SAndy Fiddaman 1183*b30d1939SAndy Fiddaman #ifndef errno 1184*b30d1939SAndy Fiddaman extern int errno; 1185*b30d1939SAndy Fiddaman #endif 1186*b30d1939SAndy Fiddaman 1187*b30d1939SAndy Fiddaman /* for portable encoding of double values */ 1188*b30d1939SAndy Fiddaman #ifndef frexpl 1189*b30d1939SAndy Fiddaman #if _ast_fltmax_double 1190*b30d1939SAndy Fiddaman #define frexpl frexp 1191*b30d1939SAndy Fiddaman #endif 1192*b30d1939SAndy Fiddaman #if !_lib_frexpl 1193*b30d1939SAndy Fiddaman extern Sfdouble_t frexpl _ARG_((Sfdouble_t, int*)); 1194*b30d1939SAndy Fiddaman #endif 1195*b30d1939SAndy Fiddaman #endif 1196*b30d1939SAndy Fiddaman #ifndef ldexpl 1197*b30d1939SAndy Fiddaman #if _ast_fltmax_double 1198*b30d1939SAndy Fiddaman #define ldexpl ldexp 1199*b30d1939SAndy Fiddaman #endif 1200*b30d1939SAndy Fiddaman #if !_lib_ldexpl 1201*b30d1939SAndy Fiddaman extern Sfdouble_t ldexpl _ARG_((Sfdouble_t, int)); 1202*b30d1939SAndy Fiddaman #endif 1203*b30d1939SAndy Fiddaman #endif 1204*b30d1939SAndy Fiddaman 1205*b30d1939SAndy Fiddaman #if !_PACKAGE_ast 1206*b30d1939SAndy Fiddaman 1207*b30d1939SAndy Fiddaman #if !__STDC__ && !_hdr_stdlib 1208*b30d1939SAndy Fiddaman extern void abort _ARG_((void)); 1209*b30d1939SAndy Fiddaman extern int atexit _ARG_((void(*)(void))); 1210*b30d1939SAndy Fiddaman extern char* getenv _ARG_((const char*)); 1211*b30d1939SAndy Fiddaman extern void* malloc _ARG_((size_t)); 1212*b30d1939SAndy Fiddaman extern void* realloc _ARG_((void*, size_t)); 1213*b30d1939SAndy Fiddaman extern void free _ARG_((void*)); 1214*b30d1939SAndy Fiddaman extern size_t strlen _ARG_((const char*)); 1215*b30d1939SAndy Fiddaman extern char* strcpy _ARG_((char*, const char*)); 1216*b30d1939SAndy Fiddaman 1217*b30d1939SAndy Fiddaman extern Void_t* memset _ARG_((void*, int, size_t)); 1218*b30d1939SAndy Fiddaman extern Void_t* memchr _ARG_((const void*, int, size_t)); 1219*b30d1939SAndy Fiddaman extern Void_t* memccpy _ARG_((void*, const void*, int, size_t)); 1220*b30d1939SAndy Fiddaman #ifndef memcpy 1221*b30d1939SAndy Fiddaman extern Void_t* memcpy _ARG_((void*, const void*, size_t)); 1222*b30d1939SAndy Fiddaman #endif 1223*b30d1939SAndy Fiddaman #if !defined(strtod) 1224*b30d1939SAndy Fiddaman extern double strtod _ARG_((const char*, char**)); 1225*b30d1939SAndy Fiddaman #endif 1226*b30d1939SAndy Fiddaman #if !defined(remove) 1227*b30d1939SAndy Fiddaman extern int sysremovef _ARG_((const char*)); 1228*b30d1939SAndy Fiddaman #endif 1229*b30d1939SAndy Fiddaman #endif /* !__STDC__ && !_hdr_stdlib */ 1230*b30d1939SAndy Fiddaman 1231*b30d1939SAndy Fiddaman #if !_hdr_unistd 1232*b30d1939SAndy Fiddaman #if _proto_open && __cplusplus 1233*b30d1939SAndy Fiddaman extern int sysopenf _ARG_((const char*, int, ...)); 1234*b30d1939SAndy Fiddaman #endif 1235*b30d1939SAndy Fiddaman extern int sysclosef _ARG_((int)); 1236*b30d1939SAndy Fiddaman extern ssize_t sysreadf _ARG_((int, void*, size_t)); 1237*b30d1939SAndy Fiddaman extern ssize_t syswritef _ARG_((int, const void*, size_t)); 1238*b30d1939SAndy Fiddaman extern sfoff_t syslseekf _ARG_((int, sfoff_t, int)); 1239*b30d1939SAndy Fiddaman extern int sysdupf _ARG_((int)); 1240*b30d1939SAndy Fiddaman extern int syspipef _ARG_((int*)); 1241*b30d1939SAndy Fiddaman extern int sysaccessf _ARG_((const char*, int)); 1242*b30d1939SAndy Fiddaman extern int sysremovef _ARG_((const char*)); 1243*b30d1939SAndy Fiddaman extern int sysfstatf _ARG_((int, sfstat_t*)); 1244*b30d1939SAndy Fiddaman extern int sysstatf _ARG_((const char*, sfstat_t*)); 1245*b30d1939SAndy Fiddaman 1246*b30d1939SAndy Fiddaman extern int isatty _ARG_((int)); 1247*b30d1939SAndy Fiddaman 1248*b30d1939SAndy Fiddaman extern int wait _ARG_((int*)); 1249*b30d1939SAndy Fiddaman extern uint sleep _ARG_((uint)); 1250*b30d1939SAndy Fiddaman extern int execl _ARG_((const char*, const char*,...)); 1251*b30d1939SAndy Fiddaman extern int execv _ARG_((const char*, char**)); 1252*b30d1939SAndy Fiddaman #if !defined(fork) 1253*b30d1939SAndy Fiddaman extern int fork _ARG_((void)); 1254*b30d1939SAndy Fiddaman #endif 1255*b30d1939SAndy Fiddaman #if _lib_unlink 1256*b30d1939SAndy Fiddaman extern int unlink _ARG_((const char*)); 1257*b30d1939SAndy Fiddaman #endif 1258*b30d1939SAndy Fiddaman 1259*b30d1939SAndy Fiddaman #endif /*_hdr_unistd*/ 1260*b30d1939SAndy Fiddaman 1261*b30d1939SAndy Fiddaman #if _lib_bcopy && !_proto_bcopy 1262*b30d1939SAndy Fiddaman extern void bcopy _ARG_((const void*, void*, size_t)); 1263*b30d1939SAndy Fiddaman #endif 1264*b30d1939SAndy Fiddaman #if _lib_bzero && !_proto_bzero 1265*b30d1939SAndy Fiddaman extern void bzero _ARG_((void*, size_t)); 1266*b30d1939SAndy Fiddaman #endif 1267*b30d1939SAndy Fiddaman 1268*b30d1939SAndy Fiddaman extern time_t time _ARG_((time_t*)); 1269*b30d1939SAndy Fiddaman extern int waitpid _ARG_((int,int*,int)); 1270*b30d1939SAndy Fiddaman extern void _exit _ARG_((int)); 1271*b30d1939SAndy Fiddaman typedef int(* Onexit_f)_ARG_((void)); 1272*b30d1939SAndy Fiddaman extern Onexit_f onexit _ARG_((Onexit_f)); 1273*b30d1939SAndy Fiddaman 1274*b30d1939SAndy Fiddaman #if _lib_vfork && !_hdr_vfork && !_sys_vfork 1275*b30d1939SAndy Fiddaman extern pid_t vfork _ARG_((void)); 1276*b30d1939SAndy Fiddaman #endif /*_lib_vfork*/ 1277*b30d1939SAndy Fiddaman 1278*b30d1939SAndy Fiddaman #if _lib_poll 1279*b30d1939SAndy Fiddaman #if _lib_poll_fd_1 1280*b30d1939SAndy Fiddaman extern int poll _ARG_((struct pollfd*, ulong, int)); 1281*b30d1939SAndy Fiddaman #else 1282*b30d1939SAndy Fiddaman extern int poll _ARG_((ulong, struct pollfd*, int)); 1283*b30d1939SAndy Fiddaman #endif 1284*b30d1939SAndy Fiddaman #endif /*_lib_poll*/ 1285*b30d1939SAndy Fiddaman 1286*b30d1939SAndy Fiddaman #endif /* _PACKAGE_ast */ 1287*b30d1939SAndy Fiddaman 1288*b30d1939SAndy Fiddaman _END_EXTERNS_ 1289*b30d1939SAndy Fiddaman 1290*b30d1939SAndy Fiddaman #endif /*_SFHDR_H*/ 1291